GKE Autopilot 파트너의 권한이 있는 워크로드 실행


이 페이지에서는 Google Kubernetes Engine(GKE) Autopilot 파트너의 권한이 있는 워크로드를 실행하는 방법을 보여줍니다. 클러스터에 허용 목록을 설치하고 허용 목록을 최신 상태로 유지하는 동기화 워크로드를 설정하는 방법을 알아봅니다.

이 페이지는 다음 유형의 역할을 대상으로 합니다.

  • 서드 파티 워크로드가 클러스터에서 실행되려면 허용 목록이 필요하고 GKE에서 승인한 소스에서 가져와야 한다고 확인하려는 보안 엔지니어
  • 클러스터에서 서드 파티 워크로드를 사용 설정하여 애플리케이션팀 차단을 해제하려는 플랫폼 엔지니어

문서에서 참조하는 일반적인 역할과 예시 태스크에 대한 자세한 내용은 일반 GKE Enterprise 사용자 역할 및 태스크를 참조하세요.

이 페이지를 읽기 전 다음 내용을 숙지해야 합니다.

Autopilot의 권한이 있는 파트너 워크로드 정보

GKE를 사용하면 승인된 파트너 하위 집합이 Autopilot 클러스터에서 권한이 있는 워크로드를 실행할 수 있습니다. 이러한 권한이 있는 워크로드는 Autopilot에서 적용하는 일부 보안 제약 조건을 우회할 수 있습니다. 예를 들어 파트너가 특정 Linux 기능을 사용하거나 권한이 있는 컨테이너가 필요한 워크로드를 실행해야 할 수 있습니다.

파트너는 권한이 있는 워크로드의 허용 목록을 만들고 유지합니다. 각 허용 목록은 특정 권한이 있는 파트너 워크로드와 일치하는 파일입니다. 파트너는 이러한 허용 목록 파일이 승인될 수 있도록 GKE에 제출합니다. 승인 후 GKE는 Google 관리 저장소에 허용 목록 파일을 호스팅합니다.

파트너 워크로드를 실행하려면 클러스터에 해당 허용 목록 파일을 설치합니다. GKE는 허용 목록을 설치하고 최신 상태로 유지하는 AllowlistSynchronizer라는 Kubernetes 커스텀 리소스를 제공합니다. 허용 목록이 성공적으로 설치되면 해당 권한이 있는 파트너 워크로드를 배포할 수 있습니다.

권한이 있는 워크로드 및 허용 목록의 버그 및 기능 요청

파트너는 권한이 있는 워크로드와 허용 목록을 만들고 개발하고 유지보수해야 합니다. 버그가 발생하거나 권한이 있는 워크로드 또는 허용 목록에 대한 기능 요청이 있는 경우 해당 파트너에게 문의하세요.

AllowlistSynchronizer 컨트롤러 정보

AllowlistSynchronizer는 GKE 컨트롤 플레인에서 실행되는 컨트롤러입니다. 다른 Kubernetes 워크로드를 배포하는 방법과 마찬가지로 새 AllowlistSynchronizer를 YAML 매니페스트로 배포합니다. 서드 파티 파트너로부터 가져오고 설치하려는 허용 목록 파일의 경로를 매니페스트에 지정합니다. 동기화 담당자는 Google 관리 저장소에서 파트너의 허용 목록 파일을 찾아 클러스터에 허용 목록을 설치합니다.

동기화 담당자는 10분 간격으로 허용 목록 파일 업데이트를 확인합니다. 업데이트가 있으면 동기화 담당자는 업데이트된 허용 목록을 클러스터에 설치합니다.

특정 워크로드 허용을 중지하려면 기존 AllowlistSynchronizer를 업데이트하여 해당 허용 목록 파일 경로를 삭제한 후 클러스터에서 WorkloadAllowlist 객체를 삭제합니다. 허용 목록 동기화 담당자에서 경로를 삭제하지 않고 설치된 WorkloadAllowlist 객체를 삭제하면 동기화 담당자가 허용 목록을 다시 설치합니다. 파트너는 Google 관리 저장소에서 허용 목록 파일을 삭제할 수 없습니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화하세요. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.

요구사항

  • AllowlistSynchronizer 커스텀 리소스를 사용하려면 GKE 버전 1.32.2-gke.1652000 이상이 필요합니다.
  • 클러스터에서 실행하려는 파트너 워크로드를 알아야 합니다. 권한이 있는 워크로드를 설치하는 방법은 파트너 문서를 참조하세요.

AllowlistSynchronizer를 만듭니다.

파트너의 권한이 있는 워크로드를 실행하려면 상응하는 허용 목록 파일의 경로를 AllowlistSynchronizer 커스텀 리소스에 추가합니다. 그런 다음 AllowlistSynchronizer를 클러스터에 배포합니다.

  1. 텍스트 편집기에서 새 YAML 파일을 만듭니다.
  2. 다음 콘텐츠를 YAML 파일에 추가합니다.

    apiVersion: auto.gke.io/v1
    kind: AllowlistSynchronizer
    metadata:
      name: ALLOWLIST_SYNCHRONIZER_NAME
    spec:
      allowlistPaths:
      - ALLOWLIST1_PATH
      - ALLOWLIST2_PATH
    

    다음을 바꿉니다.

    • ALLOWLIST_SYNCHRONIZER_NAME: 새 동기화 담당자 이름입니다. 허용 목록에서 지원하는 워크로드나 팀을 식별하는 설명이 포함된 이름을 선택합니다.
    • ALLOWLIST1_PATH, ALLOWLIST2_PATH, ...: 설치할 파트너 허용 목록 파일의 경로 하나 이상입니다. 이 경로에 선택한 파트너 워크로드 문서를 확인합니다. 전체 디렉터리나 개별 파일을 지정할 수 있습니다.
  3. YAML 파일을 클러스터에 배포합니다.

    kubectl apply -f PATH_TO_YAML_FILE
    

    PATH_TO_YAML_FILE을 이전 단계에서 만든 YAML 파일의 경로로 바꿉니다.

    AllowlistSynchronizer 컨트롤러는 지정된 경로의 허용 목록 파일을 클러스터에 설치합니다.

  4. 동기화 담당자가 Ready 상태를 보고할 때까지 기다립니다.

    kubectl wait --for=condition=Ready allowlistsynchronizer/ALLOWLIST_SYNCHRONIZER_NAME \
      --timeout=60s
    

파트너 워크로드 배포를 지속적 통합 및 지속적 배포(CI/CD) 파이프라인에 통합할 수도 있습니다. 허용 목록이 성공적으로 설치될 때까지 기다린 후에 해당하는 워크로드를 배포하도록 워크플로를 구성합니다.

기존 AllowlistSynchronizer 업데이트

기존 AllowlistSynchronizer를 업데이트하여 허용 목록 파일을 추가하거나 삭제할 수 있습니다. 다음과 같은 상황에서 기존 동기화 담당자를 업데이트할 수 있습니다.

  • 파트너가 이름이 다른 새 허용 목록 파일을 추가합니다.
  • 관련 허용 목록을 그룹화하는 기존 동기화 담당자에 새 워크로드 허용 목록을 추가하려고 합니다.
  • 더 이상 해당 워크로드를 사용하지 않으려 하기 때문에 동기화 담당자에서 허용 목록을 삭제하려고 합니다.

기존 AllowlistSynchronizer 객체를 업데이트하려면 다음을 수행합니다.

  1. 클러스터의 기존 동기화 담당자를 나열합니다.

    kubectl get allowlistsynchronizer
    
  2. 텍스트 편집기에서 업데이트하려는 동기화 담당자의 사양을 엽니다.

  3. spec.allowlistPaths 필드를 업데이트하여 허용 목록 파일 경로를 추가, 수정 또는 삭제합니다.

  4. 텍스트 편집기를 저장하고 닫습니다.

  5. 업데이트된 구성을 클러스터에 적용합니다.

    kubectl apply -f PATH_TO_YAML_FILE
    

    PATH_TO_YAML_FILE을 이전 단계에서 업데이트한 YAML 파일의 경로로 바꿉니다.

업데이트된 동기화 담당자 구성을 배포하면 AllowlistSynchronizer 객체 상태에 있는 managedAllowlistStatus.generation 필드가 1씩 증가합니다. 그러면 AllowlistSynchronizer 컨트롤러에서 변경사항을 적용합니다.

허용 목록 동기화 상태 모니터링

AllowlistSynchronizer를 설치하거나 기존 동기화 담당자를 업데이트한 후에 동기화 상태를 모니터링할 수 있습니다. 이 상태는 허용 목록 파일의 설치, 삭제, 수정뿐만 아니라 발생할 수 있는 오류를 추적하는 데 도움이 됩니다.

동기화의 일반적인 상태를 모니터링하려면 다음 명령어를 실행합니다.

kubectl get allowlistsynchronizer ALLOWLIST_SYNCHRONIZER_NAME -o yaml

출력은 다음과 비슷합니다.

...
status:
  conditions:
  - type: Ready
    status: "False"
    reason: "SyncError"
    message: "some allowlists failed to sync: example-allowlist-1.yaml"
    lastTransitionTime: "2024-10-12T10:00:00Z"
    observedGeneration: 2
  managedAllowlistStatus:
    - filePath: "gs://path/to/allowlist1.yaml"
      generation: 1
      phase: Installed
      lastSuccessfulSync: "2024-10-10T10:00:00Z"
    - filePath: "gs://path/to/allowlist2.yaml"
      phase: Failed
      lastError: "Initial install failed: invalid contents"
      lastSuccessfulSync: "2024-10-08T10:00:00Z"

이러한 필드에 대한 설명은 AllowlistSynchronizer 상태를 참조하세요.

클러스터에 허용 목록이 있는지 확인

클러스터에 허용 목록이 있는지 확인하려면 다음 명령어를 실행합니다.

kubectl get workloadallowlist

출력은 클러스터에 설치된 허용 목록의 목록입니다. 출력에 사용하려는 허용 목록이 포함되어 있는지 확인합니다.

권한이 있는 워크로드 배포

허용 목록이 설치되면 클러스터에 해당 워크로드를 배포할 수 있습니다. 워크로드를 제공하는 파트너는 워크로드 설치 안내도 제공해야 합니다. Autopilot 파트너 목록과 문서 링크는 Autopilot 파트너를 참조하세요.

비공개 이미지 미러 저장소 사용

소유한 비공개 저장소에서 파트너 워크로드의 컨테이너 이미지를 미러링할 수 있습니다. 워크로드에서 이러한 미러링된 이미지를 실행하려면 다음 요구사항을 모두 충족해야 합니다.

  • 미러링된 이미지의 SHA-256 다이제스트는 공개적으로 제공되는 파트너 워크로드의 이미지 다이제스트와 일치해야 합니다.
  • 지정하는 SHA-256 이미지 다이제스트는 파트너가 제공하고 클러스터에 동기화된 WorkloadAllowlist 객체에 있어야 합니다.

파트너 워크로드가 미러링된 이미지를 지원하는 경우 해당 워크로드의 허용 목록 사양에는 해당 워크로드의 허용 목록 사양에 있는 containers.imageDigests 필드에 대한 이미지 다이제스트 목록이 포함됩니다. 일반적으로 이 필드에는 사용 가능한 모든 컨테이너 이미지 버전에 대한 별도의 다이제스트가 있습니다. 이미지 다이제스트 목록을 보려면 다음을 수행합니다.

  1. 클러스터에 허용 목록이 있는지 확인합니다.
  2. 설치된 허용 목록의 사양을 가져옵니다.

    kubectl get workloadallowlist ALLOWLIST_NAME -o yaml
    

    ALLOWLIST_NAME을 설치된 허용 목록의 이름으로 바꿉니다. 예를 들면 company-name-solution-v1.0.0입니다.

    이 기능을 지원하는 워크로드의 경우 출력은 다음과 유사합니다. imageDigests 필드에는 허용된 다이제스트 목록이 있습니다.

    # lines omitted for clarity
    - containerName: pause-container1
      imageDigests:
      - cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
      - 932ea160d395f3d7f76c0c17a52a63c4cfe1836a900f1058b6bc20b16fd10d23
    

    출력에 imageDigests 필드가 포함되지 않거나 사용하려는 출시 버전의 다이제스트가 목록에 없으면 파트너에게 직접 연락하여 허용 목록을 업데이트해 달라고 요청합니다. 파트너가 이미지 다이제스트를 허용 목록에 추가하고 변경사항을 GKE에 제출하면 클러스터의 허용 목록 동기화 담당자가 업데이트된 허용 목록을 자동으로 설치합니다.

  3. 지원되는 이미지 다이제스트 중 하나를 워크로드 매니페스트에 추가합니다.

예를 들어 파트너의 공개적으로 사용 가능한 포드 사양에 있는 다음 이미지를 살펴보겠습니다.

...
  containers:
  - name: pause-container1
    image: partner-repo/pause1@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
    securityContext:
      privileged: true

다이제스트가 공개적으로 사용 가능한 다이제스트와 일치하는 경우 미러링된 이미지를 사용할 수 있습니다(예: 다음 예시).

...
  containers:
  - name: pause-container1
    image: my-private-repo/pause1@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
    securityContext:
      privileged: true

이전 예시와 마찬가지로 이미지 필드에 SHA-256 다이제스트를 포함해야 합니다. 다이제스트가 일치하지 않으면 미러링된 이미지가 실행되지 않습니다. 파트너 이미지를 미러링할 때 이미지 다이제스트를 보존하려면 crane, ORAS 또는 skopeo와 같은 도구를 사용하는 것이 좋습니다.

권한이 있는 워크로드 삭제

클러스터에서 권한이 있는 워크로드가 실행되도록 허용하지 않으려면 AllowlistSynchronizer에서 해당 허용 목록의 경로를 삭제합니다. 동기화 담당자가 허용 목록을 제거합니다.

동기화 담당자를 업데이트하는 대신 클러스터에서 WorkloadAllowlist 객체를 삭제하면 동기화 담당자가 허용 목록을 다시 설치합니다. AllowlistSynchronizer에서 경로를 삭제해야 합니다.

허용 목록을 제거하려면 다음을 수행합니다.

  1. 허용 목록을 관리하는 AllowlistSynchronizer의 YAML 매니페스트에서 제거하려는 허용 목록의 경로를 삭제합니다. 자세한 내용은 기존 AllowlistSynchronizer 섹션 업데이트를 참조하세요.
  2. 허용 목록이 제거되었는지 확인하려면 클러스터의 WorkloadAllowlist 객체 목록을 가져옵니다.

    kubectl get workloadallowlist
    

    출력에서 삭제하려는 허용 목록이 표시되지 않는지 확인합니다.

  3. 클러스터에서 워크로드를 삭제합니다. 자세한 내용은 워크로드 제공업체 문서를 참조하세요.

클러스터에서 허용 목록 설치 방지

특정 클러스터에 권한이 있는 워크로드 허용 목록이 설치되지 않게 하려면 ValidatingAdmissionPolicy를 사용합니다. 허용 정책 유효성을 검사하면 Kubernetes 리소스가 클러스터에서 실행되도록 허용되기 전에 특정 기준을 충족하는지 확인할 수 있습니다. 예를 들어 라벨에 특정 값이 있는지 검증할 수 있습니다.

클러스터에 허용 목록을 설치하지 않으려면 다음을 수행합니다.

  1. 다음 ValidatingAdmissionPolicy 매니페스트를 disallow-allowlists.yaml로 저장합니다.

    apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingAdmissionPolicy
    metadata:
      name: "disallow-allowlists"
    spec:
      failurePolicy: Fail
      matchConstraints:
        resourceRules:
        - apiGroups:   ["auto.gke.io"]
          apiVersions: ["*"]
          operations:  ["*"]
          resources:   ["allowlistsynchronizers"]
      validations:
      - expression: "false"
        message: 'AllowlistSynchronizer creation is not allowed'
    
  2. 다음 ValidatingAdmissionPolicyBinding 매니페스트를 disallow-allowlists-binding.yaml로 저장합니다.

    apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingAdmissionPolicyBinding
    metadata:
      name: "disallow-allowlists-binding"
    spec:
      policyName: "disallow-allowlists"
      validationActions: [Deny]
    
  3. 클러스터에 ValidatingAdmissionPolicy를 배포합니다.

    kubectl apply -f disallow-allowlists.yaml
    kubectl apply -f disallow-allowlists-binding.yaml
    

이 정책은 클러스터에 새 AllowlistSynchronizer가 생성되지 않도록 합니다.

문제 해결

동기화 또는 워크로드 배포가 실패하면 권한이 있는 Autopilot 워크로드 배포 문제 해결을 참조하세요.

다음 단계