1. 博客/

K3s 集群修改 Flannel CNI 插件网络模式

·1168 字·3 分钟· ·
k3s openwrt network flannel n1 linux
Johny
作者
Johny
熟练的 云原生搬砖师
Table of Contents

背景说明
#

之前搭建 的 k3s 集群中因为某些原因我将 openwrt 节点,进行了系统重装,更改固件为了 esir 高大全的 op 固件,由于其 固件中没有将 vxlan 模块编译进内核当中,而 k3s 默认 使用的 cni 为 flannel 的 vxlan 模式,导致在初始化节点的时候会出现错误,导致节点添加不成功,我们知道原生 flannel 支持的模式不只单单只有 vxlan,还支持 host-gwudp 模式。进行查阅 k3s 相关资料,看到 k3s 是支持切换多种网络模式的,于是决定将 flannel 模式更改为 host-gw

节点说明
#

IP 地址节点名称机型配置操作系统节点角色
192.168.8.1openwrt占美 (机型不详)4c 2g ( cpu N2940 )openWrt(X86_64 esir 高大全node/agent
192.168.8.112n1斐讯 N14c 2gArmbian ( 5.0.2-aml-s905)master/server
192.168.8.113n2斐讯 N14c 2gArmbian ( 5.0.2-aml-s905)node/agent
192.168.8.114n3斐讯 N14c 2gArmbian ( 5.0.2-aml-s905)node/agent

更改模式为 host-gw
#

由于我目前的环境,n1、n2、n3 已组建为了 k3s 集群,使用的网络模式为 默认模式 vxlan ,这里需要进行更改即可。而 openwrt 这个节点是需要加入的节点,打算将其加入为 agent 节点。组建的集群规模为: 一主三从

原规模 集群更改模式
#

这里指 n1、n2、n3 这三台节点。下面步骤分别在各节点,进行相同操作进行更改。

vim `systemctl status k3s 2>&1|grep loaded|awk -F '[(;]' '{print $2}'` # 编辑 k3s 配置文件, 加入下述配置
...
        '--flannel-backend' \
        'host-gw'
...

image-20210729100350622

重启生效
#

systemctl daemon-reload \
&& systemctl restart k3s.service

检查是否生效
#

apt install sshpass

for i in `seq 1 3`;do sshpass -p 'xxxx' ssh -t -o StrictHostKeyChecking=no n"${i}" 'cat /var/lib/rancher/k3s/agent/etc/flannel/net-conf.json';done

image-20210729101620888

可以看到,即 /var/lib/rancher/k3s/agent/etc/flannel/net-conf.json 这个文件中,显示 type 为 host-gw 即 可以

image-20210729101815742

跨集群通讯也是没有问题的。

配置加入节点
#

原集群测试没有问题后,尝试对 openwrt 节点进行纳入集群中,进行管理。

测试启动
#

这里 openwrt 安装 k3s 的步骤,部分省略,可以参考我早期整理的 文档

k3s agent --server https://192.168.8.112:6443 --token K106ccb265579f1e40038844787c9ce4dd8528b6c58e26894e953661c9a907ef5d2::server:4843c59507b6840cb1c3bea454570f85 --docker --kube-apiserver-arg service-node-port-range=40000-65000 --no-deploy traefik --write-kubeconfig ~/.kube/config --write-kubeconfig-mode 666

image-20210729102428410

测试启动后,在 master 节点中查看,相关节点是否就绪。可以看到我这里是没有问题的。

配置 k3s 为服务,并设置开机自启
#

相关配置文件展示

cat /etc/config/k3s 
config globals 'globals'
        option opts '--server https://192.168.8.112:6443 --flannel-backend host-gw --token K106ccb265579f1e40038844787c9ce4dd8528b6c58e26894e953661c9a907ef5d2::server:4843c59507b6840cb1c3bea454570f85 --docker --kube-apiserver-arg service-node-port-range=40000-65000 --no-deploy traefik --write-kubeconfig ~/.kube/config --write-kubeconfig-mode 666'
        option root '/application/k3s'
        

cat /etc/init.d/k3s 
#!/bin/sh /etc/rc.common

START=60
STOP=20

PIDFILE=/var/run/k3s.pid
EXEC="/usr/bin/k3s"

ensure_cgroup_mount() {
  # Unmount /sys/fs/cgroup if mounted as cgroup
  grep -q ' /sys/fs/cgroup cgroup' /proc/self/mounts && umount /sys/fs/cgroup

  grep -q ' /sys/fs/cgroup tmpfs' /proc/self/mounts \
    || mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup

  for sys in $(awk '!/^#/ { if ($4 == 1) print $1 }' /proc/cgroups); do
    mnt="/sys/fs/cgroup/$sys"
    grep -q "cgroup $mnt " /proc/self/mounts && continue
    mkdir -p "$mnt"
    mount -n -t cgroup -o $sys cgroup "$mnt"
  done
}

start() {
  ensure_cgroup_mount
  start-stop-daemon -S -b -x "$EXEC" -m -p "$PIDFILE" \
    -- agent $(uci get k3s.globals.opts) \
    --data-dir $(uci get k3s.globals.root)
}

stop() {
  start-stop-daemon -K -p "$PIDFILE"

设置开机自启

chmod a+x /etc/init.d/k3s 

/etc/init.d/k3s start \
&& /etc/init.d/k3s enable

防火墙策略开放
#

由于 openwrt 中对,网络进行的 策略管理,这里我们要想 跨节点与 openwrt 中的 pod 进行通讯时,还需要将对应的 接口 进行开放一下。步骤实现方式在之前 整理 的 文档当中

测试 openwrt pod 网络通讯
#

这里已我目前集群中的 blog 服务为示例进行测试。使用 dashboard 为 lens 5.x

删除 pod ,触发 pod 重新调度,使其调度到 openwrt 节点当中。

image-20210729103444297

在 n1 节点当中,测试访问 openwrt 节点 pod,查看 pod 之间网络是否通畅。

image-20210729103732183

访问对应的 pod ip,正常返回 http 状态码 200, 即表示网络通畅且正常,此次集群升级结束。

参考文档
#

https://rancher.com/docs/k3s/latest/en/installation/install-options/server-config/#networking

总结
#

由于我这里在家里面搭的是一套 娱乐 性集群,部署的服务也是一些轻量级的应用,对性能什么的要求不高。 如果是生产环境的话,可能对相关的性能表现是比较在意,默认的 k3s kube-porxy 的模式是 使用的 iptables,一般生产是建议使用 ipvs 性能好一下,如有需求可以参加此篇 文档 进行实现。

相关文章

使用 斐讯n1 & openWrt 搭建 k3s 集群
·3283 字·7 分钟·
k3s openwrt n1
Docker 部署的 openWrt 软路由, 并解决无法与宿主机通信问题
·923 字·2 分钟·
fix openwrt n1 docker-compose docker openwrt
Docker 部署多网口 openWrt 软路由
·810 字·2 分钟·
openwrt linux centos7
使用 Docker-Compose 部署 openConnect Vpn Server
·793 字·2 分钟·
linux network openconnect docker-compose openldap
OpenVpn 的安装,并配置关联 openLdap 认证
·953 字·2 分钟·
linux network openvpn install
Centos7 安装之后必要的初始化操作
·1349 字·3 分钟·
linux centos centos7 docker linux