StatefulSet 컨트롤러 사용

KubernetesBeginner
지금 연습하기

소개

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

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 92%입니다.학습자들로부터 90%의 긍정적인 리뷰율을 받았습니다.

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 으로 작업할 때 수행해야 하는 기본적인 작업입니다.