[kubernetes] deployment

112 阅读3分钟

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

图片

本文使用 文章同步助手 同步