구성 컨트롤러로 리소스 관리

구성 커넥터, 정책 컨트롤러, 구성 동기화가 사전 설치되는 구성 컨트롤러 인스턴스를 만드는 방법을 알아봅니다. 이제 다음 태스크를 완료하여 인스턴스 사용 방법을 알아봅니다.

  • 구성 커넥터를 사용하여 Google Cloud 리소스를 만들고 관리합니다.
  • 정책을 적용하고 배포되기 전 정책 위반 사항을 감지하는 정책 컨트롤러 제약조건을 만듭니다.
  • Google Cloud 리소스가 포함된 샘플 저장소로부터 동기화하도록 구성 동기화를 구성하여 GitOps를 설정합니다.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud CLI를 설치합니다.
  3. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  4. Google Cloud 프로젝트를 만들거나 선택합니다.

    • Google Cloud 프로젝트를 만듭니다.

      gcloud projects create PROJECT_ID

      PROJECT_ID를 만들려는 Google Cloud 프로젝트의 이름으로 바꿉니다.

    • 만든 Google Cloud 프로젝트를 선택합니다.

      gcloud config set project PROJECT_ID

      PROJECT_ID를 Google Cloud 프로젝트 이름으로 바꿉니다.

  5. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  6. KRM, GKE API, Resource Manager, 서비스 사용량 API를 사용 설정합니다.

    gcloud services enable krmapihosting.googleapis.com  container.googleapis.com  cloudresourcemanager.googleapis.com  serviceusage.googleapis.com
  7. Google Cloud CLI를 설치합니다.
  8. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  9. Google Cloud 프로젝트를 만들거나 선택합니다.

    • Google Cloud 프로젝트를 만듭니다.

      gcloud projects create PROJECT_ID

      PROJECT_ID를 만들려는 Google Cloud 프로젝트의 이름으로 바꿉니다.

    • 만든 Google Cloud 프로젝트를 선택합니다.

      gcloud config set project PROJECT_ID

      PROJECT_ID를 Google Cloud 프로젝트 이름으로 바꿉니다.

  10. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  11. KRM, GKE API, Resource Manager, 서비스 사용량 API를 사용 설정합니다.

    gcloud services enable krmapihosting.googleapis.com  container.googleapis.com  cloudresourcemanager.googleapis.com  serviceusage.googleapis.com

구성 컨트롤러 인스턴스 만들기

  1. 터미널에서 Autopilot 구성 컨트롤러 인스턴스를 만듭니다.

    gcloud anthos config controller create cc-example \
        --location=us-central1 \
        --full-management
    

    이 작업은 완료하는 데 최대 15분이 걸릴 수 있습니다.

    출력은 다음과 같습니다.

    Created instance [cc-example].
    Fetching cluster endpoint and auth data.
    kubeconfig entry generated for krmapihost-cc-example.
    
  2. 구성 컨트롤러 엔드포인트와 통신하도록 kubectl을 구성하려면 필요한 인증 사용자 인증 정보 및 엔드포인트 정보를 가져옵니다.

    gcloud anthos config controller get-credentials cc-example \
        --location us-central1
    
  3. 구성 컨트롤러 인스턴스 목록을 확인하여 인스턴스가 생성되었는지 확인합니다.

    gcloud anthos config controller list --location=us-central1
    

    출력은 다음과 같습니다.

    NAME                 LOCATION                 STATE
    cc-example           us-central1              RUNNING
    

구성 컨트롤러에 필요한 권한 부여

이 섹션에서는 구성 컨트롤러에 Google Cloud 리소스를 관리하기 위한 권한을 부여합니다

  1. 서비스 계정 이메일에 대한 환경 변수를 설정합니다.

    export SA_EMAIL="$(kubectl get ConfigConnectorContext -n config-control \
        -o jsonpath='{.items[0].spec.googleServiceAccount}' 2> /dev/null)"
    
  2. 정책 바인딩을 만듭니다.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "serviceAccount:${SA_EMAIL}" \
        --role "roles/owner" \
        --project PROJECT_ID
    

    PROJECT_ID를 프로젝트 ID로 바꿉니다.

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

    Updated IAM policy for project [PROJECT_ID].
    auditConfigs:
    - auditLogConfigs:
      - logType: ADMIN_READ
      - logType: DATA_READ
      - logType: DATA_WRITE
      service: gkehub.googleapis.com
    # Remainder of output omitted
    

구성 컨트롤러 인스턴스 사용

다음 섹션에서는 구성 컨트롤러 인스턴스를 사용할 수 있는 방법을 소개합니다.

구성 커넥터로 Google Cloud 리소스 만들기

구성 컨트롤러 인스턴스를 사용하면 구성 커넥터를 활용해서 Kubernetes 도구 및 API를 사용하여 여러 Google Cloud 서비스 및 리소스를 관리할 수 있습니다. 이 섹션에서는 구성 컨트롤러를 사용하여 PubSubTopic 리소스를 만듭니다.

구성 커넥터를 사용하여 Pub/Sub 주제를 만들려면 다음 단계를 완료하세요.

  1. 구성 커넥터를 사용하여 Pub/Sub API를 사용 설정합니다.

    1. 원하는 텍스트 편집기를 사용하여 enable-pubsub.yaml이라는 파일을 만들고 여기에 다음 YAML을 복사합니다.

      # enable-pubsub.yaml
      apiVersion: serviceusage.cnrm.cloud.google.com/v1beta1
      kind: Service
      metadata:
        name: pubsub.googleapis.com
        namespace: config-control
      spec:
        projectRef:
          external: projects/PROJECT_ID
      

      PROJECT_ID를 프로젝트 ID로 바꿉니다.

    2. Pub/Sub API를 사용 설정하려면 클러스터에 매니페스트를 적용합니다.

      kubectl apply -f enable-pubsub.yaml
      

      이 API를 사용 설정하려면 몇 분 정도 걸릴 수 있습니다.

  2. 구성 커넥터를 사용하여 Pub/Sub 주제를 만듭니다.

    1. pubsub-topic.yaml 파일을 만들고 이 파일에 다음 YAML을 복사합니다.

      # pubsub-topic.yaml
      apiVersion: pubsub.cnrm.cloud.google.com/v1beta1
      kind: PubSubTopic
      metadata:
        annotations:
          cnrm.cloud.google.com/project-id: PROJECT_ID
        labels:
          label-one: "value-one"
        name: example-topic
        namespace: config-control
      
    2. Pub/Sub 주제를 만듭니다.

      kubectl apply -f pubsub-topic.yaml
      
  3. Pub/Sub 주제 목록을 확인하여 구성 컨트롤러로 Google Cloud에 리소스가 생성되었는지 확인합니다.

    gcloud pubsub topics list
    

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

    ---
    name: projects/PROJECT_ID/topics/start-instance-event
    ---
    labels:
      label-one: value-one
      managed-by-cnrm: 'true'
    name: projects/PROJECT_ID/topics/example-topic
    

정책 컨트롤러로 정책 적용

구성 컨트롤러 인스턴스를 사용하면 정책 컨트롤러 및 정책 컨트롤러 제약조건을 사용할 수 있습니다. 정책 컨트롤러를 설치한 동안 구성 컨트롤러가 제약조건 템플릿 라이브러리를 자동으로 설치합니다. 이 라이브러리의 템플릿을 사용하여 구성 컨트롤러 인스턴스에 다양한 일반 보안 및 규정준수 제어를 적용할 수 있습니다.

이 섹션에서는 GCPStorageLocationConstraintV1 제약조건 템플릿을 사용하여 제약조건을 만듭니다. 이 템플릿을 사용하면 Cloud Storage 버킷을 만들 수 있는 위치를 제한할 수 있습니다. 이 템플릿을 사용하여 만드는 제약조건은 위치를 us-central1로 제한합니다. 최고의 가격 및 성능을 제공하는 리전에서 버킷이 생성되도록 하려면 이 제약조건을 사용해야 할 수 있습니다.

제약조건을 만들려면 다음 안내를 따르세요.

  1. bucket-constraint.yaml 파일을 만들고 이 파일에 다음 YAML을 복사합니다.

    # bucket-constraint.yaml
    apiVersion: constraints.gatekeeper.sh/v1beta1
    kind: GCPStorageLocationConstraintV1
    metadata:
      name: storage-only-in-us-central1
    spec:
      match:
        kinds:
        - apiGroups:
          - storage.cnrm.cloud.google.com
          kinds:
          - StorageBucket
      parameters:
        locations:
        - us-central1
    
  2. 제약조건을 만듭니다.

    kubectl apply -f bucket-constraint.yaml
    

    출력은 다음과 같습니다.

    gcpstoragelocationconstraintv1.constraints.gatekeeper.sh/storage-only-in-us-central1 created`
    
  3. 구성 커넥터를 사용하여 asia-southeast1에서 StorageBucket 리소스를 만들기를 시도하여 제약조건이 작동하는지를 보여줍니다.

    1. asia-storage-bucket.yaml 파일을 만들고 이 파일에 다음 YAML을 복사합니다.

      # asia-storage-bucket.yaml
      apiVersion: storage.cnrm.cloud.google.com/v1beta1
      kind: StorageBucket
      metadata:
        name: bucket-in-disallowed-location
        namespace: config-control
      spec:
        location: asia-southeast1
      
    2. Cloud Storage 버킷 만들기를 시도합니다.

      kubectl apply -f asia-storage-bucket.yaml
      

      출력은 다음과 같습니다.

      Error from server (Forbidden): error when creating "STDIN": admission webhook "validation.gatekeeper.sh" denied the request: [storage-only-in-us-central1] Cloud Storage bucket <bucket-in-disallowed-location> uses a disallowed location <asia-southeast1>, allowed locations are ["us-central1"]
      

구성 동기화로 GitOps 설정

구성 동기화는 Git 저장소, OCI 이미지, Helm 저장소에 저장된 구성, 정책, Google Cloud 리소스로 구성 컨트롤러 인스턴스를 동기화할 수 있게 해주는 GitOps 서비스입니다. 구성 동기화는 소스의 구성으로 구성 컨트롤러 상태를 지속적으로 조정하기 때문에 인스턴스에 일관적인 구성이 사용되도록 보장할 수 있습니다.

이 섹션에서는 구성 컨트롤러 인스턴스를 공개 GitHub 저장소로 동기화합니다. 이 저장소에는 다른 PubSubTopic 리소스가 포함됩니다. 이 저장소에서 인스턴스를 동기화하면 리소스가 자동으로 생성되고 인스턴스에 적용됩니다. GitOps 워크플로를 사용하려면 리소스를 직접 적용하는 대신 구성 동기화를 사용하여 리소스를 만들도록 선택할 수 있습니다.

  1. GitHub에서 동기화하려면 Cloud NAT를 설정합니다. 구성 컨트롤러 인스턴스가 비공개 Google Kubernetes Engine(GKE) Enterprise 버전 클러스터로 지원되고 비공개 클러스터 노드에 아웃바운드 인터넷 액세스가 없기 때문에 이를 수행해야 합니다.

    1. Cloud NAT 라우터를 만듭니다. NAT 게이트웨이를 설정하려면 이 라우터가 필요합니다.

      gcloud compute routers create cc-nat-router \
          --network default \
          --region us-central1
      

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

      Creating router [cc-nat-router]...done.
      NAME           REGION       NETWORK
      cc-nat-router  us-central1  default
      
    2. 이전 단계에서 만든 라우터에서 NAT 게이트웨이를 설정합니다.

      gcloud compute routers nats create cc-nat-config \
          --router-region us-central1 \
          --router cc-nat-router \
          --nat-all-subnet-ip-ranges \
          --auto-allocate-nat-external-ips
      

      출력은 다음과 같습니다.

      Creating NAT [cc-nat-config] in router [cc-nat-router]...done.
      
  2. 샘플 저장소에서 동기화하도록 구성 컨트롤러 인스턴스를 구성하려면 cc-rootsync.yaml이라는 파일을 만들고 여기에 다음 YAML을 복사합니다.

    # cc-rootsync.yaml
    apiVersion: configsync.gke.io/v1beta1
    kind: RootSync
    metadata:
      name: root-sync
      namespace: config-management-system
    spec:
      sourceFormat: unstructured
      git:
        repo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples
        branch: main
        dir: config-controller-quickstart
        auth: none
    
  3. 구성을 적용합니다.

    kubectl apply -f cc-rootsync.yaml
    

    인스턴스가 저장소로부터 동기화된 후 구성 동기화가 Pub/Sub 주제를 만들고 이를 구성 컨트롤러 인스턴스에 적용합니다.

  4. 구성 동기화가 Git 저장소를 구성 컨트롤러 인스턴스에 동기화하는지 확인합니다.

    nomos status --contexts gke_PROJECT_ID_us-central1_krmapihost-cc-example
    

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

    *gke_PROJECT_ID_us-central1_krmapihost-cc-example
    --------------------
    <root>:root-sync                         https://github.com/GoogleCloudPlatform/anthos-config-management-samples/config-controller-quickstart@main
    SYNCED @ 2023-01-10 18:31:02 +0000 UTC   715b4295d3eac07b057cce2543275c1ee104cad8
    Managed resources:
       NAMESPACE        NAME                                                               STATUS   SOURCEHASH
       config-control   pubsubtopic.pubsub.cnrm.cloud.google.com/pubsub-topic-sample-sync  Current   715b429
       config-control   service.serviceusage.cnrm.cloud.google.com/pubsub.googleapis.com   Current   715b429
    

    이 출력이 표시되지 않으면 몇 분 정도 기다린 후 다시 시도합니다.

  5. 구성 컨트롤러로 리소스가 생성되었는지 확인합니다.

    gcloud pubsub topics list
    

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

    name: projects/PROJECT_ID/topics/start-instance-event
    ---
    labels:
      managed-by-cnrm: 'true'
    name: projects/PROJECT_ID/topics/sample-topic
    ---
    labels:
      managed-by-cnrm: 'true'
    name: projects/PROJECT_ID/topics/pubsub-topic-sample-sync
    ---
    labels:
      label-one: value-one
      managed-by-cnrm: 'true'
    name: projects/PROJECT_ID/topics/example-topic
    

    이 출력에서는 구성 컨트롤러 인스턴스 만들기 섹션에서 만든 Pub/Sub와 GitHub 저장소에 인스턴스를 동기화하여 생성된 항목을 볼 수 있습니다.

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

프로젝트 삭제

    Google Cloud 프로젝트를 삭제합니다.

    gcloud projects delete PROJECT_ID

개별 리소스 삭제

  1. 구성 커넥터 PubSubTopic 리소스를 삭제합니다.

    kubectl delete -f pubsub-topic.yaml
    
  2. 정책 컨트롤러 제약조건을 삭제합니다.

    kubectl delete -f bucket-constraint.yaml
    
  3. NAT 라우터를 삭제합니다.

    gcloud compute routers delete cc-nat-router \
        --project=PROJECT_ID \
        --region=us-central1
    

    메시지가 표시되면 y를 누릅니다.

  4. 구성 동기화로 생성된 Pub/Sub 리소스를 삭제합니다.

    kubectl delete PubSubTopic pubsub-topic-sample-sync -n config-control
    
  5. RootSync 리소스를 삭제합니다.

    kubectl delete rootsync root-sync -n config-management-system
    
  6. 원하는 텍스트 편집기를 사용하여 만든 모든 YAML 파일을 삭제합니다.

    • enable-pubsub.yaml
    • pubsub-topic.yaml
    • bucket-constraint.yaml
    • asia-storage-bucket.yaml
    • cc-rootsync.yaml
  7. 구성 컨트롤러 인스턴스를 삭제합니다.

    gcloud anthos config controller delete --location=us-central1 cc-example
    

    메시지가 표시되면 y를 누릅니다.

다음 단계