自学内容网 自学内容网

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


原文地址:https://blog.csdn.net/m0_75135871/article/details/142489487

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!