云服务器、公网搭建k8s集群问题解决思路

都是个人实验测试,仅供参考。基于两台云服务器,内网无法互相ping通,主要是问题展示、解决,省略了其他环境准备、安装步骤

集群初始化

准备两个命令窗口,初始化指令参考

kubeadm init 
	--kubernetes-version=v1.17.4    #版本
    --pod-network-cidr=10.244.0.0/16   # pod 子网
    --service-cidr=10.96.0.0/12      #Service子网
    --image-repository=registry.aliyuncs.com/google_containers 
    --apiserver-advertise-address=xxxxxx  #公网ip

最终在这里会卡住 当检测到有 etcd.yaml 生成时,立即在另一个窗口编辑修改

vim /etc/kubernetes/manifests/etcd.yaml

如下

# 也就是将多余的公网ip删除,将公网ip改为127
    - --listen-client-urls=https://127.0.0.1:2379
    - --listen-metrics-urls=http://127.0.0.1:2381
    - --listen-peer-urls=https://127.0.0.1:2380

k8s集群初始化成功,执行 kubeadm join ...即可加入节点 若失败可以执行 kubeadm reset重置,再重复以上步骤

网络不通问题

问题:访问 pod ip 超时,执行logs、exec命令超时

解决:安装flannel后,会自动生成 public-ip 注解,但是默认为服务器内网ip,只要手动将其修改为公网ip即可解决,但这样每次重启服务器会失效,所以通过下面的命令增加 public-ip-overwrite 注解,每次重启时 flannel 会自动对 public-ip 实现自动修改

查看node1的 public-ip 注解

kubectl edit node node1-name

对所有node添加public-ip-overwrite 注解

#flannel会自动根据这个注解实现对public-ip的修改
kubectl annotate node node1-name flannel.alpha.coreos.com/public-ip-overwrite=node1-公网ip --overwrite

kubectl annotate node node2-name flannel.alpha.coreos.com/public-ip-overwrite=node2-公网ip --overwrite

#重启服务器,使生效
reboot

iptables.sh 脚本内容,建议对每台服务器都执行:

#!/bin/bash
iptables -t nat -A OUTPUT -d node1-内网ip  -j DNAT --to-destination node1-公网ip
iptables -t nat -A OUTPUT -d node2-内网ip  -j DNAT --to-destination node2-公网ip

iptables配置后,服务器重启就会失效,可以将其加入开机启动。

vim /etc/rc.d/rc.local`

# 以root用户执行脚本
su - root -c cd /root/boot-shells/ && sh iptables.sh

授权,重启

#授予 rc.local 执行权限
chmod +x /etc/rc.d/rc.local

#重启服务器,使生效
reboot
经验分享 程序员 微信小程序 职场和发展