25. 安装多集群组件

Linkerd 中的多集群支持需要在默认控制平面安装之上进行额外的安装和配置。 本指南将介绍此安装和配置以及您可能遇到的常见问题。 有关详细演练和正在发生的事情的解释,请查看快速上手

如果您想使用现有的 Ambassador 安装, 请查看 leverage 说明。 或者,查看 Ambassador 文档 以获取有关配置和正在发生的事情的更详细说明。

要求

  • 两个集群。
  • 每个集群中的控制平面安装共享一个公共 信任锚。 如果您有现有安装,请参阅 信任锚捆绑 文档以了解需要什么。
  • 这些集群中的每一个都应配置为 kubectl contexts
  • 两个集群上的提升权限。我们将创建服务帐户并授予扩展权限,因此您需要能够在测试集群上执行此操作。
  • 支持 east 集群中的 LoadBalancer 类型的服务。 查看集群提供商(cluster provider)的文档或查看 inlets。 这是 west 集群将用于通过网关与 east 通信的内容。

步骤 1:安装多集群控制平面

在每个集群上,运行:

linkerd multicluster install | \
    kubectl apply -f -

要验证一切是否已成功启动,请运行:

linkerd multicluster check

要深入了解将哪些组件添加到您的集群以及所有组件如何组合在一起,请查看 入门文档

步骤 2:链接集群

每个集群都必须链接。 这包括在源集群中安装多个资源,包括一个包含允许 访问目标集群 Kubernetes APIkubeconfigsecret、 一个用于镜像服务(mirroring services)服务镜像控件(service mirror control)以及一个 用于保存配置的 Link 自定义资源。 要将集群 west 链接到集群 east,您将运行:

linkerd --context=east multicluster link --cluster-name east |
  kubectl --context=west apply -f -

要验证凭据已成功创建并且集群能够相互访问,请运行:

linkerd --context=west multicluster check

您还应该通过运行以下命令看到网关列表。 请注意,您需要在源集群中安装 LinkerdViz 扩展以获取网关列表:

linkerd --context=west multicluster gateways

有关此步骤的详细说明,请查看链接集群部分

步骤 3:暴露服务

服务不会在链接的集群中自动镜像。 默认情况下,只会镜像带有 mirror.linkerd.io/exported 标签的服务。 对于您想要镜像到链接集群的每个服务,运行:

kubectl label svc foobar mirror.linkerd.io/exported=true

利用 Ambassador

不需要捆绑的 Linkerd gateway。 事实上,如果您有一个现有的 Ambassador 安装,那么使用它很容易! 通过使用现有的 Ambassador 安装, 您无需管理多个入口网关并为额外的云负载均衡器付费。 本指南假定 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 proxy, 跳过 Ambassador 为公共流量处理的端口并要求网关端口上的 identity。 查看 docs 以了解为什么在网关端口上要求 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 servicedeployment 定义需要稍作修补。 这会添加 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 flag 跳过安装 Linkerd gateway

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

现在,您需要为新集群创建一个新的信任锚颁发者

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

使用集群的信任锚集群的信任锚,您可以通过运行以下命令来创建捆绑包:

cat trustAnchor.crt root.crt > bundle.crt

您需要使用新捆绑包升级现有集群。 确保您希望与新集群通信的每个 pod 都重新启动, 以便它可以使用此包。要使用这个新的 信任锚包升级现有集群,请运行:

linkerd upgrade --identity-trust-anchors-file=./bundle.crt | \
    kubectl apply -f -

最后,您将能够使用您刚刚创建的信任锚包以及颁发者证书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 的多集群组件,即 GatewayService Mirror 可以 通过 Helm 而不是 linkerd multicluster install 命令安装。

这不仅允许进行高级配置,还允许用户将多集群安装捆绑为他们 现有的基于 Helm 的安装管道的一部分。

添加 Linkerd 的 Helm 存储库

首先,让我们通过运行以下命令添加 LinkerdHelm 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 将从 chartvalues.yaml 文件中选取。

您可以通过提供您自己的 values.yaml 文件并使用 -f 选项来覆盖该文件中的值, 或者使用 --set flag 系列覆盖特定值。

可以在 此处 找到全套配置选项

可以通过运行以下命令来验证安装

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

现在安装了多集群组件,可以根据 multicluster task 使用 linkerd CLImulticluster 子命令执行链接等操作。