实验手册03-作业指南

本节任务:

  1. 分好小组
  2. 让小组内的集群运行起来

我们统一几个术语:

  • Master节点统一叫 “主节点”
  • Worker节点、Node节点统一叫 “从节点”

统一术语是为了使该实验手册的语言更加规范,同学们在更改主机名时,依然可以自由使用masternode1等字眼

请先检查自己的环境是否正常

步骤1 检查 Docker 是否安装

bash

docker ps

如果显示的结果是command not found这类字眼,请参照《 实验手册02-部署集群-修正》中的“任务一”和“任务二”安装 Docker 和 K8S

Kubernetes 需要使用644310250两个端口进行通信,我们先在防火墙里面将这两个端口的流量放行。执行以下两条命令:

bash

firewall-cmd --zone=public --add-port=6443/tcp --permanent
firewall-cmd --zone=public --add-port=10250/tcp --permanent
修改防火墙配置

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

bash

firewall-cmd --reload
刷新防火墙配置

备注:我们在《云计算平台运维与管理》这门课中,曾经通过网页修改安全组规则,和这里修改防火墙规则的作用是一样的。

我们在上节课中,已经成功安装 Docker 和 Kubernetes 的相关软件包,并且通过下面这条命令从国内的阿里云节点下载了需要的镜像

bash

kubeadm config images pull --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers

接下来我们可以初始化集群中的 Master 节点了,执行以下命令:

bash

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指定镜像地址为国内的阿里云

上面这条命令,大概率是会失败的。

我们仔细看报错信息:

报错片段-01

首先看到的是connect: connection refused这一网络相关的报错

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

我们继续往后看:

报错片段-02

所以我们按照报错的提示,用这两条命令进行排错:

bash

systemctl status kubelet

这条命令是查看kubelet的运行状态,我们之前说过,kubelet运行在k8s的所有节点上,负责管理Pod和容器,所以这是一个非常重要的服务。

kubelet服务的状态

我们可以看出,kubelet这一服务没有启动,接下来我们使用刚才提到的第二条命令,这条命令是查看kubelet相关的错误日志。

bash

journalctl -xeu kubelet

这是一条交互式命令,我们可以使用键盘上的“上下左右”键移动显示的日志范围,如果想要退出交互,按键盘上的q

kubelet的报错日志

提示1:我们在看错误日志时,需要快速浏览是不是包含errorfailed这种字眼,有价值的信息一般都在它们附近

提示2:很多命令的退出都是按q键,比如vim。为什么呢?因为q 是 quit(退出)的缩写

思考:为什么 vim、fdisk 这类工具,保存需要按w键?

报错日志里面说:

text

"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,执行以下命令进行临时关闭:

bash

swapoff -a

命令注解:

  • -aall的缩写,意思是关闭所有Swap分区(我们的系统中只有一个)

接下来修改/etc/fstab文件永久关闭 Swap

bash

vim /etc/fstab

我们找到包含swap字样的行,将它删除或者注释掉

/etc/fstab

到这里我们就彻底关闭 Swap 了,现在我们继续刚才的步骤,初始化 k8s 的 Master 节点

先重置一下:

bash

kubeadm reset

初始化,和之前的命令一样:

bash

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

作业要求:

运行 Master 节点的同学,保留该图片。同上次保存的图片一起,提交作业。

我们看一下命令执行后的提示都包含哪些内容:

bash

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用户,所以先执行以下两条命令:

bash

export KUBECONFIG=/etc/kubernetes/admin.conf
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bashrc

思考:提示里面说执行第1条命令,我们为什么加上第2条?

Kubernetes 支持多种网络方案,我们会在第12章进行详细地学习,今天这节我们先使用 flannel 方案

我们将 kube-flannel.ymlflannel.v0.22.2.tar 两个文件传到 Master 节点上

使用 XShell 附带的 XFtp 工具进行上传,参考刚才老师的演示

遇到问题请及时沟通

其中 flannel.v0.22.2.tar 是一个 Docker 的镜像文件,我们把它导入到 Docker:

bash

docker load < ./flannel.v0.22.2.tar
导入Flannel镜像

我们需要给导入的镜像打一下标签,这样才能被 kube-flannel.yml 这个配置文件识别到

先查看一下刚才导入的镜像的ID:

bash

docker image ls
镜像ID

给镜像打标签:

bash

docker tag d73868a08083 docker.io/flannel/flannel:v0.22.2

命令注解:

  • d73868a08083是上一步,查看到的镜像ID

打好标签之后,再查看镜像会是如下的显示:

给镜像打标签

部署 Flannel

bash

kubectl apply -f ./kube-flannel.yml

如下图显示,代表部署成功

部署Flannel

我们再检查一下:

bash

kubectl get pods -A
查看Pods列表

步骤1 先在 Master 节点上执行以下命令,这条命令会返回加入集群所需的 Token

bash

kubeadm token list
查看Token

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

加入集群的命令

这条命令去哪里找?

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

初始化Master

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

bash

kubeadm token create --print-join-command
命令提示

我们复制出来它提供的命令,在所有 node 节点执行。

出现以下提示,代表加入成功:

加入集群成功

作业要求:

运行从节点的同学,保留该图片。和上次的图片一起,提交作业。

我们回到主节点,再次验证一下节点是不是成功加入集群了:

bash

kubectl get nodes
集群节点

以下操作仅为学生需要了解的内容,不必操作

如果想要删除某个节点,先在主节点上将要删除的节点设置为维护模式:

bash

kubectl drain k8s-node1 --delete-local-data --force --ignore-daemonsets
  • k8s-node1 替换为你要删除的节点

删除节点:

bash

kubectl delete node  k8s-node1
删除节点

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

bash

kubeadm reset
kubeadm reset