第一章、写在后面的阐明
本文具体记录我应用kubeadm的形式,在Ubuntu20.04环境下搭建一个k8s三机集群的过程。在《Kubernetes in Action中文版》一书中,作者提到了三种搭建k8s集群的形式:

  1. Minikube
  2. 应用GKE(Google Kubernetes Engine)托管服务
  3. 应用kubeadm工具

其中(1)学习参考,理论工作意义不大,(2)不符合实际网络情况,也就只剩下(3)这一条路了。
这里我次要参考了Gemfield在知乎上的文章:https://zhuanlan.zhihu.com/p/...
其实这篇文章已几近完满,无奈自己迟钝,又初学k8s,踩坑三、五处,故将部署过程做此记录,一并记录下其间参考的其它文章,作为本人向云原生迈出的第一步。
须要指出的是,有些步骤我尽管执行胜利,但其原理或作用仍旧只知其一;不知其二或齐全不解,故也无奈给出更具体的阐明,还请各位看官体谅。
还有,因为k8s集群部署过程中,很多状况下须要联网下载组件,这对你所在网络提出两个根本要求:
一、 速度快(下得快、省时)
二、 跨度远(下得来、省心)
对于第一点的解决方案是更换Ubuntu的apt源,比方阿里源、163源等,对于第二点的解决方案是多学习,多实际(你看人家王七,那也是学过两招儿的……)。
本章首先阐明我的k8s集群的部署环境。
1.1 环境阐明表
环境阐明表:
表 1-1 环境阐明表

宿主机环境
OSWindows 10 家庭中文版 64 位
虚机软件VirtualBox 6.1
虚机环境(须要为虚机配置2颗CPU)
k8s-005OS:Ubuntu 20.04.3 LTS
角色:master
IP:192.168.56.130
k8s-006OS:Ubuntu 20.04.3 LTS
角色:worker
IP:192.168.56.131
k8s-007OS:Ubuntu 20.04.3 LTS
角色:worker
IP:192.168.56.132

第二章、部署过程
2.1 部署筹备工作
2.1.1 敞开swap分区
执行:sudo swapoff -a
验证:free -m
如图:

2.1.2 确保时区、工夫正确
执行:sudo timedatectl
如图:

2.1.3 确保虚机不会主动suspend
执行:sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
如图:

2.1.4 加载内核模块br_netfilter,并调整参数
执行:sudo modprobe br_netfilter
确认已加载:lsmod | grep br_netfilter
调整内核参数,创立k8s.conf,如下:
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
使配置失效,执行:sudo sysctl --system
如图:

2.1.5 设置rp_filter的值
执行:sudo vi /etc/sysctl.d/10-network-security.conf
将文件中如下两个参数的值从2批改为1
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1
如图:

使配置失效,执行:sudo sysctl --system

2.2 部署外围组件
2.2.1 装置docker
2.2.1.1 装置docker
装置docker,执行:sudo apt update && sudo apt install -y docker.io
如图:

查看状态,执行:sudo systemctl status docker
如图:

2.2.1.2 调整cgroups的驱动
装置后默认cgroups驱动应用cgroupfs ,须要调整为systemd,因而,编辑docker配置文件,执行:sudo vi /etc/docker/daemon.json
增加如下内容:
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
重启docker,执行:sudo systemctl daemon-reload && sudo systemctl restart docker
查看以后cgroups驱动,执行:sudo docker info | grep -i cgroup
如图:

阐明:依据我重复尝试部署的狭窄教训,如果这里不调整cgroups驱动类型,前面启动kubelet会失败的。

2.2.2 装置k8s组件
2.2.2.1 装置k8s组件前的筹备
执行:sudo apt-get update && sudo apt-get install -y ca-certificates curl software-properties-common apt-transport-https

2.2.2.2 增加k8s源
增加k8s源,执行:
curl -s https://mirrors.aliyun.com/ku... | sudo apt-key add -
sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF
deb https://mirrors.aliyun.com/ku... kubernetes-xenial main
EOF
如图:

2.2.2.3 装置k8s组件
执行:sudo apt-get update && sudo apt-get install -y kubelet kubeadm kubectl && sudo apt-mark hold kubelet kubeadm kubectl
如图:

2.3 初始化master节点
2.3.1 初始化master节点
执行:
sudo kubeadm init --pod-network-cidr 172.16.0.0/16 \
--apiserver-advertise-address=192.168.56.130 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers
阐明:
一、 这个命令的NB之处在于,指定了aliyun的registry服务,一下子让整个世界都顺滑了……(这里我是认真的,当你体验过一周甚至更长时间的、生不如死的、如便秘早期个别的顿挫感后,你对Gemfield、阿里、顺滑、甚至整个世界都会怀有一颗感恩的心……)
二、 应用了非默认的CIDR,肯定要和宿主机的局域网的CIDR不一样!(Gemfield如是说,我也不是非常了解,但我确保172.16.0.0/16这个网段在我环境里的唯一性)
三、 如果你的虚机是双网卡(个别都是这样的,一块NAT,一块Host-Only),肯定要指定--apiserver-advertise-address地址为Host-Only网卡地址(virtualbox虚机通常是192.168.xxx.xxx),否则前面join的时候就白瞎了。
四、 这个init的过程很慢,因为要拉取7个镜像,且在拉取的过程中控制台没有任何输入,如同僵死了,如图:

所以最好在另一个窗口中用ifstat工具实时观测下网卡速率,以求心安。如图:

五、 拉取实现后,执行:sudo docker images 查看拉取后果,如图:

六、 执行init胜利后,记录下以“kubeadm join”结尾的最初两行,如图:

七、 如果您初始化失败,须要从新执行一次初始化动作的话,请在上述命令“sudo kubeadm init …”中减少一个参数:--ignore-preflight-errors=all

2.3.2 初始化后置动作
顺次执行:

  1. mkdir -p $HOME/.kube
  2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. sudo chown $(id -u):$(id -g) $HOME/.kube/config

2.3.3 启用Flannel网络计划
此时执行kubectl get nodes 和 kubectl get pods --all-namespaces会看到一些not ready的状况,如图:

接下来启用Flannel网络计划。
一、 下载Flannel的yml文件,执行:
wget https://raw.githubusercontent...
二、 批改yml文件,执行:vi kube-flannel.yml,找到行“--kube-subnet-mgr”,在其下减少一行“- --iface=enp0s8”(用你的理论网卡名替换enp0s8),如图:

三、 启用Flannel网络,执行:kubectl apply -f ./kube-flannel.yml ,执行胜利后,稍等3、5分钟,再次执行kubectl get nodes 和 kubectl get pods --all-namespaces,会看到状态失常了,如图:

至此,整个部署工作获得了阶段性胜利,您曾经实现了master节点的部署工作,上面持续部署worker节点。

2.4 退出worker节点
2.4.1 部署worker节点的前置动作
在所有worker节点上执行3.1和3.2大节的步骤。

2.4.2 退出worker节点
在每个worker节点上,执行初始化master胜利后,最初输入的命令,如图:

舒适提醒:别忘了在命令前加上“sudo”啊~

2.4.3 调整worker节点配置
依然是因为虚机双网卡的问题,须要调整worker节点的配置,执行:
sudo vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
增加如下一行:
Environment="KUBELET_EXTRA_ARGS=--node-ip=192.168.56.131"
留神,将“192.168.56.131”替换为你本人虚机的Host-Only网卡地址
如图:

重启kubelet,执行:
sudo systemctl daemon-reload && sudo systemctl restart kubelet.service

2.4.4 查看worker节点状态
在join了worker节点后,大概2、3分钟后,在master上执行:kubectl get nodes , 如图:

能够看到STATUS为Ready,然而ROLES为<none>,为批改节点ROLES,在master上执行:kubectl label node k8s-006 node-role.kubernetes.io/worker=worker , 留神将k8s-006替换为你理论的节点名称,而后再次执行:kubectl get nodes , 一切正常,如图:

好了,反复3.4大节,增加更多worker节点吧~
又至,在您增加了至多两个worker节点后,一个k8s集群就算真正搭建胜利了。

第三章、参考文章和最初
以下是次要参考文章列表:
一、 https://zhuanlan.zhihu.com/p/...
二、 https://www.cnblogs.com/cocow...
三、 https://www.jianshu.com/p/8e7...
四、 https://blog.csdn.net/qq_4315...
五、 https://blog.csdn.net/weixin_...
六、 https://segmentfault.com/a/11...
七、 https://www.jianshu.com/p/fd9...
八、 更多……

最初,如果您正在浏览或筹备开始浏览《Kubernetes in Action中文版》,能够怀着一颗敬畏的心启程了。
祝顺利……