構成ファイルの変更

このチュートリアルでは、構成ファイルを変更して検証し、クラスタと同期する方法について説明します。このチュートリアルでは、Git リポジトリから同期クイックスタートで習得したスキルを前提としています。ここでは、組織のコンプライアンス チームの新しいメンバーとして、構成ファイルの変更を行ってみます。

始める前に

このチュートリアルを始める前に、次のことを行ってください。

  1. Git リポジトリからの同期クイックスタートの手順を行います。ただし、構成したクラスタは削除しないでください。

  2. GitHub アカウントを持っていない場合は、GitHub アカウントを作成します

  3. GitHub ドキュメントの GitHub アカウントへの新しい SSH キーの追加の手順を行います。このチュートリアルを完了するには、秘密鍵の場所が必要になります。

また、Git リポジトリの fork とクローン作成にも慣れておいてください。

リポジトリを作成する

このセクションでは、Anthos Config Management サンプル リポジトリの fork を作成して Git リポジトリを作成し、作業用のコピーとしてローカル クローンを作成します。

リポジトリを作成するには、次の手順を行います。

  1. ブラウザで Anthos Config Management サンプル リポジトリに移動し、[Fork] をクリックします。

  2. ローカル システムで fork のクローンを作成します。

    git clone git@github.com:GIT_USERNAME/anthos-config-management-samples.git

    GIT_USERNAME は GitHub ユーザー名で置き換えます。

  3. 始める前にで追加した SSH 秘密鍵を使用して、GitHub の認証を行うようにローカル システムを構成します

nomos vet pre-commit フックを作成する

nomos vet コマンドを使用すると、構文エラーを含む構成ファイルの commit を防ぐことができます。変更に対して nomos vet コマンドを実行する pre-commit フックをインストールできます。このフックを使用すると、ローカル リポジトリに commit する前に、nomos vet により、変更に構文エラーなどの問題がないかどうかが確認されます。

pre-commit フックを追加するには、次の手順を行います。

  1. ターミナルで、リポジトリのクローンを作成したディレクトリに移動します。

  2. .git/hooks/pre-commit ファイルを編集します。.git/ ディレクトリの . 文字に注意してください。

  3. nomos vet は、ローカルにクローンを作成したリポジトリの quickstart/multirepo/root ディレクトリに対して実行する必要があります。ほとんどの場合、非構造化が推奨の形式であり、クイックスタートの例は非構造化形式のため、--source-format=unstructured を設定します。ファイルに以下を追加します。

    nomos vet --path=REPO_PATH/quickstart/multirepo/root --source-format=unstructured
    

    REPO_PATH は、リポジトリのクローンを作成した場所の完全修飾パスで置き換えます。

  4. ファイルを保存します。

  5. .git/hooks/pre-commit ファイルが実行可能であることを確認します。

    chmod +x .git/hooks/pre-commit
  6. pre-commit をテストするため、git commit を実行する前に、構文エラーを意図的に構成ファイルに追加することもできます(たとえば、: 文字を削除します)。nomos vet が実行され、エラー メッセージが表示されます。

クラスタを構成する

Git 認証情報に Kubernetes Secret を作成する

  1. Git リポジトリに登録されている秘密鍵を取得します。ファイルのダウンロード方法と保存場所に注意してください。Git リポジトリの認証で使用される場合があります。

  2. SSH 鍵ペアを使用して Secret を作成します。

    • ルート リポジトリに Secret を作成します。

      kubectl create secret generic SECRET_NAME \
       --namespace=config-management-system \
       --from-file=ssh=/path/to/KEYPAIR_PRIVATE_KEY_FILENAME
      
    • 各 Namespace リポジトリに Secret を作成します。

      ルート リポジトリには RepoSync オブジェクトが含まれているため、RepoSync オブジェクトの Namespace(gamestore)で Secret を作成する必要があります。

      kubectl create secret generic SECRET_NAME \
       --namespace=gamestore
       --from-file=ssh=/path/to/KEYPAIR_PRIVATE_KEY_FILENAME
      

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

    • SECRET_NAME: Secret の名前を追加します。
    • /path/to/KEYPAIR_PRIVATE_KEY_FILENAME: 秘密鍵の名前(.pub サフィックスのない秘密鍵)を追加します。
  3. ローカル ディスクの秘密鍵を保護するか、削除します。

Git 構成を更新する

Git リポジトリからの同期クイックスタートで作成した RootSync オブジェクトと RepoSync オブジェクトの Git 構成を編集します。次のように変更します。

  1. RootSync オブジェクトの次の値を更新します。

    • repo の値を fork のアドレスに変更します。GIT_USERNAME は GitHub ユーザー名で置き換えます。
    • auth の値を ssh に変更します。
    • spec.git.secretRef.nameSECRET_NAME に設定します。クラスタ内に SECRET_NAME Secret が存在している必要があります。

    次の例は、更新された構成ファイルを示しています。

    apiVersion: configsync.gke.io/v1beta1
    kind: RootSync
    metadata:
      name: root-sync
      namespace: config-management-system
    spec:
      sourceFormat: unstructured
      git:
        repo: git@github.com:GIT_USERNAME/anthos-config-management-samples.git
        branch: main
        dir: quickstart/multirepo/root
        auth: ssh
        secretRef:
          name: SECRET_NAME
    

    SECRET_NAME は、Secret の名前に置き換えます。

    フィールドの説明については、ConfigManagement フィールドをご覧ください。

  2. クラスタに構成を適用します。

    kubectl apply -f root-sync.yaml
  3. RepoSync オブジェクトの次の値を更新します。

    • repo の値を fork のアドレスに変更します。GIT_USERNAME は GitHub ユーザー名で置き換えます。
    • auth の値を ssh に変更します。
    • spec.git.secretRef.nameSECRET_NAME に設定します。クラスタ内に SECRET_NAME Secret が存在している必要があります。

    次の例は、更新された構成ファイルを示しています。

    apiVersion: configsync.gke.io/v1beta1
    kind: Repo
    metadata:
      name: repo-sync
      namespace: gamestore
    spec:
      sourceFormat: unstructured
      git:
        repo: git@github.com:GIT_USERNAME/anthos-config-management-samples.git
        branch: main
        dir: quickstart/multirepo/namespaces/gamestore
        auth: ssh
        secretRef:
          name: SECRET_NAME
    

    SECRET_NAME は、Secret の名前に置き換えます。

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

    git add .
    git commit -m 'Update gamestore RepoSync'
    git push
    

コマンドが成功すると、Kubernetes はクラスタの Config Management Operator を更新し、リポジトリからのクラスタ構成の同期を開始します。Config Management Operator が実行されていることを確認するには、config-management-system Namespace で実行されている Pod のリストを取得します。

kubectl get pods -n config-management-system

出力例:

NAME                                       READY   STATUS    RESTARTS   AGE
admission-webhook-7dbc55cbf5-9thcj         1/1     Running   0          6d18h
admission-webhook-7dbc55cbf5-pmrxt         1/1     Running   0          6d18h
ns-reconciler-gamestore-67ff4dcbc4-x4vnh   3/3     Running   0          14m
reconciler-manager-7cdb699bf8-8lvll        2/2     Running   0          6d18h
root-reconciler-84f976b74d-mh6zd           3/3     Running   0          14m

この時点で、クラスタの構成ファイルが、Git リポジトリからの同期クイックスタートと同じ構成になります。これは fork の内容が同じためです。このクイックスタートの演習を行うと、同じ結果を確認できます。

リポジトリ内の構成を変更する

リポジトリで構成を作成または変更すると、Config Sync が commit を検出し、関連する Kubernetes オブジェクトに新しい構成を適用します。

構成ファイルに追加する

このセクションでは、ユーザー admin@gamestore.comgamestore Namespace の gamestore-admin RoleBinding に追加します。

  1. ターミナルを開いて次のコマンドを実行し、gamestore RoleBinding に対する変更を監視します。

    kubectl get rolebindings gamestore-admin -n gamestore -o yaml --watch
    
  2. 別のターミナルを開き、リポジトリのローカル クローンに移動します。

  3. quickstart/multirepo/root/rolebinding-gamestore-admin.yaml ファイルを編集して、subjects フィールドに admin@gamestore.com を追加します。

    編集後のファイルの内容は次のとおりです。

    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: gamestore-admin
      namespace: gamestore
    subjects:
    - kind: ServiceAccount
      name: ns-reconciler-gamestore
      namespace: config-management-system
    - kind: User
      name: admin@gamestore.com
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: admin
      apiGroup: rbac.authorization.k8s.io
    
  4. ファイルを保存します。

    git add quickstart/multirepo/root/rolebinding-gamestore-admin.yaml
    
  5. commit を作成します。

    git commit -m "Add admin@gamestore.com to cluster admin"
    
  6. fork に commit を push します。

    git push origin main
    
  7. gamestore-admin オブジェクトを監視しているターミナルに戻ります。数秒後、変更がクラスタに同期されます。

変更内容を元に戻す

Config Sync を使用すると、変更を簡単に戻せます。

前のセクションで行った変更を元に戻すには、次の手順を行います。

  1. Git を使用していたターミナルに戻ります。

  2. git log コマンドを使用してハッシュを検索します(この例では最上位のエントリ)。

  3. 直近の変更を元に戻します。

    git revert HASH
    
    git push origin main
    

    元に戻すと、新しい commit が作成されるため、nomos vet --source-format=unstructured が結果の構成ファイルを再度チェックし、構文が正しいかどうか確認します。

  4. gamestore-admin オブジェクトを監視しているターミナルに戻ります。ClusterRole のサブジェクト リストに admin@gamestore.com が含まれていません。

  5. Control+C キーを押して gamestore-admin オブジェクトの監視を停止します。

このレッスンでは、リポジトリの変更を commit したときに Config Sync がリポジトリ内の構成ファイルと同期することを確認しました。

クリーンアップ

このチュートリアルの演習を終えたら、次のクリーンアップ作業を行います。

  • テストに使用したクラスタを削除します。
  • fork のローカル クローンを削除します。
  • ローカルの SSH 秘密鍵を削除します(該当する場合)。
  • サンプル リポジトリの fork を削除します。これにより、リポジトリのみに関連付けられたデプロイキーが削除されます。

次のステップ