名前空間リポジトリからの同期を構成する

Config Sync のインストール時に、ルート リポジトリを構成します。ルート リポジトリを構成したら、名前空間リポジトリを構成できます。名前空間リポジトリを使用すると、リポジトリの設定と管理などを管理者以外のユーザーに委任できます。こうしたリポジトリ タイプの詳細については、Config Sync の概要のリポジトリ セクションをご覧ください。

名前空間リポジトリを使用するには RepoSync API が必要です。Google Cloud Console または gcloud コマンドライン ツールを使用してバージョン 1.7.0 以降の Config Sync をインストールした場合、この API はすでに有効になっています。kubectl を使用して Config Sync をインストールし、ConfigManagement オブジェクトを使用して Git リポジトリを構成する場合は、ConfigManagement オブジェクトを移行して、RepoSync API を有効にすることをおすすめします。

Config Sync は、信頼できるソースからの変更を自動的に検出しますが、アドミッション Webhook を名前空間リポジトリに追加することで、ドリフト検出のレイヤを追加できます。詳細については、構成ファイルのドリフト防止をご覧ください。

始める前に

  • Config Sync が同期する構成ファイルを含む非構造化 Git リポジトリを作成するか、このリポジトリにアクセスできることを確認します。名前空間リポジトリには非構造化形式を使用する必要があります。
  • Anthos でサポートされるプラットフォームとバージョンのクラスタを作成するか、アクセスできることを確認します。
  • Config Sync の要件を満たす GKE クラスタを作成するか、アクセスできることを確認します。

制限事項

  • NamespaceSelectors(Selectors を指すアノテーションを含む)は、ルート リポジトリでのみ機能します。

目的の構成方法を選択する

名前空間リポジトリを構成するには、次の 2 つの方法のいずれかを選択します。

ルート リポジトリ内で名前空間リポジトリを管理する

この方式では、中央管理者がルート リポジトリから直接名前空間リポジトリの設定を管理します。Namespace リポジトリのオブジェクトは Config Sync によって管理されるため、この方式では、ローカルで Namespace リポジトリの定義は変更できません。

この方法を使用するには、次の操作を行います。

  1. ルート リポジトリで、namespace 構成を宣言します。

    # ROOT_REPO/namespaces/NAMESPACE/namespace.yaml
    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE
    

    NAMESPACE は、Namespace の名前に置き換えます。

  2. ルート リポジトリで、同じ Namespace に RepoSync オブジェクトを作成します。

    # ROOT_REPO/namespaces/NAMESPACE/repo-sync.yaml
     # If you are using a Config Sync version earlier than 1.8.0,
     # use: apiVersion: configsync.gke.io/v1alpha1
    apiVersion: configsync.gke.io/v1beta1
    kind: RepoSync
    metadata:
      name: repo-sync
      namespace: NAMESPACE
    spec:
      # Since this is for a namespace repository, the format should be unstructured
      sourceFormat: unstructured
      git:
       repo: NAMESPACE_REPOSITORY
       revision: NAMESPACE_REVISION
       branch: NAMESPACE_BRANCH
       dir: "NAMESPACE_DIRECTORY"
       auth: NAMESPACE_AUTH_TYPE
       gcpServiceAccountEmail: NAMESPACE_EMAIL
       secretRef:
         name: NAMESPACE_SECRET_NAME
       # The `noSSLVerify` field is supported in Anthos Config Management version 1.8.2 and later.
       noSSLVerify: NAMESPACE_NO_SSL_VERIFY
    

    次のように置き換えます。

    • NAMESPACE: Namespace の名前を記述します。
    • NAMESPACE_REPOSITORY: Namespace リポジトリとして使用する Git リポジトリの URL を記述します。HTTPS または SSH プロトコルを使用する URL を入力できます。たとえば、https://github.com/GoogleCloudPlatform/anthos-config-management-samples では HTTPS プロトコルを使用します。プロトコルを入力しない場合、URL は HTTPS URL として扱われます。このフィールドは必須です。
    • NAMESPACE_REVISION: チェックアウトする Git リビジョン(タグまたはハッシュ)を記述します。このフィールドは省略可能で、デフォルト値は HEAD です。
    • NAMESPACE_BRANCH: 同期元となるリポジトリのブランチを記述します。このフィールドは省略可能で、デフォルト値は master です。
    • NAMESPACE_DIRECTORY: 同期先への構成を含むルート ディレクトリへの Git リポジトリのパスを記述します。このフィールドは省略可能で、デフォルトはリポジトリのルート ディレクトリ(/)です。
    • NAMESPACE_AUTH_TYPE: 次のいずれかの認証タイプを記述します。

      • none: 認証なし
      • ssh: SSH 認証鍵ペアを使用
      • cookiefile: cookiefile を使用
      • token: トークンを使用
      • gcpserviceaccount: Google サービス アカウントを使用して Cloud Source Repositories 内のリポジトリにアクセス。
      • gcenode: Google サービス アカウントを使用して Cloud Source Repositories 内のリポジトリにアクセス。このオプションは、Workload Identity がクラスタで有効になっていない場合にのみ、選択してください。

        この認証の種類の詳細については、Config Sync に Git の読み取り専用アクセス権を付与するをご覧ください。

      このフィールドは必須です。

    • NAMESPACE_EMAIL: AUTH_TYPE として gcpserviceaccount を追加した場合は、Google サービス アカウントのメールアドレスを追加します。例: acm@PROJECT_ID.iam.gserviceaccount.com

    • NAMESPACE_SECRET_NAME: Secret に付ける名前を記述します。このフィールドは省略可能です。

    • NAMESPACE_NO_SSL_VERIFY: SSL 証明書の検証を無効にするには、このフィールドを true に設定します。デフォルト値は false です。

    フィールドの説明と spec フィールドに追加できる項目の全一覧については、RepoSync フィールドをご覧ください。

    1 つの Namespace に存在できる RepoSync オブジェクトは 1 つだけです。この制限を適用するには、オブジェクト namerepo-sync でなければなりません。また、RepoSync で参照されるディレクトリ内のすべての構成ファイルは、RepoSync オブジェクトと同じ Namespace に存在する必要もあります。

  3. ルート リポジトリで、RoleBinding 構成を宣言し、Namespace 内のオブジェクトを管理するための権限を ns-reconciler-NAMESPACE サービス アカウントに付与します。ns-reconciler-NAMESPACE サービス アカウントは、RepoSync 構成ファイルがクラスタに同期される際、Config Sync により自動的に作成されます。

    RoleBinding を宣言するには、次のオブジェクトを作成します。

    # ROOT_REPO/namespaces/NAMESPACE/sync-rolebinding.yaml
     kind: RoleBinding
     apiVersion: rbac.authorization.k8s.io/v1
     metadata:
       name: syncs-repo
       namespace: NAMESPACE
     subjects:
     - kind: ServiceAccount
       name: ns-reconciler-NAMESPACE
       namespace: config-management-system
     roleRef:
       kind: ClusterRole
       name: RECONCILER_ROLE
       apiGroup: rbac.authorization.k8s.io
    

    次のように置き換えます。

    • NAMESPACE: Namespace の名前を記述します。
    • RECONCILER_ROLE: 中央管理者として RECONCILER_ROLE を設定することで、Namespace リポジトリから同期できる構成の種類を指定できます。ロールは、次のいずれかを選択できます。

      • デフォルトの ClusterRole。

        • admin
        • edit

        詳細については、ユーザー向けのロールをご覧ください。

      • ルート リポジトリで宣言されたユーザー定義の ClusterRole または Role。このロールを使用すると、きめ細かい権限を付与できます。

  4. ルート リポジトリに変更を commit します。

     git add .
     git commit -m 'Setting up new namespace repository.'
     git push
    
  5. 必要に応じて、任意の認証方法に基づいて Secret を作成します。認証タイプに none を使用した場合は、このステップはスキップできます。

    Secret は、次の要件を満たす必要があります。

    • Secret は、RepoSync と同じ Namespace に作成します。
    • Secret の名前は、repo-sync.yaml で定義した spec.git.secretRef の名前と一致する必要があります。
    • Secret の公開鍵は、Git プロバイダに追加する必要があります。
  6. 構成を確認するには、Namespace リポジトリのオブジェクトの 1 つに対して kubectl get を使用します。次に例を示します。

    kubectl get rolebindings -n NAMESPACE
    

Kubernetes API を使用して名前空間リポジトリを管理する

この方式では、中央管理者がルート リポジトリで Namespace のみを宣言し、RepoSync ファイルの宣言はアプリケーション オペレータに委任します。

中央管理者の仕事

中央管理者は、次の作業を行います。

  1. ルート リポジトリで、namespace 構成を宣言します。

    # ROOT_REPO/namespaces/NAMESPACE/namespace.yaml
     apiVersion: v1
     kind: Namespace
     metadata:
       name: NAMESPACE
    

    NAMESPACE は、Namespace の名前に置き換えます。

  2. ルート リポジトリで RoleBinding を宣言し、アプリケーションのオペレータ権限を付与します。RBAC エスカレーション防止を使用して、アプリケーション オペレータが、このロール バインディングで付与されない権限を持つロール バインディングを適用できないようにします。

    RoleBinding を宣言するには、次のマニフェストを作成します。

    # ROOT_REPO/namespaces/NAMESPACE/operator-rolebinding.yaml
     kind: RoleBinding
     # Add RBAC escalation prevention
     apiVersion: rbac.authorization.k8s.io/v1
     metadata:
       name: operator
       namespace: NAMESPACE
     subjects:
     - kind: User
       name: USERNAME
       apiGroup: rbac.authorization.k8s.io
     roleRef:
       kind: ClusterRole
       name: OPERATOR_ROLE
       apiGroup: rbac.authorization.k8s.io
    

    次のように置き換えます。

    • NAMESPACE: ルート リポジトリで作成した Namespace を記述します。
    • USERNAME: アプリケーション オペレータのユーザー名を記述します。
    • OPERATOR_ROLE: 中央管理者として OPERATOR_ROLE を設定することで、Namespace リポジトリから同期できる構成の種類を指定できます。ロールは、次のいずれかを選択できます。

      • デフォルトの ClusterRole。

        • admin
        • edit

        詳細については、ユーザー向けのロールをご覧ください。

      • ルート リポジトリで宣言されているユーザー定義の ClusterRole またはロール。このロールを使用すると、きめ細かい権限を付与できます。

  3. ルート リポジトリに変更を commit します。

     git add .
     git commit -m 'Setting up new namespace repository.'
     git push
    

アプリケーション オペレータの仕事

アプリケーション オペレータは、次の作業を行います。

  1. RoleBinding 構成を宣言し、Namespace 内のオブジェクトを管理するための権限を ns-reconciler-NAMESPACE サービス アカウントに付与します。ns-reconciler-NAMESPACE サービス アカウントは、RepoSync 構成ファイルがクラスタに同期される際、Config Sync により自動的に作成されます。

    RoleBinding を宣言するには、次のマニフェストを作成します。

    # sync-rolebinding.yaml
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: syncs-repo
      namespace: NAMESPACE
    subjects:
    - kind: ServiceAccount
      name: ns-reconciler-NAMESPACE
      namespace: config-management-system
    roleRef:
      kind: ClusterRole
      name: RECONCILER_ROLE
      apiGroup: rbac.authorization.k8s.io
    

    次のように置き換えます。

    • NAMESPACE: ルート リポジトリで作成した Namespace を記述します。
    • RECONCILER_ROLE: アプリケーション オペレータとして、RECONCILER_ROLE を設定することで、Namespace リポジトリから同期できる構成の種類を指定できます。中央管理者によって付与された一連の権限は、さらに制限することのみ可能です。そのため、このロールでは、前のセクションで中央管理者が宣言した OPERATOR_ROLE 以上の権限を与えることはできません。
  2. RoleBinding 構成を適用します。

    kubectl apply -f sync-rolebinding.yaml
    
  3. 必要に応じて、任意の認証方法に基づいて Secret を作成します。認証タイプに none を使用した場合は、このステップはスキップできます。

    Secret は、次の要件を満たす必要があります。

    • Secret は、RepoSync と同じ Namespace に作成します。
    • Secret の名前は、root-sync.yaml で定義した spec.git.secretRef の名前と一致する必要があります。
    • Secret の公開鍵は、Git プロバイダに追加する必要があります。
  4. RepoSync 構成を宣言します。

    # repo-sync.yaml
    # If you are using a Config Sync version earlier than 1.8.0,
    # use: apiVersion: configsync.gke.io/v1alpha1
    apiVersion: configsync.gke.io/v1beta1
    kind: RepoSync
    metadata:
      name: repo-sync
      namespace: NAMESPACE
    spec:
      # Since this is for a namespace repository, the format should be unstructured
      sourceFormat: unstructured
      git:
       repo: NAMESPACE_REPOSITORY
       revision: NAMESPACE_REVISION
       branch: NAMESPACE_BRANCH
       dir: "NAMESPACE_DIRECTORY"
       auth: NAMESPACE_AUTH_TYPE
       gcpServiceAccountEmail: NAMESPACE_EMAIL
       secretRef:
         name: NAMESPACE_SECRET_NAME
       # The `noSSLVerify` field is supported in Anthos Config Management version 1.8.2 and later.
       noSSLVerify: REPO_SSL_VERIFY
    

    次のように置き換えます。

    • NAMESPACE_REPOSITORY: Namespace リポジトリとして使用する Git リポジトリの URL を記述します。HTTPS または SSH プロトコルを使用する URL を入力できます。たとえば、https://github.com/GoogleCloudPlatform/anthos-config-management-samples では HTTPS プロトコルを使用します。プロトコルを入力しない場合、URL は HTTPS URL として扱われます。このフィールドは必須です。
    • NAMESPACE_REVISION: チェックアウトする Git リビジョン(タグまたはハッシュ)を記述します。このフィールドは省略可能で、デフォルト値は HEAD です。
    • NAMESPACE_BRANCH: 同期元となるリポジトリのブランチを記述します。このフィールドは省略可能で、デフォルト値は master です。
    • NAMESPACE_DIRECTORY: 同期先への構成を含むルート ディレクトリへの Git リポジトリのパスを記述します。このフィールドは省略可能で、デフォルトはリポジトリのルート ディレクトリ(/)です。
    • NAMESPACE_AUTH_TYPE: 次のいずれかの認証タイプを記述します。

      • none: 認証なし
      • ssh: SSH 認証鍵ペアを使用
      • cookiefile: cookiefile を使用
      • token: トークンを使用
      • gcpserviceaccount: Google サービス アカウントを使用して Cloud Source Repositories 内のリポジトリにアクセス。
      • gcenode: Google サービス アカウントを使用して Cloud Source Repositories 内のリポジトリにアクセス。このオプションは、Workload Identity がクラスタで有効になっていない場合にのみ、選択してください。

        この認証の種類の詳細については、Config Sync に Git の読み取り専用アクセス権を付与するをご覧ください。

      このフィールドは必須です。

    • NAMESPACE_EMAIL: AUTH_TYPE として gcpserviceaccount を追加した場合は、Google サービス アカウントのメールアドレスを追加します。例: acm@PROJECT_ID.iam.gserviceaccount.com

    • NAMESPACE_SECRET_NAME: Secret に付ける名前を記述します。このフィールドは省略可能です。

    • NAMESPACE_NO_SSL_VERIFY: SSL 証明書の検証を無効にするには、このフィールドを true に設定します。デフォルト値は false です。

    フィールドの説明と spec フィールドに追加できる項目の全一覧については、RepoSync フィールドをご覧ください。

    1 つの Namespace に存在できる RepoSync オブジェクトは 1 つだけです。そうするためには、オブジェクトの namerepo-sync にする必要があります。また、RepoSync で参照されるディレクトリ内のすべての構成ファイルは、RepoSync オブジェクトと同じ Namespace に存在する必要もあります。

  5. RepoSync 構成を適用します。

    kubectl apply -f repo-sync.yaml
    
  6. 構成を確認するには、Namespace リポジトリのオブジェクトの 1 つに対して kubectl get を使用します。次に例を示します。

    kubectl get rolebindings -n NAMESPACE
    

名前空間リポジトリの同期ステータスを確認する

名前空間リポジトリの同期ステータスは、nomos status コマンドを使用して確認できます。

nomos status

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

my_managed_cluster-1
  --------------------
  <root>   git@github.com:foo-corp/acme/admin@main
  SYNCED   f52a11e4
  --------------------
  bookstore  git@github.com:foo-corp/acme/bookstore@v1
  SYNCED     34d1a8c8

この例では、bookstore という Namespace の名前空間リポジトリが構成されています。

RepoSync のインストールを確認する

RepoSync オブジェクトを作成すると、Config Sync によって ns-reconciler-NAMESPACE というリコンサイラが作成されます。ここで、NAMESPACE は、RepoSync オブジェクトを作成した Namespace です。

RepoSync オブジェクトが正しく機能していることは、ns-reconciler-NAMESPACE Deployment のステータスをチェックして確認できます。

kubectl get -n config-management-system deployment/ns-reconciler-NAMESPACE

NAMESPACE は、名前空間リポジトリを作成した Namespace に置き換えます。

RepoSync オブジェクトのステータスを確認する別の方法については、RootSync オブジェクトと RepoSync オブジェクトの確認をご覧ください。

名前空間リポジトリを削除する

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

ルート リポジトリ方式

ルート リポジトリで Namespace リポジトリを制御する方法を使用した場合、中央管理者は次の 2 つの手順で Namespace リポジトリを削除できます。

  1. トラブルシューティングの指示に従って、RepoSync オブジェクトによって管理されているリソースを管理対象外にするか削除します。

  2. Git リポジトリから RepoSync オブジェクトを削除します。

Kubernetes API 方式

Kubernetes API で Namespace リポジトリを制御する方法を使用すると、アプリケーション オペレータは次の 2 つの手順で Namespace リポジトリを削除できます。

  1. トラブルシューティングの指示に従って、RepoSync オブジェクトによって管理されているリソースを管理対象外にするか削除します。

  2. RepoSync オブジェクトを削除するには、次のコマンドを実行します。

    kubectl delete -f repo-sync.yaml
    

次のステップ