首页 > 其他分享 >11. Kubernetes - Deployment

11. Kubernetes - Deployment

时间:2022-10-20 11:02:24浏览次数:48  
标签:11 kubectl ReplicaSet Kubernetes deploy nginx Deployment Pod

Deployment

已经知道 ReplicaSet 控制器是用来维护集群中运行的 Pod 数量,但生产中一般不会直接使用它,而是会使用更上层封装的控制器,比如 Deployment。

Deployment(部署),和名字一样,其核心的功能就是实现了 Pod 的滚动更新。这对于线上的服务做到不中断发布非常重要。


通过命令可以查看到 Deployment 的资源清单参数(deployment 可以像 replicaset 一样简写为 deploy):

kubectl explain deploy

以一个 Deployment 的资源清单为例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx
  namespace: default
  # 这里的标签只是起着说明和描述作用
  labels:
    serviceName: nginx
    version: v1.0
spec:
  # 等待指定时间后才升级,默认 0,意味着容器启动起来后就提供服务,在某些情况下可能会造成服务不正常
  minReadySeconds: 10
  # 副本数
  replicas: 3
  # 历史版本保留个数,用于回滚
  revisionHistoryLimit: 10
  # 标签选择器
  selector:
    matchLabels:
      app: nginx
      env: prod
  # 更新策略
  strategy:
    # 支持 RollingUpdate(滚动更新)和 Recreate(重建)
    type: RollingUpdate
    # 滚动更新策略配置
    rollingUpdate:
      # 滚动更新过程中,不可用的副本数或者占期望值的最大比例,可以是具体值也可以是百分比
      maxUnavailable: 1
      # 滚动更新过程中,副本总数超过期望值的上限,可以是具体值也可以是百分比,两个值不能同时为 0
      maxSurge: 1
  # Pod 模板
  template:
    metadata:
      labels:
        app: nginx
        env: prod
    spec:
      containers:
        - name: nginx-containers
          image: nginx:1.7.9
          ports:
            - containerPort: 80

配置方式和 ReplicaSet 几乎一致,只是多了 strategy 更新策略的配置。


查看创建的相关信息:

# 获取创建的 Deployment
kubectl get deploy

# 获取 Deployment 管理的 RS
kubectl get rs

# 获取 Deployment 详细信息
kubectl describe deploy deploy-nginx

# 获取 RS 详细信息
kubectl describe rs deploy-nginx-6bf679967d 

# 查看相关 Pod 详细信息
kubectl describe pod deploy-nginx-6bf679967d-nzr86

通过上面的查看方式可以发现:

  • Deployment 详细信息中 Annotations 中的 revision 表示当前的版本。会面可以根据它实现版本回滚。
  • ReplicaSet 详细信息中的 Controlled By: Deployment/deploy-nginx 说明了它是被 Deployment 管理的资源对象。
  • Pod 详细信息中的 Controlled By: ReplicaSet/deploy-nginx-6bf679967d 说明了实际是 ReplicaSet 管理 Pod。

Deployment、ReplicaSet,Pod 的关系如图所示:

image

Deployment 中的容器重启策略必须是 restartPolicy=Always 。因为容器必须始终保证自己处于 Running 状态,ReplicaSet 才可以去明确调整 Pod 的个数。

Deployment 通过管理 ReplicaSet 的数量和属性来实现 水平扩展/收缩 以及 滚动更新

水平伸缩

水平扩展 / 收缩一般有两种方式:

  1. 修改资源清单中 Pod 副本数量,然后 apply,让 ReplicaSet 去更新。也可以通过命令来直接修改 Deployment 的镜像:
# 直接设置某些配置
kubectl set image deploy deploy-nginx nginx=nginx:1.9.1

# 直接编辑配置修改
kubectl edit deploy deploy-nginx

  1. 过命令行指定副本数进行扩缩容:
kubectl scale deploy deploy-nginx --replicas=4

通过命令进行的修改更适合临时调整,因为下一次修改资源清单 apply 的时候就会按照资源清单中定义重新变回原来的样子。

滚动更新

相对于 ReplicaSet 的资源配置清单,Deployment 中主要新增了滚动更新相关参数:

minReadySeconds: 5
strategy:
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 1
    maxUnavailable: 1

参数说明:

  • minReadySeconds:等待指定的时间后才进行升级,默认为 0。
    • 配置这个值的作用在于,某些应用可能启动完成后过几秒钟就挂了,如果直接就接入流量过去,可能出现服务无法访问。
  • type=RollingUpdate:设置更新策略为滚动更新。
    • 支持 Recreate(重新创建,一次性杀掉全部 Pod,然后启动一批新的)RollingUpdate(滚动更新) 两个值。默认 RollingUpdate。
  • maxSurge:升级过程中最多可以比原先设置多出的 Pod 数量。
    • 例如 maxSurage=1,replicas=5,更新就会先启动一个新的 Pod,完成后才删掉一个旧的 Pod,整个升级过程中最多会有 6 个 Pod。
  • maxUnavaible:升级过程中最多有多少个 Pod 处于无法提供服务的状态,当 maxSurge 不为 0 时,该值也不能为 0。
    • 例如 maxUnavaible=1,则整个升级过程中最多会有 1 个 Pod 处于无法服务的状态。

滚动更新示意图:

image

滚动更新其实就是 Deployment 新建一个 ReplicaSet,然后滚动着慢慢往新的 RS 中迁移。

版本回滚

通过调整 Deployment 的资源清单多执行几次发布,然后查看历史版本:

# 查看历史版本
kubectl rollout history deploy deploy-nginx

# 查看更新过程
kubectl rollout status deploy deploy-nginx

# 暂停更新
kubectl rollout pause deploy deploy-nginx

# 恢复更新
kubectl rollout resume deploy deploy-nginx

# 查看指定历史版本的信息
kubectl rollout history deploy deploy-nginx --revision=1

# 回滚到上个版本
kubectl rollout undo deploy deploy-nginx

# 回滚到指定版本
kubectl rollout undo deploy deploy-nginx --to-revision=1

如果资源清单跟历史的某个版本调整为一致,Kubernetes 就会认为是在做回滚。

标签:11,kubectl,ReplicaSet,Kubernetes,deploy,nginx,Deployment,Pod
From: https://www.cnblogs.com/ezops/p/16808953.html

相关文章

  • Wireshark for Ethical Hackers - 11
    WiresharkforEthicalHackers-11CapturingTrafficWheretocapturetraffic?Locally(GUIandCLI)RemotelyInlineHub-HalfduplexTestAccessPort(TAP)......
  • 【luogu CF1140F】Extending Set of Points(线段树分治)
    ExtendingSetofPoints题目链接:luoguCF1140F题目大意有一个点集,有一个扩展操作是加入符合条件的(x0,y0)直到不能加入位置。符合条件是原来(x0,y0)不存在而且存......
  • Kubernetes集群架构与组件
    Kubernetes集群架构图:简化版架构图:kube-apiserver:集群的统一入口,各组件协调者,以RESTfulAPI提供接口服务,所有对象资源的增删改查和监听都交给aipserver处理后在提交......
  • DFS练习: POJ1010 POJ1011 POJ1020 POJ1321 POJ1416 POJ1724
    POJ1010packagepoj1010;importjava.util.Arrays;importjava.util.Scanner;/***@Authorjinjun99*@DateCreatedin2022/10/418:11*@Description*@S......
  • DFS练习: POJ2362 POJ2676 POJ2698 POJ3083 POJ3411
    POJ2362packagepoj2362;importjava.util.Scanner;/***@Authorjinjun99*@DateCreatedin2022/10/513:22*@Description*用到了定序剪枝,遍历正方形的......
  • JDK-11.0.17 + Neo4j-4.4.12
    JDK安装下载地址:https://www.oracle.com/java/technologies/javase-downloads.html 注册Oracle账户,并下载,选择路径安装,将bin配置到环境变量PathNeo4j安装......
  • 通过X11远程使用eclipse
    local端使用MobarXterm,默认开启了X11forwarding和X11Server。remote端是ubuntu22桌面版。在/etc/ssh/sshd_config中修改设置AllowTcpForwardingyesX11Forwardingye......
  • CodeCraft-21 and Codeforces Round #711 C
    C.PlanarReflections考虑dpdp[i][j]表示i能量的在第j层的cnt显然我们会分裂成左右两部分dp[i][j]=dp[i-1][n-j]+dp[i][j-1]我们为了不讨论方向问题直接记忆化搜索......
  • C++11 实现一个自动注册的工厂
    之前在项目代码里面看到同事写了个自动注册的工厂类,虽然当时我看不懂,但我大受震撼。今天又重新温习了一下这种写法,分享给大家,可见学好C++是多么的重要。实现动机工厂方法......
  • 【Kubernetes】K8s笔记(九):DaemonSet 守护进程集
    目录0.Deployment有哪些不足1.使用YAML描述DaemonSet对象2.在Kubernetes里使用DaemonSet3.Taint和Toleration4.静态PodkubernetesDaemonSetdocs0.Dep......