1. Secret store CSI Driver 설치
- Secrets Store CSI Driver: Kubelet의 모든 인스턴스와의 통신을 용이하게 하는 데몬셋이다.
kubectl get pods -n kube-system -l 'app in (secrets-store-csi-driver,secrets-store-provider-azure)'
# 설치가 안되어 있을 경우 하기 명령어로 설치 진행
az aks enable-addons --addons azure-keyvault-secrets-provider --name <aks-name> --resource-group <resourcegroup-name>
2. Azure Key Vault 생성
az keyvault create -n <keyvault-name> -g <resourcegroup-name> -l koreacentral
3. AKS의 Managed Identity에 Key Vault에 대한 권한 부여
더보기
- AKS 클러스터에는 Azure Load Balancer 또는 ACR과 같은 다른 Azure 리소스를 동적으로 만들고 관리하기 위해 'Azure AD Service Principal' 또는 '시스템 할당 Managed Identity'가 필요하다.
- AKS 클러스터를 만들 때 '시스템 할당 Managed Identity'가 자동으로 생성된다.
- AKS는 'Service Principal'를 자동으로 만들지 않으므로 사용자가 직접 생성해야 한다.
- Azure Keyvault의 RBAC에서 Managed Identity인 azurekeyvaultsecretsprovider-test-aks가 'Keyvault secret 사용자 역할'을 갖도록 설정한다.
4. SecretProviderClass 생성
- SecretProviderClass를 통해 Secrets Store CSI Driver에 드라이버 구성 및 공급자 별 매개변수를 제공한다.
- SecretProviderClass를 통해 Azure Key Vault에서 가져올 값들을 기술한다.
- objectname은 Azure Key Vault에 저장한 key, secret, cert의 이름이다.
# secretproviderclass.yaml
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: azure-kvname-wi # needs to be unique per namespace
spec:
provider: azure
parameters:
usePodIdentity: "false"
clientID: "${USER_ASSIGNED_CLIENT_ID}" # Setting this to use workload identity
keyvaultName: ${KEYVAULT_NAME} # Set to the name of your key vault
cloudName: "" # [OPTIONAL for Azure] if not provided, the Azure environment defaults to AzurePublicCloud
objects: |
array:
- |
objectName: secret1 # Set to the name of your secret
objectType: secret # object types: secret, key, or cert
objectVersion: "" # [OPTIONAL] object versions, default to latest if empty
- |
objectName: key1 # Set to the name of your key
objectType: key
objectVersion: ""
tenantId: "${IDENTITY_TENANT}" # The tenant ID of the key vault
kubectl apply -f secretproviderclass.yaml
5. Pod 생성
- pod에 SecretProviderClass가 마운트 되어야 사용 가능하다.
# pod.yaml
kind: Pod
apiVersion: v1
metadata:
name: busybox-secrets-store-inline-user-msi
spec:
containers:
- name: busybox
image: registry.k8s.io/e2e-test-images/busybox:1.29-4
command:
- "/bin/sleep"
- "10000"
volumeMounts:
- name: secrets-store01-inline
mountPath: "/mnt/secrets-store"
readOnly: true
volumes:
- name: secrets-store01-inline
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: "azure-kvname-user-msi"
kubectl apply -f pod.yaml
6. Pod 접속 후 Secret 값 확인
# 비밀 저장소에 보관된 비밀을 표시
kubectl exec busybox-secrets-store-inline -- ls /mnt/secrets-store/
# 저장소에 비밀을 표시
kubectl exec busybox-secrets-store-inline -- cat /mnt/secrets-store/ExampleSecret
참고
'Container > Kubernetes' 카테고리의 다른 글
[Kubernetes] Prometheus & Grafana를 통한 Kubernetes 모니터링 설정 (0) | 2024.03.18 |
---|---|
[Kubernetes] AKS 클러스터 노드 접속 방법 (0) | 2024.03.07 |
[Kubernetes] Network Policy 개념 및 적용 방법 (0) | 2024.01.09 |
[Kubernetes] Docker 및 Container 개념 정리 (1) | 2024.01.04 |
[Kubernetes] Helm을 사용하여 Nginx Ingress 설치 (0) | 2024.01.02 |