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 API
的 kubeconfig
的 secret
、
一个用于镜像服务(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
您还应该通过运行以下命令看到网关列表。
请注意,您需要在源集群中安装 Linkerd
的 Viz
扩展以获取网关列表:
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 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
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
的多集群组件,即 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
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 CLI
的 multicluster
子命令执行链接等操作。