Deployment 是最常用的用于部署无状态服务的方式。Deployment 控制器使得我们能够以声明的方式更新 Pod(容器组)和 ReplicaSet(副本集)。目前生产上几乎不会直接使用ReplicaSet,而是直接使用Deployment

[kubernetes] deployment_副本集



01 创建Deployment

    1)创建Deployment

# 创建dp.yaml
cat dp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3 # 3副本
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: harbor.ywsn.com/library/nginx:latest # 镜像
ports:
- containerPort: 80 # 暴露的端口
# 创建svc.yaml
cat svc.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx-svc
name: nginx-svc
spec:
ports:
- port: 80
targetPort: 80
selector:
app: nginx
# 应用
[root@host211 ~]# kubectl apply -f http://k8s-yaml.ywsn.com/nginx/dp.yaml
deployment.apps/nginx-deployment created
[root@host211 ~]# kubectl apply -f http://k8s-yaml.ywsn.com/nginx/svc.yaml
service/nginx-svc created

    2)查看Deployment

kubect get deployment # 或者 kubect get deploy

   [kubernetes] deployment_nginx_02

    3)查看svc

kubectl get svc # 或者 kubect get service

[kubernetes] deployment_回滚_03

    4)测试访问

[kubernetes] deployment_回滚_04


02 Deployment更新策略
​    02.1 RollingUpdate 滚动升级策略

    • maxUnavailable:表示在更新过程中能够进入不可用状态的pod最大值(个人理解就是同一时间最多可以删除几个Pod,默认最多是25%)

    • maxSurge:表示额外创建的Pod个数(个人理解就是同一时间最多可以创建几个Pod,默认最多是25%)


    RollingUpdate实际上是启动一个新的ReplicaSet,创建一部分新Pod,并缩减历史的ReplicaSet的数量,一直循环往复,直到达到预期值。

[kubernetes] deployment_副本集_05

       a)修改和更新dp.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
annotations:
kubernetes.io/change-cause: "http.v1.2" # 更新描述
spec:
revisionHistoryLimit: 10 # 保留更新历史版本数量,系统默认也是保留10个
strategy:
rollingUpdate:
type: RollingUpdate # 更新策略
replicas: 10 # 副本数
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: harbor.ywsn.com/library/nginx:v1.2
ports:
- containerPort: 80
# 更新
kubectl apply -f http://k8s-yaml.ywsn.com/nginx/dp.yaml

    b)查看pod情况,同一时间至少会有8个pod处于READY状态(10*0.25)

kubectl get pods

[kubernetes] deployment_nginx_06

    c)查看更新历史和更新进度

kubectl rollout history deploy/nginx-deployment

[kubernetes] deployment_回滚_07

kubectl rollout status deploy/nginx-deployment

[kubernetes] deployment_副本集_08

    d)设置maxUnavailable

# 修改dp.yaml 
kubernetes.io/change-cause: "http.v1.4" # 修改描述

strategy:
rollingUpdate:
maxUnavailable: 5 # 10个pod,同时最少处于running的pod为5个
...
image: harbor.ywsn.com/library/nginx:v1.4

# 更新
kubectl apply -f http://k8s-yaml.ywsn.com/nginx/dp.yaml

        可以看出最少有5个pod处于READY状态。

[kubernetes] deployment_副本集_09

    e)修改maxsurge

# 修改dp.yaml 
kubernetes.io/change-cause: "http.v1.4" # 修改描述

strategy:
rollingUpdate:
maxsurge: 4 # 同一时间,containerCreateing 最多比 Terminating多4个
...
image: harbor.ywsn.com/library/nginx:v1.5
# 更新
kubectl apply -f http://k8s-yaml.ywsn.com/nginx/dp.yaml

    可以看的到同一时间containerCreateing比terminating最多多了4个

[kubernetes] deployment_回滚_10

    f)需要注意的是,maxSurge和maxUnavailable不能同时设置为0


    02.2 Recreate升级策略

        Recreate即先将老的ReplicaSet期望实力数修改为0,等所有的pod终止后,再创建新的ReplicaSet,次更新策略生产上几乎不会使用,这里做个简单的演示即可。

         a)修改dp.yaml和更新

# vi dp.yaml
kubernetes.io/change-cause: "http.v1.6"
strategy:
rollingUpdate:
type: Recreate
...
image: harbor.ywsn.com/library/nginx:v1.6

# 更新
kubectl apply -f http://k8s-yaml.ywsn.com/nginx/dp.yaml

        可以看到是全部删除了pod再拉起的。

[kubernetes] deployment_回滚_11

03 Deployment回滚

    Deployment回滚比较简单,主要是前期一定要做好更新的描述,以便自己能准确的选择回滚版本。回滚和更新是一样的,也是由新旧ReplicaSet进行交替部署。

    a)查看更新的历史版本

kubectl rollout history deploy/nginx-deployment

[kubernetes] deployment_回滚_12

    b)进行回滚

# 如果不指定--to-revision参数,则默认回滚到上一个版本
kubectl rollout undo deploy/nginx-deployment --to-revision=2


[kubernetes] deployment_nginx_13