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 操作,如本指南后面的 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 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 结合使用的更多相关文章

  1. Linkerd 2.10(Step by Step)—多集群通信

    Linkerd 2.10 系列 快速上手 Linkerd v2.10 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traef ...

  2. Linkerd 2.10(Step by Step)—2. 自动化的金丝雀发布

    通过结合 Linkerd 和 Flagger 来根据服务指标自动金丝雀(canary)发布,从而降低部署风险. Linkerd 2.10 中文手册持续修正更新中: https://linkerd.ha ...

  3. Linkerd 2.10(Step by Step)—4. 如何配置外部 Prometheus 实例

    Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...

  4. Linkerd 2.10(Step by Step)—使用 Kustomize 自定义 Linkerd 的配置

    Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...

  5. Linkerd 2.10(Step by Step)—控制平面调试端点

    Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...

  6. Linkerd 2.10(Step by Step)—配置超时

    Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...

  7. Linkerd 2.10(Step by Step)—配置重试

    Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...

  8. Linkerd 2.10(Step by Step)—配置代理并发

    Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...

  9. Linkerd 2.10(Step by Step)—3. 自动轮换控制平面 TLS &Webhook TLS 凭证

    Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...

随机推荐

  1. Spring MVC工作原理及源码解析(一) MVC原理介绍、与IOC容器整合原理

    MVC原理介绍 Spring MVC原理图 上图是Spring MVC工作原理图(图片来自网上搜索),根据上图,我们可以得知Spring MVC的工作流程如下: 1.用户(客户端,即浏览器)发送请求至 ...

  2. Codeforces Round #692 (Div. 2, based on Technocup 2021 Elimination Round 3)

    A.In-game Chat 题目:就是从后面数连着的'('的个数是不是严格比剩下的字符多 思路:水题,直接从后往前遍历即可 代码: #include<iostream> #include ...

  3. linux下将一个大的文件拆分成若干小文件

    命令:split,例子: 以行数拆分 -l参数: split –l 50 原始文件 拆分后文件名前缀 说明:以50行对文件进行拆分,最后一个文件的行数没有50行以实际行数进行分配,比如有一个名为 wl ...

  4. 利用Typora+PicGo+OSS+Git+Github/码云搭建个人云笔记

    搭建个人云笔记 对于程序员来讲,使用markdown可以帮助我们快速地写作,书写出排版好看,颜值高的笔记,使用markdown来书写文档相比于使用word要简单快捷的多 市面上有很多markdown的 ...

  5. [bug] Hive:Caused by: MetaException(message:Hive Schema version 2.1.0 does not match metastore's schema version 1.2.0 Metastore is not upgraded or corrupt)

    参考 https://www.cnblogs.com/liupuLearning/p/6610307.html 少了创建hive数据库一步

  6. [web] 系统运维--单机

    处理过程 浏览器发送请求经过网络到达web服务器 web服务器处理请求并响应数据 响应数据从web服务器发送到用户端 用户浏览器接收数据,本地计算渲染 指标 响应时间 吞吐量 响应时间 响应时间 = ...

  7. 强哥node.js学习笔记

    node后端语言: nodejs学习大纲:1.node安装2.node repl开发3.node sublime开发4.node 使用5.node 中创建第一个应用6.node 回调函数7.node ...

  8. 8.10-11 mount、umount

    8.10 mount:挂载文件系统 mount命令可以将指定的文件系统挂载到指定目录(挂载点),在Linux系统下必须先挂载所有的设备,然后才能被访问,挂载其实就是为要访问的设置开个门(开门才能访问) ...

  9. redis 处理缓存击穿以及缓存雪崩

    缓存击穿 1. 缓存击穿简述 某一个热点数据在缓存中失效,请求穿过redis到达DB,造成DB压力过大 2. 怎么解决缓存击穿 1. 使用redis 作为分布式互斥锁(mutex lock) 实现步骤 ...

  10. Web应用漏洞-NGINX各类请求头缺失对应配置

    前言 随着越来越多的网络访问通过WEB界面进行操作,WEB安全已经成为互联网安全的一个热点,基于WEB的攻击广为流行,SQL注入.跨站脚本等WEB应用层漏洞的存在使得网站沦陷.页面篡改.网页挂马等攻击 ...