Kubernetes--Deployment使用

一. Replication Controller与Deployment的区别

1. Replication Controller

Replication Controller为Kubernetes的一个核心内容,应用托管到Kubernetes之后,Replication Controller需要保证应用能够持续的运行,主要的功能如下:
1)确保pod数量:它会确保Kubernetes中有指定数量的Pod在运行。如果少于指定数量的pod,Replication Controller会创建新 的,反之则会删除掉多余的以保证Pod数量不变。
2)确保pod健康:当pod不健康,运行出错或者无法提供服务时,Replication Controller也会杀死不健康的pod,重新创建新的。
3)弹性伸缩 :在业务高峰或者低峰期的时候,可以通过Replication Controller动态的调整pod的数量来提高资源的利用率。同时,配置相应的监控功能(Hroizontal Pod Autoscaler),会定时自动从监控平台获取Replication Controller关联pod的整体资源使用情况,做到自动伸缩。
4)滚动升级:滚动升级为一种平滑的升级方式,通过逐步替换的策略,保证整体系统的稳定,在初始化升级的时候就可以及时发现和解决问题,避免问题不断扩大。

2. Deployment

Deployment同样为Kubernetes的一个核心内容,主要职责同样是为了保证pod的数量和健康,90%的功能与Replication Controller完全一样,可以看做新一代的Replication Controller。但是,它又具备了Replication Controller之外的新特性:
1)Deployment继承了Replication Controller的全部功能。
2)可以查看Deployment的升级详细进度和状态。
3)回滚:当升级pod镜像或者相关参数的时候发现问题,可以使用回滚操作回滚到上一个稳定的版本或者指定的版本。
4)版本记录: 每一次对Deployment的操作,都能保存下来,给予后续可能的回滚使用。
5)暂停和启动:对于每一次升级,都能够随时暂停和启动。
6)多种升级方案:Recreate:删除所有已存在的pod,重新创建新的; RollingUpdate:滚动升级,逐步替换的策略,同时滚动升级时,支持更多的附加参数,例如设置最大不可用pod数量,最小升级间隔时间等等。

二. Deployment功能全部演示一遍

1. 演示文件docker-project.yaml

apiVersion:  apps/v1                      #当前格式的版本
kind:  Deployment                 #当前创建资源的类型, 当前类型是Deployment
metadata:                         #当前资源的元数据
  name:  docker-project              #当前资源的名字 是元数据必须的项
  annotations:
    kubernetes.io/change-cause: "初始化版本v1"  #记录到revision中的内容
spec:
  selector:
    matchLabels:
      app:  web_server                          #是当前Deployment的规格说明
  replicas:                       #指当前创建的副本数量 默认不填 默认值就为‘1’
  template:                         #定义pod的模板
    metadata:                       #当前pod的元数据
      labels:                       #至少顶一个labels标签,可任意创建一个 key:value
        app:  web_server
    spec:                           #当前pod的规格说明
      containers:                   #容器
      -  name: my-docker-project              #是容器的名字容器名字是必须填写的
         image: 192.168.214.128:5000/docker-project:v1      #镜像 镜像的名字和版本
         imagePullPolicy: Always        #拉取策略: Always--总是拉取 IfNotPresent--默认值,本地有则使用本地镜像,不拉取 Never--只使用本地镜像,从不拉取
         ports:
         - containerPort: 8080
         livenessProbe:
           httpGet:
             path: api/heathy
             port: 8080

---

kind: Service
apiVersion: v1
metadata:
  name: docker-project-service
spec:
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8080
      nodePort: 31000
  selector:
    app: web_server

2. 执行docker-project.yaml文件

kubectl apply -f docker-project.yaml
kubectl get deployment
kubectl get pod
kubectl get services; 

执行结果
Kubernetes--Deployment使用_第1张图片
查看详细的pod信息

kubectl get pods --show-labels

执行结果
在这里插入图片描述
页面查看结果
Kubernetes--Deployment使用_第2张图片

3. 增加滚动升级

1)升级策略:

minReadySeconds: 5
strategy:
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 1
    maxUnavailable: 1

2)参数含义

minReadySeconds:
  Kubernetes在等待设置的时间后才进行升级
  如果没有设置该值,Kubernetes会假设该容器启动起来后就提供服务了
  如果没有设置该值,在某些极端情况下可能会造成服务服务正常运行
maxSurge:
  升级过程中最多可以比原先设置多出的POD数量
  例如:maxSurage=1,replicas=5,则表示Kubernetes会先启动1一个新的Pod后才删掉一个旧的POD,整个升级过程中最多会有5+1个POD。
maxUnavaible:
  升级过程中最多有多少个POD处于无法提供服务的状态
  当maxSurge不为0时,该值也不能为0
  例如:maxUnavaible=1,则表示Kubernetes整个升级过程中最多会有1个POD处于无法服务的状态。

3)修改后的文件:

apiVersion:  apps/v1                      #当前格式的版本
kind:  Deployment                 #当前创建资源的类型, 当前类型是Deployment
metadata:                         #当前资源的元数据
  name:  docker-project              #当前资源的名字 是元数据必须的项
  annotations:
    kubernetes.io/change-cause: "将v1版本升级到v2"  #记录到revision中的内容
spec:
  minReadySeconds: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  selector:
    matchLabels:
      app:  web_server                          #是当前Deployment的规格说明
  replicas:                       #指当前创建的副本数量 默认不填 默认值就为‘1’
  template:                         #定义pod的模板
    metadata:                       #当前pod的元数据
      labels:                       #至少顶一个labels标签,可任意创建一个 key:value
        app:  web_server
    spec:                           #当前pod的规格说明
      containers:                   #容器
      -  name: my-docker-project              #是容器的名字容器名字是必须填写的
         image: 192.168.214.128:5000/docker-project:v2      #镜像 镜像的名字和版本
         imagePullPolicy: Always        #拉取策略: Always--总是拉取 IfNotPresent--默认值,本地有则使用本地镜像,不拉取 Never--只使用本地镜像,从不拉取
         ports:
         - containerPort: 8080
         livenessProbe:
           httpGet:
             path: api/heathy
             port: 8080

---

kind: Service
apiVersion: v1
metadata:
  name: docker-project-service
spec:
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8080
      nodePort: 31000
  selector:
    app: web_server

4)执行docker-project.yaml文件

kubectl apply -f docker-project.yaml

执行结果
在这里插入图片描述
5)查看升级状态

kubectl rollout status deployment  docker-project

执行结果(节点比较少,升级过程没有体现出来)
在这里插入图片描述
6)暂停升级

kubectl rollout pause deployment <deployment>

7)继续升级

kubectl rollout resume deployment <deployment>

8)页面查看升级结果:
Kubernetes--Deployment使用_第3张图片
9)查看升级历史

kubectl rollout history deployment docker-project

执行结果:
在这里插入图片描述
10)查看deployment信息

kubectl describe deployment docker-project

执行结果:
Kubernetes--Deployment使用_第4张图片
11)回滚到上一个版本

kubectl rollout undo deployment docker-project

执行结果:
在这里插入图片描述
12) 回滚到指定版本

kubectl rollout undo deployment docker-project --to-revision=1

执行结果:
Kubernetes--Deployment使用_第5张图片
13) 删除deployment

kubectl delete deployment docker-project

你可能感兴趣的:(kubernates,kubernetes)