스테이트풀(Stateful) 애플리케이션 배포


이 페이지에서는 Google Kubernetes Engine(GKE)을 사용하여 스테이트풀(Stateful) 애플리케이션을 배포하는 방법을 설명합니다.

개요

스테이트풀(Stateful) 애플리케이션은 서버, 클라이언트, 기타 애플리케이션에서 사용할 수 있도록 영구 디스크 스토리지에 데이터를 저장합니다. 스테이트풀(Stateful) 애플리케이션의 예시로는 데이터가 저장되고 다른 애플리케이션에 의해 검색되는 데이터베이스 또는 키-값 저장소가 있습니다.

영구 스토리지는 동적으로 프로비저닝될 수 있으므로 기본 볼륨이 필요 시 생성됩니다. Kubernetes에서는 StorageClass를 만들어 동적 프로비저닝을 구성합니다. GKE에서는 기본 StorageClass를 사용하여 Compute Engine 영구 디스크를 동적으로 프로비저닝할 수 있습니다.

Kubernetes는 StatefulSet 컨트롤러를 사용하여 스테이트풀(Stateful) 애플리케이션을 StatefulSet 객체로 배포합니다. StatefulSet의 포드는 상호 호환되지 않습니다. 각 포드는 어디에 예약되든 상관없이 유지되는 고유한 식별자를 갖습니다.

스테이트풀(Stateful) 애플리케이션은 클라이언트 데이터가 세션 간에 서버에 저장되지 않는 스테이트리스(Stateless) 애플리케이션과 다릅니다.

멀티 영역 및 리전 클러스터의 영구 스토리지에 대해 자세히 알아보세요.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.
  • 컨테이너형 애플리케이션이 Artifact Registry와 같은 이미지 레지스트리에 저장되어 있는지 확인합니다.

빠른 시작을 따라 GKE API를 사용 설정하고, 클러스터를 만들고, GKE에 대해 자세히 알아볼 수 있습니다.

StatefulSet에서 영구 스토리지 요청

애플리케이션은 PersistentVolumeClaim을 통해 영구 스토리지를 요청할 수 있습니다.

일반적으로 포드를 만드는 것 외에도 PersistentVolumeClaim 객체를 만들어야 합니다. 그러나 StatefulSet 객체에는 PersistentVolumeClaim 객체를 자동으로 생성하는 volumeClaimTemplates 배열이 포함됩니다. 각 StatefulSet 복제본은 고유한 PersistentVolumeClaim 객체를 얻습니다.

StatefulSet에서 기존 디스크를 사용할 수도 있습니다.

StatefulSet 만들기

StatefulSet 리소스를 만들려면 kubectl apply 명령어를 사용합니다.

kubectl apply 명령어는 매니페스트 파일을 사용하여 클러스터에서 리소스를 생성, 업데이트, 삭제합니다. 이는 객체 구성의 선언적 메서드입니다. 이 메서드는 변경 내용을 객체 구성 파일에 다시 병합하지 않고 실시간 객체에 대한 쓰기를 보관합니다.

Linux

다음 매니페스트 파일은 별도로 생성된 서비스가 적용되는 StatefulSet의 간단한 예시입니다.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: STATEFULSET_NAME
spec:
  selector:
    matchLabels:
      app: APP_NAME
  serviceName: "SERVICE_NAME"
  replicas: 3
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: APP_NAME
    spec:
      containers:
      - name: CONTAINER_NAME
        image: ...
        ports:
        - containerPort: 80
          name: PORT_NAME
        volumeMounts:
        - name: PVC_NAME
          mountPath: ...
  volumeClaimTemplates:
  - metadata:
      name: PVC_NAME
      annotations:
        ...
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

다음을 바꿉니다.

  • STATEFULSET_NAME: StatefulSet의 이름입니다.
  • SERVICE_NAME: 서비스의 이름입니다.
  • APP_NAME: 포드에서 실행되는 애플리케이션의 이름입니다.
  • CONTAINER_NAME: 포드의 컨테이너 이름입니다.
  • PORT_NAME: StatefulSet에서 연 포트의 이름입니다.
  • PVC_NAME: PersistentVolumeClaim의 이름입니다.

이 파일에서 kind 필드는 파일에 정의된 사양으로 StatefulSet 객체를 만들어야 함을 지정합니다. 이 예시 StatefulSet는 3개의 복제된 포드를 생성하고, StatefulSet를 인터넷에 노출하기 위해 포트 80을 엽니다.

Windows

Windows Server 노드 풀에서 클러스터를 사용할 때 기본 StorageClass는 Linux 컨테이너에서만 작동하는 ext4를 파일 시스템 유형으로 사용하므로 StorageClass를 만들어야 합니다. Compute Engine 영구 디스크를 사용 중인 경우에는 다음 예시와 같이 NTFS를 파일 스토리지 유형으로 사용해야 합니다.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: STORAGECLASS_NAME
parameters:
  type: pd-standard
  fstype: NTFS
provisioner: kubernetes.io/gce-pd
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

다음 StatefulSet 매니페스트는 위에서 정의한 StorageClass를 사용합니다. Compute Engine 영구 디스크 4개를 나타내는 4개의 PersistentVolume 및 PersistentVolumeClaim 쌍을 만듭니다. StatefulSet의 각 포드는 하나의 영구 디스크를 사용합니다.

포드가 Windows Server 노드에 올바르게 예약되도록 하려면 노드 선택기를 포드 사양에 추가해야 합니다.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: STATEFULSET_NAME
spec:
  replicas: 4
  selector:
    matchLabels:
      app: APP_NAME
  template:
    metadata:
      labels:
        app: APP_NAME
      name: CONTAINER_NAME
    spec:
      nodeSelector:
        kubernetes.io/os: windows
      containers:
      - name: CONTAINER_NAME
        image: ...
        ports:
        - containerPort: 80
          name: PORT_NAME
        volumeMounts:
        - name: PVC_NAME
          mountPath: C:\mnt\state
  volumeClaimTemplates:
  - metadata:
      name: PVC_NAME
    spec:
      storageClassName: STORAGECLASS_NAME
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

다음을 바꿉니다.

  • APP_NAME: 포드에서 실행되는 애플리케이션의 이름입니다.
  • STATEFULSET_NAME: StatefulSet의 이름입니다.
  • CONTAINER_NAME: 포드의 컨테이너 이름입니다.
  • PORT_NAME: StatefulSet에서 연 포트의 이름입니다.
  • PVC_NAME: PersistentVolumeClaim의 이름입니다.
  • STORAGECLASS_NAME: StorageClass의 이름입니다.

StatefulSet 리소스를 만들려면 STATEFULSET_FILE을 매니페스트 파일 이름으로 바꾸는 다음 명령어를 실행합니다.

kubectl apply -f STATEFULSET_FILE

또한 kubectl apply -f DIRECTORY/를 사용하여 디렉터리에 저장된 구성 파일에 정의된 모든 객체(기존 객체 제외)를 만들 수 있습니다.

StatefulSet 검사

kubectl

StatefulSet를 검사하려면 다음 명령어를 실행하세요.

kubectl get statefulset STATEFULSET_NAME -o yaml

이 명령어는 YAML 형식으로 StatefulSet 리소스의 라이브 구성을 표시합니다.

StatefulSet에 의해 생성된 포드를 나열하려면 다음 명령어를 실행하세요.

kubectl get pods -l app=APP_NAME

이 명령어에서 -l 플래그는 kubectlAPP_NAME라벨이 지정된 모든 포드를 가져오도록 지시합니다.

출력은 다음과 비슷합니다.

NAME                                READY     STATUS    RESTARTS   AGE
pod-name                            1/1       Running   0          1m
pod-name                            1/1       Running   0          1m

StatefulSet에 대한 자세한 정보를 보려면 다음 명령어를 실행합니다.

kubectl describe statefulset STATEFULSET_NAME

특정 포드에 대한 정보를 보려면 다음 명령어를 실행합니다.

kubectl describe pod POD_NAME

생성된 PersistentVolumeClaim 객체를 나열하려면 다음 명령어를 실행합니다.

kubectl get pvc

출력은 다음과 비슷합니다.

NAME                            STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS    AGE
STATEFULSET_NAME-PVC_NAME-0     Bound     pvc-bdff4e1e-183e-11e8-bf6d-42010a800002   1G         RWO            standard        9s
STATEFULSET_NAME-PVC_NAME-1     Bound     pvc-bdff4e1e-183e-11e8-bf6d-42010a800003   1G         RWO            standard        9s
STATEFULSET_NAME-PVC_NAME-2     Bound     pvc-bdff4e1e-183e-11e8-bf6d-42010a800004   1G         RWO            standard        9s

특정 PersistentVolumeClaim에 대한 정보를 가져오려면 다음 명령어를 실행합니다.

kubectl describe pvc STATEFULSET_NAME-PVC_NAME-0

특정 PersistentVolume에 대한 정보를 가져오려면 다음 명령어를 실행합니다.

kubectl describe pv PV_NAME

콘솔

StatefulSet를 검사하려면 다음 단계를 수행하세요.

  1. Google Cloud 콘솔에서 워크로드 페이지로 이동합니다.

    워크로드로 이동

  2. 워크로드 목록에서 검사하려는 StatefulSet의 이름을 클릭합니다.

  3. 스테이트풀(Stateful) 세트 세부정보 페이지에서 다음 중 아무 작업이나 수행합니다.

    • 업데이트 기록 탭을 클릭하여 StatefulSet의 업데이트 기록을 확인합니다.
    • 이벤트 탭을 클릭하여 StatefulSet과 관련된 모든 이벤트를 확인합니다.
    • 로그 탭을 클릭하여 StatefulSet의 컨테이너 로그를 확인합니다.
    • YAML 탭을 클릭하여 StatefulSet의 구성 YAML을 확인, 복사, 다운로드합니다.

StatefulSet 업데이트

StatefulSet를 업데이트하는 방법은 여러 가지가 있습니다. 일반적인 선언적 메서드는 kubectl apply입니다. 셸 또는 선호하는 편집기에서 StatefulSet을 직접 업데이트하려면 kubectl edit를 사용합니다. Google Cloud 콘솔의 GKE 워크로드 메뉴에서 YAML 편집기를 사용할 수도 있습니다.

이미지, 리소스 사용량/요청, 구성과 같은 StatefulSet 리소스의 포드 사양에 대한 업데이트를 출시할 수 있습니다.

kubectl apply

새롭거나 업데이트된 매니페스트 파일을 적용하여 StatefulSet를 업데이트할 수 있습니다. 이 방법은 확장하거나 애플리케이션의 새 버전을 지정하는 등 StatefulSet를 다양하게 변경하는 경우에 유용합니다.

StatefulSet를 업데이트하려면 다음 명령어를 실행합니다.

kubectl apply -f STATEFULSET_FILE

STATEFULSET_FILE을 업데이트된 매니페스트 파일로 바꿉니다.

kubectl apply 명령어는 매니페스트 파일을 리소스에 적용합니다. 지정된 리소스가 없으면 명령어에 의해 생성됩니다,

kubectl apply에 대한 자세한 내용은 kubectl 참조 문서를 확인하세요.

콘솔

StatefulSet의 실시간 구성을 수정하려면 다음 단계를 수행하세요.

  1. Google Cloud 콘솔에서 워크로드 페이지로 이동합니다.

    워크로드로 이동

  2. 워크로드 목록에서 수정하려는 StatefulSet의 이름을 클릭합니다.

  3. 수정을 클릭합니다.

  4. 구성 YAML을 원하는 대로 변경합니다.

  5. 저장을 클릭합니다.

업데이트 출시 검사

kubectl

StatefulSet의 출시 검사를 하려면 다음 명령어를 실행합니다.

kubectl rollout status statefulset STATEFULSET_NAME

StatefulSet의 출시 기록을 보려면 다음 명령어를 실행합니다.

kubectl rollout history statefulset STATEFULSET_NAME

출시를 취소하려면 다음 명령어를 실행합니다.

kubectl rollout undo statefulset STATEFULSET_NAME

콘솔

StatefulSet의 업데이트 기록을 보려면 다음 단계를 수행하세요.

  1. Google Cloud 콘솔에서 워크로드 페이지로 이동합니다.

    워크로드로 이동

  2. 워크로드 목록에서 검사하려는 StatefulSet의 이름을 클릭합니다.

  3. 업데이트 기록 탭을 클릭합니다.

  4. 원하는 수정버전을 선택합니다.

업데이트 전략

StatefulSet의 updateStrategy 필드를 사용하면 컨테이너의 자동 순차적 업데이트, 라벨, 리소스 요청, 한도, StatefulSet의 포드에 대한 주석을 구성하고 사용 중지할 수 있습니다.

Kubernetes 문서에서 StatefulSet의 업데이트 전략에 대해 자세히 알아보세요.

StatefulSet 확장

kubectl

언제든지 kubectl scale 명령어를 사용하여 StatefulSet를 확장할 수 있습니다.

수동으로 StatefulSet를 확장하려면 다음 명령어를 실행하세요.

kubectl scale statefulset STATEFULSET_NAME --replicas NUMBER_OF_REPLICAS

NUMBER_OF_REPLICAS를 원하는 복제된 포드 수로 바꿉니다.

콘솔

StatefulSet를 확장하려면 다음 단계를 수행하세요.

  1. Google Cloud 콘솔에서 워크로드 페이지로 이동합니다.

    워크로드로 이동

  2. 워크로드 목록에서 수정하려는 StatefulSet의 이름을 클릭합니다.

  3. 작업 > 확장 > 복제본 수정을 클릭합니다.

  4. StatefulSet의 새 복제본 수를 입력합니다.

  5. 확장을 클릭합니다.

StatefulSet 삭제

kubectl

StatefulSet를 삭제하려면 다음 명령어를 실행하세요.

kubectl delete statefulset STATEFULSET_NAME

콘솔

StatefulSet를 삭제하려면 다음 단계를 수행하세요.

  1. Google Cloud 콘솔에서 워크로드 페이지로 이동합니다.

    워크로드로 이동

  2. 워크로드 목록에서 삭제할 StatefulSet를 한 개 이상 선택합니다.

  3. 삭제를 클릭합니다.

  4. 확인 메시지가 나타나면 삭제를 클릭합니다.

다음 단계