概述
cilium都近期比较火的一个网络插件,它通过将ebpf技术引入网络插件中用于满足容器工作负载的新可伸缩性,安全性和可见性要求。
前置条件
ebpf依赖内核技术,所以需要保证以下内核版本
1 、kernel版本 >= 4.9.17
软件 |
版本 |
k3s |
v1.18.6+k3s1 |
cilium |
1.8 |
部署k3s
采用两节点部署k3s,节点一角色为master+worker,节点二角色为worker
部署master
1
| curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s - --write-kubeconfig ~/.kube/config --write-kubeconfig-mode 666 --docker --no-flannel
|
获取连接master的token信息
1
| cat /var/lib/rancher/k3s/server/node-token
|
部署worker
1
| curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh| INSTALL_K3S_EXEC='--docker --no-flannel' INSTALL_K3S_MIRROR=cn K3S_URL=https://master-ip:6443 K3S_TOKEN=xxx sh -
|
查看节点部署
1 2 3 4
| kubectl get node NAME STATUS ROLES AGE VERSION rke-k3s-node1.novalocal NotReady master 24m v1.18.6+k3s1 rke-k3s-node2 NotReady <none> 10s v1.18.6+k3s1
|
此时因为没有部署网络插件所以节点状态为NotReady状态
所有节点执行挂载bpf文件系统
1
| sudo mount bpffs -t bpf /sys/fs/bpf
|
方式一:快速部署cilium网络插件
1
| kubectl create -f https://raw.githubusercontent.com/cilium/cilium/v1.8/install/kubernetes/quick-install.yaml
|
查看组件状态
1 2 3 4 5 6 7 8 9 10 11 12 13
| kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE cilium-p2c2p 1/1 Running 0 28m cilium-operator-868c78f7b5-bvgrl 1/1 Running 0 28m coredns-8655855d6-9nvn9 1/1 Running 0 27m local-path-provisioner-6d59f47c7-k2454 1/1 Running 0 21m metrics-server-7566d596c8-k4dzz 1/1 Running 0 21m helm-install-traefik-cmlzv 0/1 Completed 3 21m svclb-traefik-wz685 2/2 Running 0 20m traefik-758cd5fc85-t2mzc 1/1 Running 0 8m49s cilium-operator-868c78f7b5-tjm27 1/1 Running 0 2m49s svclb-traefik-n2b8m 2/2 Running 0 71s cilium-97j69 1/1 Running 0 91s
|
测试网络连通性
1
| kubectl apply -f https://raw.githubusercontent.com/cilium/cilium/v1.8/examples/kubernetes/connectivity-check/connectivity-check.yaml
|
主要测试二层网络联通性和三层网络联通性 ,状态都为running表示正常
cilium默认跨主机网络通信是通过VXLAN实现的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| kubectl get pod NAME READY STATUS RESTARTS AGE pod-to-a-6cf58894b7-lh9pz 1/1 Running 0 5m11s pod-to-b-intra-node-77b485d996-6bm8d 1/1 Running 0 5m10s host-to-b-multi-node-clusterip-c7557d4f8-89lj6 1/1 Running 0 5m11s echo-b-659766fb56-c54fm 1/1 Running 0 5m11s echo-a-5f555bbc8b-fck6k 1/1 Running 0 5m12s pod-to-a-l3-denied-cnp-74b9566cc7-ct4kg 1/1 Running 0 5m11s echo-b-host-65d7db76d8-kv277 1/1 Running 0 5m11s host-to-b-multi-node-headless-5dfcdf9b76-wsz7m 1/1 Running 0 5m11s pod-to-b-intra-node-nodeport-56975db6c7-sqwq8 1/1 Running 0 5m11s pod-to-b-multi-node-clusterip-75f5c78f68-4ljhc 1/1 Running 0 5m10s pod-to-b-multi-node-headless-5df88f9bd4-gfjws 1/1 Running 0 5m10s pod-to-b-multi-node-nodeport-55b9769455-dv6pv 1/1 Running 0 5m10s pod-to-a-allowed-cnp-5898f7d8c9-bjch7 1/1 Running 0 5m11s pod-to-a-external-1111-5779fb7cb9-qf8mq 0/1 Running 4 5m9s pod-to-external-fqdn-allow-google-cnp-74466b4c6f-sfchn 0/1 Running 3 5m9s
|
删除测试用例
1
| kubectl delete -f https://raw.githubusercontent.com/cilium/cilium/v1.8/examples/kubernetes/connectivity-check/connectivity-check.yaml
|
方式二:Helm部署方式cilium网络插件
因为cilium1.8开始hubble功能集成到Cilium的helm-chart中了,所以在1.8版本cilium需要使用hubble需要在chart中启用,部署方式分两种
方式一:Cilium + cilium-etcd-operator
方式二:cilium+自带etcd
因为k3s默认使用SQLite3做为后端数据库所以这里使用方式一方式进行安装
hubble主要用于
下载helm客户端
1
| wget https://get.helm.sh/helm-v3.3.0-linux-amd64.tar.gz
|
添加cilium的repo
1
| helm repo add cilium https://helm.cilium.io/
|
部署cilium和hubble
1 2 3 4 5 6 7 8 9
| helm install cilium cilium/cilium --version 1.8.2 \ --namespace kube-system \ --set global.etcd.enabled=true \ --set global.etcd.managed=true \ --set global.hubble.enabled=true \ --set global.hubble.listenAddress=":4244" \ --set global.hubble.metrics.enabled="{dns,drop,tcp,flow,port-distribution,icmp,http}" \ --set global.hubble.relay.enabled=true \ --set global.hubble.ui.enabled=true
|
使用NodePort方式对外暴露
1
| kubectl patch svc hubble-ui -p '{"spec": {"type": "NodePort"}}' -n kube-system
|
访问hubble-UI
通过hubble可以非常清晰看到各个应用的互相连接关系和访问信息。


总结:
整体部署和使用下来功能是非常强大,目前看社区都有往ebpf方向走,包括向calico目前也有个ebpf的模式,通过ebpf可以提升整体网络的性能和细粒化网络流量的控制和可视化,后续将以这个为方向深入理解。但带来的问题就是对于排错对比与calico-bgp或flannel-vxlan会更加复杂,在部署后出现过一次大面积瘫痪情况,没有找到是k3s问题和cilium问题,后面将集群和cilium重新部署就好了。