Linked 2.10(Step by Step)—將 GitOps 與 Linkerd 和 Argo CD 結(jié)合使用
Linkerd 2.10 中文手冊(cè)持續(xù)修正更新中:
- https://linkerd.hacker-linner.com
GitOps 是一種使用 Git 作為單一事實(shí)來(lái)源自動(dòng)管理和交付 Kubernetes 基礎(chǔ)設(shè)施和應(yīng)用程序的方法。它通常利用一些軟件代理來(lái)檢測(cè)和協(xié)調(diào) Git 中受版本控制的工件與集群中運(yùn)行的工件之間的任何差異。
本指南將向您展示如何設(shè)置 Argo CD 以使用 GitOps 工作流程管理 Linkerd 的安裝和升級(jí)。
具體來(lái)說(shuō),本指南提供了有關(guān)如何使用 Sealed Secrets 和 cert-manager 安全地生成和管理 Linkerd 的 mTLS 私鑰和證書(shū)的說(shuō)明。它還將向您展示如何將 auto proxy injection 功能集成到您的工作流程中。最后,本指南總結(jié)了遵循 GitOps 工作流程將 Linkerd 升級(jí)到更新版本的步驟。
本指南中使用的軟件和工具僅用于演示目的。隨意選擇最適合您要求的其他產(chǎn)品。
您需要按照下一部分中定義的步驟將這個(gè) example repository 克隆到您的本地機(jī)器并復(fù)制到您的 Kubernetes 集群中。
設(shè)置存儲(chǔ)庫(kù)
將示例存儲(chǔ)庫(kù)克隆到本地計(jì)算機(jī):
- git clone https://github.com/linkerd/linkerd-examples.git
這個(gè)存儲(chǔ)庫(kù)將用于演示 Git 操作,如本指南后面的 add、commit 和 push。
向存儲(chǔ)庫(kù)添加一個(gè)新的遠(yuǎn)程端點(diǎn)以指向集群內(nèi) Git 服務(wù)器,這將在下一節(jié)中設(shè)置:
- cd linkerd-examples
- git remote add git-server git://localhost/linkerd-examples.git
為了簡(jiǎn)化本指南中的步驟,我們將通過(guò)端口轉(zhuǎn)發(fā)與集群內(nèi) Git 服務(wù)器進(jìn)行交互。因此,我們剛剛創(chuàng)建的遠(yuǎn)程端點(diǎn)以您的 localhost 為目標(biāo)。
將 Git 服務(wù)器部署到集群中的 scm 命名空間:
- kubectl apply -f gitops/resources/git-server.yaml
在本指南的后面,Argo CD 將被配置為監(jiān)視此 Git 服務(wù)器托管的存儲(chǔ)庫(kù)。
該 Git 服務(wù)器被配置為通過(guò) git 協(xié)議作為 daemon 運(yùn)行,對(duì) Git 數(shù)據(jù)進(jìn)行未經(jīng)身份驗(yàn)證的訪問(wèn)。不建議將此設(shè)置用于生產(chǎn)用途。
確認(rèn) Git 服務(wù)器健康:
- kubectl -n scm rollout status deploy/git-server
將示例存儲(chǔ)庫(kù)克隆到集群內(nèi) Git 服務(wù)器:
- 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
確認(rèn)遠(yuǎn)程倉(cāng)庫(kù)克隆成功:
- kubectl -n scm exec "${git_server}" -- ls -al /git/linkerd-examples.git
確認(rèn)您可以通過(guò)端口轉(zhuǎn)發(fā)從本地存儲(chǔ)庫(kù)推送到遠(yuǎn)程存儲(chǔ)庫(kù):
- 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
確認(rèn)所有 Pod 都準(zhǔn)備好了:
- for deploy in "application-controller" "dex-server" "redis" "repo-server" "server"; \
- do kubectl -n argocd rollout status deploy/argocd-${deploy}; \
- done
使用 port-forward 訪問(wèn) Argo CD 儀表板:
- kubectl -n argocd port-forward svc/argocd-server 8080:443 \
- > /dev/null 2>&1 &
現(xiàn)在可以通過(guò) https://localhost:8080 使用默認(rèn)的 admin 用戶名和 password 訪問(wèn) Argo CD 儀表板。
默認(rèn)管理員密碼是自動(dòng)生成的 Argo CD API 服務(wù)器 pod 名稱。您可以使用 argocd account update-password 命令來(lái)更改它。
驗(yàn)證 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
配置項(xiàng)目訪問(wèn)和權(quán)限
設(shè)置 demo project 以對(duì)我們的 applications 進(jìn)行分組:
- kubectl apply -f gitops/project.yaml
該項(xiàng)目定義了我們的應(yīng)用程序可以使用的允許資源種類和目標(biāo)集群的列表。
確認(rèn)項(xiàng)目部署正確:
- argocd proj get demo
在儀表板上:
部署應(yīng)用程序
部署作為所有其他應(yīng)用程序的 "parent" 應(yīng)用程序的 main 應(yīng)用程序:
- kubectl apply -f gitops/main.yaml
"app of apps" 模式通常用于 Argo CD 工作流程來(lái)引導(dǎo)應(yīng)用程序。有關(guān)更多 信息, 請(qǐng)參閱 Argo CD 文檔。
確認(rèn) main 應(yīng)用程序部署成功:
- argocd app get main
同步 main 應(yīng)用程序:
- argocd app sync main
請(qǐng)注意,只有 main 應(yīng)用程序是同步的。
接下來(lái),我們將單獨(dú)同步其余的應(yīng)用程序。
部署 cert-manager
同步 cert-manager 應(yīng)用程序:
- argocd app sync cert-manager
由于 cert-manager 0.16.0 和 kubectl <1.19 以及 Argo CD 使用的 Helm 3.2 存在問(wèn)題, 本指南使用 cert-manager 0.15.0。請(qǐng)參閱 此處 的升級(jí)說(shuō)明。
確認(rèn) cert-manager 正在運(yùn)行:
- 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 應(yīng)用程序:
- argocd app sync sealed-secrets
確認(rèn) sealed-secrets 正在運(yùn)行:
- kubectl -n kube-system rollout status deploy/sealed-secrets
創(chuàng)建 mTLS trust anchor
在繼續(xù)部署 Linkerd 之前,我們需要?jiǎng)?chuàng)建 mTLS 信任錨。然后我們還將設(shè)置 linkerd-bootstrap 應(yīng)用程序來(lái)管理信任錨證書(shū)。
創(chuàng)建新的 mTLS 信任錨私鑰和證書(shū):
- step certificate create root.linkerd.cluster.local sample-trust.crt sample-trust.key \
- --profile root-ca \
- --no-password \
- --not-after 43800h \
- --insecure
確認(rèn)新信任錨的詳細(xì)信息(加密算法、到期日期、SAN 等):
- step certificate inspect sample-trust.crt
創(chuàng)建一個(gè) SealedSecret 資源來(lái)存儲(chǔ)加密的信任錨:
- 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 文件中 現(xiàn)有的 SealedSecret 資源。我們會(huì)將此更改推送到集群內(nèi) Git 服務(wù)器。
確認(rèn)只更改了 spec.encryptedData:
- git diff gitops/resources/linkerd/trust-anchor.yaml
提交并將新的信任錨 secret 推送到您的集群內(nèi) Git 服務(wù)器:
git add gitops/resources/linkerd/trust-anchor.y
- git add gitops/resources/linkerd/trust-anchor.yaml
- git commit -m "update encrypted trust anchor"
- git push git-server master
確認(rèn)提交成功推送:
- kubectl -n scm exec "${git_server}" -- git --git-dir linkerd-examples.git log -1
部署 linkerd-bootstrap
同步 linkerd-bootstrap 應(yīng)用程序:
- argocd app sync linkerd-bootstrap
如果頒發(fā)者和證書(shū)資源出現(xiàn)降級(jí)狀態(tài),則 SealedSecrets 控制器可能無(wú)法解密 sealed 的 linkerd-trust-anchor secret。檢查 SealedSecrets 控制器以獲取錯(cuò)誤日志。
出于調(diào)試目的,可以使用 kubectl -n linkerd get sealedsecrets linkerd-trust-anchor -oyaml 命令 檢索 sealed resource。確保此資源與您之前推送到集群內(nèi) Git 服務(wù)器 的 gitops/resources/linkerd/trust-anchor.yaml 文件匹配。
SealedSecrets 應(yīng)該已經(jīng)創(chuàng)建了一個(gè)包含解密信任錨的 secret。從 secret 中檢索解密的信任錨:
- trust_anchor=`kubectl -n linkerd get secret linkerd-trust-anchor -ojsonpath="{.data['tls\.crt']}" | base64 -d -w 0 -`
確認(rèn)它與您之前在本地 sample-trust.crt 文件中創(chuàng)建的解密信任錨證書(shū)匹配:
- diff -b \
- <(echo "${trust_anchor}" | step certificate inspect -) \
- <(step certificate inspect sample-trust.crt)
部署 Linkerd
現(xiàn)在我們準(zhǔn)備安裝 Linkerd。我們剛剛檢索到的解密信任錨 將使用 identityTrustAnchorsPEM 參數(shù)傳遞給安裝過(guò)程。
在安裝 Linkerd 之前,請(qǐng)注意 gloval.identityTrustAnchorsPEM 參數(shù)設(shè)置 為 "empty" 證書(shū)字符串:
- argocd app get linkerd -ojson | \
- jq -r '.spec.source.helm.parameters[] | select(.name == "identityTrustAnchorsPEM") | .value'
我們將在 linkerd 應(yīng)用程序中使用 ${trust_anchor} 的值覆蓋此參數(shù)。
在你的本地 gitops/argo-apps/linkerd.yaml 文件中找到 identityTrustAnchorsPEM 變量, 并將其 value 設(shè)置為 ${trust_anchor} 的值。
確保多行字符串縮進(jìn)正確。例如。,
- 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-----
確認(rèn)只更改了一個(gè) spec.source.helm.parameters.value 字段:
- git diff gitops/argo-apps/linkerd.yaml
提交并將更改推送到 Git 服務(wù)器:
- git add gitops/argo-apps/linkerd.yaml
- git commit -m "set identityTrustAnchorsPEM parameter"
- git push git-server master
同步 main 應(yīng)用程序:
- argocd app sync main
確認(rèn)新的信任錨被 linkerd 應(yīng)用程序選中:
- argocd app get linkerd -ojson | \
- jq -r '.spec.source.helm.parameters[] | select(.name == "identityTrustAnchorsPEM") | .value'
同步 linkerd 應(yīng)用程序:
- argocd app sync linkerd
檢查 Linkerd 是否準(zhǔn)備就緒:
- linkerd check
用 emojivoto 測(cè)試
部署 emojivoto 來(lái)測(cè)試自動(dòng)代理注入:
- argocd app sync emojivoto
檢查應(yīng)用程序是否健康:
- for deploy in "emoji" "vote-bot" "voting" "web" ; \
- do kubectl -n emojivoto rollout status deploy/${deploy}; \
- done
將 Linkerd 升級(jí)到 2.8.1
使用您的編輯器將 gitops/argo-apps/linkerd.yaml 文件中 的 spec.source.targetRevision 字段更改為 2.8.1:
確認(rèn)只更改了 targetRevision 字段:
- git diff gitops/argo-apps/linkerd.yaml
提交并將此更改推送到 Git 服務(wù)器:
- git add gitops/argo-apps/linkerd.yaml
- git commit -m "upgrade Linkerd to 2.8.1"
- git push git-server master
同步 main 應(yīng)用程序:
- argocd app sync main
同步 linkerd 應(yīng)用程序:
- argocd app sync linkerd
確認(rèn)升級(jí)成功完成:
- linkerd check
確認(rèn)控制平面的新版本:
- linkerd version
清理
所有應(yīng)用程序都可以通過(guò)刪除 main 應(yīng)用程序來(lái)刪除:
- argocd app delete main --cascade=true