既存のクラスタ オブジェクトの管理

Anthos Config Management を使用してクラスタ オブジェクトを管理する場合、Anthos Config Management はオブジェクトと、オブジェクトに影響を与えるリポジトリ内のコンフィグのセットを監視し、それらが確実に同期されるようにします。このトピックでは、既存のオブジェクトの管理を開始する方法と、現在管理対象となっているオブジェクトを削除せずに管理を停止する方法を説明します。

概要

クラスタ内のオブジェクトにアノテーション configmanagement.gke.io/managed: enabled が付いている場合、そのオブジェクトは Anthos Config Management によって管理されます。

オブジェクトに configmanagement.gke.io/managed ラベルがない場合や、このラベルに enabled 以外の値が設定されている場合、そのオブジェクトは管理対象外です。

次のフローチャートは、オブジェクトが管理対象または管理対象外になるいくつかの状況を示しています。

Anthos Config Management を使用して Kubernetes オブジェクトを管理対象または管理対象外にする方法

このチャートには、3 つの異なるフローが示されています。具体的には、オブジェクトの管理を開始するフロー、オブジェクトの管理を停止するフロー、管理対象のオブジェクトを削除するフローです。

  1. オブジェクトを管理する必要があります。オブジェクトの構成はリポジトリ内にありますか?
    • いいえ: オブジェクトのコンフィグを作成します。Anthos Config Management はアノテーション configmanagement.gke.io/managed: enabled を設定し、オブジェクトの管理を開始します。
    • はい: コンフィグでアノテーション configmanagement.gke.io/managed: disabled を設定していますか?
      • いいえ: オブジェクトはデフォルトで管理されます。
      • はい: コンフィグを編集して configmanagement.gke.io/managed: disabled アノテーションを削除します。変更がソース リポジトリに push されると、Anthos Config Management が変更を認識し、アノテーション configmanagement.gke.io/managed: enabled を適用して、そのコンフィグを適用します。
  2. オブジェクトの管理を停止する必要がありますが、オブジェクトは削除せずに維持する必要があります。
    • リポジトリに保管されているオブジェクトの構成を編集し、アノテーション configmanagement.gke.io/managed: disabled を設定します。コンフィグの変更が検出されると、Anthos Config Management はオブジェクトの管理を停止します。
  3. オブジェクトの管理を停止して、オブジェクトを削除する必要があります。
    • リポジトリからオブジェクトの構成を削除します。以前に管理されていたオブジェクトのコンフィグを削除すると、Anthos Config Management はそのコンフィグが適用されるすべてのクラスターまたは名前空間からオブジェクトを削除します。

Anthos Config Management は、configmanagement.gke.io/managed: enabled アノテーションに加えて、管理するすべてのオブジェクトにラベル app.kubernetes.io/managed-by: configmanagement.gke.io を適用します。このラベルを使用すると、Anthos Config Management によるすべての管理対象オブジェクトを簡単に一覧表示できます。

アノテーションを手動で適用しない理由

Anthos Config Management は宣言型モデルを使用して、リポジトリから目的の構成を読み取ることにより、構成の変更をクラスタに適用します。kubectl コマンドまたは Kubernetes API のいずれかを使用して、アノテーションを手動で適用しようとすると、Anthos Config Management は、手動での変更をリポジトリの内容で自動的にオーバーライドします。

始める前に

次の例は、クイックスタートに基づいています。次の手順を開始する前に、クラスタとリポジトリを調べる前にすべての手順を完了してください。

すべての管理対象オブジェクトを一覧表示する

特定のクラスタまたは名前空間で Anthos Config Management によって管理対象となっているすべてのオブジェクトを一覧表示するには、次のようなラベルセレクタを使用します。

kubectl get object-type -l "app.kubernetes.io/managed-by=configmanagement.gke.io"

Anthos Config Management によって管理対象となっていないすべてのオブジェクトを一覧表示するには、次のようなラベル セレクタを使用します。

kubectl get object-type -l "app.kubernetes.io/managed-by!=configmanagement.gke.io"

たとえば、次のコマンドは、Anthos Config Management の管理対象となっている shipping-dev 名前空間内の RoleBindings を一覧表示します。

kubectl get rolebindings -n shipping-dev \
    -l "app.kubernetes.io/managed-by=configmanagement.gke.io"
NAME           AGE
job-creators   12m
pod-creators   12m
sre-admin      12m
viewers        12m

次のコマンドは、Anthos Config Management の管理対象となっていない kube-system 名前空間内の RoleBindings を一覧表示します。

kubectl get rolebindings -n kube-system \
    -l "app.kubernetes.io/managed-by!=configmanagement.gke.io"
NAME                                             AGE
fluentd-gcp-scaler-binding                       2d21h
gce:cloud-provider                               2d21h
heapster-binding                                 2d21h
metrics-server-auth-reader                       2d21h
system::leader-locking-kube-controller-manager   2d21h
system::leader-locking-kube-scheduler            2d21h
system:controller:bootstrap-signer               2d21h
system:controller:cloud-provider                 2d21h
system:controller:token-cleaner                  2d21h

既存のオブジェクトの管理を開始する

この例では、ロールを手動で作成して、Anthos Config Management でロールの管理を開始します。

  1. myrole ロールを audit 名前空間内に作成します。

    kubectl create role -n audit myrole --verb=get --resource=pods
  2. myrole ロールによって付与される権限を表示します。

    kubectl describe role -n audit myrole
    Name:         myrole
    Labels:       <none>
    Annotations:  <none>
    PolicyRule:
      Resources  Non-Resource URLs  Resource Names  Verbs
      ---------  -----------------  --------------  -----
      pods       []                 []              [get]
    

    このロールには、get Pod の権限のみが含まれています。

  3. この時点で、ロールはクラスターに存在していますが、Anthos Config Management には認識されていません。

    1. ターミナルで、リポジトリのローカル クローンに移動します。
    2. 次のコマンドを使用して、myrole の YAML マニフェストを作成し、そのマニフェストを namespaces/audit/myrole.yaml という名前の新しいファイルに保存します。

      kubectl get role myrole -n audit -o yaml > namespaces/audit/myrole.yaml
      
    3. myrole.yaml ファイルを編集します。

      1. metadata キーの下にある、namenamespace を除くすべてのフィールドを削除します。
      2. rules.verbs リスト フィールド内の get の後に list 動詞を追加します。

      変更を保存します。編集後のファイルの内容は次のようになっています。

      apiVersion: rbac.authorization.k8s.io/v1
      kind: Role
      metadata:
        name: myrole
        namespace: audit
      rules:
      - apiGroups:
        - ""
        resources:
        - pods
        verbs:
        - get
        - list
      
    4. リポジトリに変更を commit します。

    5. Config Management Operator が commit を認識するまでしばらく待ちます。myrole ロールが Anthos Config Management の管理対象になったことを確認するには、もう一度 kubectl describe を実行します。

      kubectl describe role myrole -n audit
      

オブジェクトが Anthos Config Management によって管理されていることを示すアノテーション configmanagement.gke.io/managed: enabled があることがわかります。このアノテーションには、オブジェクトに最新の構成変更を加えた、リポジトリ内のパスとファイル名が示されています。さらに、commit を表す Git ハッシュも示されています。

Name:         myrole
Labels:       app.kubernetes.io/managed-by=configmanagement.gke.io
Annotations:  configmanagement.gke.io/cluster-name: example-cluster-name
              configmanagement.gke.io/managed: enabled
              configmanagement.gke.io/source-path: namespaces/audit/myrole.yaml
              configmanagement.gke.io/token: 0836805a09f160f12aa934b9042527e7283c7030
PolicyRule:
Resources  Non-Resource URLs  Resource Names  Verbs
---------  -----------------  --------------  -----
pods       []                 []              [get list]

管理対象オブジェクトの管理を停止する

この例では、既存のオブジェクトの管理を開始するで管理対象にした myrole ロールなど、Anthos Config Management が現在管理しているオブジェクトの管理を停止する方法を説明します。

  1. リポジトリのローカル クローンに含まれる namespaces/online/shipping-app-backend/shipping-dev/job-creator-rolebinding.yaml ファイルを編集し、以下の太字で示されたテキストと一致する annotations: セクションを追加します。

     kind: RoleBinding
     apiVersion: rbac.authorization.k8s.io/v1
     metadata:
       name: job-creators
     subjects:
     - kind: User
       name: sam@foo-corp.com
       apiGroup: rbac.authorization.k8s.io
     roleRef:
       kind: Role
       name: job-creator
       apiGroup: rbac.authorization.k8s.io
     annotations:
       configmanagement.gke.io/managed: disabled
    

    ファイルを保存します。

  2. 変更を含む Git commit を作成し、その commit をリポジトリに push します。

  3. Anthos Config Management が新しい commit を認識して適用するまでしばらく待ちます。

  4. 次のコマンドを使用して、job-creators RoleBinding に設定されているすべてのアノテーションを一覧表示します。読みやすくするために、出力は一部省略されています。

    kubectl get rolebinding job-creators -n audit -o yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      annotations:
        configmanagement.gke.io/cluster-name: my-cluster
        configmanagement.gke.io/managed: disabled
        configmanagement.gke.io/source-path: namespaces/viewers-rolebinding.yaml
        configmanagement.gke.io/sync-token: fabdb51587d51a81c7e419eeb983aafcf293dc83
    ...
    

オブジェクトが無効になったことを確認した後は、オブジェクトの構成を削除しても、管理対象外になったオブジェクトが名前空間から削除されないことを確認できます。オブジェクトを再度管理する場合は、その設定を再作成する必要があります。このため、オブジェクトの管理を解除し、その構成をリポジトリに残すことをおすすめします。

オブジェクトは管理対象外となったため、新規または既存のクラスタで作成、再作成されません。また、このオブジェクトが存在するとしても、削除されません。管理を停止したオブジェクトの管理を再開するには、次の管理対象外にしたオブジェクトの管理を再開するに記載されている例をご覧ください。

管理対象外にしたオブジェクトの管理を再開する

この例では、既存のオブジェクトの管理を停止するで管理対象外にしたオブジェクトの管理を再開する方法を説明します。この例では、job-creators RoleBinding の構成を削除していないことを前提としています。

  1. 前回の commit でリポジトリから job-creators ロール バインディングを削除した場合は、次の手順を実行します。

    1. git revert を使用して、最後の commit を元に戻します。

      git revert HEAD~1
      

      元に戻す操作の確認を求められます。

    2. 元に戻す commit をリポジトリに push します。

      git push
      
  2. リポジトリのローカル クローンに含まれる namespaces/online/shipping-app-backend/shipping-dev/job-creator-rolebinding.yaml ファイルを編集し、configmanagement.gke.io/managed: disabled アノテーションを削除します。ファイルを保存します。

  3. 変更を commit して push します。Anthos Config Management は次の処理を行います。

    • 変更を認識する
    • configmanagement.gke.io/managed: enabled アノテーションを適用する(これでオブジェクトが管理対象になります)
    • あらゆる管理対象オブジェクトと同じく、構成を適用する
  4. オブジェクトが管理対象になったことを確認するには、オブジェクトのアノテーションを一覧表示します。

    kubectl get rolebinding job-creators -n audit -o yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      annotations:
        configmanagement.gke.io/cluster-name: my-cluster
        configmanagement.gke.io/managed: enabled
    ...
    

名前空間の管理を停止する

名前空間の管理は、あらゆるタイプのオブジェクトの管理を停止する場合と同じ方法で停止できます。Namespace 内の他のリソースの管理を停止するには、次の手順を行います。

  1. configmanagement.gke.io/managed:disabled アノテーションを名前空間コンフィグと同じ名前空間内のすべてのコンフィグに追加します。

  2. 変更をリポジトリに commit して push します。演算子がリポジトリと同期するまで待ちます。

  3. リポジトリから管理対象外のリソースを削除します。

管理対象オブジェクトの構成が管理対象外の名前空間ディレクトリ内にあると、syncer はエラーをログに記録しますが、他の構成は引き続き正常に同期されます。

次のステップ