다음을 통해 공유


AKS(Azure Kubernetes Service) 비밀 자격 증명 모음 CSI 드라이버용 Azure Key Vault 공급자 구성 및 문제 해결 옵션

AKS 클러스터에서 비밀 저장소 CSI 드라이버용 Azure Key Vault 공급자 사용AKS에서 비밀 저장소 CSI 드라이버용 Azure Key Vault 공급자에 액세스하기 위한 ID 제공의 단계를 따릅니다. 이러한 단계를 완료하면 추가 구성을 적용하거나 문제 해결을 수행할 수 있습니다.

구성 옵션

자동 순환 사용 및 사용 안 함

참고 항목

비밀 저장소 CSI 드라이버용 Azure Key Vault 공급자를 사용하도록 설정하면 Pod 탑재 및 SecretProviderClasssecretObjects 필드에 정의된 Kubernetes 비밀이 업데이트됩니다. 이 업데이트는 정의한 순환 폴 간격에 따라 변경 내용을 주기적으로 폴링하여 이루어집니다. 순환 폴 간격의 기본값은 ‘2분’입니다.

참고 항목

초기 Pod 배포 후 외부 비밀 저장소에서 비밀이 업데이트되면 애플리케이션에서 비밀 데이터를 사용하는 방법에 따라 Kubernetes 비밀 및 Pod 탑재가 주기적으로 업데이트됩니다.

Kubernetes 비밀을 볼륨으로 탑재: 비밀 저장소 CSI 드라이버의 자동 순환 및 동기화 K8s 비밀 기능을 사용합니다. 애플리케이션은 탑재된 Kubernetes 비밀 볼륨의 변경 내용을 감시해야 합니다. CSI 드라이버가 Kubernetes 비밀을 업데이트하면 해당 볼륨 콘텐츠도 자동으로 업데이트됩니다.

애플리케이션이 컨테이너 파일 시스템으로부터 데이터를 읽음: 비밀 저장소 CSI 드라이버의 순환 기능을 사용합니다. 애플리케이션은 CSI 드라이버에 의해 탑재된 볼륨에서 파일 변경 내용을 감시해야 합니다.

환경 변수에 Kubernetes 비밀 사용: Pod를 다시 시작하여 최신 비밀을 환경 변수로 가져옵니다. Reloader와 같은 도구를 사용하여 동기화된 Kubernetes 비밀의 변경 내용을 감시하고 Pod에서 롤링 업그레이드를 수행합니다.

새 AKS 클러스터에서 자동 순환 사용

  • az aks create 명령을 사용하여 새 클러스터에서 비밀 자동 순환을 사용하도록 설정하고 enable-secret-rotation 추가 기능을 사용하도록 설정합니다.

    az aks create \
        --name myAKSCluster2 \
        --resource-group myResourceGroup \
        --enable-addons azure-keyvault-secrets-provider \
        --enable-secret-rotation \
        --generate-ssh-keys
    

기존 AKS 클러스터에서 자동 순환 사용

  • az aks addon update 명령 및 enable-secret-rotation 매개 변수를 사용하여 비밀 자동 순환을 사용하도록 기존 클러스터를 업데이트합니다.

    az aks addon update --resource-group myResourceGroup --name myAKSCluster2 --addon azure-keyvault-secrets-provider --enable-secret-rotation
    

사용자 지정 순환 간격 지정

  • az aks addon update 명령과 rotation-poll-interval 매개 변수를 사용하여 사용자 지정 순환 간격을 지정합니다.

    az aks addon update --resource-group myResourceGroup --name myAKSCluster2 --addon azure-keyvault-secrets-provider --enable-secret-rotation --rotation-poll-interval 5m
    

자동 순환 사용 안 함

자동 순환을 사용하지 않으려면 먼저 추가 기능을 사용하지 않도록 설정해야 합니다. 그런 다음 enable-secret-rotation 매개 변수 없이 추가 기능을 다시 사용하도록 설정할 수 있습니다.

  1. az aks addon disable 명령을 사용하여 비밀 공급자 추가 기능을 사용하지 않도록 설정합니다.

    az aks addon disable --resource-group myResourceGroup --name myAKSCluster2 --addon azure-keyvault-secrets-provider
    
  2. enable-secret-rotation 명령을 사용하여 az aks addon enable 매개 변수 없이 비밀 공급자 추가 기능을 다시 사용하도록 설정합니다.

    az aks addon enable --resource-group myResourceGroup --name myAKSCluster2 --addon azure-keyvault-secrets-provider
    

이미 SecretProviderClass를 사용하고 있는 경우 enable-secret-rotation 매개 변수를 지정하지 않고 az aks addon enable을(를) 사용하여 먼저 비활성화하지 않고도 추가 기능을 업데이트할 수 있습니다.

탑재된 콘텐츠를 Kubernetes 비밀과 동기화

참고 항목

이 섹션의 YAML 예제는 불완전합니다. 선택한 키 자격 증명 모음 ID 액세스 메서드를 지원하도록 수정해야 합니다. 자세한 내용은 비밀 저장소 CSI 드라이버용 Azure Key Vault 공급자에 액세스하기 위한 ID 제공을 참조하세요.

탑재된 비밀 콘텐츠를 미러링하는 Kubernetes 비밀을 만들려고 할 수 있습니다. 비밀은 Pod를 시작하여 탑재한 후에 동기화됩니다. 비밀을 사용하는 Pod를 삭제하면 Kubernetes 비밀도 삭제됩니다.

  • 원하는 Kubernetes 비밀 상태를 정의하려면 아래 예제 YAML에 나온 것처럼 SecretProviderClass를 만들 때 secretObjects 필드를 사용하여 탑재된 콘텐츠를 Kubernetes 비밀과 동기화합니다.

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: azure-sync
    spec:
      provider: azure
      secretObjects:                              # [OPTIONAL] SecretObjects defines the desired state of synced Kubernetes secret objects
      - data:
        - key: username                           # data field to populate
          objectName: foo1                        # name of the mounted content to sync; this could be the object name or the object alias
        secretName: foosecret                     # name of the Kubernetes secret object
        type: Opaque                              # type of Kubernetes secret object (for example, Opaque, kubernetes.io/tls)
    

    참고 항목

    secretObjects 필드의 objectName이 탑재된 콘텐츠의 파일 이름과 일치하는지 확인합니다. 대신 objectAlias을(를) 사용하는 경우 개체 별칭과 일치해야 합니다.

Kubernetes 비밀을 참조하도록 환경 변수 설정

참고 항목

이 예제 YAML은 환경 변수와 volume/volumeMount를 통해 비밀에 액세스하는 법을 보여 줍니다. 이는 설명을 위한 것입니다. 일반적인 애플리케이션은 둘 중 한 가지 방법을 사용합니다. 그러나 env 변수를 통해 비밀을 사용하려면 먼저 적어도 하나의 Pod에서 비밀을 탑재해야 합니다.

  • 다음 예제 YAML에 나온 것처럼 Pod에서 환경 변수를 설정하여 새로 만든 Kubernetes 비밀을 참조합니다.

    kind: Pod
    apiVersion: v1
    metadata:
      name: busybox-secrets-store-inline
    spec:
      containers:
        - name: busybox
          image: registry.k8s.io/e2e-test-images/busybox:1.29-1
          command:
            - "/bin/sleep"
            - "10000"
          volumeMounts:
          - name: secrets-store01-inline
            mountPath: "/mnt/secrets-store"
            readOnly: true
          env:
          - name: SECRET_USERNAME
            valueFrom:
              secretKeyRef:
                name: foosecret
                key: username
      volumes:
        - name: secrets-store01-inline
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: "azure-sync"
    

메트릭에 액세스

Azure Key Vault 공급자

메트릭은 포트 8898에서 Prometheus를 통해 제공되지만 이 포트는 기본값으로 Pod 외부에 노출되지 않습니다.

  • kubectl port-forward를 사용하여 localhost를 통해 메트릭에 액세스합니다.

    kubectl port-forward -n kube-system ds/aks-secrets-store-provider-azure 8898:8898 & curl localhost:8898/metrics
    
비밀 저장소 CSI 드라이버용 Azure Key Vault 공급자가 제공하는 메트릭
메트릭 설명 태그
keyvault_request 키 자격 증명 모음에서 가져오는 데 걸린 시간 분포. os_type=<runtime os>, provider=azure, object_name=<keyvault object name>, object_type=<keyvault object type>, error=<error if failed>
grpc_request gRPC 요청에 걸린 시간 분포. os_type=<runtime os>, provider=azure, grpc_method=<rpc full method>, grpc_code=<grpc status code>, grpc_message=<grpc status message>

비밀 저장소 CSI 드라이버

메트릭은 포트 8095에서 제공되지만 이 포트는 기본값으로 Pod 외부에 노출되지 않습니다.

  • kubectl port-forward를 사용하여 localhost를 통해 메트릭에 액세스합니다.

    kubectl port-forward -n kube-system ds/aks-secrets-store-csi-driver 8095:8095 &
    curl localhost:8095/metrics
    
비밀 저장소 CSI 드라이버에서 제공하는 메트릭
메트릭 설명 태그
total_node_publish 성공한 볼륨 탑재 요청의 총 수. os_type=<runtime os>, provider=<provider name>
total_node_unpublish 성공한 볼륨 분리 요청의 총 수. os_type=<runtime os>
total_node_publish_error 볼륨 탑재 요청의 총 오류 수. os_type=<runtime os>, provider=<provider name>, error_type=<error code>
total_node_unpublish_error 볼륨 분리 요청의 총 오류 수. os_type=<runtime os>
total_sync_k8s_secret 동기화된 Kubernetes 비밀의 총 수. os_type=<runtime os, provider=<provider name>
sync_k8s_secret_duration_sec Kubernetes 비밀을 동기화하는 데 걸린 시간 분포. os_type=<runtime os>
total_rotation_reconcile 순환 조정의 총 수. os_type=<runtime os>, rotated=<true or false>
total_rotation_reconcile_error 총 순환 수가 오류와 조정됩니다. os_type=<runtime os>, rotated=<true or false>, error_type=<error code>
total_rotation_reconcile_error Pod에 대한 비밀 저장소 콘텐츠를 순환하는 데 걸린 시간 분포. os_type=<runtime os>

오픈 소스에서 AKS 관리 비밀 저장소 CSI 드라이버로 마이그레이션

  1. 다음 helm delete 명령을 사용하여 오픈 소스 비밀 저장소 CSI 드라이버를 제거합니다.

    helm delete <release name>
    

    참고 항목

    배포 YAML을 사용하여 드라이버 및 공급자를 설치한 경우 다음 kubectl delete 명령을 사용하여 구성 요소를 삭제할 수 있습니다.

    # Delete AKV provider pods from Linux nodes
    kubectl delete -f https://raw.githubusercontent.com/Azure/secrets-store-csi-driver-provider-azure/master/deployment/provider-azure-installer.yaml
    
    # Delete AKV provider pods from Windows nodes
    kubectl delete -f https://raw.githubusercontent.com/Azure/secrets-store-csi-driver-provider-azure/master/deployment/provider-azure-installer-windows.yaml
    
  2. az aks enable-addons 명령을 사용하여 기능을 포함한 기존 AKS 클러스터를 업그레이드합니다.

    az aks enable-addons --addons azure-keyvault-secrets-provider --name myAKSCluster --resource-group myResourceGroup
    

문제 해결

문제 해결 단계는 비밀 저장소 CSI 드라이버용 Azure Key Vault 공급자 문제 해결을 참조하세요.

다음 단계

비밀 저장소 CSI 드라이버용 Azure Key Vault 공급자에 대한 자세한 내용은 다음 리소스를 참조하세요.