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

写在前面的话docker

 

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

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

 

 

关于控制器curl

 

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

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

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

Cloud controller 通常在配合云服务的时候再使用,因此不是咱们关心得重点。url

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

1. Replication Controller(已经废弃)rest

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。

相关文章
相关标签/搜索