정책 컨트롤러는 워크로드의 성능 또는 신뢰성 저하 없이 비용 효율적인 GKE 클러스터를 실행하기 위한 권장사항을 채택하는 데 도움이 되는 비용 및 신뢰성 정책 번들과 함께 사용할 수 있는 제약조건 템플릿의 기본 라이브러리와 함께 제공됩니다.
이 페이지에는 정책 번들을 수동으로 적용하는 방법에 관한 안내가 포함되어 있습니다. 또는 정책 번들을 직접 적용할 수 있습니다.
비용 및 신뢰성 정책 번들 제약조건
| 제약조건 이름 | 제약조건 설명 | 
|---|---|
| cost-reliability-v2023-pod-disruption-budget | Deployments, ReplicaSets, StatefulSets, ReplicationControllers에 대한 PodDisruptionBudget 구성이 필요합니다. | 
| cost-reliability-v2023-pod-resources-best-practices | 컨테이너에서 리소스 요청을 설정하고 권장사항을 따라야 합니다. | 
| cost-reliability-v2023-required-labels | 모든 포드 및 컨트롤러(ReplicaSet, Deployment, StatefulSet, DaemonSet)에 필요한 라벨(환경, 팀, 앱)이 있어야 합니다. | 
| cost-reliability-v2023-restrict-repos | Artifact Registry를 사용해 이미지 스트리밍을 활용하도록 컨테이너 이미지를 허용된 저장소 목록으로 제한합니다. | 
| cost-reliability-v2023-spotvm-termination-grace | gke-spot이 nodeSelector 또는 nodeAfffinty인 포드 및 포드 템플릿의 terminationGracePeriodSeconds가 15초 이하여야 합니다. | 
시작하기 전에
- 이 안내에서 사용되는 gcloud,kubectl명령어를 제공하는 Google Cloud CLI를 설치하고 초기화합니다. Cloud Shell을 사용하는 경우 Google Cloud CLI가 사전 설치됩니다.
- 제약조건 템플릿의 기본 라이브러리를 사용하여 클러스터에 정책 컨트롤러를 설치합니다. 이 번들에는 참조 제약조건이 포함되어 있으므로 참조 제약조건에 대한 지원을 사용 설정해야 합니다.
참조 제약조건에 맞게 정책 컨트롤러 구성
- 다음 YAML 매니페스트를 파일에 - policycontroller-config.yaml로 저장합니다. 이 매니페스트는 특정 종류의 객체를 감시하도록 정책 컨트롤러를 구성합니다.- apiVersion: config.gatekeeper.sh/v1alpha1 kind: Config metadata: name: config namespace: "gatekeeper-system" spec: sync: syncOnly: - group: "" version: "v1" kind: "Service" - group: "policy" version: "v1" kind: "PodDisruptionBudget"
- policycontroller-config.yaml매니페스트를 적용합니다.- kubectl apply -f policycontroller-config.yaml 
클러스터 및 워크로드 구성
- service에서 선택한 모든- pod에는 준비 프로브가 포함되어야 합니다.
- 모든 deployment,replicaset,statefulset,replicationcontroller에는poddisruptionbudget이 포함되어야 합니다.
- 모든 컨테이너에는 cpu및memory요청이 포함되어야 하며memory한도가 권장사항을 따르는memory요청과 동일해야 합니다.
- 모든 포드 및 포드 템플릿에 environment,team,app라벨을 추가합니다.
- 클러스터와 동일한 리전에서 Artifact Registry를 사용하여 컨테이너 이미지를 호스팅해 이미지 스트리밍을 사용 설정합니다.
cost-reliability-v2023-restrict-repos의 예시를 따라 관련 Artifact Registry를 허용합니다.
- gke-spot을 사용하는 모든 포드 및 포드 템플릿에는 15초 이하의- terminationGracePeriodSeconds가 포함되어야 합니다.
비용 및 신뢰성 정책 번들 감사
정책 컨트롤러를 사용하면 Kubernetes 클러스터에 정책을 적용할 수 있습니다. 앞의 테이블에서 설명된 비용 및 신뢰성 정책과 관련하여 워크로드 및 규정 준수를 테스트하는 데 도움이 되도록, '감사' 모드에서 이러한 제약조건을 배포하여 위반 사항을 표시할 수 있고 더 중요하게는 Kubernetes 클러스터에 적용하기 전에 문제를 해결할 기회를 가질 수 있습니다.
kubectl, kpt 또는 구성 동기화를 사용하여 dryrun으로 설정된 spec.enforcementAction으로 이러한 정책을 적용할 수 있습니다.
kubectl
- (선택사항) kubectl을 사용하여 정책 제약조건을 미리 봅니다. - kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/cost-reliability-v2023 
- kubectl을 사용하여 정책 제약조건을 적용합니다. - kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/cost-reliability-v2023 - 출력은 다음과 같습니다. - gkespotvmterminationgrace.constraints.gatekeeper.sh/cost-reliability-v2023-spotvm-termination-grace created k8sallowedrepos.constraints.gatekeeper.sh/cost-reliability-v2023-restrict-repos created k8spoddisruptionbudget.constraints.gatekeeper.sh/cost-reliability-v2023-pod-disruption-budget created k8spodresourcesbestpractices.constraints.gatekeeper.sh/cost-reliability-v2023-pod-resources-best-practices created k8srequiredlabels.constraints.gatekeeper.sh/cost-reliability-v2023-required-labels created 
- 정책 제약조건이 설치되었는지 확인하고 클러스터 전체에 위반 사항이 있는지 확인합니다. - kubectl get constraints -l policycontroller.gke.io/bundleName=cost-reliability-v2023 - 출력은 다음과 비슷합니다. - NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS gkespotvmterminationgrace.constraints.gatekeeper.sh/cost-reliability-v2023-spotvm-termination-grace dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spodresourcesbestpractices.constraints.gatekeeper.sh/cost-reliability-v2023-pod-resources-best-practices dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spoddisruptionbudget.constraints.gatekeeper.sh/cost-reliability-v2023-pod-disruption-budget dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8sallowedrepos.constraints.gatekeeper.sh/cost-reliability-v2023-restrict-repos dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequiredlabels.constraints.gatekeeper.sh/cost-reliability-v2023-required-labels dryrun 0 
kpt
- kpt를 설치하고 설정합니다. - 이 안내에서는 kpt를 사용하여 Kubernetes 리소스를 맞춤설정하고 배포합니다. 
- kpt를 사용하여 GitHub에서 PCI-DSS v3.2.1 정책 번들을 다운로드합니다. - kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/cost-reliability-v2023 
- set-enforcement-actionkpt 함수를 실행하여 정책의 시정 조치를- dryrun으로 설정합니다.- kpt fn eval cost-reliability-v2023 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \ -- enforcementAction=dryrun 
- 변경사항을 추적하는 리소스를 만드는 kpt로 작업 디렉터리를 초기화합니다. - cd cost-reliability-v2023 kpt live init 
- kpt로 정책 제약조건을 적용합니다. - kpt live apply 
- 정책 제약조건이 설치되었는지 확인하고 클러스터 전체에 위반 사항이 있는지 확인합니다. - kpt live status --output table --poll-until current - CURRENT상태는 제약조건이 성공적으로 설치되었음을 확인합니다.
구성 동기화
- kpt를 설치하고 설정합니다. - 이 안내에서는 kpt를 사용하여 Kubernetes 리소스를 맞춤설정하고 배포합니다. - 구성 동기화를 사용하여 클러스터에 정책을 배포하는 운영자는 다음 안내를 따르세요. 
- 구성 동기화의 동기화 디렉터리로 변경합니다. - cd SYNC_ROOT_DIR - resourcegroup.yaml로- .gitignore를 만들거나 추가하려면 다음 안내를 따르세요.- echo resourcegroup.yaml >> .gitignore 
- 전용 - policies디렉터리를 만듭니다.- mkdir -p policies 
- kpt를 사용하여 GitHub에서 비용 및 신뢰성 정책 번들을 다운로드합니다. - kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/cost-reliability-v2023 policies/cost-reliability-v2023 
- set-enforcement-actionkpt 함수를 실행하여 정책의 시정 조치를- dryrun으로 설정합니다.- kpt fn eval policies/cost-reliability-v2023 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun 
- (선택사항) 생성될 정책 제약조건을 미리 봅니다. - kpt live init policies/cost-reliability-v2023 kpt live apply --dry-run policies/cost-reliability-v2023 
- 구성 동기화의 동기화 디렉터리에 Kustomize가 사용되는 경우 루트 - kustomization.yaml에- policies/cost-reliability-v2023을 추가합니다. 그렇지 않으면- policies/cost-reliability-v2023/kustomization.yaml파일을 삭제합니다.- rm SYNC_ROOT_DIR/policies/cost-reliability-v2023/kustomization.yaml 
- 구성 동기화 저장소에 변경사항을 푸시합니다. - git add SYNC_ROOT_DIR/policies/cost-reliability-v2023 git commit -m 'Adding Cost and Reliability policy audit enforcement' git push 
- 설치 상태를 확인합니다. - watch gcloud beta container fleet config-management status --project PROJECT_ID - SYNCED상태는 정책 설치를 확인합니다.
정책 위반 보기
정책 제약조건이 감사 모드로 설치되면 정책 컨트롤러 대시보드를 사용하여 UI에서 클러스터 위반을 볼 수 있습니다.
또한 kubectl을 사용하여 다음 명령어로 클러스터에서 위반 항목을 볼 수 있습니다.
kubectl get constraint -l policycontroller.gke.io/bundleName=cost-reliability-v2023 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'
위반 항목이 있는 경우 다음을 통해 제약조건당 위반 메시지 목록을 볼 수 있습니다.
kubectl get constraint -l policycontroller.gke.io/bundleName=cost-reliability-v2023 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'
비용 및 신뢰성 정책 번들 시정 조치 변경
클러스터에서 정책 위반을 검토한 후에는 허용 컨트롤러가 호환되지 않는 리소스가 클러스터에 적용되지 않도록 warn 또는 deny를 수행할 수 있도록 시행 모드 변경을 고려할 수 있습니다.
kubectl
- kubectl을 사용하여 정책의 시정 조치를 - warn로 설정합니다.- kubectl get constraints -l policycontroller.gke.io/bundleName=cost-reliability-v2023 -o name | xargs -I {} kubectl patch {} --type='json' -p='[{"op":"replace","path":"/spec/enforcementAction","value":"warn"}]'
- 정책 제약조건 시정 조치가 업데이트되었는지 확인합니다. - kubectl get constraints -l policycontroller.gke.io/bundleName=cost-reliability-v2023 
kpt
- set-enforcement-actionkpt 함수를 실행하여 정책의 시정 조치를- warn으로 설정합니다.- kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn 
- 정책 제약조건을 적용합니다. - kpt live apply 
구성 동기화
구성 동기화를 사용하여 클러스터에 정책을 배포하는 운영자는 다음 안내를 따르세요.
- 구성 동기화의 동기화 디렉터리로 변경합니다. - cd SYNC_ROOT_DIR 
- set-enforcement-actionkpt 함수를 실행하여 정책의 시정 조치를- warn으로 설정합니다.- kpt fn eval policies/cost-reliability-v2023 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn 
- 구성 동기화 저장소에 변경사항을 푸시합니다. - git add SYNC_ROOT_DIR/policies/cost-reliability-v2023 git commit -m 'Adding Cost and Reliability policy bundle warn enforcement' git push 
- 설치 상태를 확인합니다. - nomos status - 클러스터에 설치된 정책과 함께 - SYNCED상태가 표시됩니다.
테스트 정책 시행
다음 명령어를 사용하여 클러스터에 정책을 준수하지 않는 리소스를 만듭니다.
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: wp-non-compliant
  labels:
    app: wordpress
spec:
  containers:
    - image: wordpress
      name: wordpress
      ports:
      - containerPort: 80
        hostPort: 80
        name: wordpress
EOF
다음 예시와 같이 허용 컨트롤러는 이 리소스가 위반하는 정책 위반을 나열하는 경고를 생성해야 합니다.
Warning: [cost-reliability-v2023-pod-resources-best-practices] Container <wordpress> must set <cpu> request. Warning: [cost-reliability-v2023-pod-resources-best-practices] Container <wordpress> must set <memory> request. Warning: [cost-reliability-v2023-required-labels] This app is missing one or more required labels: `environment`, `team`, and `app`. Warning: [cost-reliability-v2023-restrict-repos] container <wordpress> has an invalid image repo <wordpress>, allowed repos are ["gcr.io/gke-release/", "gcr.io/anthos-baremetal-release/", "gcr.io/config-management-release/", "gcr.io/kubebuilder/", "gcr.io/gkeconnect/", "gke.gcr.io/"] pod/wp-non-compliant created
비용 및 신뢰성 정책 번들 삭제
필요한 경우 클러스터에서 비용 및 신뢰성 정책 번들을 삭제할 수 있습니다.
kubectl
kubectl을 사용하여 정책을 삭제합니다.
kubectl delete constraint -l policycontroller.gke.io/bundleName=cost-reliability-v2023
kpt
정책을 삭제합니다.
kpt live destroy
구성 동기화
구성 동기화를 사용하여 클러스터에 정책을 배포하는 운영자는 다음 안내를 따르세요.
- 구성 동기화 저장소에 변경사항을 푸시합니다. - git rm -r SYNC_ROOT_DIR/policies/cost-reliability-v2023 git commit -m 'Removing Cost and Reliability policies' git push 
- 상태를 확인합니다. - nomos status - 클러스터에 리소스가 삭제된 상태로 - SYNCED상태가 표시됩니다.