本篇博客只讲一件事情:
1、如果使用Cilium的能力将两个k8s集群逻辑上成1个集群并且使得应用可以全局负载均衡。
一、Cilium-Cluster Mesh
1、就是可以把多个k8s集群逻辑上为1个大集群并且上面的业务可以负载均衡。
2、可以在集群之间跑网络策略。
二、Cluster Mesh-使用限制
1、集群必须统一路由的模式,如果是物理网络那就都物理网络,如果是隧道那就都是隧道网络(协议和端口号也要一致避免Bug)。
2、每个集群的Cluster pool(ipam) 就是每个集群的大子网不能一致。
3、每个集群节点的Internal IP必须网络可达。其实就是集群的node 内部管理IP。规划在一个子网就行。
4、node 内部管理IP需要互通,开放必要的防火墙规则。
Setting up Cluster Mesh — Cilium 1.16.2 documentationhttps://docs.cilium.io/en/stable/network/clustermesh/clustermesh/ *上面为详细的限制。
三、步骤简述
1、两个安装了cilium的k8s集群(上一篇博客有详细信息)
2、开启Cluster Mesh
3、使用Cluster Mesh-apiserver -使用 nodeport类型的svc 打通逻辑集群。
4、部署Demo应用,分别部署在两个集群,一样的pod,一样的svc,就是区分名称的configmap配置文件不一样(如果一样了,那curl 之后的回显就都一样了,你怎么知道curl 相应的是谁)。
5、将Demo应用全局化,进行测试,期望效果:curl回显 rke-top 或者 rke-sec 。(分别对于两个集群的pod)
6、运行策勒本地不共享。
7、运行LB策略本地优先。
四、测试流程
1、两个安装了cilium的k8s集群
Cilium-实战系列-(一)Cilium-安装与部署-CSDN博客文章浏览阅读34次。前言:1、首先说一下和为 “一文一武”,一个注重点解,一个注重实际操作。Cilium + ebpf 系列文章-什么是ebpf?(一)_clium ebpf-CSDN博客文章浏览阅读419次。一、We Create a container be a Server.二、We Create a container be a Client.三、Them link at a Bridge.四、 Do test.一、Test-tools。https://blog.csdn.net/weixin_46510209/article/details/142703214?spm=1001.2014.3001.5501*(上一篇博客有详细信息)
*集群1
**集群2
2、 开启Cluster Mesh
1、export 集群名称
#集群1
export CLUSTER1=rke-top#集群2
export CLUSTER1=rke-sec
2、更新agent配置
cilium install --set cluster.name=$CLUSTER1 --set cluster.id=1 --context $CLUSTER1
cilium install --set cluster.name=$CLUSTER2 --set cluster.id=2 --context $CLUSTER2
3、验证配置
cilium config view | grep cluster-idcilium config view | grep cluster-name
4、启用Cluster-mesh
#集群A
cilium clustermesh enable --service-type NodePort --context $CLUSTER1
#集群B
cilium clustermesh enable --service-type NodePort --context $CLUSTER2
*如果你有全局的LB,设置全局的LB就可以了。
*如果集群上下文名称不对,
#列出当前的 contexts:
kubectl config get-contexts#使用 kubectl config rename-context 命令重命名 context。例如,将 old-context-name 重命名为 new-context-name:kubectl config rename-context old-context-name new-context-name#验证修改是否成功:kubectl config get-contexts
*两个集群都会创建clustermesh-apiserver。一个在集群之前上的管理平面。
5、 Cilium-验证-Cluster-mesh
cilium clustermesh status --context $CLUSTER1cilium clustermesh status --context $CLUSTER2
6、打通逻辑集群
cilium clustermesh connect --context $CLUSTER1 --destination-context $CLUSTER2
*在“全局”终端上单向完成即可。
*执行这条命令的终端需要可以拥有访问两个集群的use-text.下篇这篇我写的博客可以帮助你完成。
Kubernetes-使用不同主机终端访问k8s 集群。-CSDN博客文章浏览阅读61次。通常,`kubeconfig` 文件位于用户主目录下的 `.kube` 目录中,文件名为 `config`。打开 `kubeconfig` 文件,找到 `clusters`、`users` 和 `contexts` 部分。要获取 Kubernetes 集群的 CA 证书、客户端证书和客户端密钥,通常需要访问集群的配置文件(如 `kubeconfig` 文件)。要在 `kubectl` 中添加一个新的 context,可以使用 `kubectl config set-context` 命令。https://blog.csdn.net/weixin_46510209/article/details/142720273?spm=1001.2014.3001.5501
7、通过Cilium验证
cilium clustermesh status --context $CLUSTER1 --wait
*在01集群上执行可以看到 rke-sec集群。
五、Demo-App
1、DemoApp-简单介绍
我搞了一个非常简单的web应用,访问/hello的路径返回:“Hello, Kubernetes from rke-top!”
like this:
因为每个电脑的CPU架构不一致,为了避免因为base image编译问题,我放在Github仓库,地址如下。
https://github.com/kodyssss/my-go-project
https://github.com/kodyssss/my-go-project
**busybox是为了方便调试测试。
*执行dockerfile打包。
docker build -t cilium_go:v1 .
*然后进入/k8s部署即可,按需修改configmap.会影响curl返回的显示。
kubectl apply -f ./
2、DemoApp-部署
1、两个集群都要部署。
2、本地测试
kubectl exec -it pod/busybox-debug-7b9495dc89-ptmk4 -n ciliumgo -- /bin/sh
**两个集群都要测试。
*A集群用cluster-Ip
*B集群用DNS
六、 部署全局Service
1、两个集群的svc添加注解
annotations:
service.cilium.io/global: "true"
apiVersion: v1
kind: Service
metadata:name: cilium-goannotations:service.cilium.io/global: "true"
spec:selector:app: cilium-goports:- protocol: TCPport: 80targetPort: 8080
2、 在集群1进行测试。
**可以看到在集群1 进行wget -qO- cilium-go/hello,返回的是两个集群的后端pod的响应。
**到这里就已经实现了全局的LB。
七、特殊注解
#打了注释的集群的SVC不共享自己的pod。 service.cilium.io/shared: "false"#打了注释的集群的SVC本地优先。 service.cilium.io/affinity: "local"