5.2.3 ReplicaSet 管控下的 Pod 对象

5.2.2 节中创建的 rc-example 通过标签选择器将拥有 “app=rs-demo” 标签的 Pod 资源收归与麾下,并确保其数量精确符合所期望的数目,使用标签选择器显示出的 Pod 资源列表也能验证这一点。然而,实际中存在着不少可能导致 Pod 对象数目与期望值不符合的可能性,如 Pod 对象的意外删除、Pod 对象标签的变动(已有的 Pod 资源变得不匹配控制器的标签选择器,或者外部的 Pod 资源标签变得匹配到了控制器的标签选择器)、控制器的标签选择器变动,甚至是工作节点故障等。ReplicaSet 控制器的和解循环过程能够实时监控到这类异常,并及时启动和解操作。

1. 缺少 Pod 副本

任何原因导致的相关 Pod 对象丢失,都会由 ReplicaSet 控制器自动补足。例如,手动删除上面列出的一个 Pod 对象,命令如下:

**[terminal]
**[delimiter $ ]**[command kubectl delete pods rs-example-cwvpn]
pod "rs-example-cwvpn" deleted

再次列出相关的 Pod 资源,可以看到 rs-example 控制器启动了删除多余 Pod 的操作,pod-example 正处于终止过程中:

**[terminal]
**[delimiter $ ]**[command kubectl get pods -l app=rs-demo]
NAME               READY   STATUS              RESTARTS   AGE
rs-example-cwvpn   1/1     Terminating         0          13m
rs-example-s47z9   1/1     Running             0          99s
rs-example-tc7d8   0/1     ContainerCreating   0          2s

另外,强制修改隶属于控制器 rs-example 的某 Pod 资源(匹配于标签控制器)的标签,会导致它不再被控制器作为副本计数,这也将触发控制器的 Pod 对象副本缺失补足机制。例如,将 rs-example-tc7d8 的标签 app 的值重置为空:

**[terminal]
**[delimiter $ ]**[command kubectl label pods rs-example-tc7d8 app= --overwrite]
pod/rs-example-tc7d8 labeled

列出 rs-example 相关的 Pod 对象的信息,发现 rs-example-tc7d8 已经消失不见了,并且正在创建新的对象副本。

**[terminal]
**[delimiter $ ]**[command kubectl get pods -l app=rs-demo]
NAME               READY   STATUS              RESTARTS   AGE
rs-example-42cw7   0/1     ContainerCreating   0          1s
rs-example-s47z9   1/1     Running             0          12m

由此可见,修改 Pod 资源的标签即可将其从控制器的管控之下移除,当然,修改后的标签他如果又能被其他控制器资源的标签选择器命中,则此时它又成了隶属于另一控制器的副本。如果修改其标签后的 Pod 对象不再隶属于任何控制器,那么它就将成为自主式 Pod,与此前手动直接创建的 Pod 对象的特征相同,即误删除或所在工作节点故障都会造成其永久性的消失。

2. 多处 Pod 副本

一旦被标签选择器匹配到的 Pod 资源数量因任何原因超出期望值,多余的部分都将被控制器自动删除。例如,为 pod-example 手动为其添加 “app: rs-demo” 标签:

**[terminal]
**[delimiter $ ]**[command kubectl label pods pod-example app=rs-demo]
pod/pod-example labeled

再次列出相关的 Pod 资源,可以看到 rs-example 控制器启动了删除多余 Pod 的操作,rs-example-42cw7 正处于终止过程中:

**[terminal]
**[delimiter $ ]**[command kubectl get pod -l app=rs-demo]
NAME               READY   STATUS        RESTARTS   AGE
pod-example        1/1     Running       1          6d23h
rs-example-42cw7   0/1     Terminating   0          10m
rs-example-s47z9   1/1     Running       0          23m

这就意味着,任何自主式的或本隶属于其他控制器的 Pod 资源其标签变动的结果一旦匹配到了其他的副本数足额的控制器,就会导致这类资源被删除。

查看 Pod 资源变动的相关事件

“kubectl describe replicasets” 命令可打印出 ReplicaSet 控制器的详细状态。从下面命令结果中 Events 一段也可以看出,rs-example 执行了 Pod 资源的创建和删除操作,为的就是确保其数量的精确性。

**[terminal]
**[delimiter $ ]**[command kubectl describe replicasets/rs-example]
Name:         rs-example
Namespace:    default
Selector:     app=rs-demo
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"apps/v1","kind":"ReplicaSet","metadata":{"annotations":{},"name":"rs-example","namespace":"default"},"spec":{"replicas":2,"...
Replicas:     2 current / 2 desired
Pods Status:  2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=rs-demo
  Containers:
   myapp:
    Image:        ikubernetes/myapp:v1
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age    From                   Message
  ----    ------            ----   ----                   -------
  Normal  SuccessfulCreate  42m    replicaset-controller  Created pod: rs-example-q99nt
  Normal  SuccessfulCreate  42m    replicaset-controller  Created pod: rs-example-cwvpn
  Normal  SuccessfulCreate  30m    replicaset-controller  Created pod: rs-example-s47z9
  Normal  SuccessfulCreate  28m    replicaset-controller  Created pod: rs-example-tc7d8

事实上,ReplicaSet 控制器能对 Pod 对象数目的异常及时作出响应,是因为它向 API Server 注册监听(watch)了相关资源及其列表的变动信息,于是 API Server 会在变动发生时立即通知给相关的监听客户端。

而因节点自身故障而导致的 Pod 对象丢失,ReplicaSet 控制器一样会使用补足资源的方式进行处理,这里不再详细说明其过程。有兴趣的读者可通过直接关掉类似上面 Pod 对象运行所在的某一节点来检验其处理过程。

results matching ""

    No results matching ""