StatefulSet 컨트롤러 사용

KubernetesBeginner
지금 연습하기

소개

Kubernetes 에서 StatefulSet 은 상태 저장 애플리케이션을 관리하는 데 사용됩니다. 기존의 상태 비저장 애플리케이션과 달리, 상태 저장 애플리케이션은 안정적이고 고유한 네트워크 식별자와 영구 스토리지를 필요로 합니다. 이 랩에서는 Kubernetes 에서 StatefulSet 을 사용하여 안정성을 모델링하는 방법을 배우겠습니다.

Minikube 클러스터 시작

리소스를 생성하기 전에, 실행 중인 Kubernetes 클러스터가 필요합니다. Minikube 는 로컬 머신에서 실행되는 가벼운 Kubernetes 환경입니다.

  1. 작업 디렉토리로 이동:

    터미널을 열고 기본 프로젝트 폴더로 이동합니다:

    cd /home/labex/project
    
  2. Minikube 시작:

    Kubernetes 클러스터를 초기화하기 위해 Minikube 를 시작합니다:

    minikube start
    
    • 이 명령어는 로컬 머신에 단일 노드 Kubernetes 클러스터를 설정합니다.
    • Minikube 는 시스템 성능에 따라 시작하는 데 몇 분 정도 걸릴 수 있습니다.
  3. Minikube 가 실행 중인지 확인:

    Minikube 클러스터의 상태를 확인합니다:

    minikube status
    
    • kubeletapiserver와 같은 구성 요소가 Running으로 나열되어 있는지 확인합니다.
    • 클러스터가 실행 중이지 않으면 minikube start를 다시 실행합니다.

Minikube 를 시작하는 데 문제가 발생하면 필요에 따라 minikube delete를 사용하여 환경을 재설정하십시오.

PV 및 PVC 생성

첫 번째 단계는 Persistent Volume (PV) 과 Persistent Volume Claim (PVC) 을 사용하여 Pod 를 생성하는 것입니다. PV 와 PVC 는 Pod 재시작 시 데이터를 영구적으로 저장하고 액세스하는 데 사용됩니다.

이를 위해 먼저 PV 를 생성합니다.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

위 코드를 /home/labex/project/pv.yaml이라는 파일에 저장하고 다음 명령을 실행합니다:

cd /home/labex/project
kubectl apply -f pv.yaml

이 명령은 용량이 1Gi 이고 호스트 경로가 /mnt/datamy-pv라는 PV 를 생성합니다.

다음으로, PV 에서 1Gi 의 스토리지를 요청하는 PVC 를 생성합니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

위 코드를 /home/labex/project/pvc.yaml이라는 파일에 저장하고 다음 명령을 실행합니다:

kubectl apply -f pvc.yaml

이 명령은 1Gi 의 스토리지를 요청하는 my-pvc라는 PVC 를 생성합니다.

StatefulSet 생성

다음 내용으로 /home/labex/project/statefulset.yaml이라는 파일을 생성합니다:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "web"
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.19.7
          ports:
            - containerPort: 80
          volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
    - metadata:
        name: www
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 1Gi

이 파일에서, NGINX Pod 의 세 개의 복제본을 생성하는 web이라는 StatefulSet 을 정의합니다. 또한 app: nginx 레이블을 사용하여 NGINX Pod 를 선택하는 web이라는 Service 를 정의합니다. 마지막으로, NGINX Pod 의 데이터를 위한 Persistent Volume Claim 템플릿을 정의합니다.

StatefulSet 을 생성하려면 다음 명령을 실행합니다:

kubectl apply -f statefulset.yaml

다음 명령을 실행하여 StatefulSet 의 상태를 확인할 수 있습니다:

kubectl get statefulsets

StatefulSet 이 실행되면 다음 명령을 실행하여 NGINX Pod 에 액세스할 수 있습니다:

kubectl get pods
kubectl exec -it web-0 -- /bin/bash

web-0을 StatefulSet 에 의해 생성된 NGINX Pod 의 이름으로 바꿉니다.

축하합니다. Kubernetes 에서 StatefulSet 을 성공적으로 생성했습니다!

StatefulSet 업데이트

Kubernetes 에서 템플릿을 업데이트하여 StatefulSet 의 Pod 를 업데이트할 수 있습니다. statefulset.yaml 파일을 업데이트하여 NGINX 버전 1.20.0 을 사용해 보겠습니다.

/home/labex/project/statefulset.yaml 파일을 다음 내용으로 업데이트합니다:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "web"
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.20.0
          ports:
            - containerPort: 80
          volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
    - metadata:
        name: www
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 1Gi

StatefulSet 을 업데이트하려면 다음 명령을 실행합니다:

kubectl apply -f statefulset.yaml

다음 명령을 실행하여 StatefulSet 의 상태를 확인할 수 있습니다:

kubectl get statefulsets

축하합니다. Kubernetes 에서 StatefulSet 을 성공적으로 업데이트했습니다!

StatefulSet 스케일링

Kubernetes 에서 replicas 필드를 변경하여 StatefulSet 을 스케일 업 또는 스케일 다운할 수 있습니다. web StatefulSet 을 다섯 개의 복제본으로 스케일링해 보겠습니다.

/home/labex/project/statefulset.yaml 파일을 다음 내용으로 업데이트합니다:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "web"
  replicas: 5
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.20.0
          ports:
            - containerPort: 80
          volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
    - metadata:
        name: www
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 1Gi

StatefulSet 을 업데이트하려면 다음 명령을 실행합니다:

kubectl apply -f statefulset.yaml

다음 명령을 실행하여 StatefulSet 의 상태를 확인할 수 있습니다:

kubectl get statefulsets

축하합니다. Kubernetes 에서 StatefulSet 을 성공적으로 스케일링했습니다!

StatefulSet 삭제

Kubernetes 에서 다음 명령을 실행하여 StatefulSet 을 삭제할 수 있습니다:

kubectl delete statefulset web

이 명령은 web StatefulSet 과 모든 Pod 를 삭제합니다.

축하합니다. Kubernetes 에서 StatefulSet 을 사용한 안정성 모델링에 대한 실습을 완료했습니다!

요약

이 실습에서는 Kubernetes 에서 StatefulSet 을 사용하여 안정성을 모델링하는 방법을 배웠습니다. StatefulSet 을 생성하고, StatefulSet 을 업데이트하고, StatefulSet 을 확장하고, StatefulSet 을 삭제했습니다. 이는 Kubernetes 에서 StatefulSet 으로 작업할 때 수행해야 하는 기본적인 작업입니다.