【05】Kubernets:资源清单(控制器

非 Y 不嫁゛ 提交于 2021-02-12 18:54:07

写在前面的话

 

从上一章节开始,我们一直在学习关于自主式 Pod 的资源清单编写, 但是自主式 Pod 存在着一个问题,就是和我们直接 docker run 运行 docker 容器一样。如果我们想以集群的形式并配合复杂的处理逻辑就不那么好用了。

针对这点,我们将 Pod 的处理交给了控制器。

 

 

关于控制器

 

再详细讲解控制器怎么使用之前,我们得知道控制器是啥,以及我们需要使用哪些。

在讲解 K8S 的 Master 组成的时候说过,Master 节点有个重要组件叫做 Controller Manager。

Controller Manager 由 kube-controller-manager 和 cloud-controller-manager 组成,是 K8S 的核心。

Cloud controller 一般在配合云服务的时候再使用,所以不是我们关心得重点。

kube-controller-manager 由以下主要的控制器组成:

1. Replication Controller(已经废弃)

2. Replicaset

3. Deployment Controller

4. DaemonSet Controller

5. Job / CronJob Controller

6. Volume Controller

7. StatefulSet Controller

8. Node Controller

9. Service Controller

10. 等等...

 

 

常见控制器说明

 

Replication Controller

保证了再特定时间内运行的副本数了,多退少补。并且不会去关注 pod 的状态,只要你被删除或者被终止,自动就把你替换掉。他就像一个进程管理器监管着多个节点的 pod。 

该控制器只对 restartPolicy 配置为默认 Always 的生效,且控制器永远不会自己关闭。但我们更希望控制器是伴随着服务的生命周期创建删除,因为程序会更新。

 

ReplicaSet

新一代的副本控制器,属于 Replication Controller 的升级版,区别在于新版本支持更为高级的 selector。

包含 3 个关键点:用户期望副本数,标签选择器,Pod 资源模板。

 

Deployment

调度 ReplicaSet 实现我们的需求,官方也建议我们使用 Deployment 替代 ReplicaSet。例如:

使用 Deployment 来创建 ReplicaSet,ReplicaSet 会在后台启动相关的 Pod 并检测其状态。

当我们更新 Deployment 中定义的 Pod 状态时,会新建 ReplicaSet 并根据配置的策略,让 ReplicaSet 按照一定的规则来重建 Pod,实现切换。

 

StatefulSet

主要用于解决有状态的服务的问题。后面会专门用到。

 

DaemonSet

保证每个节点上都有运行一个副本,常用来作为集群日志收集,监控。

 

 

Replicaset Controller 资源清单

 

对于 Replicaset Controller 的资源清单,我们也可以像查看 Pod 一样查看:

kubectl explain rs

我们可以将 ReplicaSet 简写成为 rs,就像之前我们使用 service 简写成 svc 一样。

在 ReplicaSet 中,前面提到了 3 个关键点:副本数,标签选择器,Pod 资源模板。其结果如下表:

rs
apiVersion     extensions/v1beta1
kind     ReplicaSet
metadata      
  name   rs 的名称
  namespace   所属命名空间
  labels   rs 的标签
  annotations   rs 的说明
spec      
  replicas   副本数
  selector   标签选择器
    matchExpressions KV 列表
    matchLabels 标签选择键值对
  template   模板
    metadata Pod 的 metadata
    spec Pod 的 spec

相当于在 Pod 外面嵌套了一层,用来定义 rs 的相关信息,如副本数,标签选择器。例如(红色部分就是 Pod 定义):

apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
  name: rs-demo
  namespace: default
  labels:
    app: rs
    release: stable
  annotations:
    ezops.cn/create-by: "Dylan"
spec:
  replicas: 3
  selector:
    matchLabels:
      app: erp
      release: stable
  template:
    metadata:
      name: rs-pod
      namespace: default
      labels:
        app: erp
        release: stable
      annotations:
        ezops.cn/create-by: "Dylan"
    spec:
      containers:
      - name: rs-container
        image: ikubernetes/myapp:v1
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
        - name: https
          containerPort: 443

创建查看:

kubectl create -f rs-demo.yaml
kubectl get rs -o wide

结果如下:

对于 ReplicaSet 有几点需要我们注意:

1. 标签选择器中的标签在我们的 Pod 中必须有满足条件的。

2. ReplicaSet 创建完成后再去删除 Pod 会自动创建新的 Pod。

3. 修改集群中其他 Pod 的标签,改为满足 ReplicaSet 中标签选择器定义的需求。ReplicaSet 会干掉自己的 Pod,知道数量等于 replicas 定义的副本数。

4. 直接使用 edit 修改 ReplicaSet 的副本数量能够生效,但是修改镜像需要 Pod 在重启以后才能生效。

执行测试:

kubectl get pods
# 修改副本数为 5
kubectl edit rs rs-demo
# 再度查看
kubectl get pods
# 修改镜像版本为 v2
kubectl edit rs rs-demo
# 查看
kubectl get rs -o wide
# 访问查看
curl 10.1.2.4

结果如图:

 

 

小结

 

我这里准备将每个点都单独作为一个独立的章节记录,ReplicaSet 其实在之后的不会用到,但是我们需要理解原理,因为 Deployment 调度的其实就是 ReplicaSet。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!