연습 - AKS 클러스터에서 Kubernetes용 Azure Policy 구성

완료됨

Kubernetes용 Azure Policy를 통해 조직이 클라우드 환경에 대한 거버넌스와 법적 요구 사항을 충족하고, 모범 사례를 구현하며, 조직 규칙을 설정할 수 있습니다.

여러분 회사의 개발 팀은 개발 플랫폼으로 AKS(Azure Kubernetes Service)를 도입하고 있습니다. 여러분은 비용을 관리하는 가장 좋은 방법은 워크로드 리소스 제한을 정의하는 비즈니스 규칙을 적용하는 것임을 깨닫습니다. 여러분은 개발자가 특정 CPU 및 메모리 할당 제한 내에서만 워크로드를 배포할 수 있도록 하려고 합니다. 시스템에서 제한을 초과하는 워크로드를 방지해야 합니다.

이 연습에서는 클러스터에서 AKS에 대한 Azure Policy를 사용하도록 설정하고 Kubernetes 클러스터 컨테이너 CPU 및 메모리 리소스 제한이 지정된 제한 정책을 초과하지 않아야 함을 추가 합니다 . 그런 다음 정책이 정책의 리소스 매개 변수를 초과하는 워크로드 예약을 거부하는지 테스트합니다.

ContainerService 및 PolicyInsights 리소스 공급자 사용

  1. Azure 계정을 사용하여 Azure Cloud Shell에 로그인합니다. Cloud Shell의 Bash 버전을 선택합니다.

  2. AKS용 Azure Policy를 사용하려면 클러스터 버전이 1.14 이상이어야 합니다. 다음 스크립트를 실행하여 AKS 클러스터 버전의 유효성을 검사합니다.

    az aks list
    

    보고된 클러스터 버전이 1.14 이상인지 확인합니다.

  3. az provider register 명령을 실행하여 Azure Kubernetes Service 공급자를 등록합니다.

    az provider register --namespace Microsoft.ContainerService
    
  4. az provider register 명령을 실행하여 Azure Policy 공급자를 등록합니다.

    az provider register --namespace Microsoft.PolicyInsights
    
  5. 다음 명령을 실행하여 추가 기능 설치를 사용하도록 설정합니다.az feature register

    az feature register --namespace Microsoft.ContainerService --name AKS-AzurePolicyAutoApprove
    
  6. 기능 목록 테이블을 쿼리하여 등록이 성공했는지 확인합니다. az feature list 명령을 사용하여 쿼리를 실행합니다. 기능의 등록을 마치는 데 몇 분 정도 걸릴 수 있으며, 결과를 주기적으로 확인해야 합니다.

    az feature list -o table --query "[?contains(name, 'Microsoft.ContainerService/AKS-AzurePolicyAutoApprove')].   {Name:name,State:properties.state}"
    

    Cloud Shell 세션 시간이 초과되면 Azure Portal을 통해 미리 보기 온보딩 페이지를 사용하여 등록 프로세스를 추적할 수 있습니다.

  7. 기능 목록 쿼리 명령에 ‘등록됨’이 표시되는지 확인한 후 az provider register 명령을 실행하여 업데이트를 전파합니다.

    az provider register -n Microsoft.ContainerService
    

클러스터에서 Azure Policy 사용

  1. az aks enable-addons 명령을 실행하여 클러스터에서 azure-policy 추가 기능을 사용합니다.

    az aks enable-addons \
        --addons azure-policy \
        --name $AKS_CLUSTER_NAME \
        --resource-group $RESOURCE_GROUP
    
  2. kube-system 네임스페이스에 azure-policy Pod가 설치되고 gatekeeper-system 네임스페이스에 Gatekeeper Pod가 설치되는지 확인합니다. 이렇게 하려면 다음 kubectl get pods 명령을 실행합니다.

    kubectl get pods -n kube-system
    

    출력은 다음과 유사해야 합니다.

    NAME                                    READY   STATUS    RESTARTS   AGE
    azure-policy-78c8d74cd4-7fqn2           1/1     Running   0          12m
    azure-policy-webhook-545c898766-gsjrc   1/1     Running   0          12m
    ...
    
    kubectl get pods -n gatekeeper-system
    

    출력은 다음과 유사해야 합니다.

    NAME                                            READY   STATUS    RESTARTS   AGE
    gatekeeper-controller-manager-d5cd87796-5tmhq   1/1     Running   0          15m
    ...
    
  3. 마지막으로 az aks show 명령을 실행하여 최신 추가 기능을 설치했는지 확인합니다. 이 명령은 클러스터에 대한 구성 정보를 검색합니다.

    az aks show \
     --resource-group $RESOURCE_GROUP\
     --name $AKS_CLUSTER_NAME \
     -o table --query "addonProfiles.azurepolicy"
    

    출력은 다음과 유사해야 합니다.

    {
        "config": null,
        "enabled": true,
        "identity": null
    }
    

    이제 Azure Portal로 전환하여 Kubernetes 클러스터 컨테이너 CPU 및 메모리 리소스 제한이 지정된 제한을 초과하지 않습니다라는 이름의 정책을 구성할 준비가 되었습니다.

기본 제공 정책 정의 할당

새 Azure Policy를 구성하려면 Azure Portal에서 정책 서비스를 사용합니다.

  1. Azure Portal에 로그인합니다.

  2. Azure Portal에서 정책 서비스를 찾습니다. 이렇게 하려면 포털 위쪽의 검색 창에서 ‘정책’을 검색하여 선택합니다.

  3. 아래와 같이 서비스 목록에서 정책 서비스를 선택합니다.

    Screenshot of the general Azure portal search box with a result that shows the Azure Policy service.

    정책 대시보드가 열리고 모든 할당된 정책 및 리소스 상태와 정책이 이들에 미치는 영향을 보여 주는 개요가 표시됩니다. 정책을 할당하지 않은 경우 대시보드는 비어 있습니다.

  4. 왼쪽 메뉴 창의 작성에서 할당을 선택합니다.

    Screenshot of the Policy service navigation panel that shows the location of the Assignments option.

  5. 이전에 설명한 대로 정책 할당은 이니셔티브 또는 정책 할당의 두 가지 방법으로 만들 수 있습니다. 위쪽 메뉴 모음에서 정책 할당을 선택합니다.

    Screenshot that shows the new policy assignment option.

    정책 할당 창이 나타납니다.

  6. 기본 사항 탭에서 각 설정에 대해 다음 값을 입력하여 정책을 만듭니다.

    설정
    범위
    Scope 줄임표(…) 단추를 선택합니다. 범위 창이 나타납니다. 구독에서 리소스 그룹이 있는 구독을 선택합니다. 리소스 그룹의 경우 rg-akscostsaving을 선택한 다음 선택 단추를 선택합니다.
    제외 비워 둡니다.
    기본 사항
    정책 정의 줄임표(…) 단추를 선택합니다. 사용 가능한 정의 창이 나타납니다. 검색 상자에서 CPU를 입력하여 선택 영역을 필터링합니다. 정책 정의 탭에서 Kubernetes 클러스터 컨테이너 CPU를 선택하고 메모리 리소스 제한이 지정된 한도를 초과하지 않아야 함을 선택한 다음 추가를 선택합니다.
    할당 이름 기본값을 적용합니다.
    Description 비워 둡니다.
    정책 적용 해당 옵션이 사용으로 설정되어 있는지 확인합니다.
    할당자 기본값을 적용합니다.

    다음은 완료된 기본 탭의 예입니다.

    Screenshot that shows the information captured in the Basics tab.

  7. 매개 변수 탭을 선택하여 정책에 대한 매개 변수를 지정합니다.

  8. 각 매개 변수 설정에 다음 값을 설정합니다.

    설정
    허용되는 최대 CPU 수 값을 200m으로 설정합니다. 정책은 워크로드 리소스 요청 값과 워크로드 매니페스트 파일에 지정된 워크로드 제한 값 모두에 이 값을 일치시킵니다.
    허용되는 최대 메모리 바이트 값을 256Mi로 설정합니다. 정책은 워크로드 리소스 요청 값과 워크로드 매니페스트 파일에 지정된 워크로드 제한 값 모두에 이 값을 일치시킵니다.

    다음은 완료된 매개 변수 탭의 예입니다.

    Screenshot that shows the information captured in the Parameters tab.

  9. 수정 탭을 선택합니다. 이 탭에서는 새 정책이 이미 존재하는 리소스에 미치는 영향을 선택합니다. 기본적으로 새 정책은 새로 만든 리소스만 확인합니다. 표준 기본값 구성을 유지합니다.

    다음은 완료된 수정 탭의 예입니다.

    Screenshot that shows the information captured in the Remediation tab.

  10. 검토 + 만들기 탭을 선택합니다. 선택한 값을 검토한 다음 만들기를 선택합니다.

Important

기존 AKS 클러스터를 사용하는 경우 정책 할당을 적용하는 데 약 15분이 걸릴 수 있습니다.

리소스 요청 테스트

마지막 단계는 새 정책을 테스트하는 것입니다. 새 정책을 위반하는 리소스 요청 및 제한을 사용하여 테스트 워크로드를 배포합니다. 모든 것이 올바르게 진행되면 서버는 정책에 의해 거부되었음을 나타내는 오류를 반환합니다.

  1. Azure Cloud Shell을 열고 Cloud Shell의 Bash 버전을 선택합니다.

  2. 통합 편집기를 사용하여 Kubernetes 배포에 대한 매니페스트 파일을 만듭니다. test-policy.yaml 파일 호출:

    code test-policy.yaml
    

    Cloud Shell에는 통합 파일 편집기가 포함되어 있습니다. Cloud Shell 편집기는 언어 강조 표시, 명령 팔레트, 파일 탐색기와 같은 기능을 지원합니다. 간단한 파일을 만들고 편집하려면 Cloud Shell 터미널에서 code .를 실행하여 편집기를 시작합니다. 이 작업을 수행하면 터미널에 설정된 활성 작업 디렉터리를 통해 편집기가 열립니다. 빠른 편집을 위해 매니페스트 파일을 직접 열려면 code test-policy.yaml을 실행합니다. 이 명령은 파일 탐색기 없이 편집기를 엽니다.

  3. 다음 텍스트를 파일에 붙여넣습니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 500m
            memory: 256Mi
          limits:
            cpu: 1000m
            memory: 500Mi
    
  4. Ctrl+S를 눌러 파일을 저장한 다음 Ctrl+Q를 눌러 편집기를 닫습니다.

  5. kubectl apply 명령을 실행하여 구성을 적용하고 costsavings 네임스페이스에서 애플리케이션을 배포합니다.

    kubectl apply \
    --namespace costsavings \
    -f test-policy.yaml
    

    출력은 다음과 유사합니다.

    Error from server (
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> memory limit <500Mi> is higher than the maximum allowed of <256Mi>
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> cpu limit <1> is higher than the maximum allowed of <200m>)
     : error when creating "test-deploy.yml"
     : admission webhook "validation.gatekeeper.sh" denied the request: 
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> memory limit <500Mi> is higher than the maximum allowed of <256Mi>
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> cpu limit <1> is higher than the maximum allowed of <200m>
    

    허용 웹후크 validation.gatekeeper.sh에서 Pod 예약 요청이 어떻게 거부되었는지 확인합니다.

  6. 매니페스트 파일을 열고 리소스 요청을 수정합니다.

    code test-policy.yaml
    

    텍스트를 다음 텍스트로 바꿉다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 200m
            memory: 256Mi
          limits:
            cpu: 200m
            memory: 256Mi
    
  7. Ctrl+S를 눌러 파일을 저장한 다음 Ctrl+Q를 눌러 편집기를 닫습니다.

  8. kubectl apply 명령을 실행하여 구성을 적용하고 costsavings 네임스페이스에서 애플리케이션을 배포합니다.

    kubectl apply \
    --namespace costsavings \
    -f test-policy.yaml
    

    다음과 같은 출력이 표시됩니다.

    pod/nginx created
    
  9. costsavings 네임스페이스에서 새로 만든 Pod의 Pod를 가져옵니다.

    kubectl get pods --namespace costsavings
    

    몇 초 안에 Pod가 Running 상태로 전환됩니다.

    NAME    READY   STATUS    RESTARTS   AGE
    nginx   1/1     Running   0          50s
    
  10. Pod가 실행 중인 것을 확인하면 Ctrl+C를 눌러 감시를 중지합니다.