5-3. StatefulSet 실습

황인권·2025년 2월 21일

Kubernetes

목록 보기
33/37

PV 사용을 위한 설정

GCP로 실습하면 이미 자동으로 이와 같은 역할을 하는 드라이버가 활성화 되어있기 때문에 해당 과정을 거치지 않아도 된다.

AWS 사용

CSI 드라이버 활성화

  1. 쿠버네티스 클러스터 상세 화면에서 '추가 기능' 탭에 진입

  2. '추가 기능 가져오기' 버튼을 클릭해서 새로운 기능을 추가

  3. 'Amazon EBS CSI 드라이버'를 선택하고 '다음'버튼 클릭

  4. 다음으로 나온 페이지의 설정 옵션은 그대로 둔 상태에서, 계속 다음 버튼을 눌러 넘어가 생성을 완료

노드 그룹 권한 부여

  1. 클러스터 상세 화면에서 '컴퓨팅' 탭을 클릭하여 아무 노드 그룹이나 상세 화면으로 진입

  2. 세부 정보탭의 노드 IAM 역할 ARN 항목의 'IAM에서 보기'를 클릭하여 IAM 설정 상세 화면으로 진입

  3. 권한 정책 항목에서 '권한 추가' -> '정책 연결' 버튼을 클릭해 새로운 정책을 연결하는 화면으로 진입

  4. 기타 권한 정책 항목에서 'EBS'를 검색한 후, 'AmazonEBSCSIDriverPolicy'를 선택 후, 권한 추가

StorageClass 등록

GCP를 사용하는 사람들은 이미 자동으로 'standard'라는 이름으로 StorageClass가 등록되어 있기 때문에 별도로 등록 작업을 수행하지 않아도 된다.

  • StorageClass 오브젝트를 다음과 같은 내용으로 생성

    스토리지 클래스란, PV(C)를 이용하기 위해 쿠버네티스에서 구분하는 스토리지의 종류를 나타내는 오브젝트이다.
    스토리지 클래스 오브젝트를 다음과 같이 설정하게 되면, AWS의 스토리지 서비스인 EBS와 연결되어 PVC를 생성할 떄 자동으로 물리적인 스토리지를 빌려와 연결시켜주게 된다.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ebs-sc
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
parameters:
  csi.storage.k8s.io/fstype: ext4
  type: gp3
allowedTopologies:
  - matchLabelExpressions:
    - key: topology.ebs.csi.aws.com/zone
      values:
        - ap-northeast-2a
        - ap-northeast-2b
        - ap-northeast-2c
        - ap-northeast-2d

StatefulSet을 통해 MySQL 운영하기

  1. 노드 그룹의 최대 크기를 8이상으로 설정
  • PV의 스토리지가 실제로 존재하는 가용 영역에서 Pod가 실행(Node가 존재)되어야 한다.
  • StatefulSet의 Pod가 정상적으로 실행될 수 있도록, 여러 가용 영역에서 Node가 실행되게끔 하는 조치이다.

  1. StatefulSet으로 만들어진 Pod를 다른 Pod와 연결시켜줄 Headless Service를 생성한다.

    Q. Headless Service란?
    A. yaml 파일의 내용을 잘 보면, clusterIP가 None으로 설정된 것을 확인할 수 있다.
    이렇게 Service에 직접적으로 IP를 할당하지 않는 특수한 Service를 Headless Service라고 하는데, StatefulSet으로 만들어진 Pod의 경우 일반적으로 랜덤하게 부하 분산이 이루어지면 안되고, 특정 Pod를 지정해서 접속해야하기 때문에 Service가 Pod를 로드밸런싱하는 역할을 수행하지 않고 단순히 Pod에 DNS(도메인주소)만 붙여 접속을 쉽게 할 수 있도록 도와주는 역할만 수행한다.

apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: default
  labels:
    app: mysql
spec:
  clusterIP: None
  selector:
    app: mysql
  ports:
    - port: 3306
      name: mysql
  1. StatefulSet 오브젝트를 정의하여 apply 하자.

    GCP로 실습하는 경우 storageClassName 항목을 'standard'로 설정해주자.

  • 이 과정에서 자동으로 PVC가 생성되며, PVC가 생성되는 과정에서 자동으로 PV가 생성된다.
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
  namespace: default
spec:
  serviceName: "mysql"
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:8.0
          ports:
            - containerPort: 3306
              name: mysql
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: "sparta"
            - name: MYSQL_DATABASE
              value: "sparta"
          volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql
          resources:
            requests:
              cpu: "500m"
              memory: "1Gi"
            limits:
              cpu: "500m"
              memory: "1Gi"
  volumeClaimTemplates:
    - metadata:
        name: mysql-persistent-storage
      spec:
        accessModes:
          - ReadWriteOnce
        storageClassName: "ebs-sc"
        resources:
          requests:
            storage: 20Gi


  1. kubectl exec -it mysql-0 -- bash를 입력하여, mysql Pod의 CLI에 접속.
  1. mysql -u root -p 를 입력하여, mysql 클라이언트에 접속하고 패스워드로 sparta를 입력
  1. 아래 명령어를 순차적으로 입력해 데이터베이스에 테이블을 만들어주자.
USE sparta;
CREATE TABLE users (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_code VARCHAR(20) NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    INDEX (user_code)
);


profile
inkwon Hwang

0개의 댓글