跳转至

在阿里云上运行 Cilium

本文将介绍如何在阿里云自建 Kubernetes 集群上使用 Cilium 作为集群 CNI,您能够在阿里云上体验 Cilium 的各种能力,包括网络加速、网络策略等。

注意: 使用 Cilium 有内核要求,请检查您的 ECS 实例是否满足 Cilium 最低内核版本要求

安装集群

在阿里云上准备好一套自建 Kubernetes 集群,或按照 搭建 Kubernetes 集群 文档手动搭建一套集群。

安装 Cilium

使用 Cilium 二进制安装,首先参考官方文档 安装 Cilium 二进制:

CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}

在阿里云上,支持 Cilium 以 tunnel 和 native 模式运行,这两种方式部署参数稍些不同, 下面将单独介绍:

Tunnel 模式

Cilium tunnel 模式支持 Vxlan(默认) 和 Geneve 协议,这类似 Calico 的隧道模式。在这种模式下,Cilium 不关系底层网络如何实现,也不需要跟它们对接。通过 Vxlan 等协议将 Pod 网络虚拟化一个二层覆盖网络,然后接入到主机网络,所以 在这种模式下,Cilium 不依赖类似 CCM 等插件发布 Pod 的路由。所以在这个模式下,您不需要安装 CCM。使用下面的命令安装:

cilium install 

所有参数都为默认情况下,Cilium 基于 Vxlan 协议封装 Pod 数据包

等待 Cilium 组件 Running,创建测试应用测试通信是否正常:

$ kubectl  get po -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP               NODE                  NOMINATED NODE   READINESS GATES
test-77877f4755-2jz2c   1/1     Running   0          1m   10.244.1.39       cn-chengdu.i-2vcxxr   <none>           <none>
test-77877f4755-rjlg6   1/1     Running   0          1m   10.244.0.86     cn-chengdu.i-2vcxxs   <none>           <none>
$ kubectl  get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   172.21.0.1     <none>        443/TCP        32d
test         ClusterIP   172.21.0.53    <none>        80/TCP         2m

# 跨节点访问 Pod
$ kubectl  exec test-77877f4755-2jz2c -- ping -c1 10.244.0.86
PING 10.244.0.86 (10.244.0.86) 56(84) bytes of data.
64 bytes from 10.244.0.86: icmp_seq=1 ttl=63 time=0.571 ms

--- 10.244.0.86 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.571/0.571/0.571/0.000 ms

# 访问外部
$ kubectl exec test-77877f4755-24gqt -- ping -c1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=107 time=63.8 ms

--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 63.758/63.758/63.758/0.000 ms

# 访问 ClusterIP
$ kubectl exec test-77877f4755-24gqt -- curl -i 172.21.0.53
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0HTTP/1.1 200 OK
Content-Type: application/json
Date: Thu, 28 Sep 2023 03:54:28 GMT
Content-Length: 151

经过测试,Pod 各种连通性正常。

Native 模式

Cilium 支持在阿里云上运行 Native 模式,在此模式下,Pod 网络直接对接底层网络,没有额外封装,所以性能相对较好。但需要依赖 CCM 组件发布 Pod 子网路由到 VPC 网络,另外 Cilium 需要做一些特殊配置, 参考以下命令:

安装 CCM,参考 安装CCM文档

cilium install --set ipam.mode=kubernetes --set routingMode=native --set ipv4NativeRoutingCIDR=10.244.0.0/16 

ipam.mode 需要调整为 kubernetes,使 Pod 的 IP 从各自节点的 podCIDR 中分配 routingMode 设置为 native 模式,而不是默认的隧道模式 ipv4NativeRoutingCIDR 需要设置为需要路由发布的子网,这里填集群的 ClusterCIDR 即可(你可以通过查看 kubeadm-config configmap 找到)

等待 Cilium Running,创建测试应用,验证连通性:

$ kubectl  get po -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP             NODE                                NOMINATED NODE   READINESS GATES
test-77877f4755-v9mrj   1/1     Running   0          4s    10.244.1.166   cn-chengdu.i-2vc5zub002vrlwursb4s   <none>           <none>
test-77877f4755-w95wn   1/1     Running   0          4s    10.244.0.98    cn-chengdu.i-2vc5zub002vrlwursb4r   <none>           <none>
$ kubectl  get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   172.21.0.1     <none>        443/TCP        31d
test         ClusterIP   172.21.0.98    <none>        80/TCP         16s

可以发现 Pod 的 IP 段与节点绑定,测试连通性:

# Pod 跨节点
$ kubectl  exec test-77877f4755-v9mrj -- ping -c1 10.244.0.98
PING 10.244.0.98 (10.244.0.98) 56(84) bytes of data.
64 bytes from 10.244.0.98: icmp_seq=1 ttl=60 time=0.800 ms

--- 10.244.0.98 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.800/0.800/0.800/0.000 ms

# Pod 访问 Service
$ kubectl  exec test-77877f4755-v9mrj -- curl -i 172.21.0.98
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   152  100   152    0     0  32871      0 --:--:-- --:--:-- --:--:-- 38000
HTTP/1.1 200 OK
Content-Type: application/json
Date: Thu, 28 Sep 2023 04:17:33 GMT
Content-Length: 152

经过测试, Pod 各种连通性正常。

评论