基于Wireguard异地组网部署K8s集群
前言
本次集群安装使用三台不同地方的服务器,所以使用使用wireguard组网是个不错的选择。你可以使用你熟悉的Linux系统来进行以下的安装操作,使用较新的版本。操作截图我尽可能把有必要的、精华的部分贴上。
1. 分别给三台服务器安装wireguard组网
安装wireguard需要内核版本4.9以上,三台服务器均使用Ubuntu22.04(内核为5.15版本)所有直接安装可以。
1.1 先更改一下默认主机名
# hostnamectl hostname master
# hostnamectl hostname node
1.2 安装软件和依赖:
# sudo apt install wireguard -y
# sudo apt-get install resolvconf -y
# sudo apt-get install iptables -y
1.3 开启ipv4转发:
# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# echo "net.ipv4.conf.all.proxy_arp = 1" >> /etc/sysctl.conf
# sysctl -p /etc/sysctl.conf
1.4 到/etc/wireguard/目录下生成私钥和公钥:
# wg genkey | tee privatekey | wg pubkey > publickey
ls一下可以看到分别生成一个私钥privatekey文件,一个公钥publickey文件
1.5 配置/etcwireguard/wg0.conf
# master
[Interface]
PrivateKey = 私钥
Address = 10.10.0.1
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 35331
DNS = 8.8.8.8
MTU = 1420
[Peer]
PublicKey = "node1"公钥
AllowedIPs = 10.10.0.2/32
EndPoint = 222.222.222.222:35332
[Peer]
PublicKey = "node2"公钥
AllowedIPs = 10.10.0.3/32
EndPoint = 333.333.333.333:35333
# node1
[Interface]
PrivateKey = 私钥
Address = 10.10.0.2
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 35332
DNS = 8.8.8.8
MTU = 1420
[Peer]
PublicKey = "master"公钥
AllowedIPs = 10.10.0.1/32
EndPoint = 111.111.111.111:35331
[Peer]
PublicKey = "node2"公钥
AllowedIPs = 10.10.0.3/32
EndPoint = 333.333.333.333:35333
# node2
[Interface]
PrivateKey = 私钥
Address = 10.10.0.3
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 35333
DNS = 8.8.8.8
MTU = 1420
[Peer]
PublicKey = "master1"公钥
AllowedIPs = 10.10.0.1/32
EndPoint = 111.111.111.111:35331
[Peer]
PublicKey = "node1"公钥
AllowedIPs = 10.10.0.2/32
EndPoint = 222.222.222.222:35332
请到安全组放行好对于的端口
1.6 启动wg0网卡并测试是否连通:
# wg-quick up wg0
# systemctl enable wg-quick@wg0
master:
node1:
node2:
如果测试不通,请仔细回望一下那步错了。
2. 安装容器运行时
使用containerd为容器运行时
2.1 安装containerd:
先到docker官网查对应系统,添加docker存储库使用apt安装
# sudo apt-get install -y containerd.io
# sudo mkdir -p /etc/containerd
# sudo containerd config default | sudo tee /etc/containerd/config.toml
# 创建配置文件
# sudo systemctl restart containerd
# sudo systemctl enable containerd
修改配置:
在/etc/containerd/conf.toml
2.2 安装crictl
# sudo wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.29.0/crictl-v1.29.0-linux-amd64.tar.gz
# sudo tar zxcf crictl-v1.29.0-linux-amd64.tar.gz -C /usr/local/bin
2.3 配置crictl
# sudo crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock
2.4 配置镜像加速
# 在/etc/containerd/config.toml中
# [plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
# 在/etc/containerd/certs.d/docker.io/ 下新建hosts.toml(mkdir -p)
# server = "https://registry-1.docker.io"
[host."https://xxxxxx.mirror.aliyuncs.com"]
capabilities = ["pull"] ##push、rsolve
# systemctl restart containerd
3. 安装k8s(kubeadm-kubeadm、kubelet、kubectl)
请设置好时间同步
3.1 禁用交换分区:
# swapoff -a
# 注释/etc/fstab中swap,或systemd.swap
# free -m 查看一下
3.2 转发 IPv4 并让 iptables 看到桥接流量
# 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/k8s.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
# 检查
# lsmod | grep br_netfilter
# lsmod | grep overlay
# sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
3.3 安装kubeadm、kubelet、kubectl
国内服务器可以进行以下操作或者到k8s官网的存储库:
# apt-get update && apt-get install -y apt-transport-https
# curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
# cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
# apt-get update -y
# apt-get install -y kubelet kubeadm kubectl
# 锁定版本
# apt-mark hold kubelet kubeadm kubectl
3.4 初始化集群
可以根据自己情况需要修改:
# kubeadm init --kubernetes-version=1.29.0 --control-plane-endpoint=10.10.0.1 --control-plane-endpoint=10.10.0.1 --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=Mem
"--ignore-preflight-errors=Mem"这个参数因为我在第一次初始化的时候内存警告少于1700m(只有1668m),直接终止安装,这个参数可以跳过因为我相差2m,并且这个只是测试环境,无伤大雅。
添加:
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 或者
# export KUBECONFIG=/etc/kubernetes/admin.conf
# kubectl get pods --all-namespaces 检查pod健康状态
3.5 加入集群
# sudo kubeadm token create --print-join-command
# 如果忘记,获取加入命令
# 在节点执行获取的加入命令
# 如果node加入失败可以先删除
# rm -rf /etc/kubernetes/*
# systemctl stop kubelet
# kubeadm reset
# 然后重新加入
internal-ip中IP如果不是内网IP请到图中的路径文件更改。
3.6 部署flanenl网络插件
# curl -OL https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 修改配置kube-flanenl.yml
接口为wg0
# kubectl apply -f kube-flannel.yml
# 等待拉取镜像并Ready状态
# 如果拉取不了镜像可通过另外一台导出然后导入或者从github中现在镜像tar
# 搜索要导出的包
# ctr -n k8s.io i ls | grep “镜像名称”
# 导出
# ctr -n k8s.io i export “导出的包名.tar” “镜像名称:版本号”
# 导入
# ctr -n k8s.io i import “包名.tar”
# crictl工具不能导出包导入包
如果部署有问题可以查看我上一篇文章看是否有帮助。
查看pod
ping测试:
- 测试集群
评论已关闭