1.1 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。
1.1.1 常见使用场景
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提供了稳定的网络标识、顺序部署、缩放以及扩展和滚动更新的能力。
1.1.2 Pod控制器分类
Kubernetes的控制器分为以下几类:
-
无状态应用:由Deployment和ReplicaSet管理,适用于不需要持久化存储的应用。
-
有状态应用:由StatefulSet管理,适用于需要持久化存储和有序部署的应用。
-
守护型应用:由DaemonSet管理,适用于需要在所有或特定Node上运行的服务。
-
批处理应用:由Job和CronJob管理,适用于执行一次性或周期性任务。
1.2 Pod与控制器之间的关系
-
Pod与控制器之间的关系是,控制器是Kubernetes中用于管理一组Pod的高级对象,而Pod是Kubernetes中运行容器的最小单元。
-
控制器通过定义一组标签选择器来跟踪和控制具有这些标签的Pod。
-
当Pod因故障而终止时,控制器会根据定义的规则自动创建新的Pod来替换它,从而确保应用的持续运行和所需的副本数量
-
此外,控制器还负责处理Pod的水平扩展、版本更新和滚动升级等运维任务,而Pod本身只负责运行容器化的应用。
-
控制器为Pod提供了生命周期管理和运维自动化的框架。
1.3 ReplicaSet(RS)控制器
-
ReplicaSet(RS)是一种Kubernetes控制器,用于确保指定数量的Pod副本始终运行,从而提供高可用性和负载均衡。副本集通过监控和管理Pod的副本数量,自动进行Pod的创建、更新和删除,以维护用户定义的副本数量。
1.3.1 清单文件写法
--- 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.11.1 ports: - containerPort: 80
ReplicaSet配置中spec
字段下的三个关键选项:
-
replicas:这个字段指定了ReplicaSet应该维护的Pod副本的数量。默认情况下,如果未指定,它会设置为1。通过增加副本数量,可以提高应用的可用性和容错性。
-
selector:选择器用于确定ReplicaSet管理的Pod集合。它通过标签选择器(Label Selector)机制工作。ReplicaSet的选择器必须与Pod的标签匹配,这样ReplicaSet才能跟踪和控制这些Pod。选择器由两部分组成:
-
matchLabels:这是一个匹配所有标签的字典,只有当Pod的所有这些标签都与选择器中的标签完全匹配时,ReplicaSet才会管理该Pod。
-
matchExpressions:这是一个更复杂的匹配,允许使用特定的操作符(如In, NotIn, Exists, DoesNotExist等)来匹配标签。
-
-
template:这是一个Pod模板,ReplicaSet使用它来创建新的Pod。当Pod数量少于
replicas
指定的数量时,或者当现有的Pod失败需要替换时,ReplicaSet会根据这个模板创建新的Pod。模板中定义了Pod的详细规格,包括容器的镜像、名称、端口、环境变量、存储卷等。
1.3.2 创建ReplicaSet
[root@K8s-master ~]# vim 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.11.1 [root@K8s-master ~]# kubectl apply -f pc-replicaset.yaml replicaset.apps/pc-rs created [root@K8s-master ~]# kubectl get pod -n test -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pc-rs-75hwq 1/1 Running 0 2m46s 10.244.2.30 k8s-node-02 <none> <none> pc-rs-jgrc9 1/1 Running 0 2m46s 10.244.2.32 k8s-node-02 <none> <none> pc-rs-zwllg 1/1 Running 0 2m46s 10.244.2.31 k8s-node-02 <none> <none> # 建出来的pod的名称是在控制器名称后面拼接了-xxxxx随机码 [root@K8s-master ~]# kubectl get rs pc-rs -n test -o wide #查看rs NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR pc-rs 3 3 3 170m nginx nginx:1.11.1 app=nginx-pod # DESIRED:期望副本数量 # CURRENT:当前副本数量 # READY:已经准备好提供服务的副本数量
1.3.3 ReplicaSet扩缩容
-
方法一编辑ReplicaSet
pc-rs
# 将rs的副本数改成6 [root@K8s-master ~]# kubectl edit rs pc-rs -n test ... spec: replicas: 6 ... [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 175m nginx nginx:1.11.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-75hwq 1/1 Running 0 176m 10.244.2.30 k8s-node-02 <none> <none> pc-rs-84qbg 1/1 Running 0 62s 10.244.2.35 k8s-node-02 <none> <none> pc-rs-8d8l8 1/1 Running 0 62s 10.244.2.33 k8s-node-02 <none> <none> pc-rs-g4792 1/1 Running 0 62s 10.244.2.34 k8s-node-02 <none> <none> pc-rs-jgrc9 1/1 Running 0 176m 10.244.2.32 k8s-node-02 <none> <none> pc-rs-zwllg 1/1 Running 0 176m 10.244.2.31 k8s-node-02 <none> <none>
-
方法二使用命令修改
# 使用scale命令实现扩缩容, 后面--replicas=n直接指定目标数量即可 [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-jgrc9 1/1 Running 0 3h1m 10.244.2.32 k8s-node-02 <none> <none> pc-rs-zwllg 1/1 Running 0 3h1m 10.244.2.31 k8s-node-02 <none> <none>
1.3.4 ReplicaSet镜像更新
-
方法一编辑ReplicaSet
pc-rs
[root@K8s-master ~]# kubectl edit rs pc-rs -n test ... spec: containers: - image: nginx:1.11.2 ... [root@K8s-master ~]# kubectl get rs pc-rs -n test -o wide #从nginx:1.11.1更新到了nginx:1.11.2 NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR pc-rs 2 2 2 3h9m nginx nginx:1.11.2 app=nginx-pod
-
方法二使用命令修改
# kubectl set image rs rs名称 容器=镜像版本 -n namespace [root@K8s-master ~]# kubectl set image rs pc-rs nginx=nginx:1.11.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 3h12m nginx nginx:1.11.3 app=nginx-pod
1.3.5 ReplicaSet删除
[root@K8s-master ~]# kubectl delete rs pc-rs -n test 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 No resources found in test namespace. # 如果希望仅仅删除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 #Pod保留 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pc-rs-4rdpw 1/1 Running 0 108s 10.244.2.40 k8s-node-02 <none> <none> pc-rs-7n9qj 1/1 Running 0 108s 10.244.2.41 k8s-node-02 <none> <none> pc-rs-rkgmr 1/1 Running 0 108s 10.244.2.39 k8s-node-02 <none> <none> [root@K8s-master ~]# kubectl delete pod pc-rs-4rdpw -n test #没有了控制器Pod不会创建 pod "pc-rs-4rdpw" deleted [root@K8s-master ~]# kubectl get pod -n test -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pc-rs-7n9qj 1/1 Running 0 4m10s 10.244.2.41 k8s-node-02 <none> <none> pc-rs-rkgmr 1/1 Running 0 4m10s 10.244.2.39 k8s-node-02 <none> <none> [root@K8s-master ~]# kubectl delete -f pc-replicaset.yaml #也可以直接删文件 replicaset.apps "pc-rs" deleted [root@K8s-master ~]# kubectl get pod -n test -o wide No resources found in test namespace.
1.4 Deployment(Deploy)控制器
-
从Kubernetes 1.2版本开始,引入了Deployment控制器,它提供了一种更高级别的抽象来管理应用的生命周期,包括应用的声明式更新、回滚、暂停和恢复等。Deployment的设计目标是简化应用的部署和扩展