AKS(Azure Kubernetes Service)는 여러 구성 요소에 대한 인증을 위해 인증서를 사용합니다. 2022년 3월 이후에 만들어진 Azure RBAC(Azure 역할 기반 액세스 제어)가 있는 클러스터는 인증서 자동 회전을 사용하도록 설정됩니다. 보안 또는 정책상의 이유로 해당 인증서를 주기적으로 회전해야 할 수 있습니다. 예를 들어 90일마다 모든 인증서를 회전하는 정책이 있을 수 있습니다.
참고
인증서 자동 회전은 RBAC 사용 AKS 클러스터에 대해서만 기본적으로 사용하도록 설정됩니다.
이 문서에서는 AKS 클러스터에서 인증서 회전이 작동하는 방법을 보여 줍니다.
시작하기 전에
이 문서에는 Azure CLI 버전 2.0.77 이상이 필요합니다. az --version
을(를) 실행하여 버전을 찾습니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.
AKS 인증서, 인증 기관 및 서비스 계정
AKS는 다음 인증서, CA(인증 기관) 및 SA(서비스 계정)를 생성하고 사용합니다.
- AKS API 서버는 클러스터 CA라는 CA를 만듭니다.
- API 서버에는 클러스터 CA가 있으며, 클러스터 CA는 API 서버에서 Kubelet으로의 단방향 통신 인증서에 서명합니다.
- 각 kubelet은 kubelet에서 API 서버로의 통신을 위해 클러스터 CA가 서명하는 CSR(인증서 서명 요청)을 만듭니다.
- API 애그리게이터는 클러스터 CA를 사용하여 다른 API와의 통신을 위한 인증서를 발급합니다. API 애그리게이터는 해당 인증서를 발급하기 위한 자체 CA도 가질 수 있지만, 현재는 클러스터 CA를 사용하고 있습니다.
- 각 노드는 Cluster CA가 서명하는 SA 토큰을 사용합니다.
kubectl
클라이언트는 AKS 클러스터와 통신하기 위한 인증서를 가지고 있습니다.
Microsoft는 클러스터 인증서를 제외하고 이 섹션에 언급된 모든 인증서를 유지 관리합니다.
참고
- 2019년 5월 이전에 만들어진 AKS 클러스터에는 2년 후에 만료되는 인증서가 있습니다.
- 2019년 5월 이후에 만들어진 AKS 클러스터에는 30년 후에 만료되는 클러스터 CA 인증서가 있습니다.
노드 풀의 수명을 표시하는 kubectl get nodes
명령을 사용하여 클러스터가 만들어진 시기를 확인할 수 있습니다.
인증서 만료 날짜 확인
클러스터 인증서 만료 날짜 확인
kubectl config view
명령을 사용하여 클러스터 인증서의 만료 날짜를 확인합니다.kubectl config view --raw -o jsonpath="{.clusters[?(@.name == '')].cluster.certificate-authority-data}" | base64 -d | openssl x509 -text | grep -A2 Validity
API 서버 인증서 만료 날짜 확인
다음
curl
명령을 사용하여 API 서버 인증서의 만료 날짜를 확인합니다.curl https://{apiserver-fqdn} -k -v 2>&1 | grep expire
VMAS 에이전트 노드 인증서 만료 날짜 확인
az vm run-command invoke
명령을 사용하여 VMAS 에이전트 노드 인증서의 만료 날짜를 확인합니다.az vm run-command invoke --resource-group MC_rg_myAKSCluster_region --name vm-name --command-id RunShellScript --query 'value[0].message' -otsv --scripts "openssl x509 -in /etc/kubernetes/certs/apiserver.crt -noout -enddate"
가상 머신 확장 집합 에이전트 노드에 대한 인증서 만료 날짜 확인
az vmss run-command invoke
명령을 사용하여 Virtual Machine Scale Set 에이전트 노드 인증서의 만료 날짜를 확인합니다.az vmss run-command invoke --resource-group "MC_rg_myAKSCluster_region" --name "vmss-name" --command-id RunShellScript --instance-id 1 --scripts "openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -enddate" --query "value[0].message"
인증서 자동 회전
AKS가 CA가 아닌 인증서를 자동으로 회전하려면 클러스터에 모든 Azure 지역에서 기본적으로 사용하도록 설정된 TLS 부트스트랩이 있어야 합니다.
참고
- 기존 클러스터가 있는 경우 인증서 자동 회전을 사용하도록 설정하려면 해당 클러스터를 업그레이드해야 합니다.
- 자동 회전을 사용하도록 설정하려면 부트스트랩을 사용하지 않도록 설정하지 마세요.
- 클러스터가 자동 인증서 회전 중에 중지된 상태인 경우 컨트롤 플레인 인증서만 회전됩니다. 이 경우 인증서 회전 후 노드 풀을 다시 만들어 노드 풀 인증서 회전을 시작해야 합니다.
2022년 3월 이후에 만들거나 업그레이드한 AKS 클러스터의 경우 Azure Kubernetes Service 클라이언트 인증서 유효 시간의 80% 이내에 제어 평면 및 에이전트 노드 모두에서 CA가 아닌 인증서를 자동으로 회전한 후 클러스터 가동 중지 시간 없이 만료됩니다.
현재 에이전트 노드 풀이 TLS 부트스트랩을 사용하도록 설정되어 있는지 확인하는 방법
다음 경로 중 하나를 찾아 클러스터에 TLS 부트스트래핑이 사용하도록 설정되어 있는지 확인합니다.
- Linux 노드에서: /var/lib/kubelet/bootstrap-kubeconfig 또는 /host/var/lib/kubelet/bootstrap-kubeconfig
- Windows 노드: C:\k\bootstrap-config
자세한 내용은 유지 관리 또는 문제 해결을 위해 Azure Kubernetes Service 클러스터 노드에 연결을 참조하세요.
참고
Kubernetes 버전이 발전함에 따라 파일 경로가 변경될 수 있습니다.
지역이 구성되면 새 클러스터를 만들거나 기존 클러스터를 업그레이드하여 클러스터 인증서에 대한 자동 회전을 설정합니다. 이 기능을 사용 설정하려면 컨트롤 플레인과 노드 풀을 업그레이드해야 합니다.
클러스터 인증서 수동 회전
경고
az aks rotate-certs
을(를) 사용하여 인증서를 회전하면 모든 노드, Virtual Machine Scale Sets 및 디스크가 다시 만들어지며 AKS 클러스터에 대해 최대 30분의 가동 중지 시간이 발생할 수 있습니다.
az aks get-credentials
명령을 사용하여 클러스터에 연결합니다.az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME
az aks rotate-certs
명령을 사용하여 클러스터의 모든 인증서, CA 및 SA를 회전합니다.az aks rotate-certs --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME
중요합니다
완료하는 데 최대 30분이
az aks rotate-certs
걸릴 수 있습니다. 완료하기 전에 명령이 실패하면az aks show
을(를) 사용하여 클러스터의 상태가 인증서 회전인지 확인합니다. 클러스터가 실패 상태인 경우,az aks rotate-certs
을(를) 다시 실행하여 인증서를 다시 회전합니다.kubectl get nodes
와 같은kubectl
명령을 사용하여 이전 인증서가 더 이상 유효하지 않은지 확인합니다.kubectl get nodes
kubectl
에서 사용하는 인증서를 업데이트하지 않은 경우 다음 출력 예와 유사한 오류가 표시됩니다.Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "ca")
--overwrite-existing
플래그와 함께az aks get-credentials
명령을 사용하여kubectl
에서 사용하는 인증서를 업데이트합니다.az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME --overwrite-existing
kubectl get
명령을 사용하여 인증서가 업데이트되었는지 확인합니다.kubectl get nodes
참고
AKS 위에서 실행되는 서비스가 있는 경우 해당 인증서를 업데이트해야 할 수도 있습니다.
인증서 회전을 제공하는 Kubelet
Kubelet 서비스 인증서 회전을 통해 AKS는 kubelet 서버 TLS 부트스트래핑을 활용하여 클러스터 CA에서 서명한 서비스 인증서를 부트스트래핑하고 회전할 수 있습니다.
제한점
- Kubernetes 버전 1.27 이상에서 지원됩니다.
- 이전
202501.12.0
노드 이미지를 기반으로 한 노드 풀 스냅샷을 사용 중인 경우, 노드 풀에 대한 지원이 제공되지 않습니다. - 이 기능은 수동으로 사용하도록 설정할 수 없습니다. 기존 노드 풀은 kubernetes 버전 1.27 이상으로 첫 번째 업그레이드를 수행할 때 기본적으로 인증서 회전을 제공하는 kubelet을 사용합니다. kubernetes 버전 1.27 이상의 새 노드 풀에는 기본적으로 인증서 회전을 제공하는 kubelet이 있습니다. 해당 지역에서 인증서 회전을 제공하는 kubelet이 활성화되었는지 확인하려면 AKS 릴리스를 참조하세요.
인증서 회전을 제공하는 kubelet이 사용되었는지 확인합니다.
기능이 활성화된 각 노드에는 레이블 kubernetes.azure.com/kubelet-serving-ca=cluster
이 자동으로 지정됩니다. kubectl get nodes -L kubernetes.azure.com/kubelet-serving-ca
명령을 사용하여 레이블이 설정되었는지 확인합니다.
kubectl get nodes -L kubernetes.azure.com/kubelet-serving-ca
kubelet이 TLS 부트스트래핑 프로세스를 거치는지 확인
이 기능을 사용하도록 설정하면 노드를 실행하는 각 kubelet이 서비스 TLS 부트스트래핑 프로세스를 거쳐야 합니다.
클러스터 내에서 현재 CSR 개체를 kubectl get
가져오는 명령을 사용하여 부트스트래핑 프로세스가 진행되고 있는지 확인합니다.
kubectl get csr --field-selector=spec.signerName=kubernetes.io/kubelet-serving
모든 서비스 CSR은 Approved,Issued
CSR이 승인되고 서명된 인증서를 발급했음을 나타내는 상태여야 합니다. 서비스 CSR에는 서명자 이름이 kubernetes.io/kubelet-serving
있습니다.
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
csr-8mx4w 113s kubernetes.io/kube-apiserver-client-kubelet system:bootstrap:uoxr9r none Approved,Issued
csr-bchlj 111s kubernetes.io/kubelet-serving system:node:akswinp7000000 none Approved,Issued
csr-sb4wz 46m kubernetes.io/kubelet-serving system:node:akswinp6000000 none Approved,Issued
csr-zc4wt 46m kubernetes.io/kube-apiserver-client-kubelet system:bootstrap:ho7zyu none Approved,Issued
kubelet이 서버 TLS 부트스트랩에서 가져온 인증서를 사용하고 있는지 확인
노드의 kubelet이 클러스터 CA에서 서명한 서비스 인증서를 사용하고 있는지 확인하려면 [kubectl debug
][kubectl-debug]를 사용하여 kubelet의 PKI 디렉터리의 내용을 검사합니다.
kubectl debug node/<node> -ti --image=mcr.microsoft.com/azurelinux/base/core:3.0 -- ls -l /host/var/lib/kubelet/kubelet-server-current.pem
kubelet-server-current.pem
symlink가 있는 경우, kubelet은 TLS 부트스트래핑 프로세스를 통해 자체 서빙 인증서를 부트스트랩하거나 회전하며 클러스터 CA에서 서명된 인증서를 사용합니다.
인증서 회전을 제공하는 kubelet 사용 안 함
az aks nodepool update 명령을 사용하여 노드 풀을 업데이트하여 태그 aks-disable-kubelet-serving-certificate-rotation=true
를 지정한 다음 노드를 다시 설치하여 kubelet 서비스 인증서 회전을 사용하지 않도록 설정할 수 있습니다. 노드 이미지 업그레이드를 통해 또는 풀을 0개의 인스턴스로 확장한 다음 원하는 값으로 백업하여 노드 이미지를 다시 설치할 수 있습니다.
az aks nodepool update --cluster-name myCluster --resource-group myResourceGroup --name mynodepool --tags aks-disable-kubelet-serving-certificate-rotation=true
다음 단계
이 문서에서는 클러스터의 인증서, CA 및 SA를 수동으로 회전하는 방법을 보여 주었습니다. 자세한 내용은 AKS(Azure Kubernetes Service)의 클러스터 보안 및 업그레이드 모범 사례를 참조하세요.
Azure Kubernetes Service