Linkerd 2.10 中文手册持续修正更新中:
- https://linkerd.hacker-linner.com
Linkerd 中的多集群支持需要在默认控制平面安装之上进行额外的安装和配置。本指南将介绍此安装和配置以及您可能遇到的常见问题。
要求
- 两个集群。
- 每个集群中的控制平面安装共享一个公共信任锚。
- 这些集群中的每一个都应配置为 kubectl contexts。
- 两个集群上的提升权限。我们将创建服务帐户并授予扩展权限,因此您需要能够在测试集群上执行此操作。
- 支持 east 集群中的 LoadBalancer 类型的服务。查看集群提供商(cluster provider)的文档或查看 inlets。这是 west 集群将用于通过网关与 east 通信的内容。
步骤 1:安装多集群控制平面
在每个集群上,运行:
- linkerd multicluster install | \
- kubectl apply -f -
要验证一切是否已成功启动,请运行:
- linkerd multicluster check
步骤 2:Link 集群
每个集群都必须 linked。这包括在源集群中安装多个资源,包括一个包含允许 访问目标集群 Kubernetes API 的 kubeconfig 的 secret、 一个用于镜像服务(mirroring services)的服务镜像控件(service mirror control)以及一个 用于保存配置的 Link 自定义资源。要将集群 west 连接到集群 east,您将运行:
- linkerd --context=east multicluster link --cluster-name east |
- kubectl --context=west apply -f -
要验证凭据(credentials)已成功创建并且集群能够相互访问,请运行:
- linkerd --context=west multicluster check
您还应该通过运行以下命令看到网关列表。请注意,您需要在源集群中安装 Linkerd 的 Viz 扩展以获取网关列表:
- linkerd --context=west multicluster gateways
有关此步骤的详细说明,请查看链接集群部分。
步骤 3:暴露 services
服务不会在链接的集群中自动镜像。默认情况下,只会镜像带有 mirror.linkerd.io/exported 标签的服务。对于您想要镜像到链接集群的每个服务,运行:
- kubectl label svc foobar mirror.linkerd.io/exported=true
您可以通过在 linkerd multicluster link 命令上使用 --selector 标志或 通过编辑由 linkerd multicluster link 命令 创建的链接资源来配置不同的标签选择器(different label selector)。
利用 Ambassador
不需要捆绑的 Linkerd gateway。事实上,如果您有一个现有的 Ambassador 安装,那么使用它很容易!通过使用现有的 Ambassador 安装, 您无需管理多个入口网关(multiple ingress gateways)并为额外的云负载均衡器付费。本指南假定 Ambassador 已安装到 ambassador 命名空间中。
首先,您需要使用 Linkerd 注入 ambassador deployment:
- kubectl -n ambassador get deploy ambassador -o yaml | \
- linkerd inject \
- --skip-inbound-ports 80,443 \
- --require-identity-on-inbound-ports 4183 - | \
- kubectl apply -f -
这将添加 Linkerd 代理, 跳过 Ambassador 为公共流量处理的端口并要求网关端口上的 identity。接下来,您需要添加一些配置,以便 Ambassador 知道如何处理请求:
- cat <<EOF | kubectl --context=${ctx} apply -f -
- ---
- apiVersion: getambassador.io/v2
- kind: Module
- metadata:
- name: ambassador
- namespace: ambassador
- spec:
- config:
- add_linkerd_headers: true
- ---
- apiVersion: getambassador.io/v2
- kind: Host
- metadata:
- name: wildcard
- namespace: ambassador
- spec:
- hostname: "*"
- selector:
- matchLabels:
- nothing: nothing
- acmeProvider:
- authority: none
- requestPolicy:
- insecure:
- action: Route
- ---
- apiVersion: getambassador.io/v2
- kind: Mapping
- metadata:
- name: public-health-check
- namespace: ambassador
- spec:
- prefix: /-/ambassador/ready
- rewrite: /ambassador/v0/check_ready
- service: localhost:8877
- bypass_auth: true
- EOF
Ambassador service 和 deployment 定义需要稍作修补。这会添加 service mirror controller 所需的元数据。要修补这些资源,请运行:
- kubectl --context=${ctx} -n ambassador patch deploy ambassador -p='
- spec:
- template:
- metadata:
- annotations:
- config.linkerd.io/enable-gateway: "true"
- '
- kubectl --context=${ctx} -n ambassador patch svc ambassador --type='json' -p='[
- {"op":"add","path":"/spec/ports/-", "value":{"name": "mc-gateway", "port": 4143}},
- {"op":"replace","path":"/spec/ports/0", "value":{"name": "mc-probe", "port": 80, "targetPort": 8080}}
- ]'
- kubectl --context=${ctx} -n ambassador patch svc ambassador -p='
- metadata:
- annotations:
- mirror.linkerd.io/gateway-identity: ambassador.ambassador.serviceaccount.identity.linkerd.cluster.local
- mirror.linkerd.io/multicluster-gateway: "true"
- mirror.linkerd.io/probe-path: /-/ambassador/ready
- mirror.linkerd.io/probe-period: "3"
- '
现在您可以将 Linkerd 多集群组件安装到您的目标集群上。由于我们使用 Ambassador 作为我们的网关, 我们需要使用 --gateway=false 标志跳过安装 Linkerd 网关:
- linkerd --context=${ctx} multicluster install --gateway=false | kubectl --context=${ctx} apply -f -
完成所有设置和配置后,您就可以将源集群链接到这个 Ambassador 网关了。运行 link 命令,指定 Ambassador service 的名称和命名空间:
- linkerd --context=${ctx} multicluster link --cluster-name=${ctx} --gateway-name=ambassador --gateway-namespace=ambassador \
- | kubectl --context=${src_ctx} apply -f -
从源集群(未运行 Ambassador 的集群),您可以通过运行以下命令来验证一切是否正常工作:
- linkerd multicluster check
此外,在列出活动网关时会显示 ambassador 网关:
- linkerd multicluster gateways
信任锚捆绑
为了保护集群之间的连接,Linkerd 需要有一个共享的信任锚。这允许控制平面加密在集群之间传递的请求并验证这些请求的身份。此身份用于控制对集群的访问,因此共享信任锚至关重要。
最简单的方法是在多个集群之间共享一个信任锚证书。如果您有一个现有的 Linkerd 安装并丢弃了信任锚 key, 则可能无法为信任锚提供单个证书。幸运的是,信任锚也可以是一堆证书!
要获取现有集群的信任锚,请运行:
- kubectl -n linkerd get cm linkerd-config -ojsonpath="{.data.values}" | \
- yq e .identityTrustAnchorsPEM - > trustAnchor.crt
此命令需要 yq。如果您没有 yq,请随意使用您选择的工具从 identityTrustAnchorsPEM 字段中提取证书。`
现在,您需要为新集群创建一个新的信任锚(trust anchor)和颁发者(issuer):
- step certificate create root.linkerd.cluster.local root.crt root.key \
- --profile root-ca --no-password --insecure
- step certificate create identity.linkerd.cluster.local issuer.crt issuer.key \
- --profile intermediate-ca --not-after 8760h --no-password --insecure \
- --ca root.crt --ca-key root.key
我们使用 step cli 生成证书。 openssl 也能正常工作!
使用旧集群的信任锚和新集群的信任锚,您可以通过运行以下命令来创建捆绑包:
- cat trustAnchor.crt root.crt > bundle.crt
您需要使用新捆绑包(new bundle)升级现有集群。确保您希望与新集群通信的每个 pod 都重新启动, 以便它可以使用此包。要使用这个新的 信任锚包(trust anchor bundle)升级现有集群,请运行:
- linkerd upgrade --identity-trust-anchors-file=./bundle.crt | \
- kubectl apply -f -
最后,您将能够使用您刚刚创建的信任锚包(trust anchor bundle)以及颁发者证书( issuer certificate)和密钥(key)在新集群上安装 Linkerd。
- linkerd install \
- --identity-trust-anchors-file bundle.crt \
- --identity-issuer-certificate-file issuer.crt \
- --identity-issuer-key-file issuer.key | \
- kubectl apply -f -
确保通过对每个集群运行 check 来验证集群是否已成功启动。
- linkerd check
通过 Helm 安装多集群控制平面组件
Linkerd 的多集群组件,即 Gateway 和 Service Mirror 可以 通过 Helm 而不是 linkerd multicluster install 命令安装。
这不仅允许进行高级配置,还允许用户将多集群安装捆绑为他们 现有的基于 Helm 的安装管道的一部分。
添加 Linkerd 的 Helm 存储库
首先,让我们通过运行以下命令添加 Linkerd 的 Helm repo
- # To add the repo for Linkerd2 stable releases:
- helm repo add linkerd https://helm.linkerd.io/stable
Helm 多集群安装过程
- helm install linkerd2-multicluster linkerd/linkerd2-multicluster
chart values 将从 chart 的 values.yaml 文件中选取。
您可以通过提供您自己的 values.yaml 文件并使用 -f 选项来覆盖该文件中的值, 或者使用 --set 标志系列覆盖特定值。
可以在 此处 找到全套配置选项
可以通过运行以下命令来验证安装
- linkerd multicluster check
网关的安装可以通过 gateway 设置禁用。默认情况下,此值为 true。
安装额外的访问凭证
当使用 linkerd multicluster install 将 多集群组件安装到目标集群上时, 会创建一个服务帐户,源集群将使用该帐户来镜像服务。为每个源集群使用不同的服务帐户会很有好处,因为它使您能够从特定源集群撤消服务镜像访问。可以通过 CLI 使用 linkerd multicluster allow 命令 生成额外的服务帐户和关联的 RBAC。
也可以通过 Helm 将 remoteMirrorServiceAccountName 值设置为 list 来完成相同的功能。
- helm install linkerd2-mc-source linkerd/linkerd2-multicluster --set remoteMirrorServiceAccountName={source1\,source2\,source3} --kube-context target
【编辑推荐】