在EKS中使用Cilium Cluster Mesh功能

368 阅读2分钟

hero-scheme-b37769010d5b3a243354da54c722faef.png

最初想到在EKS中尝试Cilium,是因为Cilium基于eBPF打造,支持AWS VPC CNI插件,可观察性工具提供了hubble-ui,还提供了Network Policy Editor用可视化的方式创建网络规则,感觉挺不错的。在单集群安装完成后,想尝试下使用Cilium Cluster Mesh的功能,并且参考了这篇文章,但发现目前最新的Cilium 1.10版本已经不适用这个安装方法,自己折腾了几天后,终于成功了,分享给有需要的人。

软件版本

  • EKS-1.21
  • aws load balancer controller-2.2
  • Cilium-1.10
  • helm- 3

前置条件

  • 所有K8S集群需要Node和Node之间能互相访问,如果是AWS可以建立Peering Connections
  • Pod IP在所有集群中唯一

1 helm添加源

helm repo add cilium https://helm.cilium.io/ 

2 创建集群value.yaml文件

其中cluster.id 和 cluster.name,不要重复

k8sServiceHost 替换成集群的master DNS

这里关闭了启用自动创建Cluster Mesh Server证书的功能,因为当前Cilium helm创建的服务器证书只包含了127.0.0.1的ip和*.mesh.io的域名,而一个集群中的Cluster Mesh Server提供给另一个集群访问的入口是一个nlb的DNS,所以需要把这个nlb的DNS一起加到证书中。

cluster:
  id: *
  name: k8s-cluster-*
tunnel: disabled
eni:
  enabled: true
ipam:
  mode: eni
nodeinit:
  enabled: true
hubble:
  relay:
    enabled: true
  ui:
    enabled: true
egressMasqueradeInterfaces: eth0
kubeProxyReplacement: strict
k8sServiceHost: xxxxxx.us-west-2.eks.amazonaws.com
k8sServicePort: 443
hostRouting: false
clustermesh:
  useAPIServer: true
  apiserver:
    service:
      type: LoadBalancer
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-scheme: "internal"
        service.beta.kubernetes.io/aws-load-balancer-type: "external"
        service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "instance"
    tls:
      auto:
        enabled: false
      ca:
        cert:
        key:
      server:
        cert:
        key:
      remote:
        cert:
        key:
      admin:
        cert:
        key:

3 创建证书

gen.sh

这边我提供了一个脚本,会生成一套证书,并且导出到一个config.yaml的文件,把config.yaml中的证书内容替换到value.yaml中去。此证书的域名目前添加了*.elb.us-west-2.amazonaws.com,如果你需要添加其他域名,可以直接加到alt.config文件中

4 安装Cilium到各个集群中

#先关闭aws node和kube-proxy
#我用cilium agent代理了kube-proxy的功能
kubectl patch daemonset aws-node -n kube-system -p '{"spec":{"template":{"spec":{"nodeSelector":{"no-such-node": "true"}}}}}'
kubectl patch daemonset kube-proxy -n kube-system -p '{"spec":{"template":{"spec":{"nodeSelector":{"no-such-node": "true"}}}}}'

# 安装cilium 
kubectl create ns cilium
helm install cilium --namespace=cilium cilium/cilium -f value_{{clusterID}}.yaml

5 导出集群中Cluster Mesh的配置信息,导入到另一个进群中,并重启cilium daemonset

k8s-extract-clustermesh-service-secret.sh

k8s-import-clustermesh-secrets.sh

下载这两个脚本

#集群一中导出文件
./k8s-extract-clustermesh-service-secret.sh > cluster1-secret.json
#集群二中载入文件
./k8s-import-clustermesh-secrets.sh cluster1-secret.json
kubectl rollout restart ds cilium -n cilium

#另一个集群也做此操作

成功之后可以在cilium pod中输入

cilium node list

这里已经能看到其他集群的node信息了

Service 发现功能

如果需要服务发现,可以在定义Service时加入下面注释

 annotations:
   io.cilium/global-service: 'true'

然后在cilium Pod中输入命令,查看是否已经能看到另一个集群的服务了

cilium service list