一、概述

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和控制器的话,也可以直接删除对应的资源清单

 

 

 

 

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐