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
完成安装后:
- 集群操控组件都会安装至
/var/lib/rancher/rke2/bin/
,包括kubectl
、crictl
和ctr
; - 卸载清理脚本
rke2-killall.sh
和rke2-uninstall.sh
被安装至/usr/local/bin
,如果配置了变量INSTALL_RKE2_TAR_PREFIX
则会被安装到此变量路径中; - 集群控制授权文件会被写入
/etc/rancher/rke2/rke2.yaml
,默认下仅 root 用户可访问; - 集群注册文件会被写入
/var/lib/rancher/rke2/server/node-token
,用于向集群中加入控制节点或工作节点;
检查集群状态
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 进行处理和转发。
附录
参考链接
- Network Options - RKE2
- RKE2 Install With cilium - Github
- Cannot install rke2-cilium via rancher - Github
- 使用RKE2部署集群(cilium网络插件) - 简书
本文由 柒 创作,采用 知识共享署名4.0
国际许可协议进行许可。
转载本站文章前请注明出处,文章作者保留所有权限。
最后编辑时间: 2023-09-14 16:36 PM