一、控制器
控制器也是管理pod的一种手段
-
自主式pod:pod退出或意外关闭后不会被重新创建
-
控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目
Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障,它会基于指定策略重新编排Pod
当建立控制器后,会把期望值写入etcd,k8s中的apiserver检索etcd中我们保存的期望状态,并对比pod的当前状态,如果出现差异代码自驱动立即恢复
二、控制器常见类型
控制器名称 | 控制器用途 |
---|---|
Replication Controller | 比较原始的pod控制器,已经被废弃,由ReplicaSet替代 |
ReplicaSet | ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行 |
Deployment | 一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力 |
DaemonSet | DaemonSet 确保全指定节点上运行一个 Pod 的副本 |
StatefulSet | StatefulSet 是用来管理有状态应用的工作负载 API 对象。 |
Job | 执行批处理任务,仅执行一次任务,保证任务的一个或多个Pod成功结束 |
CronJob | Cron Job 创建基于时间调度的 Jobs。 |
HPA全称Horizontal Pod Autoscaler | 根据资源利用率自动调整service中Pod数量,实现Pod水平自动缩放 |
三、replicaset控制器
3.1 replicaset功能
ReplicaSet 是下一代的 Replication Controller,官方推荐使用ReplicaSet
ReplicaSet和Replication Controller的唯一区别是选择器的支持,ReplicaSet支持新的基于集合的选择器需求
ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行
虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制
3.2 replicaset参数
参数名称 | 字段类型 | 参数说明 |
---|---|---|
spec | Object | 详细定义对象,固定值就写Spec |
spec.replicas | integer | 指定维护pod数量 |
spec.selector | Object | Selector是对pod的标签查询,与pod数量匹配 |
spec.selector.matchLabels | string | 指定Selector查询标签的名称和值,以key:value方式指定 |
spec.template | Object | 指定对pod的描述信息,比如lab标签,运行容器的信息等 |
spec.template.metadata | Object | 指定pod属性 |
spec.template.metadata.labels | string | 指定pod标签 |
spec.template.spec | Object | 详细定义对象 |
spec.template.spec.containers | list | Spec对象的容器列表定义 |
spec.template.spec.containers.name | string | 指定容器名称 |
spec.template.spec.containers.image | string | 指定容器镜像 |
3.3 replicaset示例
通过标签识别
[root@k8s-master deployment]# kubectl create deployment replicaset --image myapp:v1 --dry-run=client -o yaml > replicaset.yml
[root@k8s-master deployment]# vim replicaset.yml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: replicaset
name: replicaset
spec:
replicas: 2
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- image: myapp:v1
name: myapp
[root@k8s-master deployment]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
replicaset-5d886954d4-dllz2 1/1 Running 0 50s app=myapp,pod-template-hash=5d886954d4
replicaset-5d886954d4-rz9l7 1/1 Running 0 50s app=myapp,pod-template-hash=5d886954d4
# 修改标签
[root@k8s-master deployment]# kubectl label pod replicaset-5d886954d4-dllz2 app=replicaset --overwrite
pod/replicaset-5d886954d4-dllz2 labeled
# 通过标签识别,如果标签改变,就不属于原来的控制器管理了,会重新生成新的pod
[root@k8s-master deployment]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
replicaset-5d886954d4-dllz2 1/1 Running 0 80s app=replicaset,pod-template-hash=5d886954d4
replicaset-5d886954d4-rz9l7 1/1 Running 0 80s app=myapp,pod-template-hash=5d886954d4
replicaset-5d886954d4-v5gjf 1/1 Running 0 2s app=myapp,pod-template-hash=5d886954d4 # 开启新的pod
# 删除app标签
[root@k8s-master deployment]# kubectl label pod replicaset-5d886954d4-dllz2 app-
pod/replicaset-5d886954d4-dllz2 unlabeled
[root@k8s-master deployment]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
replicaset-5d886954d4-dllz2 1/1 Running 0 110s pod-template-hash=5d886954d4
replicaset-5d886954d4-rz9l7 1/1 Running 0 110s app=myapp,pod-template-hash=5d886954d4
replicaset-5d886954d4-v5gjf 1