记录一次公网搭建K8S
个人搭建环境配置
云:阿里云和腾讯云混合
机器:3台具备公网IP的Linux CentOS 7.6云服务器,主节点2C8G、从节点分别为1C2G和2C2G
Kubernetes版本:1.20.9
———————————————————————————————————
开始部署
注:部署过程中遇到的一些问题写在文章底部,如有错误的地方请评论指出,谢谢。
- 三台机器分别设置主机名
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2
-
三台机器分别修改/etc/hosts
[Public IP] master
[Public IP] node1
[Public IP] node2
重启后生效 -
三台机器分别开放端口
10250/10260 #TCP端口:给kube-schedule、kube-controll,kube-proxy、kubelet等使用
6443 #TCP端口:给kube-apiserver使用
2379 2380 2381 #TCP商品:ETCD使用
8472 #UDP端口,或干脆全开放,个人测试机
阿里云开放端口:
腾讯云开放端口:
-
三台机器分别配置系统环境
永久关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
永久关闭SELinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
永久关闭Swap
sed -ri 's/.*swap.*/#&/' /etc/fstab
安装、配置时间同步
yum install ntpdate -y
ntpdate time.windows
创建/etc/sysctl.d/k8s.conf配置文件,将桥接的 IPv4 流量传递到 iptables 的链
cat > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
- 三台机器分别yum下载安装配置相同版本的docker、kubectl、kubelet、kubeadm
下载docker源
wget https://mirrors.aliyun/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
添加kubernetes源
vi /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun/kubernetes/yum/doc/rpm-package-key.gpg
scp上面的两个yum源到所有的机器
scp /etc/yum.repos.d/docker-ce.repo [username]@[public-ip]:/etc/yum.repos.d/
scp /etc/yum.repos.d/kubernetes.repo [username]@[public-ip]:/etc/yum.repos.d/
没有带版本号,默认安装最新版,如果新版docker有问题,可以指定安装18.03.0-ce
yum -y install docker-ce
设置开机启动并启动
systemctl enable docker && systemctl start docker
查看Docker版本
docker --version
创建/etc/docker/daemon.json配置文件并指定镜像仓库
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs"]
}
EOF
重启docker生效
systemctl restart docker
下载1.20.9版本的kubectl、kubelet、kubeadm
yum install -y kubectl-1.20.9 kubeadm-1.20.9 kubelet-1.20.9
设置开机启动
systemctl enable kubelet
- 在主节点初始化集群
kubeadm init --image-repository=registry.aliyuncs/google_containers --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --kubernetes-version=v1.20.9 --apiserver-advertise-address=[master public ip]
当初始化集群中途会卡住,打开主节点的另外一个窗口
修改etcd的配置文件与下面的配置一致
vim /etc/kubernetes/manifests/etcd.yaml
--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
修改完毕后,等待3、4分钟集群初始化成功
- 初始化完毕后,获取kubectl config文件,使用kubectl访问集群
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
- 加入节点
将步骤6中输出的命令直接复制,然后在从节点上执行
上面这个命令24小时内有效,24小时过期后,需要执行下面这条命令重新生成join token
kubeadm token create --print-join-command --ttl=0
ttl=0的作用,该token永不失效。
- 安装flannel网络插件
kubectl apply -f https://gitee/www.freeclub/blog-images/raw/master/source/kube-flannel.yml
- 添加iptables流量转发
由于从节点的集群内部ip是无法访问的,可以尝试启动一个Pod, 执行kubectl exec -it [pod-name] -n [namespace-name] – bash 发现执行报错
kubectl get nodes -o wide, 查看集群从节点内部ip
将通向从节点内部ip的流量转发到从节点的公网ip,添加后访问正常。
iptables -t nat -A OUTPUT -d [internal-ip] -j DNAT --to-destination [public-ip]
master上做从节点的DANT, 从节点只用做本机的DANT。
master:
iptables -t nat -A OUTPUT -d [node1-internal-ip] -j DNAT --to-destination [node1-public-ip]
iptables -t nat -A OUTPUT -d [node2-internal-ip] -j DNAT --to-destination [node2-public-ip]
node1:
iptables -t nat -A OUTPUT -d [node1-internal-ip] -j DNAT --to-destination [node1-public-ip]
node2:
iptables -t nat -A OUTPUT -d [node2-internal-ip] -j DNAT --to-destination [node2-public-ip]
- 覆盖原有的flannel node IP 注解
步骤10执行完后,虽然可以通过kubectl exec进入pod内,但是在pod内部无法访问其它节点上的pod和外网(如果不同node之间可以通过内网访问则可以访问)。
具体原理可以通过这篇文章理解
kubectl annotate node master flannel.alpha.coreos/public-ip-overwrite=[master-public-ip] --overwrite
kubectl annotate node node1 flannel.alpha.coreos/public-ip-overwrite=[node1-public-ip] --overwrite
kubectl annotate node node2 flannel.alpha.coreos/public-ip-overwrite=[node2-public-ip] --overwrite
- 删除替换原有flannel Pod
kubectl -n kube-system get pod [kube-flannel] -o yaml | kubectl replace --force -f -
再次进入pod内部访问其它pod和外网,正常!NB!!!
—————————————————————————————————
问题记录
- 当部署过程中出现意外错误,需要重新部署,可以参考以下流程
移除从节点,主节点上执行
kubectl drain [node-name] --delete-local-data --force --ignore-daemonsets
kubectl delete node [node-name]
清理从节点上的kubernetes 数据,在从节点上执行
kubeadm reset
rm -rf /etc/kubernetes/*
rm -rf /etc/cni/net.d
ipvsadm --clear # 如果ipvsadm显示没有命令,通过yum install -y ipvsadm 安装
集群重置,主节点上执行
kubeadm reset
rm -rf /etc/kubernetes/*
rm -rf .kube/*
rm -rf /etc/cni/net.d
ipvsadm --clear
- 当没有驱逐节点上的Pod就直接删除node,或者集群由于意外原因导致暴力重启,会有部分Pod出现以下问题
这是因为集群内部指向的ip(10.244.5.1)与node节点的cni0网卡的ip不同,可以在node节点上执行ifconfig查看
通过删除cni0网卡,解决
ifconfig cni0 down
ip link delete cni0
删除网卡后会自动重启
更多推荐
公网搭建Kubernetes 1.20.9(阿里云+腾讯云)
发布评论