天天看点

【06】Kubernets:资源清单(控制器 - Deployment)

写在前面的话

上一节主要简单的提了一下控制器都有哪些常用的,并且简单的功能是啥,最后一并提了 ReplicaSet 控制器。

但是 ReplicaSet 一般不需要我们直接配置,多以从本节开始,开始学习 K8S 默认的控制器 Deployment。

Deployment 资源清单

和 rs 一样,deployment 我们也可以简写成 deploy,先简单的看下其资源清单的结构,如下表:

deployment
apiVersion apps/v1 
kind Deployment
metadata 和其他 metadata 一样,包括 name / labels 等
spec
minReadySeconds 最小准备时间
paused 暂停
replicas 副本数量
revisionHistoryLimit 历史版本保存数量,默认 10
rollbackTo
revision 回滚到指定版本 
selector
matchExpressions 标签选择器
matchLabels 标签选择器(一般用这个)
strategy
rollingUpdate
maxSurge 能被同一时间升级允许的最大 Pod 数,可以是数字或百分比
maxUnavailable 同一时间不允许升级数,可以是数字或者百分比
type 选择方式,可以是 RollingUpdate(默认)或者 Recreate
template
Pod 的 metadata
Pod 的 spec

Deployment 示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-demo
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: erp
      release: stable
  template:
    metadata:
      name: deploy-container
      namespace: default
      labels:
        app: erp
        release: stable
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
        - name: https
          containerPort: 443      

运行:我们这里将不再使用 create 根据配置文件创建,而是使用 apply 创建:

# 创建
kubectl apply -f deploy-demo.yaml

# 查看
kubectl get deploy
kubectl get rs
kubectl get pods      

结果如图:

【06】Kubernets:资源清单(控制器 - Deployment)

我们说过 Deployment 属于 ReplicaSet 的更上层,所以我们创建 Deploy 之后是可以查看到 ReplicaSet 的,而且根据命名的特点我们也可以发现:

Deploy --> ReplicaSet --> Pod 命令属于一级一级的增加。其中 rs 名字后面的随机数其实际是模板名称的 hash 值。

此时我们可以做个升级测试,修改 yaml 中的镜像版本由 v1 改为 v2:

kubectl apply -f deploy-demo.yaml      

再度应用配置查看:

kubectl get pods -l app=erp -w      

通过该方法我们可以看到整个过程,完成后查看 rs:

kubectl get rs -o wide      
【06】Kubernets:资源清单(控制器 - Deployment)

可以看到原来 v1 版本的 rs 在运行变成了 0,而 v2 版本的变成了 2,但是 v1 版本的 rs 并未删除。

这是由于我们保存历史版本的原因,也就是:

kubectl rollout history deployment deploy-demo      
【06】Kubernets:资源清单(控制器 - Deployment)

使用打补丁的方式直接修改 Pod 数量:

kubectl patch deployment deploy-demo -p '{"spec":{"replicas":3}}'      
【06】Kubernets:资源清单(控制器 - Deployment)

同样,我们可以使用另外的方法更新,比如更新镜像版本:

kubectl set image deployment deploy-demo myapp=ikubernetes/myapp:v3      

结果如图: 

【06】Kubernets:资源清单(控制器 - Deployment)

在更新过程中,我们可以使用 pause 暂停实现金丝雀发布: 

kubectl rollout pause deployment deploy-demo      

那么他会根据更新策略进行一次更新后暂停,等待下次 resume 后完全更新:

kubectl rollout resume deployment deploy-demo      

这里就不做过多演示了。

同样,回滚历史版本:

kubectl rollout undo deployment deploy-demo --to-revision=2      
【06】Kubernets:资源清单(控制器 - Deployment)

小结

其实对于 Deployment,我们需要记忆的并不多,因为之前的 Pod 和 RS 中已经将底层的知识记了一遍,我们在这里只是相当于在他的外面继续套了一层套子。