k8s学习记录,RC/RS和Deployment(七)

RC和RS是部署Pod的两种方式,但是在生产环境中主要使用Deployment等方式进行Pod的管理和部署,这里只做了解

RC 复制控制器【Replication Controller】

可以确保Pod副本数达到期望值,可确保一个Pod或一组同类Pod总是可用

RS 复制集【Replica Set】

是支持基于集合的标签选择器的下一代RC,它主要用作Deployment协调创建、删除和更新Pod,它和RC的唯一区别是 RS支持标签选择器

实际应用中,虽然ReplicaSet可以单独使用,但是一般建议使用Deployment来自动管理ReplicaSet,除非自定义的Pod不需要更新或有其他编排等

  • StatefulSet 是一个有状态的应用部署【类似Redis、Rabbitmq】

  • DaemonSet 会在每个符合标签的节点上都会启一个容器,类似Calico,日志收集等【不支持scale扩容,每个主机一个】

  • Deployment 用于部署无状态的服务,最常用的控制器。一般用于管理维护企业内部无状态的微服务,比如:configserver,zuul,springboot;它可以管理多个副本的Pod,实现无缝迁移、自动扩容缩容,自动灾难恢复,一键回滚等功能。

Deployment

命令创建:

kubectl create deployment nginx --image=nginx:1.15.2

k8s学习记录,RC/RS和Deployment(七)

yaml文件创建:

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2020-09-19T02:41:11Z"
  generation: 1
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  progressDeadlineSeconds: 600
  replicas: 2 #副本数
  revisionHistoryLimit: 10 # 历史记录保留的个数
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.15.2
        imagePullPolicy: IfNotPresent
        name: nginx
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30

需要注意⚠️:

selector和metadata中的labels必须要配置成一样的,并且创建之后不可以修改

selector:
    matchLabels:
      app: nginx
.......
  metadata:
      creationTimestamp: null
      labels:
        app: nginx

更新Deployment

命令

修改nginx deployment中 pod名为nginx的镜像版本为nginx:1.15.3,并且record记录下,后续可以查看详细的修改记录

kubectl set image deploy nginx nginx=nginx:1.15.3 --record

k8s学习记录,RC/RS和Deployment(七)
k8s学习记录,RC/RS和Deployment(七)
k8s学习记录,RC/RS和Deployment(七)

命令查看滚动更新的过程状态

kubectl rollout status deploy nginx

k8s学习记录,RC/RS和Deployment(七)

回滚Deployment

1、直接回滚到上一个版本

查看历史版本

kubectl rollout history deploy nginx

k8s学习记录,RC/RS和Deployment(七)

开始回滚

kubectl rollout undo deploy nginx

k8s学习记录,RC/RS和Deployment(七)
k8s学习记录,RC/RS和Deployment(七)
⚠️可以看到镜像版本已经由nginx:bbbbajzjahq1adaqxxxxxagdfqqaaaa 回滚到了nginx:1adaqxxxxxagdfqqaaaa,向上回滚了1个版本

2、回滚到指定版本

查看指定版本的详细信息

kubectl rollout history deploy nginx --revision=3

k8s学习记录,RC/RS和Deployment(七)

回滚到指定的版本

kubectl rollout undo deploy nginx --to-revision=3

k8s学习记录,RC/RS和Deployment(七)
k8s学习记录,RC/RS和Deployment(七)

Deployment扩容

命令扩容/缩容

#扩容nginx这个deployment,增加为4个副本
kubectl scale --replicas=4 deploy nginx

k8s学习记录,RC/RS和Deployment(七)

修改yaml文件扩容/缩容

kubectl edit deploy nginx

k8s学习记录,RC/RS和Deployment(七)
k8s学习记录,RC/RS和Deployment(七)

Deployment更新暂停和恢复

每执行一个set命令,就会触发一次更新

#deployment暂停功能
kubectl rollout pause deployment nginx  #暂停

#进行第一次更新
kubectl set image deploy nginx=nginx:1.15.3 --record

#进行第二次更新,添加CPU内存配置
kubectl set resources deploy nginx -c nginx --limits=cpu=100m,memory=64Mi --requests=cpu=20m,memory=16Mi --record

#deployment恢复,开始执行上面的修改操作
kubectl rollout resume deploy nginx

k8s学习记录,RC/RS和Deployment(七)
k8s学习记录,RC/RS和Deployment(七)

Deployment更新注意事项

清理策略:

在默认情况下,revision保留10个旧的ReplicaSet,其余的将在后台进行垃圾回收,可以在.spec.revisionHistoryLimit设置保留ReplicaSet的个数。当设置为0时,不保留历史记录

spec:
  progressDeadlineSeconds: 600
  replicas: 2 #副本数
  revisionHistoryLimit: 10 # 历史记录保留的个数

.spec.minReadySeconds:可选参数,指定新创建的Pod在没有任何容器崩溃的情况下视为Ready最小的秒数,默认为0,即一旦被创建就视为可用。

滚动更新的策略

.spec.strategy.type:更新deployment的方式,默认是RollingUpdate

  1. RollingUpdate:滚动更新,可以指定maxSurge和maxUnavailable
  • maxUnavailable:指定在回滚或更新时最大不可用的Pod的数量,可选字段,默认25%,可以设置成数字或百分比,如果该值为0,那么maxSurge就不能0
  • maxSurge:可以超过期望值的最大Pod数,可选字段,默认为25%,可以设置成数字或百分比,如果该值为0,那么maxUnavailable不能为0
  1. Recreate:重建,先删除旧的Pod,在创建新的Pod
上一篇:k8s pod 如何删除


下一篇:Kubernetes入门(三)——使用Deployment运行一个无状态应用