k3s集群部署和使用cilium网络插件

概述

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重新部署就好了。