Block Storage for Classic 설정

IBM Cloud Block Storage for Classic는 Kubernetes 지속적 볼륨(PV)을 사용하여 앱에 추가할 수 있는 지속적, 고성능 iSCSI 스토리지입니다. 워크로드의 요구사항을 충족하는 GB 크기와 IOPS를 사용하여 사전정의된 스토리지 계층 중에서 선택할 수 있습니다. IBM Cloud Block Storage for Classic 이 적합한 스토리지 옵션인지 확인하려면 스토리지 솔루션 선택하기를 참조하세요.

IBM Cloud Block Storage for Classic 플러그인을 사용할 때는 다음 고려사항에 유의하십시오.

IBM Cloud Block Storage for Classic 플러그인은 클래식 인프라에서 프로비저닝된 표준 IBM Cloud Kubernetes Service 클러스터에만 사용될 수 있습니다. VPC 클러스터가 있는 경우 Block Storage for Classic설정 을 참조하십시오.

클러스터가 공용 네트워크(예: 방화벽 뒤의 사설 클러스터 또는 프라이빗 클라우드 서비스 엔드포인트만 사용 가능한 클러스터)에 액세스할 수 없는 경우, 사설 네트워크를 통해 Block Storage for Classic 인스턴스에 연결하려면 IBM Cloud Block Storage for Classic 플러그인 버전 1.3.0 이상을 설치했는지 확인하십시오.

Block Storage for Classic 인스턴스는 단일 캠퍼스 멀티존 지역에만 해당됩니다. 다중 구역 클러스터가 있는 경우에는 다중 구역 지속적 스토리지 옵션을 고려하십시오.

클래식 인프라

이 페이지의 단계는 클래식 클러스터에만 적용됩니다. VPC 클러스터에서는 ‘ Block Storage for VPC ’ 클러스터 애드온이 기본적으로 설치됩니다. 자세한 내용은 설정 설정 Block Storage for VPC 을 참조하세요.

IBM Cloud Block Storage for Classic 의 빠른 시작

이 빠른 시작 가이드에서는 볼륨을 동적으로 프로비저닝하기 위해 PVC를 생성하여 클러스터 내에 ‘ 24Gi ’ 실버 등급의 Block Storage for Classic 볼륨을 생성합니다. 그런 다음 PVC를 마운트하는 앱 배치를 작성합니다.

클러스터에서 Block Storage for Classic를 처음 사용하시는 것입니까? Block Storage for Classic 플러그인을 설치한 후 여기로 돌아오십시오.

  1. 다음 지속적 볼륨 청구(PVC) 구성을 pvc.yaml 파일에 저장하십시오.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: block-storage-pvc
      labels:
        billingType: "hourly"
        region: us-east
        zone: wdc07
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 45Gi
      storageClassName: ibmc-block-silver
    
  2. 구성을 클러스터에 적용하여 PVC를 작성하십시오.

    kubectl apply -f pvc.yaml
    
  3. PVC가 Bound 상태가 될 때까지 기다리십시오. 다음 명령을 실행하여 상태를 확인할 수 있습니다.

    kubectl get pvc
    
  4. PVC가 Bound 상태가 된 후 PVC를 사용하는 앱 배치를 작성하십시오. 다음 배치 구성을 deployment.yaml 파일에 저장하십시오.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
      labels:
        app: my-app
    spec:
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - image: nginx # Use the nginx image, or your own containerized app image.
            name: my-container
            command: ["/bin/sh"]
            args: ["-c", "while true; do date \"+%Y-%m-%d %H:%M:%S\"; sleep 3600; done"] # This app prints the timestamp, then sleeps.
            workingDir: /home
            imagePullPolicy: Always
            ports:
              - containerPort: 80
            volumeMounts:
            - name: my-volume
              mountPath: /mount-path
          volumes:
          - name: my-volume
            persistentVolumeClaim:
              claimName: block-storage-pvc
    
  5. 클러스터에 배치를 작성하십시오.

    kubectl apply -f deployment.yaml
    
  6. 배치가 Ready 상태가 될 때까지 기다리십시오. 다음 명령을 실행하여 배치 상태를 확인하십시오.

    kubectl get deployments
    

    출력 예

    NAME            READY   UP-TO-DATE   AVAILABLE   AGE
    my-deployment   1/1     1            1           3m19s
    
  7. 팟(Pod)을 나열하고 my-deployment 팟(Pod)이 실행 중인지 확인하십시오.

    kubectl get pods
    

    출력 예

    NAME                            READY   STATUS    RESTARTS   AGE
    my-deployment-ccdf87dfb-vzn95   1/1     Running   0          5m27s
    
  8. 팟(Pod) 로그를 가져와 시간소인이 기록되었는지 확인하십시오.

    kubectl logs
    

    출력 예

    2022-01-21 14:18:59
    

Block Storage for Classic를 사용하는 배치를 작성했습니다. 자세한 정보는 다음 링크를 참조하십시오.

클러스터에 IBM Cloud Block Storage for Classic 플러그인 설치

Helm 차트로 IBM Cloud Block Storage for Classic 플러그인을 설치하여 Block Storage for Classic에 대한 사전 정의된 스토리지 클래스를 설정하십시오. 이러한 스토리지 클래스를 사용하여 앱의 Block Storage for Classic를 프로비저닝하기 위한 PVC를 작성할 수 있습니다.

IBM Cloud Kubernetes Service 버전 1.24 이상을 실행하는 클래식 클러스터는 IBM Cloud Block Storage for Classic 플러그인을 설치할 필요가 없습니다. 드라이버 및 플러그인은 기본적으로 이 클러스터에 설치됩니다.

시작하기 전에: 계정에 로그인하십시오. If applicable, target the appropriate resource group. 클러스터에 대한 컨텍스트를 설정하십시오.

  1. 작업자 노드가 최신 보안 설정으로 작업자 노드를 실행하도록 부 버전에 대한 최신 패치를 적용하는지 확인하십시오. 또한 패치 버전은 작업자 노드의 루트 비밀번호가 갱신되었는지도 확인합니다.

    최근 90일 이내에 업데이터를 적용하거나 작업자 노드를 다시 로드하지 않은 경우 작업자 노드의 루트 비밀번호가 만료되고 스토리지 플러그인 설치에 실패할 수 있습니다.

    1. 작업자 노드의 현재 패치 버전을 나열하십시오.
        ibmcloud ks worker ls --cluster CLUSTER_NAME_OR_ID
        ```
        출력 예
        ```sh {: screen}
        OK
        ID                                                  Public IP        Private IP     Machine Type           State    Status   Zone    Version
        kube-dal10-crb1a23b456789ac1b20b2nc1e12b345ab-w26   169.xx.xxx.xxx    10.xxx.xx.xxx   b3c.4x16.encrypted     normal   Ready    dal10   1.35_1523*
        ```
        작업자 노드가 최신 패치 버전을 적용하지 않는 경우에는 CLI 출력의 `*`Version** 열에 별표(**)가 표시됩니다.
    
    2. [Kubernetes 버전 정보](/docs/containers?topic=containers-cs_versions) 를 검토하여 최신 변경사항을 찾으십시오.
    
    3. 작업자 노드를 다시 로드하여 최신 패치 버전을 적용하십시오. 워커 노드를 재로드하기 전에, [`ibmcloud ks worker reload` 명령어의](/docs/containers?topic=containers-kubernetes-service-cli#worker-reload-cli) 지침에 따라 워커 노드에서 실행 중인 모든 포드를 안전하게 재스케줄링하십시오. 다시 로드하는 중에 작업자 노드 머신은 최신 이미지로 업데이트되며 [작업자 노드의 외부에 저장](/docs/containers?topic=containers-storage-plan)되지 않은 경우 데이터가 삭제됨을 유념하십시오.
    
    
  2. 지시사항에 따라 로컬 머신에 Helm 버전 3 클라이언트를 설치하십시오.

  3. IBM Cloud 플러그인을 사용할 클러스터에 IBM Cloud Block Storage for Classic Helm 차트 저장소를 추가하십시오.

    IBM Cloud 계정에서 VRF서비스 엔드포인트를 활성화한 경우, 비공개 IBM Cloud Helm 저장소를 사용하여 이미지 가져오기 트래픽을 비공개 네트워크 내에서 처리할 수 있습니다. 계정에서 VRF 또는 서비스 엔드포인트를 사용으로 설정할 수 없으면 공용 레지스트리 도메인 helm repo add iks-charts https://icr.io/helm/iks-charts를 사용하십시오.

    helm repo add iks-charts https://icr.io/helm/iks-charts
    
  4. Helm 저장소를 업데이트하여 이 저장소에 있는 모든 Helm 차트의 최신 버전을 검색하십시오.

    helm repo update
    
  5. IBM Cloud Block Storage for Classic 플러그인을 설치하고 설치에 이름을 지정하십시오(예: block-storage-plugin). 플러그인을 설치하면 사전 정의된 블록 스토리지 클래스가 클러스터에 추가됩니다.

    helm install <name> iks-charts/ibmcloud-block-storage-plugin -n <namespace>
    

    출력 예

    NAME:   <name>
    LAST DEPLOYED: Wed Apr 18 10:02:55 2018
    NAMESPACE: default
    STATUS: DEPLOYED
    RESOURCES:
    ==> v1beta1/DaemonSet
    NAME                           DESIRED  CURRENT  READY  UP-TO-DATE  AVAILABLE  NODE SELECTOR  AGE
    ibmcloud-block-storage-driver  0        0        0      0           0          <none>         0s
    ==> v1beta1/Deployment
    NAME                           DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
    ibmcloud-block-storage-plugin  1        0        0           0          0s
    ==> v1/StorageClass
    NAME                      PROVISIONER        AGE
    ibmc-block-bronze         ibm.io/ibmc-block  0s
    ibmc-block-custom         ibm.io/ibmc-block  0s
    ibmc-block-gold           ibm.io/ibmc-block  0s
    ibmc-block-retain-bronze  ibm.io/ibmc-block  0s
    ibmc-block-retain-custom  ibm.io/ibmc-block  0s
    ibmc-block-retain-gold    ibm.io/ibmc-block  0s
    ibmc-block-retain-silver  ibm.io/ibmc-block  0s
    ibmc-block-silver         ibm.io/ibmc-block  0s
    ==> v1/ServiceAccount
    NAME                           SECRETS  AGE
    ibmcloud-block-storage-plugin  1        0s
    ==> v1beta1/ClusterRole
    NAME                           AGE
    ibmcloud-block-storage-plugin  0s
    ==> v1beta1/ClusterRoleBinding
    NAME                           AGE
    ibmcloud-block-storage-plugin  0s
    NOTES:
    Thank you for installing: ibmcloud-block-storage-plugin.   Your release is named: <name>
    
  6. 설치를 확인하십시오.

    kubectl get pod -n <namespace> | grep block
    

    출력 예

    ibmcloud-block-storage-driver-kh4mt                              1/1       Running   0          27d       10.118.98.19   10.118.98.19
    ibmcloud-block-storage-plugin-58c5f9dc86-pbl4t                   1/1       Running   0          14d       172.21.0.204   10.118.98.19
    

    하나의 ibmcloud-block-storage-plugin 팟(Pod)과 하나 이상의 ibmcloud-block-storage-driver 팟(Pod)이 표시되면 설치에 성공한 것입니다. ibmcloud-block-storage-driver 팟(Pod)의 수는 클러스터에 있는 작업자 노드의 수와 동일합니다. 모든 팟(Pod)이 실행 중(Running) 상태여야 합니다.

  7. Block Storage for Classic에 대한 스토리지 클래스가 클러스터에 추가되었는지 확인하십시오.

    kubectl get sc | grep block
    

    출력 예

    ibmc-block-bronze                      ibm.io/ibmc-block   Delete          Immediate           true                   148m
    ibmc-block-custom                      ibm.io/ibmc-block   Delete          Immediate           true                   148m
    ibmc-block-gold                        ibm.io/ibmc-block   Delete          Immediate           true                   148m
    ibmc-block-retain-bronze               ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-retain-custom               ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-retain-gold                 ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-retain-silver               ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-silver                      ibm.io/ibmc-block   Delete          Immediate           true                   148m
    
  8. 블록 스토리지를 프로비저닝할 모든 클러스터에 대해 이러한 단계를 반복하십시오.

이제 앱을 위한 블록 스토리지를 프로비저닝하는 데 필요한 PVC의 작성을 진행할 수 있습니다.

IBM Cloud Block Storage 플러그인 업데이트

기존 IBM Cloud Block Storage 플러그인을 최신 버전으로 업그레이드할 수 있습니다.

시작하기 전에: 계정에 로그인하십시오. If applicable, target the appropriate resource group. 클러스터에 대한 컨텍스트를 설정하십시오.

  1. Helm 저장소를 업데이트하여 이 저장소에 있는 모든 Helm 차트의 최신 버전을 검색하십시오.

    helm repo update
    
  2. 선택사항: 최신 Helm 차트를 로컬 머신에 다운로드하십시오. 그런 다음, 패키지의 압축을 풀고 release.md 파일을 검토하여 최신 릴리스 정보를 찾으십시오.

    helm pull iks-charts/ibmcloud-block-storage-plugin --untar
    
  3. 클러스터에 설치한 블록 스토리지 Helm 차트의 릴리스 이름 네임스페이스를 찾으십시오.

    helm ls -A
    

    출력 예

    NAME            NAMESPACE   REVISION    UPDATED                             STATUS      CHART                                   APP VERSION
    block-plugin    default     1           2022-01-21 09:02:46.11622 -0500 EST deployed        bmcloud-block-storage-plugin-v2.1.5
    
  4. IBM Cloud Block Storage 플러그인을 최신 버전으로 업그레이드하십시오. 이전에 검색한 릴리스 이름 및 네임스페이스를 포함하십시오.

    helm upgrade RELEASE-NAME iks-charts/ibmcloud-block-storage-plugin -n NAMESPACE
    
  5. 선택사항: 플러그인을 업데이트하면 default 스토리지 클래스가 설정 해제됩니다. 기본 스토리지 클래스를 자체 선정한 스토리지 클래스로 설정하려면 다음 명령을 실행하십시오.

    kubectl patch storageclass STORAGECLASS -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
    

IBM Cloud Block Storage 플러그인 제거

클러스터에서 IBM Cloud Block Storage를 프로비저닝하고 사용하지 않으려면 Helm 차트를 설치 제거할 수 있습니다.

이 플러그인을 제거해도 기존 PVC, PV 또는 데이터는 제거되지 않습니다. 플러그인을 제거할 때는 모든 관련 팟(Pod) 및 디먼 세트만 클러스터에서 제거됩니다. 플러그인을 제거한 후에는 클러스터의 새 블록 스토리지를 프로비저닝하거나 기존 블록 스토리지 PVC 및 PV를 사용할 수 없습니다.

시작하기 전에:

플러그인을 제거하려면 다음을 수행하십시오.

  1. 클러스터에 설치한 블록 스토리지 Helm 차트의 릴리스 이름 및 네임스페이스를 찾으십시오.

    helm ls -A
    

    출력 예

    NAME            NAMESPACE   REVISION    UPDATED                             STATUS   CHART                                  APP VERSION
    block-plugin    default     1           2022-01-21 09:02:46.11622 -0500 EST deployed    ibmcloud-block-storage-plugin-v2.1.5
    
  2. IBM Cloud Block Storage 플러그인을 삭제하십시오.

    helm uninstall NAME -n kube-system
    
  3. 블록 스토리지 팟(Pod)이 제거되었는지 확인하십시오.

    kubectl get pods -n kube-system | grep block
    

    CLI 출력에 팟(Pod)이 표시되지 않으면 팟(Pod) 제거가 성공한 것입니다.

  4. 블록 스토리지 클래스가 제거되었는지 확인하십시오. CLI 출력에 스토리지 클래스가 표시되지 않으면 스토리지 클래스 제거가 성공한 것입니다.

    kubectl get sc | grep block
    

블록 스토리지 구성 결정

IBM Cloud Kubernetes Service는 특정 구성으로 블록 스토리지를 프로비저닝하는 데 사용할 수 있는 블록 스토리지의 사전 정의된 스토리지 클래스를 제공합니다.

모든 스토리지 클래스는 사용 가능한 크기, IOPS, 파일 시스템 및 보유 정책을 포함하여 사용자가 프로비저닝하는 블록 스토리지의 유형을 지정합니다.

데이터를 저장할 만한 충분한 용량을 보유하도록 반드시 스토리지 구성을 신중하게 선택하십시오. 스토리지 클래스를 사용하여 특정 유형의 스토리지를 프로비저닝한 후에는 스토리지 디바이스에 대한 유형 또는 보유 정책을 변경할 수 없습니다. 그러나 스토리지 용량과 성능을 늘리려는 경우에는 크기 및 IOPS를 변경할 수 있습니다. 스토리지의 유형 및 보존 정책을 변경하려면 새 스토리지 인스턴스를 생성하고, 기존 스토리지 인스턴스의 데이터를 새 인스턴스로 복사해야 합니다.

  1. IBM Cloud® Kubernetes Service에서 사용 가능한 스토리지 클래스를 나열하십시오.

    kubectl get sc | grep block
    

    출력 예

    ibmc-block-bronze                      ibm.io/ibmc-block   Delete          Immediate           true                   148m
    ibmc-block-custom                      ibm.io/ibmc-block   Delete          Immediate           true                   148m
    ibmc-block-gold                        ibm.io/ibmc-block   Delete          Immediate           true                   148m
    ibmc-block-retain-bronze               ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-retain-custom               ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-retain-gold                 ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-retain-silver               ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-silver                      ibm.io/ibmc-block   Delete          Immediate           true                   148m
    
  2. 스토리지 클래스의 구성을 검토하십시오.

    kubectl describe storageclass STORAGECLASS
    

    각 스토리지 클래스에 대한 자세한 정보는 스토리지 클래스 참조를 참조하십시오. 원하는 항목을 찾지 못한 경우에는 사용자 정의된 자체 스토리지 클래스의 작성을 고려하십시오. 시작하려면 사용자 정의된 스토리지 클래스 샘플을 체크아웃하십시오.

  3. 프로비저닝하고자 하는 블록 스토리지의 유형을 선택하십시오.

    • 브론즈, 실버 및 골드 스토리지 클래스: 이러한 스토리지 클래스는 Endurance 스토리지를 프로비저닝합니다. Endurance 스토리지를 사용하면 사전 정의된 IOPS 티어에서 스토리지의 크기(GB 단위)를 선택할 수 있습니다.
    • 사용자 정의 스토리지 클래스: 이 스토리지 클래스는 성능 스토리지를 프로비저닝합니다. 성능 스토리지를 사용하면 IOPS 및 스토리지의 크기에 대한 추가적인 제어가 가능합니다.
  4. 블록 스토리지의 크기와 IOPS를 선택하십시오. IOPS의 크기와 수는 스토리지의 속도에 대한 지표의 역할을 하는 IOPS(Input/output Operations Per Second) 수의 총계를 정의합니다. 스토리지에 총 IOPS가 많을 수록 읽기/쓰기 오퍼레이션의 처리 속도가 빨라집니다.

    • 브론즈, 실버 및 골드 스토리지 클래스: 이 스토리지 클래스는 기가바이트당 고정된 수의 IOPS가 제공되며 SSD 하드 디스크에 프로비저닝됩니다. IOPS 수의 총계는 선택하는 스토리지의 크기에 따라 다릅니다. 허용된 크기 범위 내에서 GB 단위의 정수를 선택할 수 있습니다(예: 20Gi, 256Gi 또는 11854Gi). IOPS 수의 총계를 판별하려면 IOPS를 선택된 크기와 곱해야 합니다. 예를 들어, GB당 4 IOPS가 제공되는 실버 스토리지 클래스에서 1000Gi 블록 스토리지 크기를 선택하는 경우에는 스토리지에 총 4000 IOPS가 있습니다.
    스토리지 클래스 크기 범위 및 GB당 IOPS의 표
    스토리지 클래스 GB당 IOPS 크기 범위(GB)
    브론즈 2IOPS/GB 20 - 12000Gi
    실버 4IOPS/GB 20 - 12000Gi
    골드 10 IOPS/GB 20 - 4000Gi
    • 사용자 정의 스토리지 클래스: 이 스토리지 클래스를 선택하면 원하는 IOPS와 크기에 대해 추가적인 제어가 가능합니다. 크기의 경우 허용되는 크기 범위 내에서 기가바이트 정수를 선택할 수 있습니다. 사용자가 선택하는 크기에 따라 사용 가능한 IOPS 범위가 결정됩니다. 지정된 범위 내에서 100의 배수인 IOPS를 선택할 수 있습니다. 선택하는 IOPS는 정적이며 스토리지의 크기에 따라 스케일링되지 않습니다. 예를 들어, 100 IOPS와 함께 40Gi를 선택하면 총 IOPS는 100을 유지합니다. IOPS 대 기가바이트 비율은 사용자를 위해 프로비저닝되는 하드 디스크의 유형도 결정합니다. 예를 들어, 100 IOPS의 500Gi를 사용 중이면 IOPS 대 기가바이트 비율은 0.2입니다. 비율이 0.3 이하인 스토리지는 SATA 하드 디스크에서 프로비저닝됩니다. 비율이 0.3을 초과하는 스토리지는 SSD 하드 디스크에서 프로비저닝됩니다.
    Table class size ranges and IOPS
    크기 범위(GB) 100의 배수로 된 IOPS 범위
    20 - 39Gi 100 - 1000IOPS
    40 - 79Gi 100 - 2000IOPS
    80 - 99Gi 100 - 4000IOPS
    100 - 499Gi 100 - 6000IOPS
    500 - 999Gi 100 - 10000IOPS
    1000 - 1999Gi 100 - 20000IOPS
    2000 - 2999Gi 200 - 40000IOPS
    3000 - 3999Gi 200 - 48000IOPS
    4000 - 7999Gi 300 - 48000IOPS
    8000 - 9999Gi 500 - 48000IOPS
    10000 - 12000Gi 1000 - 48000IOPS
  5. 클러스터 또는 지속적 볼륨 청구(PVC)가 삭제된 후에 데이터를 보존하고자 하는지를 선택하십시오.

    • 데이터를 보존하려면 retain 스토리지 클래스를 선택하십시오. PVC를 삭제하면 PVC만 삭제됩니다. PV, IBM Cloud 인프라 계정의 실제 스토리지 디바이스 및 데이터는 여전히 존재합니다. 스토리지를 재확보하고 이를 클러스터에서 다시 사용하려면 PV를 제거하고 기존 블록 스토리지 사용의 단계를 따라야 합니다.
    • PVC를 삭제할 때 PV, 데이터 및 실제 블록 스토리지 디바이스가 삭제되도록 하려면 retain 없이 스토리지 클래스를 선택하십시오.
  6. 시간별 또는 월별로 청구되기를 원하는지 선택하십시오. 기본 설정은 시간별 청구입니다.

Block Storage for Classic의 암호화 설정

Block Storage for Classic를 사용하여 IBM Key Protect에 대한 암호화를 설정할 수 있습니다.

다음 예에서는 Key Protect 및 클러스터에 필요한 액세스 역할로 서비스 ID를 작성하는 방법에 대해 설명합니다. 이 서비스 ID의 인증 정보는 Block Storage for Classic 볼륨에 대한 암호화를 사용으로 설정하는 데 사용됩니다.

클러스터에 대한 뷰어 플랫폼 액세스 역할 및 작성자 서비스 액세스 역할을 비롯하여 Key Protect 인스턴스에 대한 독자 서비스 역할이 있으면 개인용 API 키를 사용하는 Kubernetes 시크릿을 작성하여 암호화를 사용으로 설정할 수 있습니다.

계정에 로그인하십시오. If applicable, target the appropriate resource group. 클러스터에 대한 컨텍스트를 설정하십시오.

  1. Key Protect 인스턴스를 암호화하기 위해 사용하는 자체 루트 키를 사용할 수 있도록 Block Storage for Classic에 대한 편집자 플랫폼 액세스 역할과 작성자 서비스 액세스 역할이 지정되었는지 확인하십시오. IAM 콘솔 에서 IAM 액세스 역할을 확인할 수 있습니다. IAM 역할에 대한 자세한 정보는 IAM 액세스를 참조하십시오.

  2. Key Protect 인스턴스가 없는 경우 이를 프로비저닝하십시오.

  3. 루트 키를 작성하십시오. 기본적으로 루트 키는 만료 날짜 없이 작성됩니다.

  4. IAM 서비스 ID를 작성하십시오. <service_ID_name>을 서비스 ID에 지정할 이름으로 대체하십시오. 이 서비스 ID는 Key Protect 볼륨에서 Block Storage for Classic 인스턴스에 액세스하는 데 사용됩니다.

    ibmcloud iam service-id-create <service_ID_name>
    

    출력 예

    OK
    Service ID test-id is created successfully
    ID            ServiceId-a1a11111-bb11-1111-a11b-1111111a11ba   
    Name          test-id   
    Description      
    CRN           crn:v1:bluemix:public:iam-identity::a/1a1111aa2b11111aaa1a1111aa2aa111::serviceid:ServiceId-a1a11111-bb11-1111-a11b-1111111a11bb   
    Version       1-bb11aa11a0aa1a11a011a1aaaa11a1bb   
    Locked        false
    
  5. 서비스 ID에 대한 API 키를 작성하십시오. <api-key-name>을 API 키의 이름으로 대체하고 <service_ID_name>을 작성한 서비스 ID의 이름으로 대체하십시오. 나중에 검색할 수 없으므로 API 키를 저장해야 합니다. 이 API는 이후 단계에서 클러스터의 Kubernetes 시크릿에 저장됩니다.

    ibmcloud iam service-api-key-create <api_key_name> <service_ID_name>
    
  6. 계정에서 IAM 사용 서비스의 목록을 검색하고 작성한 Key Protect 인스턴스의 이름을 기록해 두십시오.

    ibmcloud resource service-instances
    
  7. Key Protect 인스턴스의 GUID를 검색하십시오. ID는 서비스 ID에 대한 IAM 서비스 정책을 작성하는 데 사용됩니다.

    ibmcloud resource service-instance "<instance_name>" | grep GUID
    
  8. IAM 서비스 정책을 작성하여 Key Protect 인스턴스에 서비스 ID 액세스 권한을 부여하십시오. 다음 명령은 Key Protect 인스턴스에 Reader 액세스 권한을 부여합니다. 독자 액세스 역할은 서비스 ID가 Key Protect 키를 검색해야 하는 최소 서비스 액세스 역할입니다. 자세한 정보는 Key Protect에 대한 사용자 액세스 관리를 참조하십시오.

    ibmcloud iam service-policy-create <service_ID_name> --roles Reader --service-name kms --service-instance <service_instance_GUID>
    
  9. 다른 IAM 서비스 액세스 정책을 작성하여 서비스 ID 액세스 권한을 클러스터에 제공하십시오. 다음 명령은 클러스터에 대한 서비스 ID에 뷰어 플랫폼 액세스 역할 및 작성자 서비스 액세스 역할을 부여합니다. ibmcloud ks cluster get <cluster_name>을 실행하여 클러스터 ID를 검색할 수 있습니다.

    ibmcloud iam service-policy-create <service_ID_name> --roles Writer,Viewer --service-name containers-kubernetes --service-instance <cluster_ID>
    
  10. 이미 ibmcloud-block-storage-plugin Helm 차트를 설치한 경우 Helm 차트를 제거한 후 새 버전을 설치해야 합니다.

    Helm을 사용하지 않고 플러그인을 설치한 경우 새 버전을 설치하기 전에 블록 스토리지 플러그인 배치 및 연관된 모든 리소스를 수동으로 제거해야 합니다.

    helm uninstall <name> <namespace>
    
  11. ibmcloud-block-storage-plugin Helm 차트를 설치하십시오.

    helm install <name> iks-charts/ibmcloud-block-storage-plugin
    
  12. ibm-block-secrets 네임스페이스를 작성하십시오.

    kubectl create ns ibm-block-secrets
    
  13. 블록 스토리지 플러그인의 ibm-block-secrets 네임스페이스에서 역할 바인딩을 작성하십시오.

    kubectl create rolebinding ibmcloud-block-storage-plugin-byok --clusterrole=ibmcloud-block-storage-plugin-byok --serviceaccount=kube-system:ibmcloud-block-storage-plugin --group system:nodes --namespace=ibm-block-secrets
    
  14. Key Protect 서비스 인스턴스에서 루트 키에 액세스하기 위한 인증 정보가 포함된 secret.yaml이라는 Kubernetes 시크릿을 작성하십시오.

    1. 시크릿에 대한 구성 파일을 작성하십시오.
        apiVersion: v1
        kind: Secret
        metadata:
          labels:
            kmsConfig: kpc-secretLabel
          name: <secret_name> # Enter a name for your secret. Example: my_secret
          namespace: <namespace> # Enter the name of the namespace where you want to create the secret. The secret must be in same namespace where your app is deployed. Example: default
        stringData:
        config: |-
            {
                "api_key":"<service_id_api_key>", # Enter the API key for the service ID that you created. Example: "AA1aAAaA1a21AAaA1aAAaAa-AA-1AAaaA1aA1aAaaaAA"
                "iam_endpoint":"https://iam.cloud.ibm.com",
                "key_protect_endpoint":"https://<region>.kms.cloud.ibm.com", # Example: "https://us-east.kms.cloud.ibm.com"
                "root_key_crn":"<rook_key_crn>", # Example: "crn:v1:bluemix:public:kms:<region>:a/1ab011ab2b11111aaa1a1111aa1aa111:11aa111a-1111-11a1-a111-a11a111aa111:key:11a11111-1a1a-111a-111a-11111a1a1aa1",
                "version":""
            }
        type: ibm.io/kms-config
        ```
        `stringData.config.key_protect_endpoint`
        :   Key Protect 인스턴스의 지역적 엔드포인트를 입력하십시오. Key Protect 엔드포인트의 목록은 [지역  엔드포인트](/docs/key-protect?topic=key-protect-regions)를 참조하십시오.
    
        `stringData.config.root_key_crn`
        :   작성한 루트 키의 CRN을 입력하십시오. 루트  CRN을 검색하려면 다음 단계를 완료하십시오.
            1. [IBM Cloud 콘솔](https://cloud.ibm.com/resources){: external}에서 리소스 목록으로 이동하십시오.
            2. **서비스**를 클릭한  Key Protect 인스턴스를 클릭하십시오.
            3. **조치 메뉴**에서 루트 키를 찾은 다음 **CRN 보기**를 클릭하십시오.
            4. CRN을 복사하려면 **복사** 단추를 클릭하십시오.
    
    1. 클러스터의 시크릿을 작성하십시오.
    
    ```sh {: pre}
        kubectl apply -f secret.yaml
        ```
    1. 시크릿이 작성되었는지 확인하십시오.
    
    ```sh {: pre}
        kubectl get secrets
        ```
    
  15. 다음 옵션 중 하나를 선택하여 루트 키로 데이터를 암호화하는 Block Storage for Classic 인스턴스를 생성하십시오.

사용자 정의 스토리지 클래스를 사용하여 볼륨 데이터 암호화하기

먼저 자체 스토리지 클래스를 생성한 다음, 암호화된 볼륨을 사용하는 앱을 배포할 수 있습니다.

다음 단계에서는 구성이 동일한 여러 개의 암호화된 블록 스토리지 인스턴스를 작성하기 위해 사용할 수 있는 암호화된 사용자 정의 스토리지 클래스를 작성하는 방법에 대해 설명합니다. IBM 제공 스토리지 클래스 중 하나를 사용하여 암호화된 PVC를 작성하려면 PVC에서 직접 Key Protect 인증 정보를 참조하여 이를 수행할 수 있습니다.

  1. 스토리지 구성을 결정하십시오.

  2. IBM 에서 제공하는 스토리지 클래스 중 하나를 기반으로, 암호화된 블록 스토리지 인스턴스를 프로비저닝하는 자체 스토리지 클래스를 생성하십시오. kubectl get sc <storageclass_name> -o yaml을 실행하여 스토리지 클래스의 세부사항을 검색할 수 있습니다. 다음 예는 ibmc-block-retain-bronze 스토리지 클래스를 기반으로 합니다.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: <name> # Enter the name of the storage class. Example: my_custom_storageclass
    parameters:
      billingType: hourly
      classVersion: "2"
      fsType: ext4
      iopsPerGB: "2"
      sizeRange: '[20-12000]Gi'
      type: Endurance
      encrypted: "true" # Enter "true" to enable encryption.
      encryptionKeySecret: <secret_name> # # #nter the name of the secret that you created earlier.Example: my_secret
      encryptionKeyNamespace: <namespace> # # #nter the namespace where you created your secret. Example: default
    provisioner: ibm.io/ibmc-block
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    
  3. 클러스터에 스토리지 클래스를 작성하십시오.

    kubectl apply -f storageclass.yaml
    
  4. 자체 스토리지 클래스를 사용하여 PVC를 생성함으로써 앱에 ‘ Block Storage for Classic ’를 추가하세요.

  5. Block Storage for Classic 볼륨의 암호화를 확인하십시오.

Block Storage for Classic 시크릿을 참조하는 PVC 작성

Block Storage for Classic 인증 정보를 보유한 Kubernetes 시크릿을 지정하는 PVC를 작성하여 암호화된 Key Protect를 프로비저닝할 수 있습니다.

다음 단계에서는 암호화된 Key Protect 인스턴스를 작성하기 위해 PVC에서 Block Storage for Classic 인증 정보를 참조할 수 있는 방법을 보여줍니다. 각 PVC에서 Key Protect 인증 정보를 지정하지 않고 여러 개의 암호화된 볼륨을 작성하기 위해 암호화된 사용자 정의 스토리지 클래스를 작성할 수 있습니다.

  1. 제공된Block Storage for Classic 스토리지 클래스를 검토하여 앱 요구사항을 가장 잘 충족하는 스토리지 클래스를 판별하십시오. 제공된 스토리지 클래스가 앱 요구사항을 충족시키지 못하는 경우에는 고유한 사용자 정의된 스토리지 클래스를 작성할 수 있습니다.

  2. Key Protect 서비스 인증 정보를 저장한 Kubernetes 시크릿을 참조하는 PVC 구성 파일을 pvc.yaml이라는 이름으로 작성하십시오. 이 시크릿을 작성하려면 Block Storage for Classic의 암호화 설정을 참조하십시오.

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: <pvc_name> # Enter a name for your PVC.
      annotations:
      volume.beta.kubernetes.io/storage-class: "<storage_class>" # Enter a storage class. To see a list of storageclasses run `kubectl get storageclasses`.
      labels:
        encrypted: "true"
        encryptionKeyNamespace: <namespace> # Enter the namespace where your secret was created.
        encryptionKeySecret: <secret_name> # Enter the name of the secret you created.
    spec:
      accessModes:
        - ReadWriteOnce
        resources:
        requests:
            storage: 20Gi
    
  3. 클러스터에 PVC를 작성하십시오.

    kubectl apply -f pvc.yaml
    
  4. PVC의 상태를 확인하십시오.

    kubectl get pvc
    
  5. PVC가 바인드할 때까지 기다린 후 PVC를 사용하는 배치를 작성하십시오.

  6. Block Storage for Classic 볼륨의 암호화를 확인하십시오.

Block Storage for Classic 볼륨의 암호화 확인

볼륨 마운트 경로를 확인하여 볼륨의 암호화를 확인할 수 있습니다.

  1. 앱 팟(Pod)에 로그인하십시오. <pod_name>을 암호화된 Block Storage for Classic 볼륨을 마운트하는 팟(Pod)의 이름으로 대체하십시오.

    kubectl exec <pod_name> -it bash
    
  2. 팟(Pod)의 파일 시스템을 나열하십시오.

    df -h
    
  3. 암호화된 Block Storage for Classic 볼륨에 대한 파일 시스템 경로를 검토하십시오.

    • 암호화된 볼륨의 경로 구조는 /dev/mapper/<pvc-ID_encrypted>입니다. 이 예에서 암호화된 볼륨은 팟(Pod)의 /test 파일 경로에 마운트됩니다.
        Filesystem                                            Size  Used Avail Use% Mounted on
        overlay                                                98G  8.2G   85G   9% /
        tmpfs                                                  64M     0   64M   0% /dev
        tmpfs                                                 2.0G     0  2.0G   0% /sys/fs/cgroup
        /dev/mapper/pvc-a011a111-1111-1111-111a-aaa1a1111a11_encrypted   20G   45M   20G   1% /test
        ```
    * 암호화되지 않은 볼륨의 경로 구조는 `dev/mapper/<random_string>`입니다.
    
    ```sh {: screen}
        Filesystem                                     Size  Used Avail Use% Mounted on
        overlay                                         98G   16G   78G  17% /
        tmpfs                                           64M     0   64M   0% /dev
        tmpfs                                          7.9G     0  7.9G   0% /sys/fs/cgroup
        /dev/mapper/3600a09803830476e733f4e477370716e   24G   45M   24G   1% /test
        ```
    

Kubernetes 시크릿을 삭제하더라도 볼륨 데이터에 대한 액세스 권한은 취소되지 않습니다. 팟(Pod) 전용 배치를 작성한 경우 팟(Pod)을 삭제해야 합니다. 배치를 작성한 경우 배치를 삭제해야 합니다.

앱에 블록 스토리지 추가

클러스터에 블록 스토리지를 동적으로 프로비저닝하기 위해 영구 볼륨 클레임(PVC)을 생성합니다. 동적 프로비저닝은 일치하는 지속적 볼륨(PV)을 자동으로 작성하고 IBM Cloud 인프라 계정에서 실제 스토리지 디바이스를 주문합니다.

블록 스토리지는 ReadWriteOnce 액세스 모드로 제공됩니다. 한 번에 클러스터에 있는 하나의 작업자 노드의 하나의 팟(Pod)에만 마운트할 수 있습니다.

시작하기 전에:

블록 스토리지를 Stateful 세트에 배치하려고 하십니까? 자세한 정보는 Stateful 세트에서의 블록 스토리지 사용을 참조하십시오.

블록 스토리지를 추가하려면 다음을 수행하십시오.

  1. 지속적 볼륨 클레임(PVC)을 정의하는 구성 파일을 작성하고 이 구성을 .yaml 파일로 저장하십시오.

    • 브론즈, 실버, 골드 스토리지 클래스 예: 다음 .yaml 파일은 "ibmc-block-silver" 스토리지 클래스 이름이 block-storage-pvc이고 시간별로 청구되며 GB 크기가 24Gi인 청구를 작성합니다.
        apiVersion: v1
        kind: PersistentVolumeClaim
        metadata:
          name: block-storage-pvc
          labels:
            billingType: "hourly"
            region: us-south
            zone: dal13
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 24Gi
          storageClassName: ibmc-block-silver
        ```
    -  **사용자 고유의 스토리지 클래스 사용 예**:
            다음 `.yaml` 파일은 스토리지 클래스 `ibmc-block-retain-custom`의 이름이 `block-storage-pvc`이고 시간별로 청구되며 GB 크기가 `45Gi`이고 IOPS가 `"300"`인 청구를 작성합니다.
    
    ```yaml {: codeblock}
        apiVersion: v1
        kind: PersistentVolumeClaim
        metadata:
          name: block-storage-pvc
          labels:
            billingType: "hourly"
            region: us-south
            zone: dal13
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 45Gi
              iops: "300"
          storageClassName: ibmc-block-retain-custom
        ```
    
        `name`
        :   PVC의 이름을 입력하십시오.
    
        `billingType`
        :   metadata labels 섹션에서, 스토리지 요금이 계산되는 빈도를 "monthly" 또는 "hourly" 지정하십시오. 기본값은 "시간별"입니다.
    
        `region`
        :   metadata labels 섹션에서, 블록 스토리지를 프로비저닝할 지역을 지정하십시오. 지역을 지정하는 경우에는 구역도 지정해야 합니다. 지역을 지정하지 않거나 지정된 지역을 찾을  없는 경우, 스토리지는 클러스터와 동일한 지역에 작성됩니다.  옵션은 IBM Cloud Block Storage 플러그인 버전 1.0.1 이상에서만 지원됩니다. 이전 플러그인 버전의 경우, 다중 구역 클러스터를 보유 중이면 모든 구역 간에 볼륨 요청의 균등한 밸런스를 유지하기 위해 스토리지가 프로비저닝되는 구역이 라운드 로빈 기반으로 선택됩니다. 스토리지에 대한 구역을 지정하려면 우선 [사용자 정의된 스토리지 클래스](#block_multizone_yaml)를 작성할  있습니다. 그리고 사용자 정의된 스토리지 클래스로 PVC를 작성하십시오.
    
        `zone`
        :   metadata labels 섹션에서, 블록 스토리지를 프로비저닝할 구역을 지정하십시오. 구역을 지정하는 경우에는 지역도 지정해야 합니다. 구역을 지정하지 않거나 지정된 구역을 다중 구역 클러스터에서 찾을  없으면 구역이 라운드 로빈 기반으로 선택됩니다.  옵션은 IBM Cloud Block Storage 플러그인 버전 1.0.1 이상에서만 지원됩니다. 이전 플러그인 버전의 경우, 다중 구역 클러스터를 보유 중이면 모든 구역 간에 볼륨 요청의 균등한 밸런스를 유지하기 위해 스토리지가 프로비저닝되는 구역이 라운드 로빈 기반으로 선택됩니다. 스토리지에 대한 구역을 지정하려면 우선 [사용자 정의된 스토리지 클래스](#block_multizone_yaml)를 작성할  있습니다. 그리고 사용자 정의된 스토리지 클래스로 PVC를 작성하십시오.
    
        `storage`
        :   spec resources requests 섹션에서, 블록 스토리지의 크기를 기가바이트(Gi) 단위로 입력하십시오. 스토리지가 프로비저닝된 후에는 블록 스토리지의 크기를 변경할  없습니다. 저장할 데이터의 크기와 일치하도록 크기를 지정해야 합니다.
    
        `iops`
        :    옵션은 사용자 정의 스토리지 클래스(`ibmc-block-custom / ibmc-block-retain-custom`)에서만 사용할  있습니다. 사양 리소스 요청 섹션에서 허용 범위 내에서 100 배수가 되도록 스토리지의  IOPS를 지정하십시오. 나열된 것과 이외의 IOPS를 선택하면 IOPS가 올림됩니다.
    
        `storageClassName`
        :   spec 섹션에서, 블록 스토리지를 프로비저닝하는  사용할 스토리지 클래스의 이름을 입력하십시오. [IBM 제공 스토리지 클래스](#block_storageclass_reference)  하나를 사용하거나 [ 사용자 고유의 스토리지 클래스를 작성](#block_custom_storageclass)하도록 선택할  있습니다. 스토리지 클래스를 지정하지 않으면 기본 스토리지 클래스 `ibmc-file-bronze`를 사용하여 PV가 작성됩니다.
    
    사용자 정의된 스토리지 클래스를 사용하려면 해당 스토리지 클래스 이름, 올바른 IOPS  크기를 사용하여 PVC를 작성하십시오.
    {: tip}
    
    
  2. PVC를 작성하십시오.

    kubectl apply -f block-storage.yaml
    
  3. PVC가 작성되고 PV에 바인딩되는지 확인하십시오. 이 프로세스에는 몇 분 정도 소요될 수 있습니다.

    kubectl get pvc
    

    출력 예

    NAME                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE
    block-storage-pvc              Bound    pvc-1aa1aaaa-11a1-48d1-ab11-11b11111f3bc   45Gi       RWO            ibmc-block-silver   150m
    
  4. PV를 배치에 마운트하려면 구성 .yaml 파일을 작성하고 PV를 바인드하는 PVC를 지정하십시오.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: <deployment_name>
      labels:
        app: <deployment_label>
    spec:
      selector:
        matchLabels:
          app: <app_name>
      template:
        metadata:
          labels:
            app: <app_name>
        spec:
          containers:
          - image: <image_name>
            name: <container_name>
            volumeMounts:
            - name: <volume_name>
              mountPath: /<file_path>
          volumes:
          - name: <volume_name>
            persistentVolumeClaim:
              claimName: <pvc_name>
    
    app
    metadata에서, 배치의 레이블을 입력하십시오.
    matchLabels.applabels.app
    spec selector 및 template metadata에서, 앱의 레이블을 입력하십시오.
    image
    사용할 컨테이너 이미지의 이름입니다. IBM Cloud Container Registry 계정에서 사용 가능한 이미지를 나열하려면 ibmcloud cr image-list를 실행하십시오.
    name
    클러스터에 배치하려는 컨테이너의 이름입니다.
    mountPath
    container volumeMounts 섹션에서, 컨테이너 내에서 볼륨이 마운트되는 디렉토리의 절대 경로를 입력하십시오. 마운트 경로에 기록된 데이터는 실제 블록 스토리지 인스턴스의 루트 디렉토리 아래에 저장됩니다. 서로 다른 앱 간에 볼륨을 공유하려면, 각 앱에 대해 볼륨 하위 경로를 지정할 수 있습니다.
    name
    container volumeMounts 섹션에서, 팟(Pod)에 마운트할 볼륨의 이름을 입력하십시오.
    name
    volumes 섹션에서, 팟(Pod)에 마운트할 볼륨의 이름을 입력하십시오. 일반적으로 이 이름은 volumeMounts/name과 동일합니다.
    claimName
    볼륨의 지속적 볼륨 청구 섹션에 사용할 PV를 바인드하는 PVC의 이름을 입력하십시오.
  5. 배치를 작성하십시오.

    kubectl apply -f <local_yaml_path>
    
  6. PV가 성공적으로 마운트되었는지 확인하십시오.

    kubectl describe deployment <deployment_name>
    

    마운트 지점은 Volume Mounts 필드에 있고 볼륨은 Volumes 필드에 있습니다.

    Volume Mounts:
        /var/run/secrets/kubernetes.io/serviceaccount from default-token-tqp61 (ro)
        /volumemount from myvol (rw)
    ...
    Volumes:
    myvol:
        Type:    PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
        ClaimName:    block-storage-pvc
        ReadOnly:    false
    

클러스터의 기존 블록 스토리지 사용

클러스터에서 사용하고자 하는 기존 물리적 스토리지 장치가 있는 경우, PV와 PVC를 수동으로 생성하여 스토리지를 정적으로 프로비저닝할 수 있습니다.

기존 스토리지를 앱에 마운트하려면 우선 PV에 대한 모든 필수 정보를 검색해야 합니다.

기존 블록 스토리지의 정보 검색

  1. IBM Cloud 인프라 계정의 API 키를 검색하거나 생성하십시오.

    1. IBM Cloud 인프라 포털 에 로그인하십시오.
    2. 계정을 선택한 후 사용자, 사용자 목록을 선택하십시오.
    3. 자신의 사용자 ID를 찾으십시오.
    4. API 키 열에서 생성을 클릭하여 API 키를 생성하거나 보기를 클릭하여 기존 API 키를 보십시오.
  2. IBM Cloud 인프라 계정의 API 사용자 이름을 검색하십시오.

    1. 사용자 목록 메뉴에서 자신의 사용자 ID를 선택하십시오.
    2. API 액세스 정보 섹션에서 API 사용자 이름을 찾으십시오.
  3. IBM Cloud 인프라 CLI 플러그인에 로그인하십시오.

    ibmcloud sl init
    
  4. IBM Cloud 인프라 계정의 사용자 이름 및 API 키를 사용하여 인증하도록 선택하십시오.

  5. 이전 단계에서 검색한 사용자 이름 및 API 키를 입력하십시오.

  6. 사용 가능한 블록 스토리지 디바이스를 나열하십시오.

    ibmcloud sl block volume-list
    

    출력 예

    id          username              datacenter   storage_type                capacity_gb   bytes_used   lunId   
    11111111    IBM01AAA1111111-1     wdc07        endurance_block_storage     45            -            2      
    
  7. 볼륨 세부사항을 검색하십시오. <volume_ID>를 6단계에서 검색한 블록 스토리지 볼륨의 ID로 대체하십시오.

    ibmcloud sl block volume-detail <volume_ID>
    

    출력 예

    ID                         11111111
    User name                  IBM01AAA1111111-1   
    Type                       endurance_block_storage   
    Capacity (GB)              45   
    LUN Id                     2   
    IOPs                       100   
    Datacenter                 wdc07   
    Target IP                  10.XXX.XX.XXX  
    # of Active Transactions   0   
    Replicant Count            0
    
  8. 클러스터에 마운트할 블록 스토리지 디바이스의 ID, Capacity, LUN Id, DatacenterTarget IP를 기록해 두십시오. 참고: 클러스터에 기존 스토리지를 마운트하려면 스토리지와 동일한 구역에 작업자 노드가 있어야 합니다. 작업자 노드의 구역을 확인하려면 ibmcloud ks worker ls --cluster <cluster_name_or_ID>를 실행하십시오.

지속적 볼륨(PV) 및 일치하는 지속적 볼륨 청구(PVC) 작성

  1. 선택사항: retain 스토리지 클래스로 프로비저닝한 스토리지가 있으면 PVC를 제거할 때 PV 및 실제 스토리지 디바이스가 제거되지 않습니다. 클러스터의 스토리지를 재사용하려면 우선 PV를 제거해야 합니다. 기존 PV를 나열하고 지속적 스토리지에 속하는 PV를 찾으십시오. PV는 released 상태입니다.

    kubectl get pv
    
  2. PV를 제거하십시오.

    kubectl delete pv <pv_name>
    
  3. PV가 제거되었는지 확인하십시오.

    kubectl get pv
    
  4. PV에 대한 구성 파일을 작성하십시오. 이전에 검색한 매개변수를 포함하십시오.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: "block-storage-pv" # Enter a name for your PV. For example, my-static-pv.
      labels:
         failure-domain.beta.kubernetes.io/region: "<region>" # Example us-east.
         failure-domain.beta.kubernetes.io/zone: "<zone>" # Example: wdc04. See /docs/containers?topic=containers-regions-and-zones#zones-sz
    spec:
      capacity:
        storage: "<storage>"
      accessModes:
        - ReadWriteOnce
      flexVolume:
        driver: "ibm/ibmc-block"
        fsType: "<fs_type>" # Enter ext or xfs
        options:
          "Lun": "<Lun_ID>"
          "TargetPortal": "<TargetPortal>"
          "VolumeID": "<VolumeID>"
          "volumeName": "block-storage-pv" # Enter the same value as your PV name from metadata.name
    
    name
    PV에 이름을 지정하십시오. 예를 들어, block-storage-pv입니다. 또한 spec.FlexVolume.options에 이 값을 volumeName으로 입력해야 합니다.
    labels
    이전에 검색한 지역 및 구역을 입력하십시오. 클러스터에서 스토리지를 마운트하려면 지속적 스토리지와 동일한 지역 및 구역에 작업자 노드가 최소한 하나 이상 있어야 합니다. 볼륨 세부사항을 검색하려면 ibmcloud sl block volume-list를 실행하여 볼륨 ID를 가져온 후 ibmcloud sl block volume-detail <volume_ID>를 실행하여 볼륨의 세부사항을 가져오십시오.
    region
    블록 스토리지가 있는 지역을 입력하십시오. 클러스터와 블록 스토리지는 동일한 지역에 있어야 합니다. 클러스터 위치를 찾으려면 ibmcloud ks cluster ls를 실행하십시오. 사용 가능한 지역 및 구역에 대한 자세한 정보는 지역 및 구역을 참조하십시오. 예: us-east.
    zone
    스토리지 볼륨이 있는 구역을 입력하십시오. 볼륨 세부사항을 검색하려면 ibmcloud sl block volume-list를 실행하여 볼륨 ID를 가져온 후 ibmcloud sl block volume-detail <volume_ID>를 실행하여 볼륨의 세부사항을 가져오십시오. 블록 스토리지를 클러스터에 연결하려면 연결하려는 볼륨과 동일한 구역에서 사용 가능한 작업자 노드가 있어야 합니다. 작업자 노드의 구역을 찾으려면 ibmcloud ks worker ls -c <cluster>를 실행하십시오. 예: wdc04.
    storage
    클러스터에 연결 기존 블록 스토리지 볼륨의 스토리지 크기를 입력하십시오. 이 스토리지 크기는 기가바이트 단위로 기록해야 합니다(예: 20Gi(20GB) 또는 1000Gi(1TB)). 볼륨 세부사항을 검색하려면 ibmcloud sl block volume-list를 실행하여 볼륨 ID를 가져온 후 ibmcloud sl block volume-detail <volume_ID>를 실행하여 볼륨의 세부사항을 가져오십시오.
    fsType
    기존 블록 스토리지에 대해 구성된 파일 시스템 유형을 입력하십시오. ext4 또는 xfs 중에서 선택하십시오. 이 옵션을 지정하지 않으면 기본적으로 PV가 ext4로 설정됩니다. 잘못된 fsType이 정의된 경우 PV 작성에 성공하지만 PV를 팟(Pod)에 마운트하는 데 실패합니다. 볼륨 세부사항을 검색하려면 ibmcloud sl block volume-list를 실행하여 볼륨 ID를 가져온 후 ibmcloud sl block volume-detail <volume_ID>를 실행하여 볼륨의 세부사항을 가져오십시오.
    Lun
    블록 스토리지 볼륨의 LUN ID를 입력하십시오. 볼륨 세부사항을 검색하려면 ibmcloud sl block volume-list를 실행하여 볼륨 ID를 가져온 후 ibmcloud sl block volume-detail <volume_ID>를 실행하여 볼륨의 세부사항을 가져오십시오.
    TargetPortal
    블록 스토리지의 IP 주소를 입력하십시오. TargetPortal 매개변수를 검색하려면 ibmcloud sl block volume-list를 실행하여 볼륨 ID를 가져온 후 ibmcloud sl block volume-detail <volume_ID>를 실행하고 출력에서 Target IP를 기록하십시오.
    VolumeId
    블록 스토리지의 ID를 입력하십시오. 볼륨 세부사항을 검색하려면 ibmcloud sl block volume-list를 실행하십시오.
    volumeName
    PV 이름과 동일한 값을 입력하십시오. 예를 들어, block-storage-pv입니다.
  5. 클러스터에 PV를 작성하십시오.

    kubectl apply -f pv.yaml
    
  6. PV가 작성되었는지 확인하십시오.

    kubectl get pv
    
  7. 다른 구성 파일을 작성하여 PVC를 작성하십시오. PVC가 이전에 작성한 PV와 일치하려면 storageaccessMode에 대해 동일한 값을 선택해야 합니다. storage-class 필드는 빈 문자열이어야 합니다. 이러한 필드 중에 PV와 일치하지 않는 것이 있는 경우에는 대신 새 PV가 자동으로 작성됩니다.

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: block-storage-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: "20Gi"
      storageClassName: ""
    
  8. PVC를 작성하십시오.

    kubectl apply -f static-pvc.yaml
    
  9. PVC가 작성되어 이전에 작성한 PV에 바인딩되었는지 확인하십시오. 이 프로세스에는 몇 분 정도 소요될 수 있습니다.

    kubectl describe pvc static-pvc
    

    출력 예

    Name:          static-pvc
    Namespace:     default
    StorageClass:  
    Status:        Bound
    
  10. 선택사항 다음 예제 팟(Pod) 구성 파일을 pod.yaml 파일로 저장하십시오.

    apiVersion: v1
    kind: Pod
    metadata:
      name: block-storage
      labels:
        app: block-storage
    spec:
      containers:
        - name: block-storage
          image: nginx
          command: ["/bin/sh"]
          args: ["-c", "while true; do date \"+%Y-%m-%d %H:%M:%S\"; sleep 3600; done"]
          workingDir: /home
          imagePullPolicy: Always
          ports:
            - containerPort: 80
          volumeMounts:
            - name: block-storage-pv
              mountPath: /home
      volumes:
        - name: block-storage-pv
          persistentVolumeClaim:
            claimName: block-storage-pvc
    
  11. 클러스터에서 팟(Pod)을 작성하십시오.

    kubectl create -f pod.yaml
    
  12. 팟(Pod)이 Running 상태가 된 후 로그를 가져오십시오.

    kubectl logs
    

    출력 예

    2022-01-21 16:11:00
    

PV를 작성하여 PVC에 바인딩했습니다. 그런 다음 블록 스토리지를 사용하는 앱을 배치했습니다. 이제 클러스터 사용자가 해당 배치에 PVC를 마운트하고 지속적 볼륨에서 읽기 및 쓰기를 시작할 수 있습니다.

Stateful 세트에서의 블록 스토리지 사용

데이터베이스와 같은 Stateful 앱이 있는 경우에는 앱의 데이터를 저장하기 위해 블록 스토리지를 사용하는 Stateful 세트를 작성할 수 있습니다. 또는, IBM Cloud DBaaS(Database-as-a-Service)를 사용하여 데이터를 클라우드에 저장할 수 있습니다.

스테이트풀 세트에 블록 스토리지를 추가할 때 주의해야 할 점은 무엇인가요?
Stateful 세트에 스토리지를 추가하려는 경우에는 Stateful 세트 YAML의 volumeClaimTemplates 섹션에 스토리지 구성을 지정합니다. volumeClaimTemplates는 PVC의 기반이며 프로비저닝할 블록 스토리지의 스토리지 클래스와 크기 또는 IOPS를 포함할 수 있습니다. 그러나 volumeClaimTemplates에 레이블을 포함하려는 경우 Kubernetes는 PVC를 작성할 때 이러한 레이블을 포함하지 않습니다. 대신 사용자가 직접 Stateful 세트에 해당 레이블을 추가해야 합니다.

동시에 두 개의 Stateful 세트를 배치할 수는 없습니다. 한 Stateful 세트가 완전히 배치되기 전에 다른 세트를 작성하려 시도하면 Stateful 세트 배치 작업에서 예기치 않은 결과가 발생할 수 있습니다.

특정 존에서 스테이트풀 세트를 생성하려면 어떻게 해야 하나요?
다중 구역 클러스터에서는 Stateful 세트 YAML의 spec.selector.matchLabelsspec.template.metadata.labels 섹션에서 Stateful 세트를 작성할 구역 및 지역을 지정해야 합니다. 또는, 이러한 레이블을 사용자 정의된 스토리지 클래스에 추가하고 이 스토리지 클래스를 Stateful 세트의 volumeClaimTemplates 섹션에서 사용할 수 있습니다.
포드가 준비될 때까지 PV를 상태 유지형 포드에 바인딩하는 것을 미룰 수 있나요?
예, volumeBindingMode: WaitForFirstConsumer 필드를 포함하는 PVC에 대한 사용자 고유의 스토리지 클래스를 작성 할 수 있습니다.
스테이트풀 세트에 블록 스토리지를 추가하려면 어떤 방법이 있나요?
Stateful 세트를 작성할 때 자동으로 PVC를 작성하려는 경우에는 동적 프로비저닝을 사용하십시오. Stateful 세트에 대해 PVC를 사전 프로비저닝하거나 기존 PVC를 사용하도록 선택할 수도 있습니다.

Stateful 세트를 작성할 때 동적 프로비저닝을 사용하여 PVC 작성

Stateful 세트를 작성할 때 PVC를 자동으로 작성하려면 이 선택사항을 사용하십시오.

시작하기 전에: 계정에 로그인하십시오. If applicable, target the appropriate resource group. 클러스터에 대한 컨텍스트를 설정하십시오.

다음 단계를 완료하여 클러스터의 모든 기존 Stateful 세트가 완전히 배치되었는지 확인하십시오. 특정 Stateful 세트가 여전히 배치 중인 경우에는 Stateful 세트 작성을 시작할 수 없습니다. 예기치 않은 결과를 방지하려면 클러스터 내의 모든 Stateful 세트가 완전히 배치될 때까지 기다려야 합니다.

  1. 클러스터에 있는 기존 Stateful 세트를 나열하십시오.

    kubectl get statefulset --all-namespaces
    

    출력 예

    NAME              DESIRED   CURRENT   AGE
    mystatefulset     3         3         6s
    
  2. 각 Stateful 세트의 Pods Status를 보고 해당 Stateful 세트의 배치가 완료되었는지 확인하십시오.

    kubectl describe statefulset <statefulset_name>
    

    출력 예

    Name:               nginx
    Namespace:          default
    CreationTimestamp:  Fri, 05 Oct 2022 13:22:41 -0400
    Selector:           app=nginx,billingType=hourly,region=us-south,zone=dal10
    Labels:             app=nginx
    billingType=hourly
    region=us-south
    zone=dal10
    Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"apps/v1","kind":"StatefulSet","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"spec":{"podManagementPolicy":"Par..."
    Replicas:           3 desired | 3 total
    Pods Status:        0 Running / 3 Waiting / 0 Succeeded / 0 Failed
    Pod Template:
    Labels:  app=nginx
    billingType=hourly
    region=us-south
    zone=dal10
    ...
    

    CLI 출력의 Replicas 섹션이 Pods Status 섹션의 Running 팟(Pod) 수와 동일하면 Stateful 세트가 완전히 배치된 것입니다. Stateful 세트가 아직 완전히 배치되지 않은 경우에는 진행하기 전에 배치가 완료되기를 기다리십시오.

  3. Stateful 세트에 대한 구성 파일과 이 Stateful 세트를 노출하는 데 사용하는 서비스를 작성하십시오. 다음 예는 NGINX를 세 개의 복제본을 포함하는 Stateful 세트로 배치하는 방법을 보여줍니다. 각 복제본에 대해, ibmc-block-retain-bronze 스토리지 클래스에 정의된 스펙에 따라 20기가바이트의 블록 스토리지 디바이스가 프로비저닝됩니다. 모든 스토리지는 dal10 구역에서 프로비저닝됩니다. 다른 구역에서는 블록 스토리지에 액세스할 수 없으므로 Stateful 세트의 모든 복제본 또한 dal10에 있는 작업자 노드에 배치됩니다.

    apiVersion: v1
    kind: Service
    metadata:
     name: nginx
     labels:
    app: nginx
    spec:
    ports:
    - port: 80
        name: web
    clusterIP: None
    selector:
        app: nginx
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: nginx
    spec:
      serviceName: "nginx"
      replicas: 3
      podManagementPolicy: Parallel
      selector:
        matchLabels:
        app: nginx
        billingType: "hourly"
        region: "us-south" # Enter the region where your cluster is located.
        zone: "dal10"
    template:
      metadata:
      labels:
          app: nginx
          billingType: "hourly"
          region: "us-south"
          zone: "dal10"
      spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: myvol
        mountPath: /usr/share/nginx/html
    volumeClaimTemplates:
    - metadata:
        name: myvol
        spec:
        accessModes:
        - ReadWriteOnce
        resources:
            requests:
            storage: 20Gi
            iops: "300" #required only for performance storage
        storageClassName: ibmc-block-retain-bronze
    

    다음 예는 NGINX를 세 개의 복제본을 포함하는 Stateful 세트로 배치하는 방법을 보여줍니다. Stateful 세트는 블록 스토리지가 작성된 지역 및 구역을 영역을 지정하지 않습니다. 대신, Stateful 세트는 반친화성 규칙을 사용하여 팟(Pod)이 작업자 노드와 구역에 걸쳐 분산되도록 합니다. topologykey: failure-domain.beta.kubernetes.io/zone을 정의하면 작업자 노드가 app: nginx 레이블이 있는 팟(Pod)과 동일한 구역에 있는 경우 Kubernetes 스케줄러가 작업자 노드에 팟(Pod)을 스케줄할 수 없습니다. 각 Stateful 세트 팟(Pod)에 대해 두 개의 PVC가 volumeClaimTemplates 섹션에 정의된 대로 작성되지만 블록 스토리지 인스턴스의 작성은 스토리지를 사용하는 Stateful 세트 팟(Pod)이 스케줄될 때까지 지연됩니다. 이러한 구성을 ‘토폴로지 인식 볼륨 스케줄링’이라고 합니다.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: ibmc-block-bronze-delayed
    parameters:
      billingType: hourly
      classVersion: "2"
      fsType: ext4
      iopsPerGB: "2"
      sizeRange: '[20-12000]Gi'
      type: Endurance
    provisioner: ibm.io/ibmc-block
    reclaimPolicy: Delete
    volumeBindingMode: WaitForFirstConsumer
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      ports:
      - port: 80
        name: web
      clusterIP: None
      selector:
        app: nginx
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      serviceName: "nginx"
      replicas: 3
      podManagementPolicy: "Parallel"
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          affinity:
            podAntiAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 100
                podAffinityTerm:
                  labelSelector:
                    matchExpressions:
                    - key: app
                      operator: In
                      values:
                      - nginx
                  topologyKey: failure-domain.beta.kubernetes.io/zone
          containers:
          - name: nginx
            image: registry.k8s.io/nginx-slim:0.8
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: myvol1
              mountPath: /usr/share/nginx/html
            - name: myvol2
              mountPath: /tmp1
      volumeClaimTemplates:
      - metadata:
          name: myvol1
        spec:
          accessModes:
          - ReadWriteOnce # access mode
          resources:
            requests:
              storage: 20Gi
          storageClassName: ibmc-block-bronze-delayed
      - metadata:
          name: myvol2
        spec:
          accessModes:
          - ReadWriteOnce # access mode
          resources:
            requests:
              storage: 20Gi
          storageClassName: ibmc-block-bronze-delayed
    
    name
    Stateful 세트의 이름을 입력하십시오. 입력하는 이름은 <volume_name>-<statefulset_name>-<replica_number> 형식으로 PVC의 이름을 작성하는 데 사용됩니다.
    serviceName
    Stateful 세트를 노출하는 데 사용할 서비스의 이름을 입력하십시오.
    replicas
    Stateful 세트의 복제본 수를 입력하십시오.
    podManagementPolicy
    Stateful 세트에 대해 사용할 팟(Pod) 관리 정책을 입력하십시오.
    • OrderedReady: 이 선택사항을 사용하면 Stateful 세트 복제본이 순서대로 배치됩니다. 예를 들어, 세 개의 복제본을 지정한 경우, Kubernetes는 첫 번째 복제본의 PVC를 작성하고, 이 PVC가 바인드될 때까지 기다리고, Stateful 세트 복제본을 배치하고, PVC를 복제본에 마운트합니다. 이 배치가 완료되고 나면 두 번째 복제본이 배치됩니다. 이 옵션에 대한 자세한 내용은 OrderedReady 의 ‘Pod 관리’를 참조하십시오
    • Parallel: 이 옵션을 사용하면 모든 상태 저장 세트 복제본의 배치가 동시에 시작됩니다. 앱에서 복제본의 병렬 배치를 지원하는 경우에는 PVC 및 Stateful 세트 복제본의 배치 시간을 절약하기 위해 이 선택사항을 사용하십시오.
    matchLabels
    spec selector 섹션에서, Stateful 세트 및 PVC에 포함시킬 모든 레이블을 입력하십시오. Stateful 세트의 volumeClaimTemplates에 포함하는 레이블은 Kubernetes가 인식하지 않습니다. 포함시킬 수 있는 레이블의 샘플로는 다음과 같은 항목이 있습니다.
    • regionzone: 모든 Stateful 세트 복제본 및 PVC를 하나의 특정 구역에서 작성하려는 경우에는 두 레이블을 모두 추가하십시오. 사용하는 스토리지 클래스에 구역 및 지역을 지정할 수도 있습니다. 다중 구역 클러스터를 보유한 상태에서 구역 및 지역을 지정하지 않으면 모든 구역 간에 볼륨 요청의 균등한 밸런스를 유지하기 위해 스토리지가 프로비저닝되는 구역이 라운드 로빈 기반으로 선택됩니다.
    • billingType: PVC에 적용할 청구 유형을 입력하십시오. hourly 또는 monthly 중에서 선택하십시오. 이 레이블을 지정하지 않으면 모든 PVC가 시간별 비용 청구 유형으로 작성됩니다.
    labels
    spec template metadata 섹션에서 spec.selector.matchLabels 섹션에 추가한 것과 동일한 레이블을 입력하십시오.
    affinity
    spec template spec 섹션에서, Stateful 세트 팟(Pod)이 작업자 노드 및 구역 전체에 분산되도록 하기 위한 반친화성 규칙을 지정하십시오. 이 예는 Stateful 세트 팟(Pod)이 app: nginx 레이블이 있는 팟(Pod)이 실행되는 작업자 노드에서 스케줄되지 않는 것을 선호하는 반친화성 규칙을 보여줍니다. topologykey: failure-domain.beta.kubernetes.io/zone은 이 반친화성 규칙을 더 제한하며 작업자 노드가 app: nginx 레이블이 있는 팟(Pod)과 동일한 구역에 있는 경우 팟(Pod)이 작업자 노드에서 스케줄되지 않도록 합니다. 이 반친화성 규칙을 사용하면 작업자 노드 및 구역에 대해 반친화성을 구현할 수 있습니다.
    name
    spec volumeClaimTemplates metadata 섹션에서, 볼륨의 이름을 입력하십시오. spec.containers.volumeMount.name 섹션에 정의한 것과 동일한 이름을 사용하십시오. 여기에 입력하는 이름은 <volume_name>-<statefulset_name>-<replica_number> 형식으로 PVC의 이름을 작성하는 데 사용됩니다.
    storage
    spec volumeClaimTemplates spec resources requests 섹션에서, 블록 스토리지의 크기를 기가바이트(Gi) 단위로 입력하십시오.
    iops
    spec volumeClaimTemplates spec resources requests 섹션에서, Performance 스토리지를 프로비저닝하려는 경우에는 IOPS 수를 입력하십시오. Endurance 스토리지 클래스를 사용하면서 IOPS 수를 지정하면 IOPS 수가 무시됩니다. 대신 스토리지 클래스에 지정된 IOPS가 사용됩니다.
    storageClassName
    spec volumeClaimTemplates spec 섹션에서, 사용할 스토리지 클래스를 입력하십시오. 기존 스토리지 클래스를 나열하려면 kubectl get sc | grep block``을 실행하십시오. 스토리지 클래스를 지정하지 않으면 클러스터에 설정된 기본 스토리지 클래스를 사용하여 PVC가 작성됩니다. Stateful 세트가 블록 스토리지를 사용하여 프로비저닝되도록 기본 스토리지 클래스가 ibm.io/ibmc-block 프로비저너를 사용하는지 확인하십시오.
  4. Stateful 세트를 작성하십시오.

    kubectl apply -f statefulset.yaml
    
  5. Stateful 세트가 배치될 때까지 기다리십시오.

    kubectl describe statefulset <statefulset_name>
    

    PVC의 현재 상태를 보려면 kubectl get pvc를 실행하십시오. PVC의 이름은 <volume_name>-<statefulset_name>-<replica_number>로 형식화됩니다.

스테이트풀 세트와 기존 PVC를 활용한 정적 프로비저닝

Stateful 세트를 작성하기 전에 PVC를 사전 프로비저닝하거나 기존 PVC를 Stateful 세트와 함께 사용할 수 있습니다.

Stateful 세트를 작성할 때 동적으로 PVC를 프로비저닝하는 경우, PVC의 이름은 Stateful 세트 YAML 파일에 사용한 값에 따라 지정됩니다. Stateful 세트가 기존 PVC를 사용하기 위해서는 PVC의 이름이 동적 프로비저닝을 사용할 때 자동으로 작성되는 이름과 일치해야 합니다.

시작하기 전에: 계정에 로그인하십시오. If applicable, target the appropriate resource group. 클러스터에 대한 컨텍스트를 설정하십시오.

  1. Stateful 세트를 작성하기 전에 PVC를 사전 프로비저닝하려는 경우, 앱에 블록 스토리지 추가의 1 - 3단계에 따라 각 Stateful 세트 복제본에 대한 PVC를 작성하십시오. <volume_name>-<statefulset_name>-<replica_number> 형식을 따르는 이름을 사용하여 PVC를 작성해야 합니다.
volume_name

Stateful 세트의 spec.volumeClaimTemplates.metadata.name 섹션에 지정할 이름을 사용하십시오(예: nginxvol).

statefulset_name

Stateful 세트의 metadata.name 섹션에 지정할 이름을 사용하십시오(예: nginx_statefulset).

replica_number

0부터 시작하는 복제본의 수를 입력하십시오.

예를 들어, 세 개의 Stateful 세트 복제본을 작성해야 하는 경우에는 nginxvol-nginx_statefulset-0, nginxvol-nginx_statefulset-1nginxvol-nginx_statefulset-2와 같은 이름을 가진 세 개의 PVC를 작성하십시오.

기존 스토리지 디바이스에 대한 PVC 및 PV를 작성하시겠습니까? 정적 프로비저닝을 사용하여 PVC 및 PV를 작성하십시오.

  1. 동적 프로비저닝: Stateful 세트를 작성할 때 PVC 작성의 단계에 따라 Stateful 세트를 작성하십시오. PVC의 이름은 <volume_name>-<statefulset_name>-<replica_number> 형식을 따릅니다. Stateful 세트 스펙에는 자신이 사용하는 PVC 이름의 다음 값을 사용해야 합니다. spec.volumeClaimTemplates.metadata.name : PVC 이름의 <volume_name>을 입력하십시오.
metadata.name

PVC 이름의 <statefulset_name>을 입력하십시오.

spec.replicas

Stateful 세트에 대해 작성할 복제본의 수를 입력하십시오. 복제본의 수는 이전에 작성한 PVC의 수와 동일해야 합니다.

PVC가 다른 구역에 있는 경우, Stateful 세트에 지역 또는 구역 레이블을 포함하지 마십시오.

  1. 클러스터의 팟 (Pod) 을 나열하여 Stateful 세트 복제본 팟 (Pod) 에서 PVC가 사용되는지 확인하십시오. 자신의 Stateful 세트에 속한 팟(Pod)을 식별하십시오.

    kubectl get pods
    
  2. 기존 PVC가 Stateful 세트 복제본에 마운트되었는지 확인하십시오. CLI 출력의 ClaimName 섹션에 있는 **Volumes**을 검토하십시오.

    kubectl describe pod <pod_name>
    

    출력 예

    Name:           nginx-0
    Namespace:      default
    Node:           10.xxx.xx.xxx/10.xxx.xx.xxx
    Start Time:     Fri, 05 Oct 2022 13:24:59 -0400
    ...
    Volumes:
    myvol:
      Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
      ClaimName:  myvol-nginx-0
    ...
    

기존 스토리지 디바이스의 크기 및 IOPS 변경

스토리지 용량 또는 성능을 높이기 위해 기존 볼륨을 수정할 수 있습니다.

비용 청구에 대한 질문이 있거나 IBM Cloud 콘솔을 사용한 스토리지 수정 방법에 대한 단계를 찾으려면 블록 스토리지 용량 확장IOPS 조정을 참조하십시오. 콘솔에서 작성한 업데이트는 지속적 볼륨(PV) 에 반영되지 않습니다. 이 정보를 PV에 추가하려면 kubectl patch pv <pv_name>를 실행하고 PV의 레이블어노테이션 섹션에서 크기와 IOPS를 수동으로 업데이트하십시오.

  1. 클러스터의 PVC를 나열하고 VOLUME 열에서 연관된 PV의 이름을 기록해 두십시오.

    kubectl get pvc
    

    출력 예

    NAME             STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE
    myvol            Bound     pvc-01ac123a-123b-12c3-abcd-0a1234cb12d3   20Gi       RWO            ibmc-block-bronze    147d
    
  2. 블록 스토리지의 IOPS 및 크기를 변경할 경우 먼저 PV의 metadata.labels.IOPS 섹션에서 IOPS를 편집하십시오. IOPS값을 늘리거나 줄일 수 있습니다. 해당 스토리지 유형에 대해 지원되는 IOPS를 입력해야 합니다. 예를 들어, 네 개의 IOPS가 포함된 Endurance 블록 스토리지가 있는 경우 IOPS를 2 또는 10으로 변경할 수 있습니다. 지원되는 IOPS 값에 대한 자세한 정보는 블록 스토리지 구성 결정을 참조하십시오.

    kubectl edit pv <pv_name>
    

    CLI에서 IOPS를 변경하려면 블록 스토리지의 크기도 변경해야 합니다. 크기를 제외하고 IOPS만 변경할 경우 콘솔에서 IOPS 변경 요청을 참조하십시오.

  3. PVC를 편집하고 PVC의 spec.resources.requests.storage 섹션에서 새 크기를 추가하십시오. 스토리지 클래스로 설정된 최대 용량까지만 크기를 늘리도록 변경할 수 있습니다. 기존 스토리지의 크기를 줄일 수 없습니다. 스토리지 클래스의 사용 가능한 크기를 보려면 블록 스토리지 구성 결정을 참조하십시오.

    kubectl edit pvc <pvc_name>
    
  4. 볼륨 확장이 요청되었는지 확인하십시오. CLI 출력의 FileSystemResizePending조건** 섹션에서 ** 메시지가 표시되면 볼륨 확장이 요청된 것입니다.

    kubectl describe pvc <pvc_name>
    

    출력 예

    ...
    Conditions:
    Type                      Status  LastProbeTime                     LastTransitionTime                Reason  Message
    ----                      ------  -----------------                 ------------------                ------  -------
    FileSystemResizePending   True    Mon, 01 Jan 0001 00:00:00 +0000   Thu, 25 Apr 2022 15:52:49 -0400           Waiting for user to (re-)start a pod to finish file system resize of volume on node.
    
  5. PVC를 마운트하는 모든 팟(Pod)을 나열하십시오. 팟(Pod)으로 PVC가 마운트되면 볼륨 확장이 자동으로 처리됩니다. 팟(Pod)으로 PVC가 마운트되지 않으면 볼륨 확장을 처리할 수 있도록 PVC를 마운트해야 합니다.

    kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.volumes[*]}{.persistentVolumeClaim.claimName}{" "}{end}{end}' | grep "<pvc_name>"
    

    마운트된 팟(Pod)은 <pod_name>: <pvc_name> 형식으로 리턴됩니다.

  6. 팟(Pod)으로 PVC가 마운트되지 않으면 팟(Pod) 또는 배치를 작성하고 PVC를 마운트하십시오. 팟(Pod)으로 PVC가 마운트되는 경우 다음 단계로 진행하십시오.

  7. 크기 및 IOPS가 CLI 출력의 레이블 섹션에서 변경되었는지 확인하십시오. 이 프로세스는 완료하는 데 몇 분 정도 소요될 수 있습니다.

    kubectl describe pv <pv_name>
    

    출력 예

    ...
    Labels:       CapacityGb=50
    Datacenter=dal10
    IOPS=500
    
  8. PVC가 마운트된 포드에 로그인하십시오.

    kubectl exec <pod-name> -it -- bash
    
  9. 다음 명령을 실행하여 호스트 2진을 사용하십시오.

    chroot /host
    
  10. 파일 시스템의 크기를 조정하십시오.

    sudo resize2fs <filesystem-path>
    

    명령 예

    sudo resize2fs /dev/vdg
    
  11. 파일 시스템의 크기가 조정되었는지 확인하십시오.

    df -h
    

데이터 백업 및 복원

블록 스토리지는 클러스터의 작업자 노드와 동일한 위치로 프로비저닝됩니다. 이 스토리지는 서버의 작동이 중지되는 경우에 가용성을 제공하기 위해 IBM에 의해 클러스터된 서버에서 호스팅됩니다. 그러나 블록 스토리지는 자동으로 백업되지 않으며 전체 위치에서 장애가 발생하면 액세스가 불가능할 수 있습니다. 데이터가 유실되거나 손상되지 않도록 하기 위해, 필요한 경우 데이터를 복원하는 데 사용할 수 있는 주기적 백업을 설정할 수 있습니다.

백업 스토리지에 대한 다음의 백업 및 복원 옵션을 검토하십시오.

정기적 스냅샷 설정

특정 시점에 인스턴스 상태를 캡처하는 읽기 전용 이미지인 블록 스토리지에 대한 주기적 스냅샷을 설정할 수 있습니다.

스냅샷을 저장하려면 블록 스토리지의 스냅샷 영역을 요청해야 합니다. 스냅샷은 동일한 구역 내의 기본 스토리지 인스턴스에 저장됩니다. 사용자가 실수로 볼륨에서 중요한 데이터를 제거한 경우 스냅샷에서 데이터를 복원할 수 있습니다. \n \n **볼륨에 대한 스냅샷을 작성하려면 다음 단계를 완료하십시오.

  1. 계정에 로그인하십시오. If applicable, target the appropriate resource group. 클러스터에 대한 컨텍스트를 설정하십시오.

  2. ibmcloud sl CLI에 로그인하십시오.

    ibmcloud sl init
    
  3. 클러스터에 있는 기존 PV를 나열하십시오.

    kubectl get pv
    
  4. 스냅샷 영역을 작성할 PV에 대한 세부사항을 가져오고 볼륨 ID, 크기 및 IOPS를 기록해 두십시오. 크기 및 IOPS는 CLI 출력의 레이블 섹션에 표시됩니다.

    kubectl describe pv <pv_name>
    
  5. 볼륨 ID을 찾으려면 CLI 출력의 ibm.io/network-storage-id 어노테이션을 검토하십시오.

  6. 이전 단계에서 검색한 매개변수를 사용하여 기존 볼륨의 스냅샷 크기를 작성하십시오.

    ibmcloud sl block snapshot-order <volume_ID> --size <size> --tier <iops>
    
  7. 스냅샷 크기가 작성될 때까지 기다리십시오. CLI 출력의 **Snapshot Size (GB)**가 0에서 주문한 크기로 변경된 경우 스냅샷 크기가 성공적으로 프로비저닝된 것입니다.

    ibmcloud sl block volume-detail <volume_ID>
    
  8. 볼륨에 대한 스냅샷을 작성하고 작성된 스냅샷의 ID를 기록해 두십시오.

    ibmcloud sl block snapshot-create <volume_ID>
    
  9. 스냅샷이 작성되었는지 확인하십시오.

    ibmcloud sl block snapshot-list <volume_ID>
    
  10. 스냅샷 스케줄을 설정하십시오. 스냅샷 스케줄에 사용 가능한 옵션에 대한 자세한 정보는 CLI 문서 를 참조하십시오.

    ibmcloud sl block snapshot-enable VOLUME_ID <OPTIONS>
    
  11. 스냅샷의 데이터를 기존 볼륨에 복원하려면 다음 명령을 실행하십시오.

    ibmcloud sl block snapshot-restore <volume_ID> <snapshot_ID>
    

다른 구역에 스냅샷 복제

구역 장애로부터 데이터를 보호하기 위해 다른 구역에서 설정된 블록 스토리지 인스턴스로 스냅샷을 복제할 수 있습니다.

데이터는 기본 스토리지에서 백업 스토리지로만 복제할 수 있습니다. 복제된 블록 스토리지 인스턴스를 클러스터에 마운트할 수는 없습니다. 기본 스토리지에서 장애가 발생하는 경우에는 복제된 백업 스토리지가 기본 스토리지가 되도록 수동으로 설정할 수 있습니다. 그런 다음 클러스터에 이를 추가할 수 있습니다. 기본 스토리지가 복원되고 나면 백업 스토리지로부터 데이터를 복원할 수 있습니다.

스토리지 복제

원본 스토리지 인스턴스와 동일한 구역에서 블록 스토리지 인스턴스를 복제할 수 있습니다.

복제본(duplicate)에는 복제본(duplicate)을 작성한 시점의 원본 스토리지 인스턴스와 동일한 데이터가 저장되어 있습니다. 복제본(replica)과 다르게 복제본(duplicate)은 원본과 별개인 스토리지 인스턴스로 사용하십시오. 복제(duplicate)하려면 먼저 볼륨의 스냅샷을 설정하십시오.

IBM Cloud® Object Storage에 데이터 백업

ibm-backup-restore Helm 차트를 사용하여 클러스터에서 백업 및 복원 팟(Pod)을 스핀 업할 수 있습니다.

이 팟(Pod)에는 클러스터의 지속적 볼륨 클레임(PVC)에 대한 일회성 또는 주기적 백업을 실행하는 스크립트가 포함되어 있습니다. 데이터는 구역에 설정된 IBM Cloud® Object Storage 인스턴스에 저장됩니다.

블록 스토리지는 RWO 액세스 모드로 마운트됩니다. This access allows only one pod to be mounted to the block storage at a time. 데이터를 백업하려면 스토리지에서 앱 팟(Pod)을 마운트 해제하고 이를 백업 팟(Pod)에 마운트한 후에 데이터를 백업하고 스토리지를 앱 팟(Pod)에 다시 마운트해야 합니다.

데이터의 고가용성을 개선하고 구역 장애로부터 앱을 보호하려면 두 번째 Object Storage 인스턴스를 설정하고 구역 간에 데이터를 복제하십시오. Object Storage 인스턴스에서 데이터를 복원해야 하는 경우 Helm과 함께 제공되는 복원 팟(Pod)을 사용하십시오.

팟(pod) 및 컨테이너에 대해 데이터 복사

kubectl cp 명령어를 사용하면 클러스터 내의 포드나 특정 컨테이너로, 또는 그곳에서 파일과 디렉터리를 복사할 수 있습니다.

계정에 로그인하십시오. If applicable, target the appropriate resource group. 클러스터에 대한 컨텍스트를 설정하십시오.

kubectl cp 명령을 실행할 때 -c를 사용하여 컨테이너를 지정하지 않으면 이 명령은 팟(Pod)에서 사용 가능한 첫 번째 컨테이너를 사용합니다.

로컬 시스템의 데이터를 클러스터의 팟(pod)에 복사하십시오.

kubectl cp <local_filepath>/<filename> <namespace>/<pod>:<pod_filepath>

클러스터의 팟(pod)에 있는 데이터를 로컬 시스템에 복사하십시오.

kubectl cp <namespace>/<pod>:<pod_filepath>/<filename> <local_filepath>/<filename>

로컬 시스템의 데이터를 클러스터의 팟(pod)에서 실행하는 특정 컨테이너에 복사하십시오.

kubectl cp <local_filepath>/<filename> <namespace>/<pod>:<pod_filepath> -c CONTAINER

스토리지 클래스 참조

브론즈

이름
ibmc-block-bronze
ibmc-block-retain-bronze
유형
Endurance 스토리지
파일 시스템
ext4
GB당 IOPS
2
크기 범위(GB)
20 - 12000Gi
하드 디스크
SSD
재확보 정책
ibmc-block-bronze: 삭제
ibmc-block-retain-bronze: 유지

실버

이름
ibmc-block-silver
ibmc-block-retain-silver
유형
Endurance 스토리지
파일 시스템
ext4
GB당 IOPS
4
크기 범위(GB)
20 - 12000Gi
하드 디스크
SSD
재확보 정책
ibmc-block-silver: 삭제
ibmc-block-retain-silver: 유지

골드

이름
ibmc-block-gold
ibmc-block-retain-gold
유형
Endurance 스토리지
파일 시스템
ext4
GB당 IOPS
10
크기 범위(GB)
20 - 4000Gi
하드 디스크
SSD
재확보 정책
ibmc-block-gold: 삭제
ibmc-block-retain-gold: 유지

사용자 정의

이름
ibmc-block-custom
ibmc-block-retain-custom
유형
성능 파일 시스템
ext4
IOPS 및 크기
크기 범위(기가바이트) / IOPS 범위(100의 배수)
  • 20-39Gi / 100-1000 IOPS
  • 40-79Gi / 100-2000 IOPS
  • 80-99Gi / 100-4000 IOPS
  • 100-499Gi / 100-6000 IOPS
  • 500-999Gi / 100-10000 IOPS
  • 1000-1999Gi / 100-20000 IOPS
  • 2000-2999Gi / 200-40000 IOPS
  • 3000-3999Gi / 200-48000 IOPS
  • 4000-7999Gi / 300-48000 IOPS
  • 8000-9999Gi / 500-48000 IOPS
  • 10000-12000Gi / 1000-48000 IOPS
하드 디스크
IOPS 대 기가바이트 비율은 프로비저닝되는 하드 디스크의 유형을 결정합니다. IOPS 대 기가바이트 비율을 결정하려면 IOPS를 스토리지의 크기로 나누십시오.
예: 100 IOPS의 500Gi 스토리지를 선택했습니다. 비율은 0.2(100 IOPS/500Gi)입니다.
비율별 하드 디스크 유형의 개요:
  • 0.3 이하: SATA
  • 0.3 초과: SSD
재확보 정책
ibmc-block-custom: 삭제
ibmc-block-retain-custom: 유지

사용자 정의된 샘플 스토리지 클래스

사용자 정의된 스토리지 클래스를 작성하고 PVC에서 해당 스토리지 클래스를 사용할 수 있습니다.

IBM Cloud Kubernetes Service는 특정 계층 및 구성으로 블록 스토리지를 프로비저닝하는 데 사용할 수 있는 사전 정의된 스토리지 클래스를 제공합니다. 일부 경우에는 사전 정의된 스토리지 클래스에 포함되지 않은 다른 구성으로 스토리지를 프로비저닝하려고 할 수도 있습니다. 이 주제의 예를 사용하여 사용자 정의된 스토리지 클래스의 샘플을 찾아볼 수 있습니다.

사용자 정의된 스토리지 클래스를 작성하려면 스토리지 클래스 사용자 정의를 참조하십시오. 그 후 PVC에서 사용자 정의된 스토리지 클래스를 사용하십시오.

토폴로지 인식 스토리지 작성

다중 구역 클러스터에서 블록 스토리지를 사용하려면 볼륨을 읽고 쓸 수 있도록 블록 스토리지 인스턴스와 동일한 구역에서 팟(Pod)이 스케줄되어야 합니다. Kubernetes가 토폴로지 인식 볼륨 스케줄링을 도입하기 전에 스토리지를 동적으로 프로비저닝하면 PVC가 작성될 때 블록 스토리지 인스턴스가 자동으로 작성되었습니다. 그런 다음, 팟(Pod)을 작성할 때 Kubernetes 스케줄러는 블록 스토리지 인스턴스와 동일한 데이터 센터에 팟(Pod)을 배치하려고 했습니다.

팟(Pod)의 제한조건을 모르고 블록 스토리지 인스턴스를 작성하면 원하지 않는 결과가 발생할 수 있습니다. 예를 들어, 작업자 노드에 리소스가 충분하지 않거나 작업자 노드가 오염되어 팟(Pod)이 스케줄될 수 없어 팟(Pod)이 스토리지와 동일한 작업자 노드에 스케줄되지 않을 수도 있습니다. 토폴로지 인식 볼륨 스케줄링을 사용하면 스토리지를 사용하는 첫 번째 팟(Pod)이 작성될 때까지 블록 스토리지 인스턴스가 지연됩니다.

토폴로지 인식 볼륨 스케줄링을 사용하려면 IBM Cloud Block Storage 플러그인 버전 1.2.0 이상을 설치했는지 확인하십시오.

다음 예제는 이 스토리지를 사용하는 첫 번째 팟(Pod)이 스케줄될 준비가 될 때까지 블록 스토리지 인스턴스 작성을 지연시키는 스토리지 클래스를 작성하는 방법을 보여줍니다. 작성을 지연하려면 volumeBindingMode: WaitForFirstConsumer 옵션을 포함해야 합니다. 이 옵션을 포함하지 않으면 volumeBindingModeImmediate로 자동 설정되며 PVC를 작성할 때 블록 스토리지 인스턴스가 작성됩니다.

내구성 블록 스토리지의 예.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ibmc-block-bronze-delayed
  parameters:
    billingType: hourly
    classVersion: "2"
    fsType: ext4
    iopsPerGB: "2"
    sizeRange: '[20-12000]Gi'
    type: Endurance
  provisioner: ibm.io/ibmc-block
  reclaimPolicy: Delete
  volumeBindingMode: WaitForFirstConsumer

성능 블록 스토리지의 예.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ibmc-block-performance-storageclass
  labels:
  kubernetes.io/cluster-service: "true"
  provisioner: ibm.io/ibmc-block
  parameters:
    billingType: "hourly"
    classVersion: "2"
    sizeIOPSRange: |-
    "[20-39]Gi:[100-1000]"
    "[40-79]Gi:[100-2000]"
    "[80-99]Gi:[100-4000]"
    "[100-499]Gi:[100-6000]"
    "[500-999]Gi:[100-10000]"
    "[1000-1999]Gi:[100-20000]"
    "[2000-2999]Gi:[200-40000]"
    "[3000-3999]Gi:[200-48000]"
    "[4000-7999]Gi:[300-48000]"
    "[8000-9999]Gi:[500-48000]"
    "[10000-12000]Gi:[1000-48000]"
    type: "Performance"
  reclaimPolicy: Delete
  volumeBindingMode: WaitForFirstConsumer

구역 및 지역 지정

특정 구역에 블록 스토리지를 작성하려는 경우 사용자 정의 스토리지 클래스에 구역과 지역을 지정할 수 있습니다.

IBM Cloud Block Storage 플러그인 버전 1.0.0을 사용하거나 특정 구역에서 정적으로 블록 스토리지를 프로비저닝하려는 경우에는 사용자 정의된 스토리지 클래스를 사용하십시오. 그 외의 모든 경우에는 PVC에 구역을 직접 지정하십시오.

다음의 .yaml 파일은 ibm-block-silver 비-보유(non-retaining) 스토리지 클래스를 기반으로 하는 스토리지 클래스를 사용자 정의합니다. 여기서 type"Endurance"이고, iopsPerGB4이며, sizeRange"[20-12000]Gi"이고, reclaimPolicy"Delete"로 설정됩니다. 구역은 dal12로서 지정됩니다. 다른 스토리지 클래스를 자신의 기반으로 사용하려면 스토리지 클래스 참조를 참조하십시오.

클러스터 및 작업자 노드와 동일한 지역 및 구역에 스토리지 클래스를 작성하십시오. 클러스터의 지역을 가져오려면 ibmcloud ks cluster get --cluster <cluster_name_or_ID>를 실행하여 마스터 URL에서 지역 접두부를 찾으십시오(예: https://c2.eu-de.containers.cloud.ibm.com:11111에서 eu-de). 작업자 노드의 구역을 가져오려면 ibmcloud ks worker ls --cluster <cluster_name_or_ID>를 실행하십시오.

내구성 블록 스토리지의 예.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ibmc-block-silver-mycustom-storageclass
  labels:
    kubernetes.io/cluster-service: "true"
provisioner: ibm.io/ibmc-block
parameters:
  zone: "dal12"
  region: "us-south"
  type: "Endurance"
  iopsPerGB: "4"
  sizeRange: "[20-12000]Gi"
reclaimPolicy: "Delete"

성능 블록 스토리지의 예.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
    name: ibmc-block-performance-storageclass
labels:
  kubernetes.io/cluster-service: "true"
provisioner: ibm.io/ibmc-block
parameters:
  zone: "dal12"
  region: "us-south"
  type: "Performance"
  sizeIOPSRange: |-
  "[20-39]Gi:[100-1000]"
  "[40-79]Gi:[100-2000]"
  "[80-99]Gi:[100-4000]"
  "[100-499]Gi:[100-6000]"
  "[500-999]Gi:[100-10000]"
  "[1000-1999]Gi:[100-20000]"
  "[2000-2999]Gi:[200-40000]"
  "[3000-3999]Gi:[200-48000]"
  "[4000-7999]Gi:[300-48000]"
  "[8000-9999]Gi:[500-48000]"
  "[10000-12000]Gi:[1000-48000]"
reclaimPolicy: "Delete"

XFS 파일 시스템에서 블록 스토리지 마운트

다음 예제에서는 XFS 파일 시스템에서 블록 스토리지를 프로비저닝하는 스토리지 클래스를 작성합니다.

내구성 블록 스토리지의 예.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ibmc-block-custom-xfs
labels:
  addonmanager.kubernetes.io/mode: Reconcile
provisioner: ibm.io/ibmc-block
parameters:
  type: "Endurance"
  iopsPerGB: "4"
  sizeRange: "[20-12000]Gi"
  fsType: "xfs"
reclaimPolicy: "Delete"

성능 블록 스토리지의 예.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ibmc-block-custom-xfs
  labels:
    addonmanager.kubernetes.io/mode: Reconcile
provisioner: ibm.io/ibmc-block
parameters:
  classVersion: "2"
  type: "Performance"
  sizeIOPSRange: |-
    [20-39]Gi:[100-1000]
    [40-79]Gi:[100-2000]
    [80-99]Gi:[100-4000]
    [100-499]Gi:[100-6000]
    [500-999]Gi:[100-10000]
    [1000-1999]Gi:[100-20000]
    [2000-2999]Gi:[200-40000]
    [3000-3999]Gi:[200-48000]
    [4000-7999]Gi:[300-48000]
    [8000-9999]Gi:[500-48000]
    [10000-12000]Gi:[1000-48000]
  fsType: "xfs"
reclaimPolicy: "Delete"

클러스터에서 지속적 스토리지 제거

클러스터에서 지속적 스토리지를 설정하는 경우에는 스토리지를 요청하는 Kubernetes 지속적 볼륨 클레임(PVC), 팟(Pod)에 마운트되고 PVC에서 설명되는 Kubernetes 지속적 볼륨(PV), 그리고 IBM Cloud 인프라 인스턴스(예: 클래식 파일 또는 블록 스토리지)의 세 개의 기본 컴포넌트가 있습니다. 스토리지를 작성한 방법에 따라 3개 컴포넌트 모두를 별도로 삭제해야 할 수 있습니다.

스토리지 제거 옵션 이해

IBM Cloud 계정에서 지속적 스토리지를 제거하는 것은 스토리지를 프로비저닝한 방식과 이미 제거한 컴포넌트에 따라 다릅니다.

클러스터를 삭제하면 내 영구 저장소도 삭제되나요?
클러스터 삭제 중에 지속적 스토리지를 제거하는 옵션이 있습니다. 그러나 스토리지가 프로비저닝된 방식에 따라 스토리지 제거에는 모든 스토리지 컴포넌트가 포함되지 않을 수 있습니다. reclaimPolicy: Delete 가 설정된 스토리지 클래스를 사용하여 스토리지를 동적으로 프로비저닝한 경우, 클러스터를 삭제하면 PVC, PV 및 스토리지 인스턴스가 자동으로 삭제됩니다. 정적으로 프로비저닝된 스토리지나 reclaimPolicy: Retain``을 설정하는 스토리지 클래스를 사용하여 프로비저닝한 스토리지의 경우, 클러스터를 삭제하면 PVC와 PV는 제거되지만 스토리지 인스턴스와 데이터는 그대로 유지됩니다. 계속해서 스토리지 인스턴스에 대한 비용이 청구됩니다. 또한 비정상 상태에서 클러스터를 삭제한 경우, 제거를 선택했어도 스토리지가 아직 존재할 수 있습니다.
클러스터는 그대로 두고 스토리지만 삭제하려면 어떻게 해야 하나요?
reclaimPolicy: Delete를 설정하는 스토리지 클래스로 스토리지를 동적으로 프로비저닝한 경우 PVC를 제거하여 지속적 스토리지의 삭제 프로세스를 시작할 수 있습니다. 사용자 PVC, PV 및 스토리지 인스턴스가 자동으로 제거됩니다. 정적으로 프로비저닝된 스토리지 또는 reclaimPolicy: Retain``을 설정하는 스토리지 클래스를 사용하여 프로비저닝한 스토리지의 경우, 추가 요금이 부과되지 않도록 PVC, PV 및 스토리지 인스턴스를 수동으로 제거해야 합니다.
저장 공간을 삭제하면 요금은 어떻게 중단되나요?
삭제하는 스토리지 컴포넌트 항목과 시점에 따라 비용 청구 주기가 즉시 중지되지 않을 수 있습니다. PVC 및 PV를 삭제하지만 IBM Cloud 계정의 스토리지 인스턴스는 삭제하지 않은 경우, 해당 인스턴스는 계속 존재하게 되며 이에 대한 비용을 지불하게 됩니다.

PVC, PV 및 스토리지 인스턴스를 삭제하는 경우 비용 청구 주기는 스토리지를 프로비저닝할 때 선택한 billingType과 스토리지를 삭제하도록 선택한 방식에 따라 달라집니다.

  • IBM Cloud 콘솔이나 CLI에서 영구 스토리지 인스턴스를 수동으로 취소하면 다음과 같이 과금이 중지됩니다

    • 시간별 스토리지: 비용 청구가 즉시 중지됩니다. 스토리지가 취소된 후 최대 72시간 동안 스토리지 인스턴스가 콘솔에 표시될 수 있습니다.
    • 월별 스토리지: 즉시 취소 또는 기념일에 취소 중에서 선택할 수 있습니다. 두 경우 모두 현재 비용 청구 주기가 끝날 때까지 계속해서 비용이 청구되며 다음 비용 청구 주기에 대한 비용 청구가 중지됩니다. 스토리지가 취소된 후 최대 72시간 동안 스토리지 인스턴스가 콘솔 또는 CLI에 표시될 수 있습니다.
    • 즉시 취소: 스토리지를 즉시 제거할 경우 이 옵션을 선택합니다. 사용자가 스토리지를 더 이상 사용하지 않거나 데이터를 복구하지 않는 경우가 해당됩니다.
    • 기념일: 다음 기념일에 스토리지를 취소할 경우 이 옵션을 선택합니다. 예를 들어, 데이터를 백업할 시간을 팀에 알려주기 위해 스토리지 인스턴스는 다음 기념일까지 활성 상태로 유지되며 이 날짜까지 계속해서 사용할 수 있습니다.
  • reclaimPolicy: Delete를 설정하는 스토리지 클래스로 스토리지를 동적으로 프로비저닝하고 PVC를 제거하도록 선택하는 경우 PV 및 스토리지 인스턴스가 즉시 제거됩니다. 매시간 비용 청구된 스토리지의 경우, 비용 청구가 즉시 중지됩니다. 매월 청구되는 스토리지의 경우 해당 월의 나머지에 대해 비용이 청구됩니다. 스토리지가 제거되고 비용 청구가 중지된 후 최대 72시간 동안 스토리지 인스턴스가 콘솔 또는 CLI에 표시될 수 있습니다.

영구 저장소를 삭제하기 전에 무엇을 주의해야 하나요?
지속적 스토리지를 정리하면 그 안에 저장된 모든 데이터가 삭제됩니다. 데이터 사본이 필요한 경우 백업을 만드세요.
저장소 인스턴스를 삭제했습니다. 왜 내 인스턴스가 여전히 표시되나요?
지속적 스토리지를 제거한 후 제거가 완전히 처리되고 IBM Cloud 콘솔 또는 CLI에서 스토리지가 표시되지 않으려면 최대 72 시간이 걸릴 수 있습니다.

지속적 스토리지 정리

지속적 스토리지에 대한 추가 비용이 부과되지 않도록 IBM Cloud 계정에서 PVC, PV 및 스토리지 인스턴스를 제거합니다.

시작하기 전에:

지속적 데이터를 정리하려면 다음을 수행하십시오.

  1. 클러스터의 PVC를 나열하고 PVC의 NAME, STORAGECLASS, 그리고 PVC에 바인드되고 **VOLUME**으로 표시되는 PV의 이름을 기록해 두십시오.

    kubectl get pvc
    

    출력 예

    NAME                  STATUS    VOLUME                                     CAPACITY   ACCESSMODES   STORAGECLASS            AGE
    claim1   Bound     pvc-06886b77-102b-11e8-968a-f6612bb731fb   20Gi       RWO           class       78d
    claim2     Bound     pvc-457a2b96-fafc-11e7-8ff9-b6c8f770356c   4Gi        RWX           class 105d
    claim3      Bound     pvc-1efef0ba-0c48-11e8-968a-f6612bb731fb   24Gi       RWX           class        83d
    
  2. 스토리지 클래스에 대한 ReclaimPolicy 및 **billingType**을 검토하십시오.

    kubectl describe storageclass <storageclass_name>
    

    재확보 정책에서 Delete를 표시하는 경우에는 PVC를 제거할 때 PV 및 실제 스토리지가 제거됩니다. 재확보 정책에서 Retain을 표시하거나 사용자가 스토리지 클래스 없이 스토리지를 프로비저닝한 경우에는 PVC를 제거할 때 PV 및 실제 스토리지가 제거되지 않습니다. 사용자가 PVC, PV 및 실제 스토리지를 개별적으로 제거해야 합니다.

    스토리지가 매월 비용 청구되는 경우에는 비용 청구 주기가 종료되기 전에 스토리지를 제거해도 여전히 해당 월 전체에 대해 비용이 청구됩니다.

  3. PVC를 마운트하는 팟(Pod)을 제거하십시오. PVC를 마운트하는 팟(Pod)을 나열하십시오. 팟(Pod)이 CLI 출력에서 리턴되지 않으면 PVC를 사용하는 팟(Pod)이 없는 것입니다.

    kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.volumes[*]}{.persistentVolumeClaim.claimName}{" "}{end}{end}' | grep "<pvc_name>"
    

    출력 예

    depl-12345-prz7b:    claim1
    
  4. PVC를 사용하는 팟(Pod)을 제거하십시오. 팟(Pod)이 배치의 일부인 경우에는 배치를 제거하십시오.

    kubectl delete pod <pod_name>
    
  5. 팟(Pod)이 제거되었는지 확인하십시오.

    kubectl get pods
    
  6. PVC를 제거하십시오.

    kubectl delete pvc <pvc_name>
    
  7. PV의 상태를 검토하십시오. 이전에 검색한 PV의 이름을 **VOLUME**으로 사용하십시오. PVC를 제거하면 PVC에 바인드된 PV가 릴리스됩니다. 스토리지를 프로비저닝하는 방법에 따라, PV는 Deleting 상태(PV가 자동 삭제되는 경우) 또는 Released 상태(PV를 수동 삭제해야 하는 경우)가 됩니다. 참고: 자동 삭제되는 PV의 경우에는 삭제되기 전에 상태가 잠시 Released로 표시될 수 있습니다. 잠시 후에 명령을 다시 실행하면 PV가 제거되었는지 여부를 볼 수 있습니다.

    kubectl get pv <pv_name>
    
  8. PV가 삭제되지 않은 경우에는 PV를 수동으로 제거하십시오.

    kubectl delete pv <pv_name>
    
  9. PV가 제거되었는지 확인하십시오.

    kubectl get pv
    
  10. PV가 가리키는 실제 스토리지 인스턴스를 나열하고 실제 스토리지 인스턴스의 **id**를 기록해 두십시오.

    ibmcloud sl block volume-list --columns id --columns notes | grep <pv_name>
    

    출력 예

    12345678   {"plugin":"ibmcloud-block-storage-plugin-689df949d6-4n9qg","region":"us-south","cluster":"aa1a11a1a11b2b2bb22b22222c3c3333","type":"Endurance","ns":"default","pvc":"block-storage-pvc","pv":"pvc-d979977d-d79d-77d9-9d7d-d7d97ddd99d7","storageclass":"ibmc-block-silver","reclaim":"Delete"}
    

    참고 필드 정보 이해:

    "plugin":"ibm-file-plugin-5b55b7b77b-55bb7"
    클러스터가 사용하는 스토리지 플러그인입니다.
    "region":"us-south"
    클러스터가 있는 지역입니다.
    "cluster":"aa1a11a1a11b2b2bb22b22222c3c3333"
    스토리지 인스턴스와 연관된 클러스터 ID입니다.
    "type":"Endurance"
    파일 또는 블록 스토리지의 유형(Endurance 또는 Performance)입니다.
    "ns":"default"
    스토리지 인스턴스가 배치되는 네임스페이스입니다.
    "pvc":"block-storage-pvc"
    스토리지 인스턴스와 연관된 PVC의 이름입니다.
    "pv":"pvc-d979977d-d79d-77d9-9d7d-d7d97ddd99d7"
    스토리지 인스턴스와 연관된 PV입니다.
    "storageclass":"ibmc-file-gold"
    스토리지 클래스의 유형(브론즈, 실버, 골드 또는 사용자 정의)입니다.
  11. 실제 스토리지 인스턴스를 제거하십시오.

    ibmcloud sl block volume-cancel <classic_block_id>
    
  12. 실제 스토리지 인스턴스가 제거되었는지 확인하십시오.

삭제 프로세스는 완료되는 데 최대 72시간이 걸릴 수 있습니다.

ibmcloud sl block volume-list

limited 연결 PV에 대한 모니터링 설정

Block Storage for Classic를 사용하는 팟 (Pod) 및 PVC를 작성할 때 스토리지가 마운트되는 기본 지속적 볼륨 (PV) 에 두 개의 대상 포트가 지정됩니다. 하나의 포트가 작동 중지되는 경우 여러 대상 포트에서 장애 복구를 허용합니다.

이전 버전의 Block Storage for Classic 드라이버에서는 롤아웃 중에 PV를 마운트할 때 2개의 대상 포트를 찾을 수 없어서 배치에 실패했습니다.

그러나 때때로 IaaS 유지보수 창에서와 같이 지속적 볼륨에서 사용 가능한 하나의 대상 포트만으로 팟 (Pod) 이 성공적으로 배치되도록 할 수 있습니다.

Block Storage for Classic 드라이버의 버전 2.4.12 부터 PV가 하나의 대상 포트만 지정할 수 있는 경우에도 팟 (Pod) 이 성공적으로 배치됩니다. 이 동작 변경 외에도 PV에는 이제 네트워크 가용성을 표시하는 새 레이블이 포함됩니다. 여기서 healthy 레이블은 두 개의 대상 포트가 지정되었음을 의미하고 limited 은 마운트 중에 하나의 대상 포트만 지정될 수 있음을 의미합니다.

Block Storage for Classic 에 대한 팟 (Pod) 연결이 제한되는 인스턴스를 모니터하기 위해 limited 레이블을 찾는 사용자 정의 경보를 설정할 수 있습니다. 그런 다음 경보 임계값을 >0 로 구성하십시오.

  1. IBM Cloud Monitoring 대시보드에서 새 경보 > 지표를 선택하십시오.

  2. Prom query 를 선택하고 kube_persistentvolume_labels{label_ibm_io_pv_connectivity_status='limited'} 를 입력하십시오.

  3. 임계값을 >0 로 설정하고 이 경보에 사용할 심각도를 설정하십시오.

  4. 알림 채널을 선택하고 경보를 저장하십시오.

차단 스토리지에 신뢰할 수 있는 프로필 할당하기

신뢰할 수 있는 프로필을 사용하여 스토리지 솔루션을 비롯한 계정의 리소스에 대한 액세스 권한을 다른 IBM Cloud ID에 부여할 수 있습니다. 신뢰할 수 있는 프로필은 액세스 제어를 중앙 집중화하고, 수명이 긴 API 키가 필요하지 않으며, 특정 작업에 필요한 최소한의 권한으로만 범위를 지정할 수 있습니다. 자세한 내용은 스토리지 구성 요소에 대한 신뢰할 수 있는 프로필 구성을 참조하세요.