K8S-Deployment资源对象

一、概述

Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用。

典型的应用场景包括:

  • 定义Deployment来创建Pod和ReplicaSet

  • 滚动升级和回滚应用

  • 扩容和缩容

  • 暂停和继续Deployment更新

Deployment表示用户对K8S集群的一次更新操作。Deployment是一个比RS( Replica Set, RS) 应用模型更广的 API 对象,可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。滚动升级一个服务,实际是创建一个新的RS,然后逐渐将新 RS 中副本数增加到理想状态,将旧RS中的副本数减少到0的复合操作。

这样一个复合操作用一个RS是不好描述的,所以用一个更通用的Deployment来描述。以K8S的发展方向,未来对所有长期伺服型的业务的管理,都会通过Deployment来管理。

二、YAML文件详解

apiVersion: apps/v1 #接口版本
kind: Deployment #接口类型
metadata:
name: cango-demo #Deployment名称
namespace: cango-prd #命名空间
labels:
app: cango-demo #标签
spec:
replicas: 3
selector:
matchLabels:
app: cango-demo #匹配模板中label
strategy:
rollingUpdate: ##由于replicas为3,则整个升级,pod个数在2-4个之间
maxSurge: 1 #滚动升级时会先启动1个pod
maxUnavailable: 1 #滚动升级时允许的最大Unavailable的pod个数
template:
metadata:
labels:
app: cango-demo #模板名称必填
sepc: #定义容器模板,该模板可以包含多个容器
containers:

  • name: cango-demo1 #镜像名称
    image: swr.cn-east-2.myhuaweicloud.com/cango-prd/cango-demo:0.0.1-SNAPSHOT #镜像地址
    command: "/bin/sh","-c","cat /etc/config/path/to/special-key" #启动命令
    args: #启动参数
  • '-storage.local.retention=$(STORAGE_RETENTION)'
  • '-storage.local.memory-chunks=$(STORAGE_MEMORY_CHUNKS)'
  • '-config.file=/etc/prometheus/prometheus.yml'
  • '-alertmanager.url=http://alertmanager:9093/alertmanager'
  • '-web.external-url=$(EXTERNAL_URL)'
    #如果command和args均没有写,那么用Docker默认的配置。
    #如果command写了,但args没有写,那么Docker默认的配置会被忽略而且仅仅执行.yaml文件的command(不带任何参数的)。
    #如果command没写,但args写了,那么Docker默认配置的ENTRYPOINT的命令行会被执行,但是调用的参数是.yaml中的args。
    #如果如果command和args都写了,那么Docker默认的配置被忽略,使用.yaml的配置。
    imagePullPolicy: IfNotPresent #如果不存在则拉取
    livenessProbe: #表示container是否处于live状态。如果LivenessProbe失败,LivenessProbe将会通知kubelet对应的container不健康了。随后kubelet将kill掉container,并根据RestarPolicy进行进一步的操作。默认情况下LivenessProbe在第一次检测之前初始化值为Success,如果container没有提供LivenessProbe,则也认为是Success;
    httpGet:
    path: /health #如果没有心跳检测接口就为/
    port: 8080
    scheme: HTTP
    initialDelaySeconds: 60 ##启动后延时多久开始运行检测
    timeoutSeconds: 5
    successThreshold: 1
    failureThreshold: 5
    readinessProbe:
    httpGet:
    path: /health #如果没有心跳检测接口就为/
    port: 8080
    scheme: HTTP
    initialDelaySeconds: 30 ##启动后延时多久开始运行检测
    timeoutSeconds: 5
    successThreshold: 1
    failureThreshold: 5
    resources: ##CPU内存限制
    requests:
    cpu: 2
    memory: 2048Mi
    limits:
    cpu: 2
    memory: 2048Mi
    env: ##通过环境变量的方式,直接传递pod=自定义Linux OS环境变量
  • name: LOCAL_KEY #本地Key
    value: value
  • name: CONFIG_MAP_KEY #局策略可使用configMap的配置Key,
    valueFrom:
    configMapKeyRef:
    name: special-config #configmap中找到name为special-config
    key: special.type #找到name为special-config里data下的key
    ports:
  • name: http
    containerPort: 8080 #对service暴露端口
    volumeMounts: #挂载volumes中定义的磁盘
  • name: log-cache
    mountPath: /tmp/log
  • name: sdb #普通用法,该卷跟随容器销毁,挂载一个目录
    mountPath: /data/media
  • name: nfs-client-root #直接挂载硬盘方法,如挂载下面的nfs目录到/mnt/nfs
    mountPath: /mnt/nfs
  • name: example-volume-config #高级用法第1种,将ConfigMap的log-script,backup-script分别挂载到/etc/config目录下的一个相对路径path/to/...下,如果存在同名文件,直接覆盖。
    mountPath: /etc/config
  • name: rbd-pvc #高级用法第2中,挂载PVC(PresistentVolumeClaim)

#使用volume将ConfigMap作为文件或目录直接挂载,其中每一个key-value键值对都会生成一个文件,key为文件名,value为内容,
volumes: # 定义磁盘给上面volumeMounts挂载

  • name: log-cache
    emptyDir: {}
  • name: sdb #挂载宿主机上面的目录
    hostPath:
    path: /any/path/it/will/be/replaced
  • name: example-volume-config # 供ConfigMap文件内容到指定路径使用
    configMap:
    name: example-volume-config #ConfigMap中名称
    items:
  • key: log-script #ConfigMap中的Key
    path: path/to/log-script #指定目录下的一个相对路径path/to/log-script
  • key: backup-script #ConfigMap中的Key
    path: path/to/backup-script #指定目录下的一个相对路径path/to/backup-script
  • name: nfs-client-root #供挂载NFS存储类型
    nfs:
    server: 10.42.0.55 #NFS服务器地址
    path: /opt/public #showmount -e 看一下路径
  • name: rbd-pvc #挂载PVC磁盘
    persistentVolumeClaim:
    claimName: rbd-pvc1 #挂载已经申请的pvc磁盘

三、企业应用案例

3.1 环境准备

创建my-blue.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: mydm
spec:
replicas: 3
selector:
matchLabels:
app: myapp-blue #匹配模板中label
template:
metadata:
labels:
app: myapp-blue
spec:
containers:

  • name: myapp-blue
    image: janakiramm/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
  • containerPort: 80

创建访问service my-blue-service.yaml

apiVersion: v1
kind: Service
metadata:
name: service-blue
spec:
selector:
app: myapp-blue
type: NodePort
ports:

  • port: 80
    nodePort: 30030
    targetPort: 80

提交对应的资源清单

root@k8s-master01 \~# kubectl apply -f my-blue.yaml
root@k8s-master01 \~# kubectl apply -f my-blue-service.yaml
#查看对应的资源
root@k8s-master01 \~# kubectl get pod
NAME READY STATUS RESTARTS AGE
mydm-7755b9f55f-7h2nb 1/1 Running 0 69s
mydm-7755b9f55f-bj9gf 1/1 Running 0 69s
mydm-7755b9f55f-hjckc 1/1 Running 0 69s
mydm-7755b9f55f-lfvrd 1/1 Running 0 69s
mydm-7755b9f55f-lxzw4 1/1 Running 0 69s
mydm-7755b9f55f-v74w8 1/1 Running 0 69s
root@k8s-master01 \~# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service-blue NodePort 10.10.157.201 <none> 80:30030/TCP 87s

3.2 扩缩容

修改对应的yaml文件中的replicas的数量

apiVersion: apps/v1
kind: Deployment
metadata:
name: mydm
spec:
replicas: 5
selector:
matchLabels:
app: myapp-blue #匹配模板中label
template:
metadata:
labels:
app: myapp-blue
spec:
containers:

  • name: myapp-blue
    image: janakiramm/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
  • containerPort: 80

3.3 滚动更新

修改对应的yaml文件中的image信息

apiVersion: apps/v1
kind: Deployment
metadata:
name: mydm
spec:
replicas: 3
selector:
matchLabels:
app: myapp-blue #匹配模板中label
template:
metadata:
labels:
app: myapp-blue
spec:
containers:

  • name: myapp-blue
    image: janakiramm/myapp:v2
    imagePullPolicy: IfNotPresent
    ports:
  • containerPort: 80

3.4 回滚

查看历史版本

root@k8s-master01 \~# kubectl rollout history deployment name

回滚操作

root@k8s-master01 \~# kubectl rollout undo deployment name --to-revision=1

四、自定义更新策略

4.1类型

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

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

4.2 设置方式

  1. 按数量
  • maxUnavailable: 0, 副本数

  • maxSurge: 0, 副本数

  • 注两者不能同时为0。

  1. 按比例
  • maxUnavailable: 0%, 100% 向下取整,比如10个副本,5%的话==0.5个,但计算按照0个;

  • maxSurge: 0%, 100% 向上取整,比如10个副本,5%的话==0.5个,但计算按照1个;

  • 两者不能同时为0。

4.3 配置案例

apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-v1
spec:
replicas: 3
selector:
matchLabels:
app: myapp
version: v1
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
template:
metadata:
labels:
app: myapp
version: v1
spec:
containers:

  • name: myapp
    image: janakiramm/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
  • containerPort: 80
相关推荐
java_logo17 分钟前
Docker 部署 openGauss:轻松搭建企业级开源关系型数据库平台
数据库·docker·开源·opengauss·轩辕镜像·opengauss部署教程·opengauss部署文档
HjhIron32 分钟前
前端开发必会的Docker实战:从“我电脑能跑”到“轻松部署”
docker
嘟嘟071732 分钟前
从浏览器到 hello world:Docker + nginx 反向代理 + Node 最小服务器一次讲清
docker·容器·node.js
阿黎梨梨1 小时前
Docker 容器化实战:从零搭建 Web 服务与反向代理
前端·后端·docker
小月土星1 小时前
当 LLM 遇上集装箱:我的 Docker 学习笔记与 AI 后端的思考(含反向代理Nginx)
后端·docker·容器
Kismet_nvi1 小时前
Kubernetes 核心模块详细总结
云原生·容器·kubernetes
何时梦醒2 小时前
Docker 容器化入门:从「我电脑能跑」到「哪台机器都能跑」
后端·docker·面试
烬羽2 小时前
nginx 里写 localhost 反而 502?一条请求带你彻底搞懂 Docker 端口映射与反向代理
nginx·docker·程序员
jimidou2 小时前
从 PM2、Supervisor 到 Docker:老项目部署现代化实战(以 HOJ 评测机为例)
docker
小林ixn2 小时前
Docker + Nginx 反向代理:从“我电脑能跑”到“哪里都能跑”
nginx·docker·容器