Linkerd 2.10 系列
- 快速上手 Linkerd v2.10 Service Mesh(服務網格)
- 騰訊雲 K8S 叢集實戰 Service Mesh—Linkerd2 & Traefik2 部署 emojivoto 應用
- 詳細瞭解 Linkerd 2.10 基礎功能,一起步入 Service Mesh 微服務架構時代
- Linkerd 2.10—將您的服務新增到 Linkerd
- Linkerd 2.10—自動化的金絲雀釋出
- Linkerd 2.10—自動輪換控制平面 TLS 與 Webhook TLS 憑證
- Linkerd 2.10—如何配置外部 Prometheus 例項
- Linkerd 2.10—配置代理併發
- Linkerd 2.10—配置重試
- Linkerd 2.10—配置超時
- Linkerd 2.10—控制平面除錯端點
- Linkerd 2.10—使用 Kustomize 自定義 Linkerd 的配置
- Linkerd 2.10—使用 Linkerd 進行分散式跟蹤
- Linkerd 2.10—除錯 502s
- Linkerd 2.10—使用每個路由指標除錯 HTTP 應用程式
- Linkerd 2.10—使用請求跟蹤除錯 gRPC 應用程式
- Linkerd 2.10—匯出指標
- Linkerd 2.10—暴露 Dashboard
- Linkerd 2.10—生成您自己的 mTLS 根證書
- Linkerd 2.10—獲取每條路由指標
- Linkerd 2.10—混沌工程之注入故障
- Linkerd 2.10—優雅的 Pod 關閉
- Linkerd 2.10—Ingress 流量
- Linkerd 2.10—安裝多叢集元件
- Linkerd 2.10—安裝 Linkerd
- Linkerd 2.10—使用 Helm 安裝 Linkerd
- Linkerd 2.10—Linkerd 和 Pod 安全策略 (PSP)
- Linkerd 2.10—手動輪換控制平面 TLS 憑證
- Linkerd 2.10—修改代理日誌級別
- 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 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 &
現在可以通過
https://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: 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