实验手册04-Deployment

本节我们了解一下 K8S 的其中一个 Controller: Deployment

检查一下我们的集群是不是正常运行着,在主节点上运行:

bash

kubectl get nodes

能看到所有节点的状态都为READY,如果有问题的话,可以参考上一节的实验手册,将节点删除后重新添加。

节点列表

创建一个配置文件,名为 nginx.yaml,文件内容为:

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

文件注解:

yaml

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

我们应用一下这个文件,执行以下命令

bash

kubectl apply -f nginx.yaml

如下图所示,部署成功

kubectl apply

我们查看一下 pod 是不是创建成功了,执行以下命令

bash

kubectl get pod -o wide

命令注解:

  • -ooutput 意思,即显示的效果,大家可以去掉这个参数看看是什么样子的

我们可以看到创建了两个 pod,状态均为“正在创建”

创建 container 中

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

pod状态

其中 NODE 表示该 pod 运行在哪个节点上

我们在《云计算平台运维与管理》这门课中,曾经学习过华为云的弹性伸缩服务,它包含两个能力,分别是:调整云服务器数量、调整带宽速率。

在K8S中,伸缩是指“增加或减少 Pod 的副本数量。

我们在上面的 nginx.yaml 文件中,曾经指明需要两个副本:

副本数量为2

步骤1 修改这个配置文件,将副本数量改成5,然后再执行刚才的命令,即:

bash

kubectl apply -f nginx.yaml

步骤2 查看一下 pod 的状态:

bash

kubectl get pod -o wide

我们可以发现,有三个新 pod 正在被创建了

创建了3个新pod

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

bash

vim nginx.yaml
副本数量改成3

步骤4 然后应用一下文件:

bash

kubectl apply -f nginx.yaml

步骤5 我们再看一下状态:

可以发现,还剩余四个 pod,其中一个正在被“终结”,最后会只剩下3个 pod

我们前面说过,Controller 是章鱼的大脑,监视、管理整个集群的状态,如果有一个节点发生故障的话,它会做什么?

举个例子,我们刚才的步骤5,剩下3个 pod,其中有两个是在 k8s-node2 上面的,如果 k8s-node2 宕机的话,章鱼的大脑会做什么?我们一起来看一下。

步骤1 在 k8s-node2 节点上执行以下操作,模拟非正常宕机:(同学们自己挑一个看起来不太顺眼的节点,执行下面的操作)

bash

halt -h

步骤2 回到主节点,执行下列命令,看看节点的状况

bash

kubectl get nodes
节点2发生故障

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

bash

kubectl get pods -o wide
两个Unknown状态的pod

我们可以看到有两个 pod 的状态为 unknown(未知状态)

再过一段时间,k8s 会重启运行状态异常的 pod

默认情况下,pod 会被分散到所有节点上

接下来我们通过 label 来控制 pod 分配到哪个节点上,

步骤1 将上个任务中创建的资源删除(主节点操作)

bash

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 打一个标签(同学们可以自由选择一个节点)

bash

kubectl label node k8s-node1 star=five
给节点打标签

一个标签包含两个部分:star=five

等号左边是标签名,右边是标签值

步骤3 查看节点的标签

bash

kubectl get nodes --show-labels

步骤4 修改 nginx.yaml 配置文件,如下图所示

步骤5 应用配置文件

bash

kubectl apply -f nginx.yaml

步骤6 查看 pod 状态

bash

kubelet get pods -o wide

我们可以看到所有 pod 都分配给了 k8s-node1

步骤7 接下来我们删除节点的标签

bash

kubectl label node k8s-node1 star-

star- 即 标签名加一个减号

在配置文件中删除 nodeSelector的内容(最后两行)

步骤8 重新应用配置文件,观察结果(Pods分配到哪些节点上了)

bash

kubectl apply -f nginx -o wide

步骤9 验证(主节点)

bash

kubectl get pods