实验手册03-作业指南

本节任务:
- 分好小组
- 让小组内的集群运行起来
我们统一几个术语:
- Master节点统一叫 “主节点”
- Worker节点、Node节点统一叫 “从节点”
统一术语是为了使该实验手册的语言更加规范,同学们在更改主机名时,依然可以自由使用
master
、node1
等字眼
实践前检查
请先检查自己的环境是否正常
步骤1 检查 Docker 是否安装
docker ps
如果显示的结果是command not found
这类字眼,请参照《 实验手册02-部署集群-修正》中的“任务一”和“任务二”安装 Docker 和 K8S
实践步骤
任务一:配置防火墙,开放端口
Kubernetes 需要使用6443
和 10250
两个端口进行通信,我们先在防火墙里面将这两个端口的流量放行。执行以下两条命令:
firewall-cmd --zone=public --add-port=6443/tcp --permanent
firewall-cmd --zone=public --add-port=10250/tcp --permanent

记得刷新一下防火墙的配置,这样才能让我们刚刚添加的规则生效
firewall-cmd --reload

备注:我们在《云计算平台运维与管理》这门课中,曾经通过网页修改安全组规则,和这里修改防火墙规则的作用是一样的。
任务二:初始化主节点(主节点操作)
我们在上节课中,已经成功安装 Docker 和 Kubernetes 的相关软件包,并且通过下面这条命令从国内的阿里云节点下载了需要的镜像
kubeadm config images pull --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers
接下来我们可以初始化集群中的 Master 节点了,执行以下命令:
kubeadm init --apiserver-advertise-address 192.168.192.215 --pod-network-cidr 10.244.0.0/16 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers
命令注解:
--apiserver-advertise-address
指定使用哪个网络接口
与其他节点通信--pod-network-cidr
指定 Pod 的网络范围。第12章我们会详细解释这一部分--image-repository
指定镜像地址为国内的阿里云
上面这条命令,大概率是会失败的。
我们仔细看报错信息:

首先看到的是connect: connection refused
这一网络相关的报错
我们可能首先想到是防火墙、网络配置等问题,但是仔细看,报错中提到failed with error: Get "http://localhost:10248/healthz"
被拒绝的连接是本地
的,排除防火墙、网络配置问题。
我们继续往后看:

所以我们按照报错的提示,用这两条命令进行排错:
systemctl status kubelet
这条命令是查看kubelet
的运行状态,我们之前说过,kubelet
运行在k8s的所有节点上,负责管理Pod和容器,所以这是一个非常重要的服务。

我们可以看出,kubelet
这一服务没有启动,接下来我们使用刚才提到的第二条命令,这条命令是查看kubelet
相关的错误日志。
journalctl -xeu kubelet
这是一条交互式命令,我们可以使用键盘上的“上下左右”键移动显示的日志范围,如果想要退出交互,按键盘上的q
键

提示1:我们在看错误日志时,需要快速浏览是不是包含
error
、failed
这种字眼,有价值的信息一般都在它们附近提示2:很多命令的退出都是按
q
键,比如vim。为什么呢?因为q
是 quit(退出)的缩写思考:为什么 vim、fdisk 这类工具,保存需要按
w
键?
报错日志里面说:
"Failed to run kubelet" err="failed to run Kubelet: running with swap on is not supported, please disable swap!
翻译一下:不支持在运行时启用Swap,请禁用Swap!
前面提到过,Swap 相当于 Windows的虚拟内存,Kubernetes 要求运行时关闭 Swap。
任务三:关闭 Swap 分区(所有节点操作)
接下来我们关闭 Swap,执行以下命令进行临时关闭:
swapoff -a
命令注解:
-a
是all
的缩写,意思是关闭所有Swap分区(我们的系统中只有一个)
接下来修改/etc/fstab
文件永久关闭 Swap
vim /etc/fstab
我们找到包含swap
字样的行,将它删除或者注释掉

到这里我们就彻底关闭 Swap 了,现在我们继续刚才的步骤,初始化 k8s 的 Master 节点
任务四:重新初始化主节点(主节点操作)
先重置一下:
kubeadm reset
初始化,和之前的命令一样:
kubeadm init --apiserver-advertise-address 192.168.192.215 --pod-network-cidr 10.244.0.0/16 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers

作业要求:
运行 Master 节点的同学,保留该图片。同上次保存的图片一起,提交作业。
我们看一下命令执行后的提示都包含哪些内容:
Your Kubernetes control-plane has initialized successfully!
## 如果我们使用普通用户操作Cluster,需要执行下面3条命令
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
## 或者,如果我们使用root用户操作,执行下面一条命令
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
## 现在我们需要给集群安装 Pod 网络
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
## 安装网络之后,我们将其他节点加入到集群
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.192.215:6443 --token 5pubgw.63rjjppg53u8id7z \
--discovery-token-ca-cert-hash sha256:3436e25dc3240ad6ad5afd7e1be3e2b97f357c2a95e35b32084c3cd73535582d
这里我们直接使用root用户,所以先执行以下两条命令:
export KUBECONFIG=/etc/kubernetes/admin.conf
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bashrc
思考:提示里面说执行第1条命令,我们为什么加上第2条?
任务五:安装 Pod 网络(主节点)
Kubernetes 支持多种网络方案,我们会在第12章进行详细地学习,今天这节我们先使用 flannel 方案
我们将 kube-flannel.yml
和 flannel.v0.22.2.tar
两个文件传到 Master 节点上
使用 XShell 附带的 XFtp 工具进行上传,参考刚才老师的演示
遇到问题请及时沟通
其中 flannel.v0.22.2.tar
是一个 Docker 的镜像文件,我们把它导入到 Docker:
docker load < ./flannel.v0.22.2.tar

我们需要给导入的镜像打一下标签,这样才能被 kube-flannel.yml
这个配置文件识别到
先查看一下刚才导入的镜像的ID:
docker image ls

给镜像打标签:
docker tag d73868a08083 docker.io/flannel/flannel:v0.22.2
命令注解:
d73868a08083
是上一步,查看到的镜像ID
打好标签之后,再查看镜像会是如下的显示:

部署 Flannel
kubectl apply -f ./kube-flannel.yml
如下图显示,代表部署成功

我们再检查一下:
kubectl get pods -A

任务六:小组内同学加入集群
步骤1 先在 Master 节点上执行以下命令,这条命令会返回加入集群所需的 Token
kubeadm token list

步骤2 所有 node 节点,都执行以下命令,加入集群:

这条命令去哪里找?
在《任务四:重新初始化Master节点》中,我们执行完 kubeadm init .....
命令后,会得到以下的提示,其中最后两行就是加入集群的命令。

如果找不到也没关系,我们执行以下命令,它会告诉我们加入集群的命令是什么
kubeadm token create --print-join-command

我们复制出来它提供的命令,在所有 node 节点执行。
出现以下提示,代表加入成功:

作业要求:
运行从节点的同学,保留该图片。和上次的图片一起,提交作业。
我们回到主节点,再次验证一下节点是不是成功加入集群了:
kubectl get nodes

附注
以下操作仅为学生需要了解的内容,不必操作
如果想要删除某个节点,先在主节点上将要删除的节点设置为维护模式:
kubectl drain k8s-node1 --delete-local-data --force --ignore-daemonsets
- k8s-node1 替换为你要删除的节点
删除节点:
kubectl delete node k8s-node1

接下来,在被删除的节点上执行以下命令,使节点从集群中完全脱离出来
kubeadm reset
