K8S之Deployment的介绍和使用

Deployment的理论和实操

Deployment控制器:概念、原理解读

概述

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

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

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

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

工作原理

Deployment可以使用声明式定义,直接在命令行通过纯命令的方式完成对应资源版本的内容的修改,也就是通过打补丁的方式进行修改;Deployment能提供滚动式自定义自控制的更新;对Deployment来讲,在实现更新时还可以实现控制更新节奏和更新逻辑。

什么叫做更新节奏和更新逻辑呢?

默认先创建再删除

比如说Deployment控制5个pod副本,pod的期望值是5个,但是升级的时候需要额外多几个pod,那我们控制器可以控制在5个pod副本之外还能再增加几个pod副本;比方说能多一个,但是不能少,那么升级的时候就是先增加一个,再删除一个,始终保持pod副本数是5个;

通过Deployment对象,可以做到以下事情:

1、创建ReplicaSet和Pod

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

3、平滑地扩容和缩容

4、暂停和继续Deployment

科普:金丝雀就是先放一个新的,保留几个老的。新的就是试水的金丝雀

编写Deployment资源清单文件

查看Deployment资源对象由哪几部分组成

bash 复制代码
 kubectl explain deployment

查看Deployment下的spec字段

bash 复制代码
kubectl explain deployment.spec

字段说明

  • minReadySeconds:k8s在等待设置的时间后才进行升级(如果没有设置该值,k8s会容器启动起来后就提供服务了)
  • paused:暂停,当我们更新的时候创建pod先暂停,不是立即更新
  • progressDeadlineSeconds:k8s 在升级过程中有可能由于各种原因升级卡住(这个时候还没有明确的升级失败),比如在拉取被墙的镜像,权限不够等错误。那么这个时候就需要有个 deadline ,在 deadline 之内如果还卡着,那么就上报这个情况,这个时候这个 Deployment 状态就被标记为 False,并且注明原因。但是它并不会阻止 Deployment 继续进行卡住后面的操作。完全由用户进行控制。
  • replicas:副本数
  • revisionHistoryLimit:保留的历史版本,默认是10
  • selector:标签选择器,选择它关联的pod(必须设置的参数)
  • strategy:更新策略
  • template:定义的pod模板(必须设置的参数)

查看Deployment下的spec.strategy字段

bash 复制代码
kubectl explain deploy.spec.strategy

支持两种更新,RecreateRollingUpdate

  • Recreate:重建式更新,删除一个更新一个
  • RollingUpdate:滚动更新,定义滚动更新方式,也就是pod能多几个,少几个(默认策略)

查看Deployment下的spec.strategy.rollingUpdate字段

bash 复制代码
kubectl explain deploy.spec.strategy.rollingUpdate

字段说明

  • maxSurge:更新的过程当中最多允许超出的指定的目标副本数有几个;
    它有两种取值方式,第一种直接给定数量,第二种根据百分比,百分比表示原本是5个,最多可以超出20%,那就允许多一个,最多可以超过40%,那就允许多两个
    允许存在的pod: 目标副本数 + maxSurge
  • maxUnavailable:最多允许几个不可用
    假设有5个副本,最多一个不可用,就表示最少有4个可用
    允许存在的pod: 目标副本数 - maxUnavailable

例如:

查看Deployment下的spec.template字段

template为定义Pod的模板,Deployment通过模板创建Pod

bash 复制代码
kubectl explain deploy.spec.template

deployment.spec.template为Pod定义的模板,和Pod定义不太一样,template中不包含 apiVersion 和 Kind 属性,要求必须有metadata。deployment.spec.template.spec为容器的属性信息,其他定义内容和Pod一致。

使用案例:创建一个web站点

deployment是一个三级结构,deployment管理replicaset,replicaset管理pod,

例子:用deployment创建一个pod

bash 复制代码
vim deploy-demo.yaml 

编写Deployment资源文件

yaml 复制代码
apiVersion: apps/v1  # deployment对应的api版本
kind: Deployment     # 创建的资源是deployment
metadata:
  name: web-v1    # deployment的名字
spec:
  replicas: 2     # deployment管理的pod副本数
  selector:       # 标签选择器
    matchLabels:  # 筛选定义的标签需要跟template.metadata.labels定义的标签一致
      font: web
      version: v1
  template:
    metadata:
      labels:    # Pod具有的标签
        font: web
        version: v1
    spec:   #定义容器的属性
      containers:  
      - name: myweb
        image: janakiramm/myapp:v1     # 容器使用的镜像
        imagePullPolicy: IfNotPresent  # 镜像拉取策略
        ports:
        - containerPort: 80     # 容器里的应用的端口

更新资源清单文件

bash 复制代码
kubectl apply -f deploy-demo.yaml

kubectl apply:表示声明式的定义,既可以创建资源,也可以动态更新资源

查看deploy状态

bash 复制代码
kubectl get deploy

1.NAME :列出名称空间中deployment的名称。

2.READY:显示deployment有多少副本数。它遵循ready/desired的模式。

3.UP-TO-DATE: 显示已更新到所需状态的副本数。

4.AVAILABLE: 显示你的可以使用多少个应用程序副本。

5.AGE :显示应用程序已运行的时间。

bash 复制代码
kubectl get rs

注:创建deploy的时候也会创建一个rs(replicaset)

ReplicaSet的名称始终设置为[DEPLOYMENT-NAME]-[RANDOM-STRING]。

RANDOM-STRING是随机生成的(引用pod的模板template的名字的hash值 )

1.NAME: 列出名称空间中ReplicaSet资源

2.DESIRED:显示应用程序的所需副本数,这些副本数是在创建时定义的。这是所需的状态。

3.CURRENT: 显示当前正在运行多少个副本。

4.READY: 显示你的用户可以使用多少个应用程序副本。

5.AGE :显示应用程序已运行的时间。

bash 复制代码
kubectl get pods -o wide | grep web

请求刚才创建的pod资源

bash 复制代码
curl 10.244.36.82

Deployment管理pod:扩容、缩容

通过deployment管理应用,实现扩容,把副本数变成3

bash 复制代码
vim  deploy-demo.yaml 

直接修改replicas数量,如下,变成3

spec:

replicas: 3

修改之后保存退出,执行

bash 复制代码
kubectl apply -f deploy-demo.yaml 

注意:apply不同于create,apply可以执行多次;create执行一次,再执行就会报错复。

bash 复制代码
kubectl get pods 

上面可以看到pod副本数变成了3个

查看web-v1这个控制器的详细信息

bash 复制代码
kubectl describe deploy web-v1

通过deployment管理应用,实现缩容,把副本数变成2

bash 复制代码
vim  deploy-demo.yaml 

直接修改replicas数量,如下,变成2

spec:

replicas: 2

修改之后保存退出,执行

bash 复制代码
 kubectl apply -f deploy-demo.yaml
bash 复制代码
kubectl get pods
相关推荐
Algorithm15766 分钟前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
蜜獾云1 小时前
docker 安装雷池WAF防火墙 守护Web服务器
linux·运维·服务器·网络·网络安全·docker·容器
年薪丰厚2 小时前
如何在K8S集群中查看和操作Pod内的文件?
docker·云原生·容器·kubernetes·k8s·container
zhangj11252 小时前
K8S Ingress 服务配置步骤说明
云原生·容器·kubernetes
岁月变迁呀2 小时前
kubeadm搭建k8s集群
云原生·容器·kubernetes
墨水\\2 小时前
二进制部署k8s
云原生·容器·kubernetes
Source、2 小时前
k8s-metrics-server
云原生·容器·kubernetes
上海运维Q先生2 小时前
面试题整理15----K8s常见的网络插件有哪些
运维·网络·kubernetes
颜淡慕潇2 小时前
【K8S问题系列 |19 】如何解决 Pod 无法挂载 PVC问题
后端·云原生·容器·kubernetes
ProtonBase2 小时前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构