写在前面的话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。