公网搭建Kubernetes 1.20.9(阿里云+腾讯云)

记录一次公网搭建K8S

个人搭建环境配置

云:阿里云和腾讯云混合
机器:3台具备公网IP的Linux CentOS 7.6云服务器,主节点2C8G、从节点分别为1C2G和2C2G
Kubernetes版本:1.20.9

———————————————————————————————————

开始部署

注:部署过程中遇到的一些问题写在文章底部,如有错误的地方请评论指出,谢谢。

  1. 三台机器分别设置主机名
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2
  1. 三台机器分别修改/etc/hosts
    [Public IP] master
    [Public IP] node1
    [Public IP] node2
    重启后生效

  2. 三台机器分别开放端口
    10250/10260 #TCP端口:给kube-schedule、kube-controll,kube-proxy、kubelet等使用
    6443 #TCP端口:给kube-apiserver使用
    2379 2380 2381 #TCP商品:ETCD使用
    8472 #UDP端口,或干脆全开放,个人测试机
    阿里云开放端口:
    在这里插入图片描述
    在这里插入图片描述
    腾讯云开放端口:
    在这里插入图片描述
    在这里插入图片描述

  3. 三台机器分别配置系统环境
    永久关闭防火墙

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.com

创建/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

  1. 三台机器分别yum下载安装配置相同版本的docker、kubectl、kubelet、kubeadm
    下载docker源
wget https://mirrors.aliyun.com/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.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/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.com"] 
}
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
  1. 在主节点初始化集群
kubeadm init --image-repository=registry.aliyuncs.com/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分钟集群初始化成功

  1. 初始化完毕后,获取kubectl config文件,使用kubectl访问集群
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
  1. 加入节点
    将步骤6中输出的命令直接复制,然后在从节点上执行
    在这里插入图片描述
    上面这个命令24小时内有效,24小时过期后,需要执行下面这条命令重新生成join token
kubeadm token create --print-join-command --ttl=0

ttl=0的作用,该token永不失效。

  1. 安装flannel网络插件
kubectl apply -f https://gitee.com/www.freeclub.com/blog-images/raw/master/source/kube-flannel.yml
  1. 添加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]
  1. 覆盖原有的flannel node IP 注解
    步骤10执行完后,虽然可以通过kubectl exec进入pod内,但是在pod内部无法访问其它节点上的pod和外网(如果不同node之间可以通过内网访问则可以访问)。
    具体原理可以通过这篇文章理解
kubectl annotate node master flannel.alpha.coreos.com/public-ip-overwrite=[master-public-ip] --overwrite
kubectl annotate node node1 flannel.alpha.coreos.com/public-ip-overwrite=[node1-public-ip] --overwrite
kubectl annotate node node2 flannel.alpha.coreos.com/public-ip-overwrite=[node2-public-ip] --overwrite
  1. 删除替换原有flannel Pod
kubectl -n kube-system get pod [kube-flannel] -o yaml | kubectl replace --force -f -
再次进入pod内部访问其它pod和外网,正常!NB!!!

—————————————————————————————————

问题记录

  1. 当部署过程中出现意外错误,需要重新部署,可以参考以下流程
    移除从节点,主节点上执行
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
  1. 当没有驱逐节点上的Pod就直接删除node,或者集群由于意外原因导致暴力重启,会有部分Pod出现以下问题

这是因为集群内部指向的ip(10.244.5.1)与node节点的cni0网卡的ip不同,可以在node节点上执行ifconfig查看
通过删除cni0网卡,解决

ifconfig cni0 down    
ip link delete cni0

删除网卡后会自动重启

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值