Kubernetes运维之容器编排Deployment详解

Deployment介绍

官方介绍

一个 Deployment 为 Pods 和 ReplicaSets提供声明式的更新能力

负责描述 Deployment 中的 目标状态,而 Deployment 控制器(Controller) 以受控速率更改实际状态, 使其变为期望状态。你可以定义 Deployment 以创建新的ReplicaSet,或删除现有 Deployment, 并通过新的 Deployment 收养其资源。

而是通过管理ReplicaSet来间接管理pod,即:deployment管理ReplicaSet,ReplicaSet管理pod。所以Deployment比ReplicaSet的功能更强大。

一个Deployment产生三个资源:

  • Deployment资源所有功能
  • ReplicaSet资源的所有功能
  • POD资源

Deployment控制RS,RS控制POD副本数 Kubernetes官方强烈建议避免直接使用ReplicaSet,而应该通过Deployment来创建RS和Pod。

Deployment资源清单详解

代码语言:javascript
复制
apiVersion: apps/v1          # 版本号
kind: Deployment             # 类型
metadata:                    # 元数据
  name:                      # deploy名称,不能使用大写(遵循域名编写规范)
  namespace:                 # 所属命名空间
  labels:                    # 标签
    controller: deploy
spec:                        # 详情描述
  replicas:                  # 期望的数量(副本数量)
  revisionHistoryLimit:      # 保留历史版本,默认是10
  paused:                    # 暂停部署,默认是false
  progressDeadlineSeconds:   # 部署超时时间(s),默认是600
  minReadySeconds: 10        # 这个POD 10S以后才会认为是read状态,影响多久杀死旧的POD.
  strategy:                  # 部署策略,指定新策略
    type: RollingUpdates     # 更新策略,Recreate重新创建、RollingUpdates滚动升级。
    rollingUpdate:           # 详细滚动更新策略
      maxSurge:              # 最大可以存在的副本数,可以为百分比,也可以为整数
      maxUnavaliable:        # 最大不可用状态的pod的最大值,可以为百分比,也可以为整数
  selector:                  # 选择器,通过它指定该控制器管理哪些pod(必须字段)。
    matchLabels:             # Labels匹配规则,要与模板中Labels相匹配
       app: nginx-pod        # 和模板template里面POD标签必须一致。
    matchExpressions:        # 匹配表达式规则,不常用。
      - {key: app, operator: In, values: [nginx-pod]}
      # In: 表示key指定标签的值是在个集合内的
      # NotIn:表示key指定标签的值不是在这个集合内的
      # Exists:只要有key标签即可,不用管值是多少
      # DoesNotExist:只要Pod上没有指定标签,不用管值是多少
  template:                  # 模板,当副本数量不足时,会根据下面的创建pod
    metadata:                # POD的metadata。
        labels:
          app: nginx-pod     # 和selector标签必须一致
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        ports:
        - containerPort: 80  

创建Deployment

下面是 Deployment 示例。其中创建了一个 ReplicaSet,负责启动三个 nginx Pods:

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80