六、kubernetes 1.29 之 Pod 控制器01
一、概述
1、Kubernetes控制器核心作用
1. **核心职能**:作为K8s集群的“管理控制中心/中心大脑”,核心目标是确保集群当前状态与期望状态一致。
2. **典型控制器示例**:
- **ReplicaSet控制器**:负责维护集群中运行的Pod数量,保障Pod数量符合预期。
- **Node控制器**:监控节点状态,节点故障时执行自动化修复流程,确保集群整体处于预期工作状态。
2、pod控制器列举
Pod 控制器是 Kubernetes 中用于管理 Pod 生命周期和副本数量等的核心组件,主要有以下几种类型:可以缩写
- ReplicationController(RC)和 ReplicaSet(RS):确保指定数量的 Pod 副本始终运行,ReplicaSet 是 ReplicationController 的升级版,支持更灵活的标签选择器。
- Deployment:在 ReplicaSet 基础上,提供了滚动更新、回滚等更强大的部署和版本管理能力,是管理无状态应用的常用方式。
- DaemonSet:保证在集群中的每一个节点(或符合条件的节点)上都运行一个 Pod 副本,常用于运行节点级的守护进程,如日志收集、监控代理等。
- StatefulSet:用于管理有状态应用,为 Pod 提供稳定的网络标识(主机名、DNS)和持久化存储,保证 Pod 部署和扩展的顺序性。
- Job/CronJob:Job 用于执行一次性任务,任务完成后 Pod 终止;CronJob 则是基于时间调度的 Job,可周期性地执行任务。
- Horizontal Pod Autoscaling(HPA):根据 CPU 利用率、内存使用等指标,自动水平缩放 Pod 的副本数量,实现资源的自动弹性伸缩。
二、Pod控制器
1、ReplicationController(RC)
ReplicationController(RC)用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收(多数是根据时间回收,越短越优先)
apiVersion: v1
kind: ReplicationController
metadata:
name: rc-demo
spec:
replicas: 3
selector:
app: rc-demo
template:
metadata:
labels:
app: rc-demo
spec:
containers:
- name: rc-demo-container
image: wangyanglinux/myapp:v1.0
env:
- name: GET_HOSTS_FROM
value: dns
- name: zhangsan
value: "123"
ports:
- containerPort: 80
pod是RC的子集,所以RC有探针和钩子
env是环境变量
编写、创建

a、删除一个
防止pod丢失、节点丢失、服务器损坏

b、标签子集
给pod添加一个新的标签
kubectl label pod podname version=v1
还是三个pod

修改一个pod的app标签
kubectl label pod podName app=xinxianghf --overwrite
//对于已有标签要加 --overwrite 表示允许覆盖
会产生一个新的 app=rc-demo的pod来满足期望

将修改的标签改回
干掉运行时间小的pod,减小损失

c、修改副本数量
kubectl scale rc rc-demo --replicas=10

2、ReplicaSet(RS)
在新版本的 Kubernetes 中,建议使用 ReplicaSet 来取代 ReplicationController。ReplicaSet 跟 ReplicationController 没有本质的不同,只是名字不一样,并且 ReplicaSet 支持集合式的 selector;
# 1. 定义一个命名空间,用于隔离资源
apiVersion: v1
kind: Namespace
metadata:
name: web-app
---
# 2. 定义一个部署(Deployment),管理Pod副本集
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: web-app
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx:1.25
ports:
- containerPort: 80
---
# 3. 定义一个服务(Service),暴露部署以供访问
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: web-app
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
matchLabels 匹配标签

删除、修改RS控制器会维持期望
a、特性
rs 在标签选择器上,除了可以定义键值对的选择形式,还支持 matchExpressions 字段,可以提供多种 选择。 目前支持的操作包括:
In:label 的值在某个列表中
NotIn:label 的值不在某个列表中
Exists:某个 label 存在
DoesNotExist:某个 label 不存在
b、存在运算符
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-me-exists-demo
spec:
selector:
matchExpressions:
- key: app
operator: Exists
template:
metadata:
labels:
app: spring-k8s
spec:
containers:
- name: rs-me-exists-demo-container
image: wangyanglinux/myapp:v1.0
ports:
- containerPort: 80
matchExpressions:
- key: app
operator: Exists//是说只要有app 这个 key ,value无所谓

只有是自己的孩子才会被计数
c、In 运算符
在新版k8s中,创建的时候会去判断 pod的标签是否在 标签选择器之中,不在的话会报错
下面就不在
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-me-in-demo
spec:
selector:
matchExpressions:
- key: app
operator: In
values:
- spring-k8s
- hahahah
template:
metadata:
labels:
app: sg-k8s
spec:
containers:
- name: rs-me-in-demo-container
image: wangyanglinux/myapp:v1.0
ports:
- containerPort: 80

修正后
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-me-in-demo
spec:
selector:
matchExpressions:
- key: app
operator: In
values:
- spring-k8s
- hahahah
template:
metadata:
labels:
app: hahahah
spec:
containers:
- name: rs-me-in-demo-container
image: wangyanglinux/myapp:v1.0
ports:
- containerPort: 80

3、Deployment

滚动跟新

3.1 概念
核心作用:Deployment 为 Pod 和 ReplicaSet 提供声明式定义方法,用以替代旧的 ReplicationController,从而更便捷地管理应用。
典型应用场景:
定义 Deployment 来创建 Pod 和 ReplicaSet;
实现应用的滚动升级与回滚;
对应用进行扩容(增加实例数)和缩容(减少实例数);
暂停或继续 Deployment 的部署流程。
3.2 声明式 vs 命令式
1. 声明式 vs 命令式的核心区别
声明式:聚焦“最终要达成的结果”,仅陈述意图(而非实现过程的细节)。
以 Kubernetes 为例:表述为 “集群中应该存在一个包含 3 个 Pod 的 ReplicaSet”,只需定义“期望状态”,由系统自动实现。
命令式:聚焦“主动执行的动作”,直接下达命令。
以 Kubernetes 为例:表述为 “创建一个包含 3 个 Pod 的 ReplicaSet”,需明确指定“做什么”和“怎么做”。
2. Kubernetes 中基于声明式配置的
kubectl命令示例
$ kubectl replace -f deployment.yaml:用
deployment.yaml中定义的配置“命令式”,完全替换已有配置,完全替换集群中已有资源(若资源不存在则创建)。
$ kubectl apply -f deployment.yaml:根据
deployment.yaml定义的“声明式意图”,对集群资源执行创建/更新(跟新新配置的,剩余保留)。
$ kubectl diff -f deployment.yaml:对比
deployment.yaml中声明的配置与集群当前实际状态,输出差异(用于预检变更,避免意外修改)。
3.3 实验
清除pod、控制器 和 除k8s之外的 svc
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: myapp-deploy
name: myapp-deploy
spec:
replicas: 1
selector:
matchLabels:
app: myapp-deploy
template:
metadata:
labels:
app: myapp-deploy
spec:
containers:
- image: wangyanglinux/myapp:v1.0
name: myapp
spec:
replicas: //默认值是1
编写、创建,将pod数量设置成10

使用,是只更新新的内容
kubectl apply -f 5.deployment.yaml
使用,是直接覆盖整个文件
kubectl replace -f 5.deployment.yaml

3.4 Deployment 常用命令解析
a --recoded
kubectl create -f deployment.yaml --record
--record 参数可以记录历史命令,方便查询版本变化
如果 1 、 2 次加了,第三次没加,第三次的记录会照抄第二次
kubectl create、apply、replace
create (很笨不知道资源清单更新)
创建资源对象
-f 通过基于文件的创建,但是如果此文件描述的对象存在,那么哪怕文件描述的信息发生了改变,再次提交时也不会应用
apply (维护资源清单更新的部分)
创建资源对象、修改资源对象
-f 基于文件创建,如果目标对象与文件本身发生改变,那么会根据文件的指定一一修饰对象的属性(部分更新)
replace (资源清单更新后,重建所有对象)
创建资源对象、修改资源对象
-f 基于文件创建,如果目标对象与文件本身发生改变,那么会重建此对象(替换)
b 调整副本数量
kubectl scale deployment nginx-deoloyment --replicas 10
c 自动扩缩容
kubectl autoscale deployment nginx-deployment --min10 --max15 --cpu-percent=80
d 设置镜像
kubectl set image deployment/nginx-deployment podname=地址
kubectl set image <资源类型>/<资源名称> <容器名>=<镜像地址:标签>
是更新一部分、创建一部分 -- 滚动跟新

--pending pod创建了,但是还没有被分配到节点
e 打补丁
kubectl patch deployment 控制器名字 -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'
调整滚动跟新的数量
// kubectl patch更新 Deployment 镜像
kubectl patch deployment deployment-demo \
--patch '{"spec": {"template": {"spec": {"containers": [{"name": "deployment-demo-container","image":"wangyanglinux/myapp:v2.0"}]}}}}'
kubectl:Kubernetes 官方命令行工具,用于与集群交互。
patch:kubectl 子命令,作用是对资源做「局部更新」(无需替换整个资源定义,仅修改指定字段)。
deployment deployment-demo:指定资源类型为Deployment,资源名称为deployment-demo(即要更新的目标 Deployment)。
--patch:后接「补丁内容」(以 JSON 格式编写),用于描述要修改的资源字段。补丁内容的层级解释(JSON 结构):
补丁的核心是修改
Deployment中容器镜像,因此需要定位到 Pod 模板里的容器:
最外层
{ "spec": { ... } }:spec是 Deployment 的「规格定义」,包含模板、副本数等核心配置。中间层
{ "template": { "spec": { ... } } }:
template是 Deployment 的「Pod 模板」(所有新创建的 Pod 都基于该模板生成);
template.spec是 Pod 的「规格定义」,包含容器、存储、网络等配置。最内层
{ "containers": [ { "name": "...", "image": "..." } ] }:
containers是 Pod 中「容器列表」;匹配
name: "deployment-demo-container"的容器,将其image修改为wangyanglinux/myapp:v2.0(即把容器镜像从旧版本升级到v2.0)。
// kubectl rollout pause暂停滚动更新
kubectl rollout pause deploy deployment-demo
- •
rollout:kubectl 子命令,用于管理资源的「滚动更新」过程(如查看状态、暂停/继续/回滚等)。- •
pause:子命令动作,作用是暂停 Deployment 的滚动更新。- •
deploy:deployment的缩写,指定资源类型为Deployment。- •
deployment-demo:目标 Deployment 名称。
// 恢复跟新
kubectl rollout resume deploy deployment名字
f 回滚
kubectl rollout undo deployment/nginx-deployment
deployment/nginx-deployment
[资源类型]/[资源名称]:
通过控制RS的期望值来实现
kubectl rollout status deployment nginx-deployment
echo $?
回滚操作,其中 “echo $?” 可以在回滚完成后执行,若返回 0 证明成功
kubectl rollout undo deployment/nginx-deployment --to-revsion=2
回滚到指定版本
kubectl rollout pause deploy deployment-demo
kubectl rollout resume deploy deployment名字
暂停滚动
恢复滚动
3.5 Dployment 更新策略

默认值
1.16版 deployment在跟新的时候允许 多/少 25%

修改
kubectl explain deploy.spec.strategy.type
Recreat //重建
rollingUpdate //滚动跟新
maxSurge: 1 或者 25% //最多允许比期望多几个
maxUnavailable: 1 或者 25% //最多可以比期望少几个
3.6 Deployment 清理策略
可以通过 备份资源清单 修改备份资源清单
然后 “ kubectl apply -f xxx.yaml” 实现滚动跟新
历史的控制器都存在etcd中
您可以通过设置
.spec.revisionHistoryLimit项来指定 deployment 最多保留多少 revision 历史记录。默认的会保留所有的 revision;如果将该项设置为0,Deployment 就不允许回退了

删除控制器创建的pod
先删除控制器(否则pod杀不干净) -- 》 由控制器创建的pod会自己撕掉
kubectl delete rc --all
因为pod是根据pod控制器创建的,pod控制器是根据 资源清单创建的
删除pod和控制器的话,也可以直接删除对应的资源清单
更多推荐



所有评论(0)