Pod控制器介绍
在Kubernetes中,Pod是最小的管理单元,用于运行容器。根据Pod的创建方式,可以将其分为两类:
-
自主式Pod(Stateless Pods) :这些Pod是直接由用户或管理员创建的,通常是通过直接使用
kubectl run
命令或通过YAML文件定义来创建的。这些Pod在创建后由Kubernetes直接管理,但它们的生命周期是独立的。这意味着如果这些Pod被删除,Kubernetes不会自动重建它们。自主式Pod通常用于运行短生命周期的任务或服务,例如批处理作业、数据迁移等。 -
控制器创建的Pod(Managed Pods):这些Pod是由Kubernetes控制器创建和管理的。控制器是Kubernetes中的高级对象,它们负责根据定义的规则创建、更新和删除Pod。控制器创建的Pod通常是为了实现更复杂的应用部署和管理需求,例如部署、复制集(ReplicaSet)、状态集(StatefulSet)、DaemonSet等。这些Pod的生命周期是由控制器管理的,如果Pod被删除,控制器会根据其配置自动重建Pod,以确保集群中始终有足够数量的Pod在运行。
Pod控制器(Pod Controller)是Kubernetes中的一种对象,用于管理一组具有相同配置的Pod。Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障,它会基于指定策略重新编排Pod。
常见使用场景
Pod控制器用于管理一组Pod,确保它们按照预定的规则运行和扩展。以下是Kubernetes中常见的几种Pod控制器及其适用场景的整理:
-
ReplicationController:这是早期用于确保指定数量的Pod副本始终运行的控制器,但现在已经不推荐使用,其功能被ReplicaSet所替代。
-
ReplicaSet:用于保证Pod的副本数量维持在用户指定的数量。它支持Pod数量的扩缩容,以及Pod模板的更新,但不涉及应用状态的管理。
-
Deployment:是ReplicaSet的扩展,提供了应用的声明式更新能力。它允许用户定义应用的期望状态,自动处理Pod的创建、更新和删除,支持滚动更新和版本回退。
-
Horizontal Pod Autoscaler (HPA):根据CPU使用率或其他选择的度量指标自动扩展Pod的数量,适用于需要根据负载动态调整Pod数量的场景。
-
DaemonSet:确保在集群中的每个Node上都运行一个Pod的副本,通常用于运行集群存储、日志收集等守护进程类任务。
-
Job:用于运行批处理任务,即执行一次性任务。当Pod完成其工作后,Job控制器会负责清理这些Pod。
-
CronJob:用于周期性地创建Job对象,执行定时任务,类似于Unix中的crontab。
-
StatefulSet:用于管理有状态的服务,它为Pod提供了稳定的网络标识、顺序部署、缩放以及扩展和滚动更新的能力。
Pod控制器分类
Kubernetes的控制器分为以下几类:
-
无状态应用:由Deployment和ReplicaSet管理,适用于不需要持久化存储的应用。
-
有状态应用:由StatefulSet管理,适用于需要持久化存储和有序部署的应用。
-
守护型应用:由DaemonSet管理,适用于需要在所有或特定Node上运行的服务。
-
批处理应用:由Job和CronJob管理,适用于执行一次性或周期性任务。
Pod与控制器之间的关系
-
Pod与控制器之间的关系是,控制器是Kubernetes中用于管理一组Pod的高级对象,而Pod是Kubernetes中运行容器的最小单元。
-
控制器通过定义一组标签选择器来跟踪和控制具有这些标签的Pod。
-
当Pod因故障而终止时,控制器会根据定义的规则自动创建新的Pod来替换它,从而确保应用的持续运行和所需的副本数量
-
此外,控制器还负责处理Pod的水平扩展、版本更新和滚动升级等运维任务,而Pod本身只负责运行容器化的应用。
-
控制器为Pod提供了生命周期管理和运维自动化的框架。
ReplicaSet(RS)控制器
- ReplicaSet(RS)是一种Kubernetes控制器,用于确保指定数量的Pod副本始终运行,从而提供高可用性和负载均衡。副本集通过监控和管理Pod的副本数量,自动进行Pod的创建、更新和删除,以维护用户定义的副本数量。
清单文件写法
bash
---
apiVersion: apps/v1 # 版本号
kind: ReplicaSet # 类型
metadata: # 元数据
name: rs-nginx # rs名称
namespace: default # 所属命名空间
labels: # 标签
controller: rs
spec: # 详情描述
replicas: 3 # 副本数量
selector: # 选择器,通过它指定该控制器管理哪些pod
matchLabels:
app: nginx-pod # Labels匹配规则
matchExpressions: # Expressions匹配规则
- {key: app, operator: In, values: [nginx-pod]} # Expressions匹配规则
template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
创建ReplicaSet
bash
[root@k8s-master ~]# kubectl apply -f pc-replicaset.yaml
---
apiVersion: apps/v1 # 指定了API版本,这是ReplicaSet所使用的API版本
kind: ReplicaSet
metadata:
name: pc-rs
namespace: test
spec:
replicas: 3 # 指定了ReplicaSet应该确保在运行的Pod的数量。
selector: # 定义了哪些Pod应该被ReplicaSet管理
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
replicaset.apps/pc-rs created
[root@k8s-master ~]#
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pc-rs-d46gm 0/1 ContainerCreating 0 14s <none> k8s-node2 <none> <none>
pc-rs-fs2ml 0/1 ContainerCreating 0 14s <none> k8s-node1 <none> <none>
pc-rs-xzm7s 0/1 ContainerCreating 0 14s <none> k8s-node1 <none> <none>
[root@k8s-master ~]# kubectl get pod -n test -o wide -w
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pc-rs-d46gm 0/1 ContainerCreating 0 19s <none> k8s-node2 <none> <none>
pc-rs-fs2ml 0/1 ContainerCreating 0 19s <none> k8s-node1 <none> <none>
pc-rs-xzm7s 0/1 ContainerCreating 0 19s <none> k8s-node1 <none> <none>
pc-rs-xzm7s 1/1 Running 0 33s 10.244.36.71 k8s-node1 <none> <none>
pc-rs-fs2ml 1/1 Running 0 33s 10.244.36.72 k8s-node1 <none> <none>
^C[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pc-rs-d46gm 0/1 ContainerCreating 0 58s <none> k8s-node2 <none> <none>
pc-rs-fs2ml 1/1 Running 0 58s 10.244.36.72 k8s-node1 <none> <none>
pc-rs-xzm7s 1/1 Running 0 58s 10.244.36.71 k8s-node1 <none> <none>
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pc-rs-d46gm 1/1 Running 0 113s 10.244.169.129 k8s-node2 <none> <none>
pc-rs-fs2ml 1/1 Running 0 113s 10.244.36.72 k8s-node1 <none> <none>
pc-rs-xzm7s 1/1 Running 0 113s 10.244.36.71 k8s-node1 <none> <none>
#查看rs
[root@k8s-master ~]# kubectl get rs pc-rs -n test -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-rs 3 3 3 2m8s nginx nginx:1.17.1 app=nginx-pod
ReplicaSet扩缩容
-
方法一:编辑ReplicaSet
pc-rs
-
方法二:使用命令修改
bash
[root@k8s-master ~]# kubectl edit rs pc-rs -n test
replicaset.apps/pc-rs edited
[root@k8s-master ~]# kubectl get rs pc-rs -n test -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-rs 6 6 6 3m nginx nginx:1.17.1 app=nginx-pod
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pc-rs-b24tf 1/1 Running 0 35s 10.244.169.131 k8s-node2 <none> <none>
pc-rs-d46gm 1/1 Running 0 3m16s 10.244.169.129 k8s-node2 <none> <none>
pc-rs-f7mqb 1/1 Running 0 35s 10.244.36.73 k8s-node1 <none> <none>
pc-rs-fs2ml 1/1 Running 0 3m16s 10.244.36.72 k8s-node1 <none> <none>
pc-rs-mqk6x 1/1 Running 0 35s 10.244.169.130 k8s-node2 <none> <none>
pc-rs-xzm7s 1/1 Running 0 3m16s 10.244.36.71 k8s-node1 <none> <none>
[root@k8s-master ~]# kubectl scale rs pc-rs --replicas 2 -n test
replicaset.apps/pc-rs scaled
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pc-rs-b24tf 0/1 Terminating 0 66s 10.244.169.131 k8s-node2 <none> <none>
pc-rs-d46gm 0/1 Terminating 0 3m47s <none> k8s-node2 <none> <none>
pc-rs-f7mqb 0/1 Terminating 0 66s 10.244.36.73 k8s-node1 <none> <none>
pc-rs-fs2ml 1/1 Running 0 3m47s 10.244.36.72 k8s-node1 <none> <none>
pc-rs-mqk6x 0/1 Terminating 0 66s <none> k8s-node2 <none> <none>
pc-rs-xzm7s 1/1 Running 0 3m47s 10.244.36.71 k8s-node1 <none> <none>
[root@k8s-master ~]# kubectl get pod -n test -o wide -w
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pc-rs-f7mqb 0/1 Terminating 0 69s 10.244.36.73 k8s-node1 <none> <none>
pc-rs-fs2ml 1/1 Running 0 3m50s 10.244.36.72 k8s-node1 <none> <none>
pc-rs-xzm7s 1/1 Running 0 3m50s 10.244.36.71 k8s-node1 <none> <none>
pc-rs-f7mqb 0/1 Terminating 0 76s 10.244.36.73 k8s-node1 <none> <none>
pc-rs-f7mqb 0/1 Terminating 0 76s 10.244.36.73 k8s-node1 <none> <none>
^C[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pc-rs-fs2ml 1/1 Running 0 4m 10.244.36.72 k8s-node1 <none> <none>
pc-rs-xzm7s 1/1 Running 0 4m 10.244.36.71 k8s-node1 <none> <none>
ReplicaSet镜像更新
- 方法一编辑ReplicaSet
pc-rs
bash
[root@k8s-master ~]# kubectl edit rs pc-rs -n test
replicaset.apps/pc-rs edited
[root@k8s-master ~]# kubectl get rs pc-rs -n test -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-rs 2 2 2 4m47s nginx nginx:1.17.2 app=nginx-pod
[root@k8s-master ~]# kubectl set image rs pc-rs nginx=nginx:1.17.3 -n test
replicaset.apps/pc-rs image updated
[root@k8s-master ~]# kubectl get rs pc-rs -n test -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-rs 2 2 2 5m17s nginx nginx:1.17.3 app=nginx-pod
ReplicaSet删除
bash
# kubectl delete rs pc-rs -n test
# 如果希望仅仅删除RS对象(保留Pod),可以使用kubectl delete命令时添加--cascade=false选项(不推荐)
[root@k8s-master ~]# kubectl delete rs pc-rs -n test --cascade=orphan
replicaset.apps "pc-rs" deleted
[root@k8s-master ~]# kubectl get rs pc-rs -n test -o wide
Error from server (NotFound): replicasets.apps "pc-rs" not found
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pc-rs-fs2ml 1/1 Running 0 12m 10.244.36.72 k8s-node1 <none> <none>
pc-rs-xzm7s 1/1 Running 0 12m 10.244.36.71 k8s-node1 <none> <none>
#删除之后,不会重新创建,因为控制器已经被删除
[root@k8s-master ~]# kubectl delete pod pc-rs-fs2ml -n test
pod "pc-rs-fs2ml" deleted
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pc-rs-xzm7s 1/1 Running 0 13m 10.244.36.71 k8s-node1 <none> <none>