3

第一章、写在前面的说明
本文详细记录我使用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集群部署过程中,很多情况下需要联网下载组件,这对你所在网络提出两个基本要求:

  1. 速度快(下得快、省时)
  2. 跨度远(下得来、省心)

对于第一点的解决方案是更换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.1

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

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

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

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
如图:
2.1.5
使配置生效,执行:sudo sysctl --system

2.2 部署核心组件
2.2.1 安装docker
2.2.1.1 安装docker
安装docker,执行:sudo apt update && sudo apt install -y docker.io
如图:
2.2.1.1-1
查看状态,执行:sudo systemctl status docker
如图:
2.2.1.1-2

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
如图:
2.2.1.2

说明:根据我反复尝试部署的狭隘经验,如果这里不调整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/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF 
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

如图:
2.2.2.2

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

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
说明:

  1. 这个命令的NB之处在于,指定了aliyun的registry服务,一下子让整个世界都顺滑了……(这里我是认真的,当你体验过一周甚至更长时间的、生不如死的、如便秘晚期一般的顿挫感后,你对Gemfield、阿里、顺滑、甚至整个世界都会怀有一颗感恩的心……)
  2. 使用了非默认的CIDR,一定要和宿主机的局域网的CIDR不一样!(Gemfield如是说,我也不是十分理解,但我确保172.16.0.0/16这个网段在我环境里的唯一性)
  3. 如果你的虚机是双网卡(一般都是这样的,一块NAT,一块Host-Only),一定要指定--apiserver-advertise-address地址为Host-Only网卡地址(virtualbox虚机通常是192.168.xxx.xxx),否则后面join的时候就白瞎了。
  4. 这个init的过程很慢,因为要拉取7个镜像,且在拉取的过程中控制台没有任何输出,容易造成程序已僵死的错觉,如图:
    init
    所以最好在另一个窗口中用ifstat工具实时观测下网卡速率,以求心安。如图:
    ifstat
  5. 拉取完成后,执行:sudo docker images 查看拉取结果,如图:
    images
  6. 执行init成功后,记录下以“kubeadm join”开头的最后两行,如图:
    init-fin
  7. 如果您初始化失败,需要重新执行一次初始化动作的话,请在上述命令“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-1
接下来启用Flannel网络方案。

  1. 下载Flannel的yml文件,执行:
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  1. 修改yml文件,执行:
    vi kube-flannel.yml,找到行“--kube-subnet-mgr”,在其下增加如下一行:
    “- --iface=enp0s8”(用你的实际网卡名替换enp0s8),如图:
    flannel-2
  2. 启用Flannel网络,执行:
    kubectl apply -f ./kube-flannel.yml ,执行成功后,稍等3、5分钟,再次执行kubectl get nodes 和 kubectl get pods --all-namespaces,会看到状态正常了,如图:
    flannel-3

至此,整个部署工作取得了阶段性胜利,您已经完成了master节点的部署工作,下面继续部署worker节点。

2.4 加入worker节点
2.4.1 部署worker节点的前置动作
请在所有worker节点上执行2.1《部署准备工作》和2.2《部署核心组件》两个小节的步骤。

2.4.2 加入worker节点
在每个worker节点上,执行初始化master成功后,最后输出的命令,如图:
2.4.2
温馨提示:别忘了在命令前加上“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网卡地址
如图:
2.4.3
重启kubelet,执行:
sudo systemctl daemon-reload && sudo systemctl restart kubelet.service

2.4.4 检查worker节点状态
在join了worker节点后,大约2、3分钟后(也可能10来分钟),在master上执行:kubectl get nodes , 如图:
2.4.4-1
可以看到STATUS为Ready,但是ROLES为<none>,为修改节点ROLES,在master上执行:kubectl label node k8s-006 node-role.kubernetes.io/worker=worker , 注意将k8s-006替换为你实际的节点名称,然后再次执行:kubectl get nodes , 一切正常,如图:
2.4.4-2
好了,重复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中文版》,可以怀着一颗敬畏的心启程了。
祝顺利……


韩山己几
12 声望1 粉丝