構成ファイルのドリフトの防止

Config Sync では、自動自己修復、定期的な再同期、オプションのブレ防止により、「シャドウ オペレーション」のリスクを軽減できます。Config Sync がクラスタと信頼できる情報源の間のドリフトを検出した場合、許可して迅速に元に戻すことも、完全に拒否することもできます。

自己修復は、マネージド リソースを監視し、信頼できる情報源からのブレを検出し、そのブレを元に戻します。自己修復は常に有効になっています。

定期的な再同期では、信頼できる情報源に変更がない場合でも、最後に同期が完了してから 1 時間後に自動的に同期されます。定期的な再同期は常に有効になっています。

自己修復と定期的な再同期は、ブレを修正するのに役立ちますが、ブレ防止は管理対象オブジェクトの変更リクエストをインターセプトし、変更を許可するかどうかを検証します。変更が信頼できる情報源と一致しない場合、変更は拒否されます。ブレ防止はデフォルトで無効になっています。有効にすると、ドリフト防止はデフォルトで RootSync オブジェクトを保護します。また、RepoSync オブジェクトを保護するように構成することもできます。

ドリフト防止を使用するには、RootSync API と RepoSync API を有効にする必要があります。

ドリフト防止を有効にする

  1. 構成ファイルの preventDrift フィールドを true に設定し、構成ファイルを適用します。

    gcloud

    Google Cloud コンソールまたは gcloud CLI を使用して Config Sync をインストールした場合は、gcloud CLI を使用してドリフト防止を有効にします。gcloud CLI を最新バージョンに更新してください。gcloud 構成ファイルの spec.configSync.preventDrift フィールドを true に設定し、gcloud 構成ファイルを適用します。

    kubectl

    kubectl を使用して Config Sync を手動でインストールした場合は、kubectl を使用してドリフト防止を有効にします。ConfigManagement オブジェクトの spec.preventDrift フィールドを true に設定し、ConfigManagement オブジェクトを適用します。

  2. ConfigManagement Operator によって Config Sync ValidateWebhookConfiguration オブジェクトが作成されるまで待ちます。

    kubectl get validatingwebhookconfiguration admission-webhook.configsync.gke.io
    

    出力は次の例のようになります。

    NAME                                  WEBHOOKS   AGE
    admission-webhook.configsync.gke.io   0          2m15s
    
  3. root-reconciler Deployment が Config Sync ValidatingWebhookConfiguration オブジェクトに Webhook を追加できるように、同期される信頼できる情報源の新しい変更を commit します。または、root-reconcilier Deployment を削除して調整をトリガーすることもできます。新しい root-reconciler Deployment により、Config Sync ValidatingWebhookConfiguration オブジェクトが更新されます。

  4. Webhook サーバーの準備が整うまで待ちます。Config Sync アドミッション Webhook デプロイログに serving webhook server が含まれているはずです。これには数分かかることがあります。

    kubectl logs -n config-management-system -l app=admission-webhook --tail=-1 | grep "serving webhook server"
    

    出力は次の例のようになります。

    I1201 18:05:41.805531       1 deleg.go:130] controller-runtime/webhook "level"=0 "msg"="serving webhook server"  "host"="" "port"=10250
    I1201 18:07:04.626199       1 deleg.go:130] controller-runtime/webhook "level"=0 "msg"="serving webhook server"  "host"="" "port"=10250
    

ドリフト防止を無効にする

gcloud

Google Cloud コンソールまたは gcloud CLI を使用して Config Sync をインストールした場合は、gcloud CLI を使用してドリフト防止を無効にします。gcloud CLI を最新バージョンに更新してください。gcloud 構成ファイルの spec.configSync.preventDrift フィールドを false に設定するか、フィールドを削除してから、gcloud 構成ファイルを適用します。

kubectl

kubectl を使用して Config Sync を手動でインストールした場合、kubectl を使用してドリフト防止を無効にします。ConfigManagement オブジェクトの spec.preventDrift フィールドを false に設定するか、フィールドを削除してから、ConfigManagement オブジェクトを適用します。

これによって、Config Sync アドミッション Webhook リソースがすべて削除されます。Config Sync ValidatingWebhookConfiguration オブジェクトが存在しないため、Config Sync Reconciler はマネージド リソースの Webhook 構成ファイルを生成しません。

名前空間スコープのソースでアドミッション Webhook を有効にする

名前空間スコープの信頼できる情報源は、Webhook で完全には保護されていません。各名前空間ソースの Config Sync Reconciler には、クラスタレベルで ValidatingWebhookConfiguration オブジェクトの読み取りまたは更新を行う権限がありません。

この権限がないと、Namespace Reconciler のログに次のようなエラーが記録されます。

Failed to update admission webhook: KNV2013: applying changes to
admission webhook: Insufficient permission. To fix, make sure the reconciler has
sufficient permissions.:
validatingwebhookconfigurations.admissionregistration.k8s.io "admission-
webhook.configsync.gke.io" is forbidden: User "system:serviceaccount:config-
management-system:ns-reconciler-NAMESPACE" cannot update resource
"validatingwebhookconfigurations" in API group "admissionregistration.k8s.io" at
the cluster scope

名前空間スコープの信頼できる情報源に Webhook 保護を使用しない場合は、このエラーを無視して問題ありません。ただし、Webhook を使用する場合は、複数の信頼できる情報源からの同期を構成した後に、名前空間スコープの信頼できる各情報源の Reconciler に権限を付与します。ClusterRole cluster-admin 権限を持つ ns-reconciler-NAMESPACE の RoleBinding がすでに存在する場合、この操作を行う必要はありません。

  1. 信頼できる情報源で、Config Sync アドミッション Webhook に権限を付与する新しい ClusterRole 構成を宣言します。この ClusterRole は、クラスタごとに 1 回だけ定義する必要があります。

    # ROOT_SOURCE/cluster-roles/webhook-role.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: admission-webhook-role
    rules:
    - apiGroups: ["admissionregistration.k8s.io"]
      resources: ["validatingwebhookconfigurations"]
      resourceNames: ["admission-webhook.configsync.gke.io"]
      verbs: ["get", "update"]
    
  2. アドミッション Webhook 権限を付与する必要がある名前空間スコープのソースごとに ClusterRoleBinding 構成を宣言して、アドミッション Webhook へのアクセス権を付与します。

    # ROOT_SOURCE/NAMESPACE/sync-webhook-rolebinding.yaml
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: syncs-webhook
    subjects:
    - kind: ServiceAccount
      name: ns-reconciler-NAMESPACE
      namespace: config-management-system
    roleRef:
      kind: ClusterRole
      name: admission-webhook-role
      apiGroup: rbac.authorization.k8s.io
    

    NAMESPACE は、Namespace スコープのソースを作成した Namespace に置き換えます。

  3. Git リポジトリから同期する場合など、信頼できる情報源のルートに変更を commit します。

    git add .
    git commit -m 'Providing namespace repository the permission to update the admission webhook.'
    git push
    
    
  4. kubectl get を使用して ClusterRole と ClusterRoleBinding が作成されていることを確認します。

    kubectl get clusterrole admission-webhook-role
    kubectl get clusterrolebindings syncs-webhook
    

放棄されたリソースのドリフト防止を無効にする

デフォルトでは、RootSync オブジェクトまたは RepoSync オブジェクトを削除しても、Config Sync は以前に RootSync オブジェクトまたは RepoSync オブジェクトによって管理されていたリソースを変更しません。これにより、Config Sync がこれらのリソース オブジェクトの追跡に使用するラベルとアノテーションが残存する場合があります。この結果、ドリフト保護が有効になっている場合は、以前に管理されていたリソースへの変更が拒否される可能性があります。

削除の伝播を使用していない場合は、残存するリソース オブジェクトに Config Sync によって追加されたラベルとアノテーションが保持される可能性があります。

これらのマネージド リソースを保持する場合は、信頼できる情報源で宣言されているすべてのマネージド リソースで configmanagement.gke.io/managed アノテーションを disabled に設定して RootSync オブジェクトまたは RepoSync オブジェクトを削除する前に、これらのリソースを管理対象外にします。これにより、これらのリソースを削除することなく、マネージド リソースからラベルとアノテーションを削除するよう Config Sync に指示されます。同期の完了後、RootSync オブジェクトまたは RepoSync オブジェクトを削除できます。

これらのマネージド リソースを削除するには、次の 2 つの方法があります。

  • 信頼できる情報源からマネージド リソースを削除します。その後、Config Sync はクラスタからマネージド オブジェクトを削除します。同期の完了後、RootSync オブジェクトまたは RepoSync オブジェクトを削除できます。
  • 削除する前に、RootSync オブジェクトまたは RepoSync オブジェクトで削除の伝播を有効にします。その後、Config Sync はクラスタからマネージド オブジェクトを削除します。

マネージド リソースを管理対象外にする前または削除する前に RootSync オブジェクトまたは RepoSync オブジェクトを削除した場合は、RootSync オブジェクトまたは RepoSync オブジェクトを再作成すると信頼できる情報源に一致するクラスタのリソースが採用されます。その後、リソースを管理対象外にするか削除し、変更が同期されるまで待ってから、RootSync オブジェクトまたは RepoSync オブジェクトを再度削除します。

次のステップ