type
Post
status
Published
date
Apr 26, 2023
slug
2023/ArchLinux-kubeadm-kubernetes-install
summary
之前装的K8S网卡用的虚拟机nat网卡,换了虚拟机环境后就有问题了,这次装个双网卡的,顺便网络插件换 cilium 玩玩
tags
Kubernetes
category
技术分享
icon
password
0x01 虚拟机网络
确保 MAC 地址和 product_uuid 的唯一性
ip link cat /sys/class/dmi/id/product_uuid
通过虚拟机创建,因为不同虚拟机网卡可能会有变化,所以除了默认的nat上网网卡外,我单独新建了一个网段来设置静态ip

我这里使用内置的网络服务
systemd-network
,其他像NetworkManage之类的都是要安装的我这里第二张网卡名字是:ens36,所以在
/etc/systemd/network
目录下新建 ens36.network
文件IP和主机对应表 | IP | 域名 |
kmaster1 | 10.2.2.3 | kmaster1.k8s.tari.moe |
knode1 | 10.2.2.4 | knode1.k8s.tari.moe |
knode2 | 10.2.2.5 | knode2.k8s.tari.moe |
每台主机依次执行
hostnamectl set-hostname kmaster1.k8s.tari.moe cat >> /etc/hosts <<EOF 10.2.2.3 kmaster1.k8s.tari.moe 10.2.2.4 knode1.k8s.tari.moe 10.2.2.5 knode2.k8s.tari.moe EOF
hostnamectl set-hostname knode1.k8s.tari.moe cat >> /etc/hosts <<EOF 10.2.2.3 kmaster1.k8s.tari.moe 10.2.2.4 knode1.k8s.tari.moe 10.2.2.5 knode2.k8s.tari.moe EOF
hostnamectl set-hostname knode2.k8s.tari.moe cat >> /etc/hosts <<EOF 10.2.2.3 kmaster1.k8s.tari.moe 10.2.2.4 knode1.k8s.tari.moe 10.2.2.5 knode2.k8s.tari.moe EOF
在3个节点分别执行命令,其中 10.2.2.2 为 kmaster1节点,其他2个为node节点
cat > /etc/systemd/network/ens36.network <<EOF [Match] Name=ens36 [Network] Address=10.2.2.3/24 Gateway=10.2.2.1 DNS=114.114.114.114 EOF
cat > /etc/systemd/network/ens36.network <<EOF [Match] Name=ens36 [Network] Address=10.2.2.4/24 Gateway=10.2.2.1 DNS=114.114.114.114 EOF
cat > /etc/systemd/network/ens36.network <<EOF [Match] Name=ens36 [Network] Address=10.2.2.5/24 Gateway=10.2.2.1 DNS=114.114.114.114 EOF
依次重启网络即可
systemctl restart systemd-networkd
确保3个节点的 10.2.2.[2-4] 相互能 ping通
如果出现网络问题,可以通过 命令查看网关情况,如果存在两个默认网关,那么会存在问题
ip route show
默认网关建议使用外网的,即设置更高的优先级,首先删除默认网关
ip route del default
然后设置
ip route add default via 192.168.116.2 dev ens33 metric 1 ip route add default via 10.2.2.1 dev ens36 metric 9
0x02 每个节点安装前
- 确保交换分区被禁用,不然 kubelet 起不来
例如,sudo swapoff -a
将暂时禁用交换分区。要使此更改在重启后保持不变,请确保在如/etc/fstab
、systemd.swap
等配置文件中禁用交换分区,具体取决于你的系统如何配置。
- 每台机器 2 GB 或更多的 RAM(如果少于这个数字将会影响你应用的运行内存),master节点需4GB内存,不然装完后经常POD会被杀掉
- CPU 2 核心及以上
- 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。
- 开启机器上的某些端口。请参见这里了解更多详细信息。
以下所有操作均在 root 用户身份下进行
安装所需的依赖,并开启相应的内核模块
pacman -S bridge-utils --noconfirm modprobe br_netfilter
编辑文件
/etc/sysctl.conf
最后一行添加net.ipv4.ip_forward=1
并执行开启内核数据包转发
sysctl -p /etc/sysctl.conf
0x03 kmaster1节点
0x01 初始化集群
pacman -S kubelet kubeadm kubectl containerd
会提示和原本的 iptables 冲突,这里直接选 y 覆盖即可

使用 systemc cgroup
mkdir -p /etc/containerd containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1 sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
启动 containerd、kubelet 并设置为开机启动,
systemctl enable --now kubelet systemctl enable --now containerd
kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。
一开始代理不知为啥怎么也挂不上去(export 或者 proxychains 都不行),后面搭建了个 openvpn (
kubeadm init --apiserver-advertise-address=10.2.2.3 --control-plane-endpoint=10.2.2.3 --pod-network-cidr=10.217.0.0/16
- 这里一定要指定 ip 地址,防止自动绑定到 openvpn 的ip 或者上网的动态ip
- 网络插件
Cilium
,需要设置--pod-network-cidr=10.217.0.0/16
:cilium/bandwidth-manager.rst at main · cilium/cilium (github.com)

保存好,下面子节点加入需要
kubeadm join 10.2.2.3:6443 --token xxxxxxxxxxxx \ --discovery-token-ca-cert-hash sha256:xxxxxxxx
也可以使用该命令再次显示
kubeadm token create --print-join-command
如果安装异常重新 init 则执行
# kubectl drain 10.2.2.3 --delete-local-data --force --ignore-daemonsets # kubectl delete node 10.2.2.3 # iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X # kubeadm reset
安装完成后,执行,就可以正常使用 kubectl 啦
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config

此时还没安装网络插件,所以 coredns 是起不来的
0x02 安装网络插件
这里用 cillium,其他插件可见
# 挂上代理 wget https://raw.githubusercontent.com/cilium/cilium/v1.9/install/kubernetes/quick-install.yaml # 退出代理 kubectl create -f quick-install.yaml

稍等一会

通过 helm 装最新版本有问题,装完后会导致整个集群不断重启 - 希望大佬指导下
pacman -S helm
安装 cillium 作为网络插件
helm repo add cilium https://helm.cilium.io/ helm install cilium cilium/cilium --namespace=kube-system
此时 coredns 就正常了

0x04 knode1&2节点
pacman -S kubelet kubeadm containerd
即可
kubeadm join 10.2.2.3:6443 --token xxxxxxxxxxxx \ --discovery-token-ca-cert-hash sha256:xxxxxxxx
查看节点加入状态,如果为 Ready 就正常了
kubectl get nodes
需要等一会(
kubectl describe -nkube-system xxxx
镜像拉不下来可以给node节点挂个 openvpn 代理)
到此就安装完成啦