다음을 통해 공유


배포 세이프가드를 사용하여 AKS(Azure Kubernetes Service)에서 모범 사례 적용(미리 보기)

이 문서에서는 배포 세이프가드를 사용하여 AKS(Azure Kubernetes Service) 클러스터에 모범 사례를 적용하는 방법을 보여 줍니다.

개요

개발 수명 주기 전반에 걸쳐 Kubernetes 리소스의 초기 배포에 잘못된 구성이 포함된 경우 버그, 문제 및 기타 문제가 발생하는 것이 일반적입니다. Kubernetes 개발 부담을 완화하기 위해 AKS(Azure Kubernetes Service)는 배포 세이프가드(미리 보기)를 제공합니다. 배포 세이프가드는 Azure Policy 제어를 통해 AKS 클러스터에 Kubernetes 모범 사례를 적용합니다.

배포 세이프가드는 두 가지 수준의 구성을 제공합니다.

  • Warning: 비준수 클러스터 구성에 대해 경고하기 위해 코드 터미널에 경고 메시지를 표시하지만 여전히 요청이 통과하도록 허용합니다.
  • Enforcement: 모범 사례를 따르지 않는 경우 배포를 거부하고 변형하여 규정 준수 구성을 적용합니다.

'경고' 또는 '적용'에 대한 배포 세이프가드를 구성한 후 배포 세이프가드는 규정 준수를 위해 만들기 또는 업데이트 시 클러스터를 프로그래밍 방식으로 평가합니다. 또한 배포 세이프가드는 Azure Portal이나 CLI 또는 터미널에서 Azure Policy의 규정 준수 대시보드를 통해 리소스 수준별로 워크로드 전반에 걸쳐 집계된 규정 준수 정보를 표시합니다. 비준수 워크로드를 실행한다는 것은 클러스터가 모범 사례를 따르지 않으며 클러스터의 워크로드가 클러스터 구성으로 인해 발생하는 문제를 경험할 위험이 있음을 나타냅니다.

Important

AKS 미리 보기 기능은 셀프 서비스에서 사용할 수 있습니다(옵트인 방식). 미리 보기는 "있는 그대로" 및 "사용 가능한 상태로" 제공되며 서비스 수준 계약 및 제한적 보증에서 제외됩니다. AKS 미리 보기의 일부는 고객 지원팀에서 최선을 다해 지원합니다. 따라서 이러한 기능은 프로덕션 용도로 사용할 수 없습니다. 자세한 내용은 다음 지원 문서를 참조하세요.

필수 조건

  • AKS에 대해 Azure Policy 추가 기능을 사용하도록 설정해야 합니다. 자세한 내용은 AKS 클러스터에서 Azure Policy 사용을 참조하세요.

  • 배포 세이프가드를 구성하려면 aks-preview 확장 버전 2.0.0b1 이상이 있어야 합니다. 확장을 설치하려면 aks-preview CLI 확장 설치를 참조하세요. 또한 최신 버전이 설치되어 있는지 확인하기 위해 Azure CLI를 업데이트하는 것이 좋습니다.

  • 배포 세이프가드 구성을 만들고 수정하려면 AKS 클러스터에 대한 다음 권한이 있는 구독이 필요합니다.

    • Microsoft.Authorization/policyAssignments/write
    • Microsoft.Authorization/policyAssignments/read
  • 배포 세이프가드 기능 플래그를 등록해야 합니다. 기능 플래그를 등록하려면 배포 세이프가드 기능을 위한 기능 플래그 등록을 참조하세요.

aks-preview CLI 확장 설치

  1. az extension add 명령을 사용하여 aks-preview CLI 확장을 설치합니다.

    az extension add --name aks-preview
    
  2. az extension update 명령을 사용하여 최신 버전이 설치되어 있는지 확인하려면 확장을 업데이트합니다.

    az extension update --name aks-preview
    

배포 세이프가드 기능 플래그 등록

  1. az feature register 명령을 사용하여 SafeguardsPreview 기능 플래그를 등록합니다.

    az feature register --namespace Microsoft.ContainerService --name SafeguardsPreview
    

    상태가 Registered로 표시되는 데 몇 분 정도 걸립니다.

  2. 또한 az feature show 명령을 사용하여 등록 상태를 확인합니다.

    az feature show --namespace Microsoft.ContainerService --name SafeguardsPreview
    
  3. 상태가 Registered(등록됨)를 반영하면 az provider register 명령을 사용하여 Microsoft.ContainerService 리소스 공급자의 등록을 새로 고칩니다.

    az provider register --namespace Microsoft.ContainerService
    

배포 세이프가드 정책

참고 항목

ReadOnlyRootFilesystemRootfilesystemInitContainers 정책은 현재 Linux에서만 사용할 수 있습니다.

다음 표에는 배포 세이프가드를 사용하도록 설정할 때 사용하도록 설정되는 정책과 해당 정책이 대상으로 삼는 Kubernetes 리소스가 나열되어 있습니다. Azure Portal에서 Azure Policy 정의로 또는 Azure Kubernetes Service용 Azure Policy 기본 제공 정의에서 현재 사용 가능한 배포 세이프가드를 볼 수 있습니다. 이 컬렉션의 목적은 대부분의 사용자와 사용 사례에 적용할 수 있는 일반적인 모범 사례 목록을 만드는 것입니다.

배포 세이프가드 정책 대상 Kubernetes 리소스 가능한 경우 변형 결과
[미리 보기]: 개별 노드를 편집할 수 없음 노드 해당 없음
Kubernetes 클러스터 컨테이너 CPU 및 메모리 리소스 제한은 지정된 제한을 초과하지 않아야 함 Pod 설정되지 않은 경우 CPU 리소스 제한을 500m로 설정하고 경로가 없는 경우 메모리 제한을 500Mi로 설정합니다.
[미리 보기]: 선호도 방지 규칙 집합이 있어야 함 배포, StatefulSet, 복제 컨트롤러, ReplicaSet 해당 없음
[미리 보기]: AKS 특정 레이블 없음 배포, StatefulSet, Replicaset 해당 없음
Kubernetes 클러스터 컨테이너는 허용된 이미지만 사용해야 함 Pod 해당 없음
[미리 보기]: 예약된 시스템 풀 taint 노드 설정되지 않은 경우 사용자 노드 풀에서 CriticalAddonsOnly 테인트를 제거합니다. AKS는 CriticalAddonsOnly 테인트를 사용하여 고객 Pod를 시스템 풀에서 먼 거리를 유지합니다. 이 구성은 AKS 구성 요소와 고객 Pod 간의 명확한 분리를 보장하고 CriticalAddonsOnly 테인트를 허용하지 않는 고객 Pod의 제거를 방지합니다.
클러스터 컨테이너에 준비 상태 또는 활동성 프로브가 구성되어 있는지 확인 Pod 해당 없음
Kubernetes 클러스터는 CSI(Container Storage Interface) 드라이버 StorageClass를 사용해야 합니다. StorageClass 해당 없음
[미리 보기]: Kubernetes 클러스터 컨테이너는 이미지 끌어오기 비밀이 있는 경우에만 이미지를 가져와야 합니다. Pod 해당 없음
[미리 보기]: Kubernetes 클러스터는 정확한 Pod 중단 예산을 구현해야 합니다. 배포, ReplicaSet, StatefulSet PodDisruptionBudget 리소스의 maxUnavailable을 1로 설정합니다.
[미리 보기]: Kubernetes 클러스터 서비스는 고유한 선택기를 사용해야 합니다. 서비스 해당 없음
[미리 보기]: Pod 사양의 ReadOnlyRootFilesystem이 true로 설정되었습니다. Pod 설정되지 않은 경우 Pod 사양의 readOnlyRootFilesystemtrue로 설정합니다. 이 구성은 컨테이너가 루트 파일 시스템에 쓰는 것을 방지합니다.
[미리 보기]: Pod 사양의 RootfilesystemInitContainers이 true로 설정되었습니다. Pod 설정되지 않은 경우 Pod 사양의 rootFilesystemInitContainerstrue로 설정합니다.
[미리 보기]: Kubernetes 클러스터 컨테이너 이미지에는 최신 이미지 태그가 포함되어서는 안 됩니다. 배포, StatefulSet, 복제 컨트롤러, ReplicaSet 해당 없음
[미리 보기]: Kubernetes 클러스터 컨테이너 이미지에는 preStop 후크가 포함되어야 합니다. 배포, StatefulSet, 복제 컨트롤러, ReplicaSet 해당 없음

배포 세이프가드에 대한 아이디어나 요청을 제출하려면 AKS GitHub 리포지토리에서 문제를 열고 제목 시작 부분에 [deployment safeguards request]를 추가합니다.

배포 세이프가드 사용

참고 항목

배포 세이프가드를 사용하기 위해 처음으로 Azure Policy를 사용하도록 설정한 경우 Azure Policy가 적용될 때까지 최대 20분을 기다려야 할 수 있습니다.

배포 세이프가드 Enforcement 수준을 사용한다는 것은 배포가 차단되고 변경되도록 선택한다는 의미입니다. Enforcement를 사용하도록 설정하기 전에 이러한 정책이 AKS 클러스터에서 어떻게 작동할 수 있는지 생각해보세요.

새 클러스터에서 배포 세이프가드 기능 사용

--safeguards-level--safeguards-version 플래그와 함께 az aks create 명령을 사용하여 새 클러스터에서 배포 세이프가드를 사용하도록 설정합니다.

비준수 경고를 받으려면 --safeguards-levelWarning으로 설정합니다. 모든 비준수 배포를 거부하거나 변경하려면 Enforcement로 설정합니다. 경고를 받으려면 --safeguards-level을 "경고"로 설정합니다. 배포 세이프가드를 준수하지 않는 모든 배포를 거부하거나 변경하려면 --safeguards-level을 "적용"으로 설정합니다. 배포 세이프가드 버전을 설정하려면 --safeguards-version 플래그를 사용합니다. 현재 V2.0.0은 배포 세이프가드의 최신 버전입니다.

az aks create \
    --name myAKSCluster \
    --resource-group myResourceGroup \
    --enable-addons azure-policy \
    --safeguards-level Warning \
    --safeguards-version v2.0.0 \
    --generate-ssh-keys

기존 클러스터에서 배포 세이프가드 기능 사용

--safeguards-level--safeguards-version 플래그와 함께 az aks update 명령을 사용하여 Azure Policy 추가 기능이 사용하도록 설정된 기존 클러스터에서 배포 세이프가드를 사용하도록 설정합니다. 비준수 경고를 받으려면 --safeguards-levelWarning으로 설정합니다. 모든 비준수 배포를 거부하거나 변경하려면 Enforcement로 설정합니다.

az aks update --name myAKSCluster --resource-group myResourceGroup --safeguards-level Enforcement --safeguards-version v2.0.0

기존 클러스터의 배포 세이프가드 수준을 업데이트하려면 --safeguards-level 플래그가 Warning 또는 Enforcement로 설정된 az aks update 명령을 사용합니다.

az aks update --name myAKSCluster --resource-group myResourceGroup --safeguards-level Enforcement

네임스페이스 제외

배포 세이프가드에서 특정 네임스페이스를 제외할 수도 있습니다. 네임스페이스를 제외하면 해당 네임스페이스의 작업은 배포 세이프가드 경고 또는 적용의 영향을 받지 않습니다.

예를 들어, ns1ns2 네임스페이스를 제외하려면 다음 예와 같이 --safeguards-excluded-ns 플래그와 함께 쉼표로 구분된 네임스페이스 목록을 사용합니다.

az aks update --name myAKSCluster --resource-group myResourceGroup --safeguards-level Warning --safeguards-version v2.0.0 --safeguards-excluded-ns ns1,ns2 

배포 세이프가드 버전 업데이트

참고 항목

v2.0.0은 최신 버전의 배포 세이프가드입니다.

--safeguards-version 플래그가 새 버전으로 설정된 az aks update 명령을 사용하여 배포 세이프가드 버전을 업데이트합니다. 다음 예에서는 버전 2.0.0을 사용하도록 기존 클러스터를 업데이트합니다.

az aks update --name myAKSCluster --resource-group myResourceGroup --safeguards-version v2.0.0

클러스터 전체의 준수 확인

Kubernetes 매니페스트를 배포한 후 다음 예와 같이 클러스터가 배포 세이프가드를 준수하지 않는 경우 CLI 또는 터미널에 경고 또는 잠재적인 거부 메시지가 표시됩니다.

경고

$ kubectl apply -f pod.yml
Warning: [azurepolicy-k8sazurev2containerenforceprob-0e8a839bcd103e7b96a8] Container <my-container> in your Pod <my-pod> has no <livenessProbe>. Required probes: ["readinessProbe", "livenessProbe"]
Warning: [azurepolicy-k8sazurev2containerenforceprob-0e8a839bcd103e7b96a8] Container <my-container> in your Pod <my-pod> has no <readinessProbe>. Required probes: ["readinessProbe", "livenessProbe"]
Warning: [azurepolicy-k8sazurev1restrictedlabels-67c4210cc58f28acdfdb] Label <{"kubernetes.azure.com"}> is reserved for AKS use only
Warning: [azurepolicy-k8sazurev3containerlimits-a8754961dbd4c1d8b49d] container <my-container> has no resource limits
Warning: [azurepolicy-k8sazurev1containerrestrictedi-bde07e1776cbcc9aa8b8] my-pod in default does not have imagePullSecrets. Unauthenticated image pulls are not recommended.
pod/my-pod created

적용

배포 세이프가드 변형을 사용하면 Enforcement 수준이 적용 가능한 경우 Kubernetes 리소스를 변형합니다. 그러나 Kubernetes 리소스가 성공적으로 배포되려면 여전히 모든 세이프가드를 통과해야 합니다. 보호 정책이 실패하면 리소스가 거부되고 배포되지 않습니다.

$ kubectl apply -f pod.yml
Error from server (Forbidden): error when creating ".\pod.yml": admission webhook "validation.gatekeeper.sh" denied the request: [azurepolicy-k8sazurev2containerenforceprob-0e8a839bcd103e7b96a8] Container <my-container> in your Pod <my-pod> has no <livenessProbe>. Required probes: ["readinessProbe", "livenessProbe"]
[azurepolicy-k8sazurev2containerenforceprob-0e8a839bcd103e7b96a8] Container <my-container> in your Pod <my-pod> has no <readinessProbe>. Required probes: ["readinessProbe", "livenessProbe"]
[azurepolicy-k8sazurev2containerallowedimag-1ff6d14b2f8da22019d7] Container image my-image for container my-container has not been allowed.
[azurepolicy-k8sazurev1restrictedlabels-67c4210cc58f28acdfdb] Label <{"kubernetes.azure.com"}> is reserved for AKS use only
[azurepolicy-k8sazurev1containerrestrictedi-bde07e1776cbcc9aa8b8] my-pod in default does not have imagePullSecrets. Unauthenticated image pulls are not recommended.

Kubernetes 리소스가 적용 가능한 변형 세이프가드를 준수하고 다른 모든 보호 요구 사항을 충족하면 다음 예와 같이 성공적으로 배포됩니다.

$ kubectl apply -f pod.yml
pod/my-pod created

Azure Policy 대시보드를 사용하여 클러스터 전체의 규정 준수 확인

배포 세이프가드가 적용되었는지 확인하고 클러스터의 규정 준수 여부를 확인하려면 클러스터의 Azure Portal 페이지로 이동하여 정책을 선택한 다음 Azure Policy로 이동을 선택합니다.

정책 및 이니셔티브 목록에서 배포 세이프가드와 관련된 이니셔티브를 선택합니다. AKS 클러스터 전체의 준수 상태를 보여 주는 대시보드가 표시됩니다.

참고 항목

AKS 클러스터 전체의 준수를 적절하게 평가하려면 Azure Policy 이니셔티브의 범위를 클러스터의 리소스 그룹으로 지정해야 합니다.

배포 세이프가드 사용 안 함

az aks update 명령을 사용하여 클러스터에서 배포 세이프가드를 사용하지 않도록 설정하고 --safeguards-levelOff로 설정합니다.

az aks update --name myAKSCluster --resource-group myResourceGroup --safeguards-level Off

--

FAQ

처음으로 Azure Policy를 사용하여 배포 세이프가드 기능을 사용하도록 설정했습니다. 경고가 표시되지 않는 이유는 무엇인가요? 내 Pod가 거부되지 않는 이유는 무엇인가요?

Azure Policy를 처음 사용하도록 설정한 후 클러스터와 동기화하는 데 최대 35분이 걸릴 수 있습니다.

방금 경고에서 적용으로 전환했습니다. 이것이 즉시 적용되나요?

배포 세이프가드 수준을 전환할 때 새 수준이 적용될 때까지 최대 15분을 기다려야 할 수 있습니다.

나만의 변형을 만들 수 있나요?

아니요. 보호 장치에 대한 아이디어가 있으면 AKS GitHub 리포지토리에서 문제를 열고 제목 시작 부분에 [deployment safeguards request]를 추가합니다.

집행에서 원하는 변형을 골라 선택할 수 있나요?

아니요. 배포 세이프가드는 전부 적용되거나 전혀 적용되지 않습니다. 경고 또는 집행을 켜면 모든 세이프가드가 활성화됩니다.

모범 사례를 따르지 않았음에도 배포 리소스가 승인된 이유는 무엇인가요?

배포 세이프가드는 Azure Policy 제어를 통해 모범 사례 표준을 적용하고 Kubernetes 리소스에 대해 유효성을 검사하는 정책을 포함합니다. 클러스터 구성 요소를 평가하고 적용하기 위해 Azure Policy는 Gatekeeper를 확장합니다. Gatekeeper 적용은 현재 fail-open 모델에서도 작동합니다. Gatekeeper가 네트워킹 호출에 응답한다는 보장이 없으므로 이 경우 거부로 인해 배포가 차단되지 않도록 유효성 검사를 건너뜁니다.

자세한 내용은 Gatekeeper의 워크로드 유효성 검사를 참조하세요.

다음 단계

  • AKS 클러스터 운영에 대한 모범 사례에 대해 자세히 알아봅니다.