構成ファイルの同期の停止と再開

状況によっては、Config Sync がリポジトリから構成ファイルを同期するのを即座に停止する必要がある場合があります。そのような状況の一例として、構文的には有効であるが間違った構成をリポジトリに commit し、その構成を削除または修正する間、実行中のクラスタへの影響を制限する場合があります。

前提条件

このトピックで説明するコマンドを実行するユーザーには、kube-system 名前空間(1.9.0 より前のバージョンにのみ必要)と、同期を停止するすべてのクラスタ上の config-management-system 名前空間で、次の Kubernetes RBAC 権限が必要です。

- apiGroups: ["extensions"]
  resources: ["deployments", "deployments/scale"]
  verbs: ["get", "update"]
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["list", "watch"]

config-management-operator の名前空間

config-management-operator は、1.9.0 より前のバージョンの Anthos Config Management では、kube-system 名前空間にありました。Anthos Config Management 1.9.0 では、config-management-operator は config-management-system 名前空間に移動しています。次のいずれかのコマンドを実行する前に、バージョン固有の名前空間を示す環境変数を設定します。

1.9.0 以降のバージョンの Anthos Config Management の場合:

export OPERATOR_NAMESPACE=config-management-system

1.9.0 より前のバージョンの場合:

export OPERATOR_NAMESPACE=kube-system

単一リポジトリからの同期の停止と再開

このセクションでは、単一のリポジトリに対して直ちに同期を停止する方法と、問題が修正されたときに同期を再開する方法について説明します。複数のリポジトリの同期を停止する方法については、複数のリポジトリからの同期の停止と再開をご覧ください。

同期を停止する

同期を停止する場合は、以下のコマンドを実行します。コマンドは、便宜上 1 つのコマンドとして記載されていますが、個別に実行することもできます。

kubectl scale -n $OPERATOR_NAMESPACE deployment config-management-operator --replicas=0 \
&& kubectl wait -n $OPERATOR_NAMESPACE --for=delete pods -l k8s-app=config-management-operator \
&& kubectl scale -n config-management-system deployment --replicas=0 --all \
&& kubectl wait -n config-management-system --for=delete pods --all

このコマンドでは次の処理を順番に実行します。コマンドが失敗すると、残りのコマンドは実行されません。

  1. Config Management Operator Deployment の replicas 数を 0 に減らします。
  2. config-management-system Namespace で実行されているすべての Pod の replicas 数を 0 に減らします。どの Pod が影響を受けるかは、プロダクトのバージョンによって異なります。

すべての Deployment はクラスタ内にありますが、Operator のレプリカなどの同期を処理するプロセスがないため、構成ファイルはリポジトリから同期されません。

登録されているすべてのクラスタで同期を停止する

一度に 1 つのクラスタではなく、1 つの Google Cloud プロジェクト内に登録されているすべてのクラスタで同期を停止する必要がある場合は、nomos status コマンドを使用するスクリプトを作成して、登録されているすべてのクラスタのリストを取得できます。スクリプトは、gcloud container clusters get-credentials コマンドを使用して各クラスタの kubectl コンテキストを作成し、前記のコマンドを各クラスタで実行します。このようなスクリプトの簡単な例を次に示します。

#!/bin/bash

nomos status |grep SYNCED | awk {'print $1'} |while read i; do

  gcloud container clusters get-credentials "$i"

  kubectl scale -n $OPERATOR_NAMESPACE deployment config-management-operator --replicas=0 \
  && kubectl wait -n $OPERATOR_NAMESPACE --for=delete pods -l k8s-app=config-management-operator \
  && kubectl scale -n config-management-system deployment --replicas=0 --all \
  && kubectl wait -n config-management-system --for=delete pods --all

done

同期を再開する

同期を再開するには、以下のコマンドを実行します。

kubectl -n $OPERATOR_NAMESPACE scale deployment config-management-operator --replicas=1

このコマンドによって、Operator Deployment が 1 つのレプリカにスケールされます。その後、Operator によって config-management-system Namespace Deployment の Pod が正しくスケールされていないことが認識され、適切なレプリカ数にスケールされます。

登録されているすべてのクラスタで同期を再開する

一度に 1 つのクラスタではなく、Google Cloud プロジェクト内に登録されているすべてのクラスタで同期を再開する必要がある場合は、nomos status を使用するスクリプトを作成して、登録されているすべてのクラスタのリストを取得できます。スクリプトは、gcloud container clusters get-credentials コマンドを使用して各クラスタの kubectl コンテキストを作成し、前記のコマンドを各クラスタで実行します。このようなスクリプトの簡単な例を次に示します。

#!/bin/bash

nomos status |grep SYNCED | awk {'print $1'} |while read i; do

  gcloud container clusters get-credentials "$i"

  kubectl -n $OPERATOR_NAMESPACE scale deployment config-management-operator --replicas=1

done

複数のリポジトリからの同期の停止と再開

このセクションの説明は複数のリポジトリを対象にしています。ここでは、複数のリポジトリの同期を一時的に停止して再開する方法について説明します。この操作は、間違った構成がリポジトリに誤って commit された場合に必要になる可能性があります。単一リポジトリの同期を停止する方法については、単一リポジトリからの同期の停止と再開をご覧ください。

ルート リポジトリでの同期は、中央管理者のみが停止できます。

Namespace リポジトリで同期を停止する機能は、Namespace リポジトリに使用された構成方式によって異なります。

  • ルート リポジトリ内で Namespace リポジトリを管理する方式を使用した場合は、中央管理者のみが同期を停止して再開できます。

  • Kubernetes API で Namespace リポジトリを管理する方式を使用した場合は、アプリケーション オペレータが対象の Namespace リポジトリからの同期を停止して再開できます。

同期を停止する

このセクションでは、ルート リポジトリと Namespace リポジトリの同期を停止する方法について説明します。Reconciler Manager による変更の取り消しを停止するには、次のコマンドを実行して Reconciler Manager を停止する必要があります。

kubectl -n $OPERATOR_NAMESPACE scale deployment config-management-operator --replicas=0 \
&& kubectl wait -n $OPERATOR_NAMESPACE --for=delete pods -l k8s-app=config-management-operator --timeout=60s \
&& kubectl scale deployment -n config-management-system reconciler-manager --replicas=0 \
&& kubectl wait -n config-management-system --for=delete pods -l app=reconciler-manager

このコマンドでは次の処理を順番に実行します。コマンドが失敗すると、残りのコマンドは実行されません。

  1. Config Management Operator Deployment の replicas 数を 0 に減らします。
  2. Reconciler Manager の Deployment の replicas 数を 0 に減らします。

ルート リポジトリからの同期を停止する

ルート リポジトリからの同期は、中央管理者が次のコマンドを実行して停止できます。

kubectl -n config-management-system scale deployment root-reconciler --replicas=0

このコマンドは、root-reconciler Deploymentreplicas 数を 0 に減らします。

Namespace リポジトリからの同期を停止する

[ルート リポジトリ方式] または [Kubernetes API 方式] のタブを選択することで、該当する手順が表示されます。

ルート リポジトリ方式

ルート リポジトリ内の Namespace リポジトリを管理する方式を使用する場合、Namespace リポジトリからの同期は、中央管理者が次のコマンドを実行して停止できます。

kubectl -n config-management-system scale deployment ns-reconciler-NAMESPACE --replicas=0

このコマンドは、ns-reconciler-NAMESPACE Deployment のレプリカ数を 0 に減らします。

Kubernetes API 方式

Kubernetes API で Namespace リポジトリを管理する方式を使用する場合、同期は、アプリケーション オペレータが次のコマンドを実行して停止できます。

  1. RepoSync 構成を取得して保存します。これは、同期を再開したときに使用します。

    kubectl -n NAMESPACE get reposyncs repo-sync -oyaml > repo-sync.yaml
    

    NAMESPACE は、RepoSync オブジェクトの Namespace に置き換えます。

  2. RepoSync 構成を削除します。

    kubectl -n NAMESPACE delete reposyncs repo-sync
    

    このコマンドは、Reconciler Manager をトリガーして NAMESPACE から Namespace 調整ツール(ns-reconciler-NAMESPACE)を削除し、同期を停止します。

アドミッション Webhook がドリフトをブロックしないようにする(省略可)

Config Sync によるドリフト防止の実行を停止するには、調整ツールを停止した後、次のコマンドを実行することでアドミッション Webhook を停止します。

kubectl delete validatingwebhookconfigurations.admissionregistration.k8s.io admission-webhook.configsync.gke.io

このステップは省略可能であり、クラスタ内のマネージド リソースに競合する変更を行う場合にのみ必要です。このステップを実施するには、まずルート調整ツールを停止する必要があります。停止しないと、ルート調整ツールは削除後に Webhook 構成ファイルを生成しようとします。

すべてのリポジトリからの同期を停止する

ルート リポジトリや Namespace リポジトリを含むすべてのリポジトリからの同期を停止するには、次のコマンドを実行します。

kubectl scale deployment -n config-management-system -l app=reconciler --replicas=0 \
&& kubectl wait -n config-management-system --for=delete pods -l app=reconciler

このコマンドは、config-management-system Namespace で実行されているすべての Reconciler Pod の replicas 数を 0 に減らし、すべての Reconciler Pod が削除されるまで待ちます。

すべての Reconciler Deployment はクラスタ内にありますが、Reconciler のレプリカや同期を処理するプロセスがないため、構成ファイルがリポジトリから同期されません。

登録されているすべてのクラスタで同期を停止する

一度に 1 つのクラスタではなく、1 つの Google Cloud プロジェクト内に登録されているすべてのクラスタで同期を停止する必要がある場合は、nomos status コマンドを使用するスクリプトを作成して、登録されているすべてのクラスタのリストを取得できます。スクリプトは、gcloud container clusters get-credentials コマンドを使用して各クラスタの kubectl コンテキストを作成し、前記のコマンドを各クラスタで実行します。このようなスクリプトの簡単な例を次に示します。

#!/bin/bash

nomos status | grep SYNCED | awk {'print $1'} | while read i; do

  gcloud container clusters get-credentials "$i"

  kubectl scale -n $OPERATOR_NAMESPACE deployment config-management-operator --replicas=0 \
  && kubectl wait -n $OPERATOR_NAMESPACE --for=delete pods -l k8s-app=config-management-operator --timeout=60s \
  && kubectl scale deployment -n config-management-system reconciler-manager --replicas=0 \
  && kubectl wait -n config-management-system --for=delete pods -l app=reconciler-manager \
  && kubectl scale deployment -n config-management-system -l app=reconciler --replicas=0 \
  && kubectl wait -n config-management-system --for=delete pods -l app=reconciler

done

同期を再開する

このセクションでは、ルート リポジトリと Namespace リポジトリの同期を再開する方法について説明します。

ルート リポジトリからの同期を再開する

ルート リポジトリからの同期を再開するには、中央管理者が次のコマンドを実行します。

kubectl -n config-management-system scale deployment root-reconciler --replicas=1

このコマンドによって、root-reconciler Deployment は、1 つのレプリカにスケールされます。

Namespace リポジトリからの同期を再開する

[ルート リポジトリ方式] または [Kubernetes API 方式] のタブを選択することで、該当する手順が表示されます。

ルート リポジトリ方式

ルート リポジトリ内で Namespace リポジトリを管理する方式を使用する場合は、中央管理者が次のコマンドを実行します。

kubectl -n config-management-system scale deployment ns-reconciler-NAMESPACE --replicas=1

このコマンドによって、ns-reconciler-NAMESPACE Deployment は、1 つのレプリカにスケールされます。

Kubernetes API 方式

Kubernetes API で Namespace リポジトリを管理する方式を使用した場合は、アプリケーション オペレータが RepoSync 構成を含む repo-sync.yaml を再適用することで同期を再開できます。

kubectl apply -f repo-sync.yaml

このコマンドは、Reconciler Manager をトリガーし、それにより Namespace 調整プロセスが作られ、ns-reconciler-NAMESPACE Deployment が作成されます。

アドミッション Webhook を再開する

ルート調整ツールが再開されると、Webhook 構成が自動的に生成されます。正常に生成されたことを確認するには、次のコマンドを実行します。

kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io admission-webhook.configsync.gke.io

すべてのリポジトリからの同期の再開

すべてのリポジトリからの同期を再開するには、次のコマンドを実行します。

kubectl -n $OPERATOR_NAMESPACE scale deployment config-management-operator --replicas=1

このコマンドによって、Operator Deployment が 1 つのレプリカにスケールされます。Operator によって Reconciler Manager Deployment が正しくスケールされていないことが通知され、適切なレプリカ数にスケールされます。最終的に、Reconciler Manager は、ルート調整子と名前空間調整子を対応するレプリカ数にスケールします。

  # scale the root-reconciler Deployment to 1 replica.
  kubectl -n config-management-system scale deployment root-reconciler --replicas=1

  # scale the ns-reconciler-NAMESPACE Deployment to 1 replica.
  kubectl -n config-management-system scale deployment ns-reconciler-NAMESPACE --replicas=1

登録されているすべてのクラスタで同期を再開する

一度に 1 つのクラスタではなく、Google Cloud プロジェクト内に登録されているすべてのクラスタで同期を再開する必要がある場合は、nomos status を使用するスクリプトを作成して、登録されているすべてのクラスタのリストを取得できます。スクリプトは、gcloud container clusters get-credentials コマンドを使用して各クラスタの kubectl コンテキストを作成し、前記のコマンドを各クラスタで実行します。このようなスクリプトの簡単な例を次に示します。

#!/bin/bash

nomos status |grep SYNCED | awk {'print $1'} |while read i; do

  gcloud container clusters get-credentials "$i"

  kubectl -n $OPERATOR_NAMESPACE scale deployment config-management-operator --replicas=1

done

次のステップ