Cilium使用 (Cilium 3)

charlieroro發表於2020-04-19

使用k3s測試Cilium,安裝步驟可以參見官方文件

Cilium安裝使用

docker安裝

使用如下命令安裝最新版本的docker

yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
    
yum install docker-ce docker-ce-cli containerd.io

啟動docker

service docker start

核心更新

Cilium要求的核心版本比較高,需要對核心進行升級,否則會執行失敗。錯誤日誌如minimal supported kernel version is 4.8.0; kernel version that is running is: 3.10.0"

1、匯入key
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

2、安裝elrepo的yum源
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

3、安裝核心
在yum的ELRepo源中,有mainline頒佈的,可以這樣安裝:
yum --enablerepo=elrepo-kernel install  kernel-ml-devel kernel-ml -y

為了讓新安裝的核心成為預設啟動選項,需要如下修改 GRUB 配置,開啟並編輯 /etc/default/grub 並設定 GRUB_DEFAULT=0。意思是 GRUB 初始化頁面的第一個核心將作為預設核心

# cat /etc/default/grub
GRUB_TIMEOUT=1
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=0
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto spectre_v2=retpoline rhgb quiet net.ifnames=0 console=tty0 console=ttyS0,11520                                                  0n8 noibrs"
GRUB_DISABLE_RECOVERY="true"

接下來執行下面的命令來重新建立核心配置.

# grub2-mkconfig -o /boot/grub2/grub.cfg

重啟機器並檢視核心版本

# uname -a
Linux iZt4n3pfp2quf7ld2pln01Z 5.6.5-1.el7.elrepo.x86_64 #1 SMP Thu Apr 16 14:02:22 EDT 2020 x86_64 x86_64 x86_64 GNU/Linux

安裝k3s

安裝master
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC='--flannel-backend=none --no-flannel' sh -
安裝node(可選)
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC='--no-flannel' K3S_URL='https://${MASTER_IP}:6443' K3S_TOKEN=${NODE_TOKEN}
掛載BPF檔案系統
sudo mount bpffs -t bpf /sys/fs/bpf
安裝Cilium
kubectl create -f https://raw.githubusercontent.com/cilium/cilium/1.7.2/install/kubernetes/quick-install.yaml
檢視安裝結果
# kubectl -n kube-system get pods --watch
NAME                                      READY   STATUS      RESTARTS   AGE
cilium-operator-774d8f6d67-8mht6          1/1     Running     0          2m24s
metrics-server-6d684c7b5-qjmd5            1/1     Running     0          2m55s
local-path-provisioner-58fb86bdfd-xmx2r   1/1     Running     0          2m55s
helm-install-traefik-wx88l                0/1     Completed   0          2m55s
cilium-md26c                              1/1     Running     0          2m24s
svclb-traefik-g4mq5                       2/2     Running     0          55s
coredns-6c6bb68b64-gtqm5                  1/1     Running     0          2m55s
traefik-7b8b884c8-79v79                   1/1     Running     0          55s

部署連線測試

該步驟部署一系列deployment,這些deployment將使用各種連線路徑相互連線。連線路徑包括有/無service負載平衡以及各種網路策略組合。pod名稱表示連線變數,readiness和liveness gate表示測試的成功或失敗:

kubectl apply -f https://raw.githubusercontent.com/cilium/cilium/1.7.2/examples/kubernetes/connectivity-check/connectivity-check.yaml

安裝Hubble

Hubble是一個完全分散式的網路和安全的觀測平臺,用於雲本地工作負載。它構建在Cilium和eBPF之上,可以通過完全透明的方式深入瞭解服務以及網路基礎設施的通訊和行為。Visit Hubble Github page

安裝helm
wget https://get.helm.sh/helm-v3.1.2-linux-amd64.tar.gz
tar -zxvf helm-v3.1.2-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm
安裝Hubble
git clone https://github.com/cilium/hubble.git
cd hubble/install/kubernetes

helm template hubble \
    --namespace kube-system \
    --set metrics.enabled="{dns,drop,tcp,flow,port-distribution,icmp,http}" \
    --set ui.enabled=true \
> hubble.yaml

kubectl apply -f hubble.yaml

如果需要通過nodeport的方式訪問,可以建立如下service,訪問http://{$Externap_IP}:32000即可看到相關的策略

apiVersion: v1
kind: Service
metadata:
  name: hubble-ui-node
  namespace: kube-system
spec:
  ports:
  - name: http
    port: 12000
    protocol: TCP
    targetPort: 12000
    nodePort: 35000
  selector:
    k8s-app: hubble-ui
  sessionAffinity: None
  type: NodePort

Cilium的網路模型

同節點訪問

同節點內部的容器之間的連通性依賴核心協議棧二層轉發和BPF程式,不會經過像OVS或Linux bridge這樣的二層裝置。這部分功能由Cilium Agent負責,使用BPF規則進行流量的管控。簡單示意圖如下:

官方示意圖如下:

可以看到,同節點的容器之間通訊直接走BPF規則即可;不同節點的容器的通訊需要通過各個節點上的cilium_host介面進行轉發

容器和所在節點的通訊走節點內部的三層路由和BPF轉發,BPF程式連線容器的veth pair和它的閘道器裝置。如下路由中,將cilium_host作為容器的預設閘道器。容器和容器所在的節點的通訊需要經過cilium_host介面

容器:
# ip route
default via 10.42.0.79 dev eth0 mtu 1450 
10.42.0.79 dev eth0 scope link 

節點:
[root@iZt4n3pfp2quf7ld2pln01Z ~]# ip route
default via 172.21.239.253 dev eth0 
10.42.0.0/24 via 10.42.0.79 dev cilium_host src 10.42.0.79 mtu 1450 
10.42.0.79 dev cilium_host scope link 
169.254.0.0/16 dev eth0 scope link metric 1002 
172.21.224.0/20 dev eth0 proto kernel scope link src 172.21.239.198 

cilium_host涉及的iptables表項如下,可以看到對源地址為127.0.0.1的報文進行了SNAT。

Chain CILIUM_POST_nat (1 references)
 pkts bytes target     prot opt in     out     source               destination
 1977  119K MASQUERADE  all  --  *      !cilium_+  10.42.0.0/24        !10.42.0.0/24         /* cilium masquerade non-cluster */
 1521 95679 RETURN     all  --  *      !cilium_host  0.0.0.0/0            0.0.0.0/0            /* exclude non-cilium_host traffic from masquerade */
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match 0xa00/0xe00 /* exclude proxy return traffic from masquarade */
    0     0 SNAT       all  --  *      cilium_host !10.42.0.79          !10.42.0.0/24         /* cilium host->cluster masquerade */ to:10.42.0.79
    0     0 SNAT       all  --  *      cilium_host  127.0.0.1            0.0.0.0/0            /* cilium host->cluster from 127.0.0.1 masquerade */ to:10.42.0.79

跨節點網路

下面是使用Host L3進行跨節點通訊的流程圖

下面是使用vxlan進行跨節點通訊的流程圖

Cilium cli

使用Cilium後,不會再使用kube-proxy,它會從Kubernetes API伺服器獲得Service資訊,並存入BPF。可以使用cilium命令列檢視相關的資訊。如使用# cilium node list檢視當前的node節點資訊,使用# cilium service list檢視service資訊等。對於策略的獲取,可以通過命令列# cilium policy get,也可以通過Hubble UI檢視,如下:

參考:

相關文章