Linkerd 2.10(Step by Step)—将 GitOps 与 Linkerd 和 Argo CD 结合使用

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
Linkerd 2.10(Step by Step)—将 GitOps 与 Linkerd 和 Argo CD 结合使用的更多相关文章
- Linkerd 2.10(Step by Step)—多集群通信
Linkerd 2.10 系列 快速上手 Linkerd v2.10 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traef ...
- Linkerd 2.10(Step by Step)—2. 自动化的金丝雀发布
通过结合 Linkerd 和 Flagger 来根据服务指标自动金丝雀(canary)发布,从而降低部署风险. Linkerd 2.10 中文手册持续修正更新中: https://linkerd.ha ...
- Linkerd 2.10(Step by Step)—4. 如何配置外部 Prometheus 实例
Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...
- Linkerd 2.10(Step by Step)—使用 Kustomize 自定义 Linkerd 的配置
Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...
- Linkerd 2.10(Step by Step)—控制平面调试端点
Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...
- Linkerd 2.10(Step by Step)—配置超时
Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...
- Linkerd 2.10(Step by Step)—配置重试
Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...
- Linkerd 2.10(Step by Step)—配置代理并发
Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...
- Linkerd 2.10(Step by Step)—3. 自动轮换控制平面 TLS &Webhook TLS 凭证
Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...
随机推荐
- 【SpringMVC】数据校验时,抛出javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: java.util.Date.
老魏原创,转载请留言. 原因:给Javabean中的字段注解多余或者错误导致. @NotEmpty @Past @DateTimeFormat(pattern="yyyy-MM-dd&quo ...
- 将文件服务器及域控制器从2003迁移至Windows Server 2008 R2
(一)背景环境: 当前,多数小企业仍然使用windows server2003 系统做域控制器及文件服务器,由于windows server 2003在多年使用之后变得卡顿,且存在异常的系统错误及诟病 ...
- Mybatis学习之自定义持久层框架(二) 自定义持久层框架设计思路
前言 上一篇文章讲到了JDBC的基本用法及其问题所在,并提出了使用Mybatis的好处,那么今天这篇文章就来说一下该如何设计一个类似Mybatis这样的持久层框架(暂时只讲思路,具体的代码编写工作从下 ...
- CAS的理解
CAS(CompareAndSweep)工作方式 CAS是乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被 ...
- 基础知识:DFRduino UNO R3最全资料详解
一.概述篇:1. 什么是DFRduino UNO R3?DFRduino UNO R3是一块基与开放原始代码的Simple i/o平台,並且具有使用类似java,C语言的开发环境.让您可以快速使用Ar ...
- java基础——初识面向对象
面向对象 面向过程&面向对象 面向过程思想 步骤请简单:第一步做什么,第一步做什么 面向过程适合处理一些较为简单的东西 面向对象思想 物以类聚,分类的思维模式,思考的问题首先会解决问题需要哪些 ...
- golang:数据类型总结
Go语言将数据类型分为四类:基础类型.复合类型.引用类型和接口类型. 基础数据类型包括: 基础类型: - 布尔型.整型.浮点型.复数型.字符型.字符串型.错误类型. 复合数据类型包括: - 指针.数组 ...
- 第3期:Too many open files以及ulimit的探讨
第3期:Too many open files以及ulimit的探讨 毛帅 Java.AI.互联网.金融 10 人赞同了该文章 Too many open files是Java常见的异常,通常是由于系 ...
- CentOS7开放端口以及常用的使用命令记录整理
CentOS7与以前常用的CentOS6还是有一些不同之处的,比如在设置开放端口的时候稍许有些不同,常用的iptables命令已经被firewalld代替.这几天正好有在CentOS7系统中玩Seaf ...
- 如何在 CentOS 8 中安装 Cockpit Web 控制台
如何在 CentOS 8 中安装 Cockpit Web 控制台 [日期:2019-10-31] 来源:Linux公社 作者:醉落红尘 [字体:大 中 小] 在本文中,我们将帮助您在CentOS ...