Linkerd 2.10(Step by Step)—將 GitOps 與 Linkerd 和 Argo CD 結合使用

  • 2021 年 6 月 22 日
  • 筆記

Linkerd 2.10 系列

Linkerd 2.10 中文手冊持續修正更新中:

GitOps 是一種使用 Git 作為單一事實來源自動管理和交付 Kubernetes 基礎設施和應用程式的方法。
它通常利用一些軟體代理來檢測和協調 Git 中受版本控制的工件與集群中運行的工件之間的任何差異。

本指南將向您展示如何設置
Argo CD
以使用 GitOps 工作流程管理 Linkerd 的安裝和升級。

具體來說,本指南提供了有關如何使用
Sealed Secrets
cert-manager
安全地生成和管理 Linkerd 的 mTLS 私鑰和證書的說明。
它還將向您展示如何將 auto proxy injection
功能集成到您的工作流程中。
最後,本指南總結了遵循 GitOps 工作流程將 Linkerd 升級到更新版本的步驟。

本指南中使用的軟體和工具僅用於演示目的。隨意選擇最適合您要求的其他產品。

您需要按照下一部分中定義的步驟將這個
example repository
克隆到您的本地機器並複製到您的 Kubernetes 集群中。

設置存儲庫

將示例存儲庫克隆到本地電腦:

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

這個存儲庫將用於演示 Git 操作,如本指南後面的 addcommitpush

向存儲庫添加一個新的遠程端點以指向集群內 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 //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 \
  //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 &

現在可以通過
//localhost:8080
使用默認的 admin 用戶名和
password
訪問 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
project
以對我們的
applications
進行分組:

kubectl apply -f gitops/project.yaml

該項目定義了我們的應用程式可以使用的允許資源種類和目標集群的列表。

確認項目部署正確:

argocd proj get demo

在儀錶板上:

部署應用程式

部署作為所有其他應用程式的 “parent” 應用程式的 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 trust anchor

在繼續部署 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 resource。
確保此資源與您之前推送到集群內 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: //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