文章目录
官网
- API查看:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#-strong-api-overview-strong-(可以查看控制器样例)
- 控制器概念:https://kubernetes.io/zh/docs/concepts/workloads/controllers/
概念
控制器类型:
-
Replication Controller【RC,复制控制器】:RC是K8s集群中最早的保证Pod高可用的API对象。通过监控运行中的Pod来保证集群中运行指定数目的Pod副本。指定的数目可以是多个也可以是1个;少于指定数目,RC就会启动运行新的Pod副本;多于指定数目,RC就会杀死多余的Pod副本。即使在指定数目为1的情况下,通过RC运行Pod也比直接运行Pod更明智,因为RC也可以发挥它高可用的能力,保证永远有1个Pod在运行。RC是K8s较早期的技术概念,只适用于长期伺服型的业务类型,比如控制小机器人提供高可用的Web服务。
-
Replica Set【RS,副本集】:RS是新一代RC,提供同样的高可用能力,区别主要在于RS后来居上,能支持更多种类的匹配模式。副本集对象一般不单独使用,而是作为Deployment的理想状态参数使用。ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行。 然而,Deployment 是一个更高级的概念,它管理 ReplicaSet,并向 Pod 提供声明式的更新以及许多其他有用的功能。 因此建议使用 Deployment 而不是直接使用 ReplicaSet,除非需要自定义更新业务流程或根本不需要更新。这实际上意味着,可能永远不需要操作ReplicaSet 对象:而是使用 Deployment,并在 spec 部分定义应用。
-
Deployment【部署】:部署表示用户对K8s集群的一次更新操作。部署是一个比RS应用模式更广的API对象,可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。滚动升级一个服务,实际是创建一个新的RS,然后逐渐将新RS中副本数增加到理想状态,将旧RS中的副本数减小到0的复合操作;这样一个复合操作用一个RS是不太好描述的,所以用一个更通用的Deployment来描述。以K8s的发展方向,未来对所有长期伺服型的的业务的管理,都会通过Deployment来管理。
-
DaemonSet【后台支撑服务集】:长期伺服型和批处理型服务的核心在业务应用,可能有些节点运行多个同类业务的Pod,有些节点上又没有这类Pod运行;而后台支撑型服务的核心关注点在K8s集群中的节点(物理机或虚拟机),要保证每个节点上都有一个此类Pod运行。节点可能是所有集群节点也可能是通过nodeSelector选定的一些特定节点。典型的后台支撑型服务包括,存储,日志和监控等在每个节点上支撑K8s集群运行的服务。
-
Job【任务】:Job是K8s用来控制批处理型任务的API对象。批处理业务与长期伺服业务的主要区别是批处理业务的运行有头有尾,而长期伺服业务在用户不停止的情况下永远运行。Job管理的Pod根据用户的设置把任务成功完成就自动退出了。成功完成的标志根据不同的spec.completions策略而不同:单Pod型任务有一个Pod成功就标志完成;定数成功型任务保证有N个任务全部成功;工作队列型任务根据应用确认的全局成功而标志成功。
-
CornJob【定时任务】:Cron Job 创建基于时间调度的 Jobs。一个 CronJob 对象就像 crontab (cron table) 文件中的一行。它用 Cron 格式进行编写,并周期性地在给定的调度时间执行 Job。CronJob 时间都是基于初始 Job 的主控节点的时区定位的。
-
StatefulSet【有状态服务集】:StatefulSet 是用来管理有状态应用的工作负载 API 对象。StatefulSet 用来管理 Deployment 和扩展一组 Pod,并且能为这些 Pod 提供序号和唯一性保证。和 Deployment 相同的是,StatefulSet 管理了基于相同容器定义的一组 Pod。但和 Deployment 不同的是,StatefulSet 为它们的每个 Pod 维护了一个固定的 ID。这些 Pod 是基于相同的声明来创建的,但是不能相互替换:无论怎么调度,每个 Pod 都有一个永久不变的 ID。StatefulSet 和其他控制器使用相同的工作模式。你在 StatefulSet 对象 中定义你期望的状态,然后 StatefulSet 的 控制器 就会通过各种更新来达到那种你想要的状态
Replica Set
spec字段参数
- 与其他API资源清单一致,基础格式
apiVersion: #api版本
kind: #资源类型
metadata: #元数据对象
spec: #期望的状态(disired state)
status: #当前状态,本字段有kubernetes自身维护,用户不能去定义
- 其中spec中的字段
spec:
minReadySeconds <integer> #最小就绪时间;指定新创建的 Pod 在没有任意容器崩溃情况下的最小就绪时间,以便将其视为可用。默认值为 0
replicas <integer> #Pod副本数量
selector <Object> -required- #Pod选择器
matchLabels <map[string]string> #配备标签,主要匹配使用的Pod的标签名,通常与模板中的标签进行匹配
template <Object> #Pod模板,其中主要为容器的设置内容
metadata <Object> #模板中的元数据
spec <Object> #模板中的期望状态
RS控制器实践
一个简单的RS实例
[kubeadm@node1 controller]$ vim rs_myapp.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset-example
spec:
replicas: 3 #副本数 3
selector:
matchLabels:
app: myapp #选择器指定标签 app:myapp
template:
metadata:
labels:
app: myapp #模板设定标签为 app:myapp 匹配选择器
spec:
containers:
- name: myapp
image: myapp:v1 #使用容器myapp,镜像随意选择,myapp仅方便测试
[kubeadm@node1 controller]$ kubectl create -f rs_myapp.yaml
replicaset.apps/replicaset-example created
#创建RS实例
[kubeadm@node1 controller]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
replicaset-example-8vlt8 1/1 Running 0 77s
replicaset-example-gkxzg 1/1 Running 0 77s
replicaset-example-jbbxp 1/1 Running 0 77s
#创建结果显示
查看容器创建结果
[kubeadm@node1 controller]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
replicaset-example-8vlt8 1/1 Running 0 2m45s 10.244.1.31 node2 <none> <none>
replicaset-example-gkxzg 1/1 Running 0 2m45s 10.244.2.36 node3 <none> <none>
replicaset-example-jbbxp 1/1 Running 0 2m45s 10.244.1.32 node2 <none> <none>
[kubeadm@node1 controller]$ curl 10.244.1.31
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[kubeadm@node1 controller]$ curl 10.244.2.36
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[kubeadm@node1 controller]$ curl 10.244.1.32
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
#显示均正常
扩展副本
[kubeadm@node1 controller]$ vim rs_myapp.yaml
……
replicas: 6 #副本数修改为6
……
[kubeadm@node1 controller]$ kubectl apply -f rs_myapp.yaml
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
replicaset.apps/replicaset-example configured
[kubeadm@node1 controller]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
replicaset-example-8vlt8 1/1 Running 0 12m
replicaset-example-99hnt 1/1 Running 0 17s
replicaset-example-c8q7z 1/1 Running 0 17s
replicaset-example-gkxzg 1/1 Running 0 12m
replicaset-example-jbbxp 1/1 Running 0 12m
replicaset-example-xzzzh 1/1 Running 0 17s
#已创建6个
RS与标签的关系
- RS控制器主要通过标签对Pod进行控制
- 修改已有pod的标签,便不会配控制器管理
修改已有pod标签,删除所有pod,查看现象
[kubeadm@node1 controller]$ kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
replicaset-example-8vlt8 1/1 Running 0 17m app=myapp
replicaset-example-99hnt 1/1 Running 0 5m22s app=myapp
replicaset-example-c8q7z 1/1 Running 0 5m22s app=myapp
replicaset-example-gkxzg 1/1 Running 0 17m app=myapp
replicaset-example-jbbxp 1/1 Running 0 17m app=myapp
replicaset-example-xzzzh 1/1 Running 0 5m22s app=myapp
[