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