[kubernetes] deployment

春衣少年当酒歌,起舞四顾以笑和。这篇文章主要讲述[kubernetes] deployment相关的知识,希望能为你提供帮助。
?      Deployment 是最常用的用于部署无状态服务的方式。Deployment 控制器使得我们能够以声明的方式更新 Pod(容器组)和 ReplicaSet(副本集)。目前生产上几乎不会直接使用ReplicaSet,而是直接使用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

   
        3)查看svc
kubectl get svc # 或者 kubect get service


        4)测试访问



??02 Deployment更新策略
??        02.1  RollingUpdate  滚动升级策略
    • maxUnavailable:表示在更新过程中能够进入不可用状态的pod最大值(个人理解就是同一时间最多可以删除几个Pod,默认最多是25%)
    • maxSurge:表示额外创建的Pod个数(个人理解就是同一时间最多可以创建几个Pod,默认最多是25%)


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

            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


        c)查看更新历史和更新进度
kubectl rollout history deploy/nginx-deployment


kubectl rollout status deploy/nginx-deployment


        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状态。

        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个

        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再拉起的。

??03  Deployment回滚??
      Deployment回滚比较简单,主要是前期一定要做好更新的描述,以便自己能准确的选择回滚版本。回滚和更新是一样的,也是由新旧ReplicaSet进行交替部署。
        a)查看更新的历史版本
kubectl rollout history deploy/nginx-deployment


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




【[kubernetes] deployment】


    推荐阅读