使用 Cilium CNI 插件的 rke2 集群搭建
后知后觉 暂无评论

RKE2 默认使用 Canal CNI (Flannel) 来进行节点间通讯,其实还支持 Calico 和 Cilium 插件。

默认情况就不再赘述,可以参考官方文档。

环境准备

环境准备工作和 Kubernetes 基本一致。Cilium 使用 eBPF 方式进行通讯,简单理解就是直接使用内核态进行转发,不再依赖其他组件,也正因如此对内核版本要求比较严格,需要内核版本 >= 4.9.17 (建议使用内核比较新的发行版,比如 Debian 和 Ubuntu),其他系统要求参考官方手册

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

## 手动加载下模块
sudo modprobe overlay
sudo modprobe br_netfilter

## 配置 sysctl 参数,并保持重启依然生效 
cat <<EOF | sudo tee /etc/sysctl.d/rke2.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

## 应用 sysctl 参数,无需重启
sudo sysctl --system

如果是由 NetworkManager 托管网卡的发行版,比如 CentOS 或 RHEL 等,还需要按【此文档】操作,防止 CNI 网络插件与 NetworkManager 冲突。


安装

控制节点

准备安装配置文件 /etc/rancher/rke2/config.yaml

write-kubeconfig-mode: "0644"
cni:
  - cilium
disable:
  - rke2-canal
  - rke2-kube-proxy
disable-kube-proxy: true
debug: true
注意:Cilium 支持 proxy less 模式,即不使用 kube-proxy 进行组网,完全使用 eBPF 代替 iptables 进行流量转发,效率更高,但是此选项对内核要求更高,需要 5.8 及以上版本的内核。

然后使用下面的命令进行安装

curl -sfL https://get.rke2.io | sudo sh -

配置服务启动

sudo systemctl enable rke2-server.service

配置 kube-proxy less,写入配置文件/var/lib/rancher/rke2/server/manifests/rke2-cilium-config.yaml

---
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: rke2-cilium
  namespace: kube-system
spec:
  valuesContent: |-
    kubeProxyReplacement: strict
    k8sServiceHost: 主节点地址或域名
    k8sServicePort: 6443
    cni:
      chainingMode: "none"

IPv4 和 IPv6 双栈(可选配置)

#/etc/rancher/rke2/config.yaml
cluster-cidr: "10.42.0.0/16,2001:cafe:42:0::/56"
service-cidr: "10.43.0.0/16,2001:cafe:42:1::/112"

启动服务

sudo systemctl start rke2-server.service

查看日志

sudo journalctl -u rke2-server -f

完成安装后:

检查集群状态

export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
/var/lib/rancher/rke2/bin/kubectl get nodes

工作节点

控制节点中的配置文件里的字符串就是集群认证密钥,将其复制出来,方便一会加入工作节点。

sudo cat /var/lib/rancher/rke2/server/node-token

在希望加入集群的工作节点上创建配置文件 /etc/rancher/rke2/config.yaml

server: https://[控制节点域名或地址]:9345
token: [上面复制的认证密钥]
cni:
  - cilium
disable:
  - rke2-canal
  - rke2-kube-proxy
disable-kube-proxy: true
小贴士:需要注意每个节点必须有唯一的主机名,如果没有则需要在配置文件中添加 node-name 参数,且保证每个节点的配置文件的此参数值唯一。

然后执行安装脚本

curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="agent" sudo sh -

配置服务启动

sudo systemctl enable rke2-agent.service

启动服务

sudo systemctl start rke2-agent.service

配置

配置控制授权

为了方便使用,将普通用户授权为集群管理用户,且在生产环境中只建议使用普通用户管理容器集群。

mkdir ~/.kube/
sudo cp /etc/rancher/rke2/rke2.yaml ~/.kube/config
sudo chown $USER:$USER ~/.kube/config
sudo chmod 600 ~/.kube/config

配置环境变量

因为 rke2 集群的组件都被安装至非常规目录,因此需要配置环境变量才能直接执行。

echo 'export PATH=/var/lib/rancher/rke2/bin:$PATH' | sudo tee /etc/profile.d/rke2.sh

重新登录终端生效,如果使用普通用户对集群进行管理(也只推荐这样操作),但 sudo 命令对 PATH 存在限制,为了让普通用户通过 sudo 使用命令时不报错,需要配置 sudo 可继承环境变量。执行 sudo visudo,在 secure_path 中添加被允许的路径(/var/lib/rancher/rke2/bin)。

Defaults secure_path="/var/lib/rancher/rke2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

配置完成后,退出终端重新连接,同时需要将重新配置 crictl

sudo crictl config --set runtime-endpoint=unix:///run/k3s/containerd/containerd.sock
sudo crictl config --set image-endpoint=unix:///run/k3s/containerd/containerd.sock
sudo crictl config --set timeout=2

执行后可见 /etc/crictl.yaml 内产生了新配置。

配置自动补全

默认情况下不会生成自动补全,为了方便使用手动生成配置文件。

sudo mkdir -p /etc/bash_completion.d/
curl -s https://raw.githubusercontent.com/containerd/containerd/main/contrib/autocomplete/ctr | sudo tee /etc/bash_completion.d/ctr
crictl completion bash | sudo tee /etc/bash_completion.d/crictl
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl

配置 Helm

参考文章 从零开始的 Kubernetes 学习笔记(三) #5.1 部分


检查

全部配置完成后重新登录终端,检查集群状态:

$ kubectl get nodes
NAME     STATUS   ROLES                       AGE    VERSION
rke2n1   Ready    control-plane,etcd,master   1h     v1.25.12+rke2r1
rke2n2   Ready    <none>                      1h     v1.25.12+rke2r1
rke2n3   Ready    <none>                      1h     v1.25.12+rke2r1

检查节点状态

$ kubectl get pods -A
NAMESPACE     NAME                                                    READY   STATUS      RESTARTS      AGE
kube-system   cilium-jm2j5                                            1/1     Running     0             7m53s
kube-system   cilium-thvwq                                            1/1     Running     0             13m
kube-system   cilium-tt52q                                            1/1     Running     0             7m49s
kube-system   cilium-operator-844ddf5b88-74pxl                        1/1     Running     0             13m
kube-system   cilium-operator-844ddf5b88-ksjlm                        1/1     Running     0             13m
kube-system   cloud-controller-manager-rke2n1                         1/1     Running     1 (14m ago)   14m
kube-system   etcd-rke2n1                                             1/1     Running     0             14m
kube-system   helm-install-rke2-cilium-m5shf                          0/1     Completed   0             14m
kube-system   helm-install-rke2-coredns-7rngs                         0/1     Completed   0             14m
kube-system   helm-install-rke2-ingress-nginx-pjdt9                   0/1     Completed   0             14m
kube-system   helm-install-rke2-metrics-server-rzkts                  0/1     Completed   0             14m
kube-system   helm-install-rke2-snapshot-controller-crd-w7sx4         0/1     Completed   0             14m
kube-system   helm-install-rke2-snapshot-controller-rrq8f             0/1     Completed   1             14m
kube-system   helm-install-rke2-snapshot-validation-webhook-rwbs5     0/1     Completed   0             14m
kube-system   kube-apiserver-rke2n1                                   1/1     Running     0             14m
kube-system   kube-controller-manager-rke2n1                          1/1     Running     0             14m
kube-system   kube-scheduler-rke2n1                                   1/1     Running     0             14m
kube-system   rke2-coredns-rke2-coredns-546587f99c-5vd5p              1/1     Running     0             13m
kube-system   rke2-coredns-rke2-coredns-546587f99c-v88tw              1/1     Running     0             7m46s
kube-system   rke2-coredns-rke2-coredns-autoscaler-797c865dbd-bxbx6   1/1     Running     0             13m
kube-system   rke2-ingress-nginx-controller-n4q25                     1/1     Running     0             6m38s
kube-system   rke2-ingress-nginx-controller-q6w9q                     1/1     Running     0             10m
kube-system   rke2-ingress-nginx-controller-rh2zh                     1/1     Running     0             6m59s
kube-system   rke2-metrics-server-78b84fff48-ndjrg                    1/1     Running     0             10m
kube-system   rke2-snapshot-controller-849d69c748-tbt24               1/1     Running     0             10m
kube-system   rke2-snapshot-validation-webhook-7f955488ff-vqxvt       1/1     Running     0             10m

可以注意到,和其他 CNI 不同的是,已经没有 kube-proxy 的容器存在,所有的流量将使用内核 eBPF 进行处理和转发。


附录

参考链接

本文撰写于一年前,如出现图片失效或有任何问题,请在下方留言。博主看到后将及时修正,谢谢!
禁用 / 当前已拒绝评论,仅可查看「历史评论」。