实验手册04-Deployment

实验内容
本节我们了解一下 K8S 的其中一个 Controller: Deployment
实验前检查
检查一下我们的集群是不是正常运行着,在主节点上运行:
kubectl get nodes
能看到所有节点的状态都为READY
,如果有问题的话,可以参考上一节的实验手册,将节点删除后重新添加。

实践步骤
任务一:运行 Deployment(主节点)
创建一个配置文件,名为 nginx.yaml
,文件内容为:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: web_server
template:
metadata:
labels:
app: web_server
spec:
containers:
- name: nginx
image: nginx:1.7.9
文件注解:
apiVersion: apps/v1 # 当前配置格式的版本
kind: Deployment # 要创建的资源类型,我们今天的任务是 Deployment
metadata: # 该资源的元数据,其中`name`是必需的
name: nginx-deployment
spec: # 该 Deployment 的规格说明
replicas: 2 # 副本数量,默认是1
template: # 定义 pod 模板,重要
metadata: # pod 的元数据,至少包含一个 label
labels:
app: web_server
spec: # pod 的规格,name 和 image 是必需的
containers:
- name: nginx
image: nginx:1.7.9
我们应用一下这个文件,执行以下命令
kubectl apply -f nginx.yaml
如下图所示,部署成功

我们查看一下 pod 是不是创建成功了,执行以下命令
kubectl get pod -o wide
命令注解:
-o
是output
意思,即显示的效果,大家可以去掉这个参数看看是什么样子的
我们可以看到创建了两个 pod,状态均为“正在创建”

创建过程可能需要一点时间,因为需要从国外的服务器下载一些镜像,下载完成后,再次执行kubectl get pod -o wide
,可以看到下面的结果:

其中 NODE 表示该 pod 运行在哪个节点上
任务二:伸缩(主节点)
我们在《云计算平台运维与管理》这门课中,曾经学习过华为云的弹性伸缩服务,它包含两个能力,分别是:调整云服务器数量、调整带宽速率。
在K8S中,伸缩是指“增加或减少 Pod 的副本数量。
我们在上面的 nginx.yaml
文件中,曾经指明需要两个副本:

步骤1 修改这个配置文件,将副本数量改成5,然后再执行刚才的命令,即:
kubectl apply -f nginx.yaml
步骤2 查看一下 pod 的状态:
kubectl get pod -o wide
我们可以发现,有三个新 pod 正在被创建了

步骤3 接下来,大家再次修改刚才的配置文件,将副本数量改成3
vim nginx.yaml

步骤4 然后应用一下文件:
kubectl apply -f nginx.yaml
步骤5 我们再看一下状态:
可以发现,还剩余四个 pod,其中一个正在被“终结”,最后会只剩下3个 pod
任务三:故障模拟
我们前面说过,Controller 是章鱼的大脑,监视、管理整个集群的状态,如果有一个节点发生故障的话,它会做什么?
举个例子,我们刚才的步骤5,剩下3个 pod,其中有两个是在 k8s-node2 上面的,如果 k8s-node2 宕机的话,章鱼的大脑会做什么?我们一起来看一下。
步骤1 在 k8s-node2 节点上执行以下操作,模拟非正常宕机:(同学们自己挑一个看起来不太顺眼的节点,执行下面的操作)
halt -h
步骤2 回到主节点,执行下列命令,看看节点的状况
kubectl get nodes

步骤3 稍等片刻后,我们重新启动刚才关机的节点。等节点正常启动后,在主节点上查看 pod 状态
kubectl get pods -o wide

我们可以看到有两个 pod 的状态为 unknown(未知状态)
再过一段时间,k8s 会重启运行状态异常的 pod
任务四:控制 pod 的位置
默认情况下,pod 会被分散到所有节点上
接下来我们通过 label 来控制 pod 分配到哪个节点上,
步骤1 将上个任务中创建的资源删除(主节点操作)
kubectl delete deployment nginx-deployment
kubectl delete pods nginx-deployment-cbfcf5654-cbzb8 nginx-deployment-cbfcf5654-fwsbc nginx-deployment-cbfcf5654-ztklw
第2行命令中,大长串的 pod 名,要换成你自己的。这个名字可以用
kubectl get pods
命令查看
非常有可能的情况是,同学们在执行完第一行命令后,就已经看不到 pods 了,因为默认情况下,当我们删除 deployment 时,k8s 会附带删除对应的 pods
步骤2 给 k8s-node1 打一个标签(同学们可以自由选择一个节点)
kubectl label node k8s-node1 star=five

一个标签包含两个部分:star=five
等号左边是标签名,右边是标签值
步骤3 查看节点的标签
kubectl get nodes --show-labels
步骤4 修改 nginx.yaml 配置文件,如下图所示
步骤5 应用配置文件
kubectl apply -f nginx.yaml
步骤6 查看 pod 状态
kubelet get pods -o wide
我们可以看到所有 pod 都分配给了 k8s-node1
步骤7 接下来我们删除节点的标签
kubectl label node k8s-node1 star-
star- 即 标签名加一个减号
在配置文件中删除 nodeSelector
的内容(最后两行)
步骤8 重新应用配置文件,观察结果(Pods分配到哪些节点上了)
kubectl apply -f nginx -o wide
步骤9 验证(主节点)
kubectl get pods