云原生工程师-5.k8s控制器-Replicaset和Deployment

个人博客

4.1-什么是Replicaset

4.1.1-Replicaset 概述

简称rs:ReplicaSet 是 kubernetes 中的一种副本控制器,控制管理Pod,使Pod的副本数量始终维持在预设个数。作用是保证一定数量的Pod在集群中正常运行,它会持续监听这些Pod状态,发送故障时重启,减少时运行新的副本。

官方建议不要直接使用rs,用deployment取代。deployment支持声明式更新,不会丢失历史变更。

deployment管理replicaset管理pod

4.1.2-Replicaset管理Pod的工作原理

rs的主要核心作用在于代用户管理Pod,多退少补,自动扩缩容。

rs主要的三个部分:

1.pod副本数

2.标签选择器:管理那些pod

3.pod资源模板:新创建的pod由模板启动

4.1.3-Replicaset资源清单编写
apiVersion: apps/v1
kind: Replicaset
metadata:
  name:
  labels:
    key:value
spec:
  replicas: #副本数
  selector: #匹配pod的标签选择器
    matchLabels:
      key:value
  template: #pod模板
    metadata:
    spec:
#两个spec,第一个为副本数,标签选择器,模板;第二个为pod对象属性
#在.spec.selector 中定义的标签选择器必须能够匹配到spec.template.metadata.labels 里定义的 Pod 标签,否则 Kubernetes 将不允许创建 ReplicaSet。
4.1.4-Replicaset示例
apiVersion: apps/v1
kind: Replicaset
metada:
  name: frontend
  labels:
    demo: demo
    tier: frontend
spec:
  replicas: 3
  selector:
    tier: frontend
  template:
    metada:
      labels:
        tier: frontend
    spec:
      containers:
      - name: test-rs
        image: docker.io/circleci/frontend:latest
#pod的名字是由控制器名字-随机数组组成
4.1.5-Replicaset管理pod:扩容,缩容,更新
#rs最核心的功能是动态扩容和回缩。只需修改replicaset再执行
kubectl apply -f name.yaml
#或者直接编辑
kubectl edit rs name
#rs实现pod的更新滚动更新
#apply edit修改image
#虽然镜像已经更新了,但是原来的pod还是使用的之前的镜像,只有新创建的pod才会使用最新的镜像,需要delete删除旧的pod

#生产环境如果升级,可以删除一个 pod,观察一段时间之后没问题再删除另一个 pod,但是这样需要人工干预多次;实际生产环境一般采用蓝绿发布,原来有一个 rs1,再创建一个 rs2(控制器),通过修改 service 标签,修改 service 可以匹配到 rs2 的控制器,这样才是蓝绿发布,这个也需要我们精心的部署规划,我们有一个控制器就是建立在 rs 之上完成的,叫做 Deployment

4.2-什么是Deployment

4.2.1-Deployment概述

1.Deployment 是 kubernetes 中最常用的资源对象,为 ReplicaSet 和 Pod 的创建提供了一种声明式的定义方法,在 Deployment 对象中描述一个期望的状态,Deployment 控制器就会按照一定的控制速率把实际状态改成期望状态,通过定义一个 Deployment 控制器会创建一个新的 ReplicaSet 控制器,通过ReplicaSet 创建 pod,删除 Deployment 控制器,也会删除 Deployment 控制器下对应的 ReplicaSet 控制器和 pod 资源.

2.声明式定义是指直接修改资源清单 yaml 文件,然后通过 kubectl apply -f 资源清单 yaml 文 件,就可以更改资源

3.Deployment有比rs更多的功能,如滚动升级和回滚

4.滚动升级和回滚的实现:

Deployment 控制器是建立在 rs 之上的一个控制器,可以管理多个 rs,每次更新镜像版本,都会生 成一个新的 rs,把旧的 rs 替换掉,多个 rs 同时存在,但是只有一个 rs 运行。

rs v1 控制三个 pod,删除一个 pod,在 rs v2 上重新建立一个,依次类推,直到全部都是由 rs v2 控制,如果 rs v2 有问题,还可以回滚,Deployment 是建构在 rs 之上的,多个 rs 组成一个 Deployment,但是只有一个 rs 处于活跃状态.

在这里插入图片描述

4.2.2-Deployment工作原理

deploy使用声明式定义,直接通过纯命令对资源版本进行修改(打补丁方式);对deploy来讲,我们在实现更新时还可以控制更新节奏和更新逻辑

deploy在升级的过程中,会控制副本的数量之外还能额外增加几个副本,但是不能少;升级的时候先增加一个,再删除一个。比如5个,最多就是6个,最少是4个;第一次加一个,删除
两个,第二次加两个,删除两个,依次类推,可以自己控制更新方式,这种滚动更新需要加readinessProbe 和 livenessProbe 探测,确保 pod 中容器里的应用都正常启动了才删除之前的 pod。

假如目标是 5 个,允许一个也不能少,允许最多可以 10 个,那一次加 5 个即可;这就是控制更新的方法

功能:

1、创建 ReplicaSet 和 Pod

2、滚动升级(不停止旧服务的状态下升级)和回滚应用(将应用回滚到之前的版本)

3、平滑地扩容和缩容

4、暂停和继续 Deployment

4.2.3-Deployment资源清单编写
apiVersion: apps/v1
kind: Replicaset
metadata:
  name:
  labels:
    key:value
spec:
  minReadySeconds: #k8s在等待设置的时间后才进行升级,没有k8s会假设容器启动了就提供服务了
  paused: boolean #暂停,更新的时候创建pod先暂停,不是立刻升
  progressDeadlineSeconds: #升级过程中有可能由于各种原因升级卡住(这个时候还没有明确的升级失败),比如在拉取被墙的镜像,权限不够等错误。那么这个时候就需要有个 deadline ,在 deadline 之内如果还卡着,那么就上报这个情况,这个时候这个 Deployment 状态就被标记为 False,并且注明原因。但是它并不会阻止 Deployment 继续进行卡住后面的操作。完全由用户进行控制。 
  replicas: #副本数
  revisionHistoryLimit: #保留的历史版本,默认是 10 
  strategy: #更新策略
    rollingUpdate:
      maxSurge: #最多允许超出的指定的目标副本数有几个;第一种直接给定数量,第二种根据百分比,百分比表示原本是 5 个,最多可以超出 20%,那就允许多一个,最多可以超过 40%,那就允许多两个
      maxUnavailable: #最多允许几个不可用 假设有 5 个副本,最多一个不可用,就表示最少有 4 个可用
    tyep: #支持两种更新,Recreate 和 RollingUpdate,#Recreate 是重建式更新,删除一个更新一个;#RollingUpdate 滚动更新,定义滚动更新方式,也就是 pod 能多几个,少几个 
  selector: #匹配pod的标签选择器
    matchLabels:
      key:value
  template: #pod模板
    metadata:
    spec:
      ephemeralContainers: #定义临时容器,临时容器与其他容器的不同之处在于,它们缺少对资源或执行的保证,并且永远不会自动重启,因此不适用于构建应用程序。临时容器使用与常规容器相同的 ContainerSpec 段进行描述,但许多字段是不相容且不允许的。临时容器没有端口配置;Pod 资源分配是不可变的,因此 resources 配置是不允许的。当由于容器崩溃或容器镜像不包含调试应用程序而导致 kubectl exec 无用时,临时容器对于交互式故障排查很有用。
      hostAliases: #在 pod 中增加域名解析的
      - ip: "0.0.0.0"
        hostnames:
        - "localhost"
      hostIPC: <boolean> #使用主机 IPC 
      hostNetwork: <boolean> #是否使用宿主机的网络 
      hostPID: <boolean> #可以设置容器里是否可以看到宿主机上的进程。True 可以 
      hostname: <string> 
      imagePullSecrets: <[]Object> 
      initContainers: <[]Object> #定义初始化容器 
      nodeName: <string> #定义 pod 调度到具体哪个节点上 
      nodeSelector: <map[string]string> #定义节点选择器
      restartPolicy: <string> #Pod 重启策略 
      securityContext: <Object> #是否开启特权模式
      terminationGracePeriodSeconds: <integer> 
#在真正删除容器之前,K8S 会先发终止信号(kill -15 {pid})给容器,默认 30s 
      tolerations: <[]Object> #定义容忍度         
#两个spec,第一个为副本数,标签选择器,模板;第二个为pod对象属性
#在.spec.selector 中定义的标签选择器必须能够匹配到spec.template.metadata.labels 里定义的 Pod 标签,否则 Kubernetes 将不允许创建 ReplicaSet。
4.2.4-Deployment使用案例
apiVersion: v1
kind: Deployment
metadata:
  name: demo-web
spec:
  replicas: 2
  selector:
    matchLabels:
      demo: web
      version: v1
  template:
    metadata:
      labels:
        demo: web
        version: v1
    spec:
      containers:
      - name: demo-web-deploy
        image: docker.io/library/nginx:latest
        ports:
        - containerProt: 80
[root@master2 deploy]# kubectl apply -f nginx.yaml
[root@master2 deploy]# kubectl get deploy
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
demo-web   2/2     2            2           59s
          (已更新到所需状态的副本数)(可以使用多少个应用程序副本) 
4.2.5-Deployment管理pod:扩容,缩容,滚动更新,回滚
扩容缩容: #vi apply修改或者edit修改:replicas
更新镜像: #监测kubectl get pods -l demo=web -w;可以看到是滚动更新,先启动一个新的,停掉一个旧的;
[root@master2 deploy]# kubectl get pods -l demo=web -w
NAME                       READY   STATUS              RESTARTS   AGE
demo-web-8448d88b9-7gtxj   1/1     Running             0          10m
demo-web-8448d88b9-gpgs4   1/1     Running             0          10m
demo-web-b4f89bffc-gkrnl   0/1     ContainerCreating   0          1s
demo-web-b4f89bffc-gkrnl   0/1     ContainerCreating   0          1s
demo-web-b4f89bffc-gkrnl   1/1     Running             0          6s
demo-web-8448d88b9-7gtxj   1/1     Terminating         0          10m
demo-web-b4f89bffc-ld586   0/1     Pending             0          0s
demo-web-b4f89bffc-ld586   0/1     Pending             0          0s
demo-web-b4f89bffc-ld586   0/1     ContainerCreating   0          0s
demo-web-8448d88b9-7gtxj   1/1     Terminating         0          10m
demo-web-8448d88b9-7gtxj   0/1     Terminating         0          10m
demo-web-b4f89bffc-ld586   0/1     ContainerCreating   0          2s
demo-web-8448d88b9-7gtxj   0/1     Terminating         0          10m
demo-web-8448d88b9-7gtxj   0/1     Terminating         0          10m
demo-web-b4f89bffc-ld586   1/1     Running             0          5s
demo-web-8448d88b9-gpgs4   1/1     Terminating         0          11m
demo-web-8448d88b9-gpgs4   1/1     Terminating         0          11m
demo-web-8448d88b9-gpgs4   0/1     Terminating         0          11m
demo-web-8448d88b9-gpgs4   0/1     Terminating         0          11m
demo-web-8448d88b9-gpgs4   0/1     Terminating         0          11m
回滚: #kubectl get rs 可以看到两个rs,一个是旧的。
[root@master2 deploy]# kubectl get rs
NAME                 DESIRED   CURRENT   READY   AGE
demo-web-8448d88b9   0         0         0       13m
demo-web-b4f89bffc   2         2         2       3m2s
#查看历史版本
[root@master2 deploy]# kubectl rollout history deployment demo-web
deployment.apps/demo-web
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
#回滚之前版本
[root@master2 deploy]# kubectl rollout undo deployment demo-web --to-revision=1
deployment.apps/demo-web rolled back
4.2.6-Deployment-自定义滚动更新策略
sepc:
  strategy: #更新策略
    rollingUpdate:
      maxSurge: #最多允许超出的指定的目标副本数有几个;第一种直接给定数量,第二种根据百分比,百分比表示原本是 5 个,最多可以超出 20%,那就允许多一个,最多可以超过 40%,那就允许多两个
      maxUnavailable: #最多允许几个不可用 假设有 5 个副本,最多一个不可用,就表示最少有 4 个可用
    type: #支持两种更新,Recreate 和 RollingUpdate,#Recreate 是重建式更新,删除一个更新一个;#RollingUpdate 滚动更新,定义滚动更新方式,也就是 pod 能多几个,少几个;默认为双25%

maxUnavailable:

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永恒布gg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值