Linkerd 2.10とArgo CDを組み合わせたGitOpsワークフローの設定

GitOpsは、Gitを単一の信頼できる情報源として、Kubernetesインフラストラクチャとアプリケーションを自動的に管理およびデリバリーする方法です。通常、Gitでバージョン管理されたアーティファクトとクラスタで実行されているアーティファクトの間の差異を検出し、調整するためのソフトウェアエージェントを利用します。

本ガイドでは、GitOpsワークフローを使用してLinkerdのインストールとアップグレードを管理するためにArgo CDを設定する方法を示します。

具体的には、LinkerdのmTLSプライベートキーと証明書を安全に生成および管理するためにSealed Secretsとcert-managerを使用する方法に関する説明を提供します。また、auto proxy injection機能をワークフローに統合する方法も示します。最後に、GitOpsワークフローに従ってLinkerdを新しいバージョンにアップグレードする手順をまとめます。

本ガイドで使用されているソフトウェアとツールはデモンストレーション目的のみです。要件に最適な他の製品を選択してください。

次のセクションで定義されている手順に従って、このexample repositoryをローカルマシンにクローンし、Kubernetesクラスタにコピーする必要があります。

リポジトリの設定

例のリポジトリをローカルマシンにクローンします:

git clone https://github.com/linkerd/linkerd-examples.git

このリポジトリは、本ガイドの後半で説明するgit操作(add、commit、pushなど)をデモンストレーションするために使用されます。

クラスタ内のGitサーバーを指すように、新しいリモートエンドポイントをリポジトリに追加します。これは次のセクションで設定されます:

cd linkerd-examples

git remote add git-server git://localhost/linkerd-examples.git

本ガイドのステップを簡素化するために、クラスタ内のGitサーバーとポートフォワーディングを介してインタラクションを行います。そのため、先ほど作成したリモートエンドポイントはlocalhostをターゲットとしています。

Gitサーバーをscm名前空間のクラスタにデプロイします:

kubectl apply -f gitops/resources/git-server.yaml

本ガイドの後半で、Argo CDはこのGitサーバーがホストするリポジトリを監視するように設定されます。

このGitサーバーは、Gitデータへの認証なしアクセスをdaemonとしてgitプロトコル経由で実行するように設定されています。この設定は本番環境での使用には推奨されません。

Gitサーバーの正常性を確認します:

kubectl -n scm rollout status deploy/git-server

例のリポジトリをクラスタ内のGitサーバーにクローンします:

git_server=`kubectl -n scm get po -l app=git-server -oname | awk -F/ '{ print $2 }'`

kubectl -n scm exec "${git_server}" -- \
  git clone --bare https://github.com/linkerd/linkerd-examples.git

リモートリポジトリのクローンが成功したことを確認します:

kubectl -n scm exec "${git_server}" -- ls -al /git/linkerd-examples.git

ローカルリポジトリからリモートリポジトリにプッシュできることを確認します:

kubectl -n scm port-forward "${git_server}" 9418  &

git push git-server master

Argo CDのデプロイ

Argo CDをインストールします:

kubectl create ns argocd

kubectl -n argocd apply -f \
  https://raw.githubusercontent.com/argoproj/argo-cd/v1.6.1/manifests/install.yaml

すべてのPodが準備完了であることを確認します:

for deploy in "application-controller" "dex-server" "redis" "repo-server" "server"; \
  do kubectl -n argocd rollout status deploy/argocd-${deploy}; \
done

port-forwardを使用してArgo CDダッシュボードにアクセスします:

kubectl -n argocd port-forward svc/argocd-server 8080:443  \
  > /dev/null 2>&1 &

デフォルトのadminユーザー名とpasswordを使用して、https://localhost:8080でArgo CDダッシュボードにアクセスできるようになりました。

デフォルトの管理者パスワードはArgo CD APIサーバーpod名によって自動生成されます。argocd account update-passwordコマンドを使用して変更できます。

Argo CD CLIを検証します:

argocd_server=`kubectl -n argocd get pods -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2`

argocd login 127.0.0.1:8080 \
  --username=admin \
  --password="${argocd_server}" \
  --insecure

プロジェクトアクセスと権限の設定

アプリケーションをグループ化するためのdemoプロジェクトを設定します:

kubectl apply -f gitops/project.yaml

このプロジェクトは、アプリケーションが使用できる許可リソースの種類とターゲットクラスタのリストを定義します。

プロジェクトが正しくデプロイされたことを確認します:

argocd proj get demo

ダッシュボードで:

アプリケーションのデプロイ

他のすべてのアプリケーションの「親」アプリケーションとしてmainアプリケーションをデプロイします:

kubectl apply -f gitops/main.yaml

"app of apps"パターンは、Argo CDワークフローでアプリケーションを導入するために通常使用されます。詳細については、Argo CDドキュメントを参照してください。

mainアプリケーションのデプロイが成功したことを確認します:

argocd app get main

mainアプリケーションを同期します:

argocd app sync main

注意:同期されるのはmainアプリケーションのみです。

次に、残りのアプリケーションを個別に同期します。

cert-managerのデプロイ

cert-managerアプリケーションを同期します:

argocd app sync cert-manager

cert-manager 0.16.0とkubectl <1.19およびArgo CDが使用するHelm 3.2との間に問題があるため、本ガイドではcert-manager 0.15.0を使用しています。アップグレードの手順については、こちらを参照してください。

cert-managerが実行されていることを確認します:

for deploy in "cert-manager" "cert-manager-cainjector" "cert-manager-webhook"; \
  do kubectl -n cert-manager rollout status deploy/${deploy}; \
done

Sealed Secretsのデプロイ

sealed-secretsアプリケーションを同期します:

argocd app sync sealed-secrets

sealed-secretsが実行されていることを確認します:

kubectl -n kube-system rollout status deploy/sealed-secrets

mTLSトラストアンカーの作成

Linkerdをデプロイする前に、mTLSトラストアンカーを作成する必要があります。次に、トラストアンカー証明書を管理するlinkerd-bootstrapアプリケーションを設定します。

新しいmTLSトラストアンカーのプライベートキーと証明書を作成します:

step certificate create root.linkerd.cluster.local sample-trust.crt sample-trust.key \
  --profile root-ca \
  --no-password \
  --not-after 43800h \
  --insecure

新しいトラストアンカーの詳細(暗号アルゴリズム、有効期限、SANなど)を確認します:

step certificate inspect sample-trust.crt

暗号化されたトラストアンカーを保存するためのSealedSecretリソースを作成します:

kubectl -n linkerd create secret tls linkerd-trust-anchor \
  --cert sample-trust.crt \
  --key sample-trust.key \
  --dry-run=client -oyaml | \
kubeseal --controller-name=sealed-secrets -oyaml - | \
kubectl patch -f - \
  -p '{"spec": {"template": {"type":"kubernetes.io/tls", "metadata": {"labels": {"linkerd.io/control-plane-component":"identity", "linkerd.io/control-plane-ns":"linkerd"}, "annotations": {"linkerd.io/created-by":"linkerd/cli stable-2.8.1", "linkerd.io/identity-issuer-expiry":"2021-07-19T20:51:01Z"}}}}}' \
  --dry-run=client \
  --type=merge \
  --local -oyaml > gitops/resources/linkerd/trust-anchor.yaml

これにより、ローカルのgitops/resources/linkerd/trust-anchor.yamlファイル内の既存のSealedSecretリソースが上書きされます。この変更をクラスタ内Gitサーバーにプッシュします。

spec.encryptedDataのみが変更されたことを確認します:

git diff gitops/resources/linkerd/trust-anchor.yaml

新しいトラストアンカーsecretをクラスタ内Gitサーバーにコミットしてプッシュします:

git add gitops/resources/linkerd/trust-anchor.yaml

git commit -m "update encrypted trust anchor"

git push git-server master

コミットが正常にプッシュされたことを確認します:

kubectl -n scm exec "${git_server}" -- git --git-dir linkerd-examples.git log -1

linkerd-bootstrapのデプロイ

linkerd-bootstrapアプリケーションを同期します:

argocd app sync linkerd-bootstrap

SealedSecretsコントローラーがsealedされたlinkerd-trust-anchor secretを復号化できない場合、発行者と証明書リソースにダウングレード状態が表示される可能性があります。SealedSecretsコントローラーでエラーログを確認してください。

デバッグ目的で、kubectl -n linkerd get sealedsecrets linkerd-trust-anchor -oyamlコマンドを使用してsealedリソースを取得できます。このリソースが、以前にクラスタ内Gitサーバーにプッシュしたgitops/resources/linkerd/trust-anchor.yamlファイルと一致することを確認してください。

SealedSecretsは、復号化されたトラストアンカーを含むsecretを作成する必要があります。secretから復号化されたトラストアンカーを取得します:

trust_anchor=`kubectl -n linkerd get secret linkerd-trust-anchor -ojsonpath="{.data['tls\.crt']}" | base64 -d -w 0 -`

以前にローカルのsample-trust.crtファイルで作成した復号化されたトラストアンカー証明書と一致することを確認します:

diff -b \
  <(echo "${trust_anchor}" | step certificate inspect -) \
  <(step certificate inspect sample-trust.crt)

Linkerdのデプロイ

Linkerdをインストールする準備が整いました。先ほど取得した復号化されたトラストアンカーは、インストールプロセスにidentityTrustAnchorsPEMパラメータとして渡されます。

Linkerdをインストールする前に、gloval.identityTrustAnchorsPEMパラメータが"empty"証明書文字列に設定されていることに注意してください:

argocd app get linkerd -ojson | \
  jq -r '.spec.source.helm.parameters[] | select(.name == "identityTrustAnchorsPEM") | .value'

linkerdアプリケーションで${trust_anchor}の値を使用してこのパラメータを上書きします。

ローカルのgitops/argo-apps/linkerd.yamlファイルでidentityTrustAnchorsPEM変数を見つけ、そのvalueを${trust_anchor}の値に設定します。

複数行文字列のインデントが正しいことを確認してください。例えば、

  source:
    chart: linkerd2
    repoURL: https://helm.linkerd.io/stable
    targetRevision: 2.8.0
    helm:
      parameters:
      - name: identityTrustAnchorsPEM
        value: |
          -----BEGIN CERTIFICATE-----
          MIIBlTCCATygAwIBAgIRAKQr9ASqULvXDeyWpY1LJUQwCgYIKoZIzj0EAwIwKTEn
          MCUGA1UEAxMeaWRlbnRpdHkubGlua2VyZC5jbHVzdGVyLmxvY2FsMB4XDTIwMDkx
          ODIwMTAxMFoXDTI1MDkxNzIwMTAxMFowKTEnMCUGA1UEAxMeaWRlbnRpdHkubGlu
          a2VyZC5jbHVzdGVyLmxvY2FsMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+PUp
          IR74PsU+geheoyseycyquYyes5eeksIb5FDm8ptOXQ2xPcBpvesZkj6uIyS3k4qV
          E0S9VtMmHNeycL7446NFMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB
          Af8CAQEwHQYDVR0OBBYEFHypCh7hiSLNxsKhMylQgqD9t7NNMAoGCCqGSM49BAMC
          A0cAMEQCIEWhI86bXWEd4wKTnG07hBfBuVCT0bxopaYnn3wRFx7UAiAwXyh5uaVg
          MwCC5xL+PM+bm3PRqtrmI6TocWH07GbMxg==
          -----END CERTIFICATE-----

spec.source.helm.parameters.valueフィールドのみが変更されたことを確認します:

git diff gitops/argo-apps/linkerd.yaml

変更をGitサーバーにコミットしてプッシュします:

git add gitops/argo-apps/linkerd.yaml

git commit -m "set identityTrustAnchorsPEM parameter"

git push git-server master

mainアプリケーションを同期します:

argocd app sync main

新しいトラストアンカーがlinkerdアプリケーションによって選択されたことを確認します:

argocd app get linkerd -ojson | \
  jq -r '.spec.source.helm.parameters[] | select(.name == "identityTrustAnchorsPEM") | .value'

linkerdアプリケーションを同期します:

argocd app sync linkerd

Linkerdが準備完了であることを確認します:

linkerd check

emojivotoでテスト

自動プロキシインジェクションをテストするためにemojivotoをデプロイします:

argocd app sync emojivoto

アプリケーションが正常に動作していることを確認します:

for deploy in "emoji" "vote-bot" "voting" "web" ; \
  do kubectl -n emojivoto rollout status deploy/${deploy}; \
done

Linkerdを2.8.1にアップグレード

エディタを使用して、gitops/argo-apps/linkerd.yamlファイルのspec.source.targetRevisionフィールドを2.8.1に変更します:

targetRevisionフィールドのみが変更されたことを確認します:

git diff gitops/argo-apps/linkerd.yaml

この変更をGitサーバーにコミットしてプッシュします:

git add gitops/argo-apps/linkerd.yaml

git commit -m "upgrade Linkerd to 2.8.1"

git push git-server master

mainアプリケーションを同期します:

argocd app sync main

linkerdアプリケーションを同期します:

argocd app sync linkerd

アップグレードが正常に完了したことを確認します:

linkerd check

コントロールプレーンの新しいバージョンを確認します:

linkerd version

クリーンアップ

すべてのアプリケーションは、mainアプリケーションを削除することで削除できます:

argocd app delete main --cascade=true

タグ: Linkerd GitOps Argo CD Kubernetes Service Mesh

7月27日 19:08 投稿