Pod控制器

Replication Controller(RC)

        Replication Controller简称RC,RC是Kubernetes系统中的核心概念之一,简单来说,RC可以保证在任意时间运行Pod的副本数量,能够保证Pod总是可用的。如果实际Pod数量比指定的多那就结束掉多余的,如果实际数量比指定的少就新启动一些Pod,当Pod失败、被删除或者挂掉后,RC都会去自动创建新的Pod来保证副本数量,所以即使只有一个Pod,我们也应该使用RC来管理我们的Pod。

        Kubernetes的资源对象

                Replication Controller:用来部署、升级Pod

                Replica Set:下一代的Replication Controller

                Deployment:可以更加方便的管理Pod和Replica Set

        RC应用

                

vi nginx_rc.yaml
piVersion: v1
kind: ReplicationController
metadata:
  name: rc-demo
  labels:
    name: rc
spec:
  replicas: 3
  selector:
    name: rc
  template:
    metadata:
     labels:
       name: rc
    spec:
     containers:
     - name: nginx-demo
       image: hub.atomgit.com/library/nginx:1.24
       ports:
       - containerPort: 80

# kind:ReplicationController

# spec.replicas: 指定Pod副本数量,默认为1

# spec.selector: RC通过该属性来筛选要控制的Pod

# spec.template: 这里就是我们之前的Pod的定义的模块,但是不需要apiVersion和kind了

# spec.template.metadata.labels: 注意这里的Pod的labels要和spec.selector相同,这样RC就可以来控制当前这个Pod了。

#这个YAML文件中的意思就是定义了一个RC资源对象,它的名字叫rc-demo,保证一直会有3个Pod运行,Pod的镜像是nginx镜像。

[root@master ~]# cat nginx_rc.yaml

apiVersion: v1

kind: ReplicationController

metadata:

  name: rc-demo

  labels:

    name: rc

spec:

  replicas: 3

  selector:

    name: rc

  template:

    metadata:

     labels:

       name: rc

    spec:

     containers:

     - name: nginx-demo

       image: nginx:1.20

       ports:

       - containerPort: 80

[root@master ~]# kubectl apply -f nginx_rc.yaml

replicationcontroller/rc-demo created

[root@master ~]# kubectl get pod

NAME            READY   STATUS              RESTARTS   AGE

rc-demo-tv7tc   0/1     ContainerCreating   0          4s

rc-demo-vprgq   0/1     ContainerCreating   0          4s

rc-demo-w7lw8   0/1     ContainerCreating   0          4s

你也可以使用尝试删除一个pod,会发现删除以后又会启动一个pod。

# 查看rc

[root@master ~]# kubectl get rc

NAME      DESIRED   CURRENT   READY   AGE

rc-demo   3         3         3       4m3s

        RC滚动更新

# rolling-update在1.11版开始过时的,控制Pod副本数量后面我们主要使用Deployment
kubectl rolling-update rc-demo --image=nginx:1.21

Replication Set(RS)

        Replication Set简称RS,随着Kubernetes的高速发展,官方已经推荐我们使用RS和Deployment来代替RC了,实际上RS和RC的功能基本一致,目前唯一的一个区别就是RC只支持基于等式的selector(env=dev或environment!=qa),但RS还支持基于集合的selector(version in (v1.0, v2.0)),这对复杂的运维管理就非常方便了。

        RC/RS的特性和作用

                我们可以通过定义一个RC实现的Pod的创建和副本数量的控制

                RC中包含一个完整的Pod定义模块(不包含apiversion和kind)

                RC是通过label selector机制来实现对Pod副本的控制的

                通过改变RC里面的Pod副本数量,可以实现Pod的扩缩容功能

                通过改变RC里面的Pod模板中镜像版本,可以实现Pod的滚动升级功能(但是不支持一键回滚,需要用相同的方法去修改镜像地址)

        RS应用

                1.

vi nginx_rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: hub.atomgit.com/library/nginx:1.24

        与replication controll类似,rs是他的升级版

[root@master ~]# kubectl apply -f nginx_rs.yaml

replicaset.apps/nginx created

[root@master ~]# kubectl get rs

NAME    DESIRED   CURRENT   READY   AGE

nginx   3         3         3       7m15s

[root@master ~]# kubectl get pod

NAME          READY   STATUS    RESTARTS   AGE

nginx-jfw4d   1/1     Running   0          7m17s

nginx-kwpbr   1/1     Running   0          7m17s

nginx-x6bls   1/1     Running   0          7m17s

 Deployment

        Deployment同样也是Kubernetes系统的一个核心概念,主要职责和RC、RS一样的都是保证Pod的数量和健康,通过定义一个Deployment控制器会创建一个新的ReplicaSet控制器,通过ReplicaSet创建pod,删除Deployment控制器,也会删除Deployment控制器下对应的ReplicaSet控制器和pod资源。二者大部分功能都是完全一致的,我们可以看成是一个升级版的RC、RS控制器

        功能

                事件和状态查看:可以查看Deployment的升级详细进度和状态

                回滚:当升级Pod的时候如果出现问题,可以使用回滚操作回滚到之前的任一版本

                版本记录:每一次对Deployment的操作,都能够保存下来,这也是保证可以回滚到任一版本的基础

                暂停和启动:对于每一次升级都能够随时暂停和启动

        一般无状态服务都是使用Deployment来进行管理

        无状态服务

                服务不依赖自身的状态,实例的状态数据可以维护在内存中。

                任何一个请求都可以被任意一个实例处理。

                不存储状态数据,实例可以水平拓展,通过负载均衡将请求分发到各个节点。

                在一个封闭的系统中,只存在一个数据闭环。

                通常存在于单体架构的集群中。

        

maxSurge和maxUnavailable用来控制滚动更新的更新策略

maxUnavailable:和期望ready的副本数比,不可用副本数最大比例(或最大值),这个值越小,越能保证服务稳定,更新越平滑;

maxSurge:和期望ready的副本数比,超过期望副本数最大比例(或最大值),这个值调的越大,副本更新速度越快。

取值范围

数值

  1. maxUnavailable: [0, 副本数]

  2. maxSurge: [0, 副本数]

     注意:两者不能同时为0

比例

  1. maxUnavailable: [0%, 100%] 向下取整,比如10个副本,5%的话==0.5个,但计算按照0个;

  2. maxSurge: [0%, 100%] 向上取整,比如10个副本,5%的话==0.5个,但计算按照1个;

     注意:两者不能同时为0

建议配置

  1. maxUnavailable == 0

  2. maxSurge == 1

        Deployment应用

                

vi nginx_deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: nginx
  labels: 
    app: nginx
spec:
  replicas: 6
  selector:
    matchLabels:
      app: nginx
  # 用于将现有 Pod 替换为新 Pod 的部署策略。
  strategy:
    rollingUpdate: 
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: hub.atomgit.com/library/nginx:1.20
        imagePullPolicy: IfNotPresent
~                                     

[root@master ~]# kubectl apply -f nginx_deployment.yaml

deployment.apps/nginx created

[root@master ~]# kubectl get deployment

NAME    READY   UP-TO-DATE   AVAILABLE   AGE

nginx   6/6     6            6           63s

[root@master ~]# kubectl get pod

NAME                     READY   STATUS    RESTARTS   AGE

nginx-795ff9d4cc-8hjqr   1/1     Running   0          11s

nginx-795ff9d4cc-fr9dx   1/1     Running   0          14s

nginx-795ff9d4cc-ldvb4   1/1     Running   0          9s

nginx-795ff9d4cc-mpdx5   1/1     Running   0          13s

nginx-795ff9d4cc-mwccx   1/1     Running   0          8s

nginx-795ff9d4cc-wxrs9   1/1     Running   0          6s

        扩缩容Pod应用 

# 修改yaml文件中的replicas配置,然后重新应用yaml文件

# replicas的值修改的比之前多就是扩容,比之前少就是缩容

[root@master ~]# vi nginx_deployment.yaml

[root@master ~]# kubectl apply -f nginx_deployment.yaml

deployment.apps/nginx configured

# 还可以使用edit直接修改

[root@master ~]# kubectl get deployment

NAME    READY   UP-TO-DATE   AVAILABLE   AGE

nginx   8/8     8            8           4m7s

# 找到replicas配置修改完以后保存退出即可

[root@master ~]# kubectl edit deployment nginx

deployment.apps/nginx edited

[root@master ~]# kubectl get deployment

NAME    READY   UP-TO-DATE   AVAILABLE   AGE

nginx   9/9     9            9           5m33s

# 使--replicas指定数量即可

[root@master ~]# kubectl scale deployment nginx --replicas=2

deployment.apps/nginx scaled

 滚动更新应用

        更新

        

# 编写yaml文件中image,然后重新应用yaml文件

[root@master ~]# vi nginx_deployment.yaml

[root@master ~]# kubectl apply -f nginx_deployment.yaml

deployment.apps/nginx configured

[root@master ~]# kubectl get pod

NAME                     READY   STATUS              RESTARTS   AGE

nginx-5ff79c7ff8-865kg   0/1     ContainerCreating   0          0s

nginx-5ff79c7ff8-lttfr   1/1     Running             0          2s

nginx-795ff9d4cc-29z2t   1/1     Running             0          32s

nginx-795ff9d4cc-dxst6   1/1     Running             0          32s

nginx-795ff9d4cc-grmwm   1/1     Running             0          32s

nginx-795ff9d4cc-kpdzl   1/1     Terminating         0          32s

nginx-795ff9d4cc-xtwbc   1/1     Running             0          32s

nginx-795ff9d4cc-xztdg   1/1     Running             0          32s

nginx-795ff9d4cc-z2cxn   1/1     Running             0          32s

nginx-795ff9d4cc-zh5gn   1/1     Running             0          32s

# 使用该命令可以查看发布历史

[root@master ~]# kubectl rollout history deployment nginx

deployment.apps/nginx

REVISION  CHANGE-CAUSE

1         <none>

2         <none>

# 使用--revision可以查看某个发布历史的具体信息

[root@master ~]# kubectl rollout history deployment nginx --revision=1

deployment.apps/nginx with revision #1

Pod Template:

  Labels: app=nginx

pod-template-hash=795ff9d4cc

  Containers:

   nginx:

    Image: nginx:1.20

    Port: <none>

    Host Port: <none>

    Environment: <none>

    Mounts: <none>

  Volumes: <none>

[root@master ~]# kubectl rollout history deployment nginx --revision=2

deployment.apps/nginx with revision #2

Pod Template:

  Labels: app=nginx

pod-template-hash=5ff79c7ff8

  Containers:

   nginx:

    Image: nginx:1.21

    Port: <none>

    Host Port: <none>

    Environment: <none>

    Mounts: <none>

  Volumes: <none>

# 可以使用kubectl set image命令来进行滚动更新

[root@master ~]# kubectl get deployment

NAME    READY   UP-TO-DATE   AVAILABLE   AGE

nginx   8/8     8            8           6m50s

[root@master ~]# kubectl set image deployment nginx nginx=nginx:1.22

deployment.apps/nginx image updated

[root@master ~]# kubectl get pod

NAME                     READY   STATUS              RESTARTS   AGE

nginx-5ff79c7ff8-778cz   1/1     Running             0          7m40s

nginx-5ff79c7ff8-865kg   1/1     Running             0          7m43s

nginx-5ff79c7ff8-c8ccl   1/1     Running             0          7m42s

nginx-5ff79c7ff8-cx9g4   1/1     Running             0          7m38s

nginx-5ff79c7ff8-hcj4d   1/1     Running             0          7m41s

nginx-5ff79c7ff8-lttfr   1/1     Running             0          7m45s

nginx-5ff79c7ff8-srmdq   1/1     Running             0          7m39s

nginx-5ff79c7ff8-zq9nk   1/1     Running             0          7m37s

nginx-7c8489bfcf-n2kkw   0/1     ContainerCreating   0          5s

# 查看发布状态

[root@master ~]# kubectl rollout status deployment nginx

deployment "nginx" successfully rolled out

        查看拉取镜像失败的pod的原因

#kubectl describe rs 失败pod的name
kubectl describe rs nginx-94578b596

K8s中的Pod控制器是用来管理和控制Pod的一种机制。Pod控制器负责创建、启动、停止、重启和删除Pod,以及监控和调节Pod的状态。Pod和Controller之间是通过label标签来建立关系,Controller又被称为控制器工作负载。Pod控制器可以根据需要创建多个Pod实例,以满足应用程序的需求。 常见的Pod控制器包括Deployment、ReplicaSet、StatefulSet和DaemonSet等。Deployment控制器是K8s中最常用和最重要的Pod控制器之一。它通过创建和管理ReplicaSet来实现对Pod的控制。Deployment控制器可以定义应用的副本数、升级和回滚策略,以及弹性伸缩等功能。通过使用Deployment控制器,可以方便地部署和管理应用程序。 在使用K8s时,可以使用yaml文件来定义Pod控制器的配置和参数。通过指定不同的字段和数值,可以实现对Pod控制器的定制化配置。例如,可以在yaml文件中指定应用程序的镜像、资源需求、副本数等信息。 总结来说,K8s中的Pod控制器是用来管理和控制Pod的机制,通过label标签与Pod建立关系。常见的Pod控制器包括Deployment、ReplicaSet、StatefulSet和DaemonSet。使用yaml文件可以对Pod控制器进行配置和定制化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [k8s技术交流,包括Pod概念和特点Pod种类Pod镜像拉取策略Pod重启策略Pod控制器Pod探针、Pod调度](https://download.csdn.net/download/lingmeng447/85358750)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【k8s】6、pod控制器](https://blog.csdn.net/hancoder/article/details/118064163)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值