Kubernetes/7.Pod控制器-Deployment

Pod控制器-Deployment

本章节开始,将对控制器逐个进行讲解和分析,我们先讲解最基础且最常用的控制器:Deployment

  • 控制器对象的分类
  • What is Deployment?
  • Deployment的更新机制
  • ReplicaSet
  • 命令补充
  • Deployment-demo
  • 备注

1.控制器对象的分类

1.守护进程型

1.无状态应用:非系统级应用(Nginx等)

推荐使用:Deployment,ReplicaSet

2.无状态应用:系统级应用

应用场景:日志和监控收集客户端:场景就是每个node节点需要且只需要运行1个pod

推荐使用:DaemonSet

3.有状态应用

应用场景:mysql、redis集群等

推荐使用:statefulSet

2.非守护进程型

Job:一次性任务

Cronjob:定时任务

2. What is Deployment?

Deploymen是一个提供申明Pod更新和Reolica Sets状态的控制器。换句话说:

你在deployment对象中描述了一个期望状态,接着deployment控制器会让当前状态和用户期望状态保持一致。比如我期望运行2个nginx Pod,当一个Pod因为不可抗因素下线的时候deployment控制器就会根据用户期望的状态再启动一个nginx pod。

第二章节的kubernetes集群架构里,我说过tomcatredis是通过相关service进行"连接"的,这其实只是为了大家能更简单的理解。其实serice会去找到对应的deployment,然后deployment根据申明的Replica Sets的配置,控制对应Pod容器的数量和状态。

3.Deployment的更新机制


你可以发现Deployment的更新机制是基于滚动更新的,具体顺序如下:

  • 首先,创建一个新的RS控制器,版本为v2
  • 接着将旧控制器的pod陆续下线,同时新的RS控制器同步上线对应Pod;
  • Pod更新完成后,弃用旧的RS控制器,滚动发布就此完成。

你可以使用kubectl get pod -o wide -w观察pod滚动更新情况,可以使用kubectl get rs -o wide观察RS控制器的名字、状态等信息。

你也可以使用pause命令实现基于deployment的金丝雀发布策略。

这里我补充了一个RS控制器状态,你可以观察发现,各控制器的命名、期望状态、当前状态和就绪状态。


#使用命令查看rs控制器的历史版本
[[email protected] mainfasts]# kubectl get rs -o wide
NAME               DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES       SELECTOR
myapp-67f698f887   0         0         0       53m     myapp        nginx:1.16   app=myapp,pod-template-hash=67f698f887,rel=stable
myapp-7c488c6f44   5         5         5       48m     myapp        nginx:1.17   app=myapp,pod-template-hash=7c488c6f44,rel=stable
myapp-98f644994    0         0         0       46m     myapp        nginx:1.15   app=myapp,pod-template-hash=98f644994,rel=stable
ngx-new-cb79d555   2         2         2       2d22h   nginx        nginx        app=ngx-new,pod-template-hash=cb79d555

1.滚动发布和回滚实战

1) 我们首先编辑deployment-nginx.yaml,并apply -f,发布nginx1.10版本。
其中我们给定了滚动策略:最多新增1个(maxSurge)最少下线1个(maxUnavailable)

第一次发布的时候是新增1个,下线2个

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx
spec:
  replicas: 3
  minReadySeconds: 10
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.10-alpine
        ports:
        - containerPort: 80
          name: http
        readinessProbe:
          periodSeconds: 1
          httpGet:
            path: /
            port: http

2) 接着,我们通过修改deployment-nginx.yamlimage: nginx:1.10-alpine版本为1.13,发布并观察。可以发现deployment对应的rs控制器逐步应用至deploy-nginx-567c45c74nginx:1.13-alpine

[[email protected] chapter5]# kubectl get rs -o wide
NAME                      DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES              SELECTOR
deploy-nginx-567c45c748   2         2         0       51s     nginx        nginx:1.13-alpine   app=nginx,pod-template-hash=567c45c748
deploy-nginx-5745bb45d7   2         2         2       7m2s    nginx        nginx:1.10-alpine   app=nginx,pod-template-hash=5745bb45d7
deploy-nginx-67f876bcb6   0         0         0       5m51s   nginx        nginx:1.11-alpine   app=nginx,pod-template-hash=67f876bcb6

[[email protected] chapter5]# kubectl get rs -o wide
NAME                      DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES              SELECTOR
deploy-nginx-567c45c748   3         3         2       2m40s   nginx        nginx:1.13-alpine   app=nginx,pod-template-hash=567c45c748
deploy-nginx-5745bb45d7   0         0         0       8m51s   nginx        nginx:1.10-alpine   app=nginx,pod-template-hash=5745bb45d7
deploy-nginx-67f876bcb6   0         0         0       7m40s   nginx        nginx:1.11-alpine   app=nginx,pod-template-hash=67f876bcb6

3) 同时,我们可以查看历史版本,第4条是我们最新的版本。由于前几次发布没有新增--record=true字段,所以显示为none

[[email protected] chapter5]# kubectl rollout history deployment/deploy-nginx
deployment.apps/deploy-nginx
REVISION  CHANGE-CAUSE
2         <none>
3         <none>
4         kubectl apply --filename=deploy-nginx.yaml --record=true

4) 接下来,我将演示如何回滚至上个版本。
我们使用rollout undo命令进行回滚,默认--to-revision=0(上一个版本)。观察rs变化,发现已经全部切换至1.10nginx,至此滚动发布的策略和回滚已经演示完毕

[[email protected] chapter5]# kubectl rollout undo deployment/deploy-nginx --to-revision=0
deployment.apps/deploy-nginx rolled back

[[email protected] chapter5]# kubectl get rs -o wide
NAME                      DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES              SELECTOR
deploy-nginx-567c45c748   2         2         2       4m58s   nginx        nginx:1.13-alpine   app=nginx,pod-template-hash=567c45c748
deploy-nginx-5745bb45d7   2         2         2       11m     nginx        nginx:1.10-alpine   app=nginx,pod-template-hash=5745bb45d7
deploy-nginx-67f876bcb6   0         0         0       9m58s   nginx        nginx:1.11-alpine   app=nginx,pod-template-hash=67f876bcb6

[[email protected] chapter5]# kubectl get rs -o wide
NAME                      DESIRED   CURRENT   READY   AGE    CONTAINERS   IMAGES              SELECTOR
deploy-nginx-567c45c748   0         0         0       5m6s   nginx        nginx:1.13-alpine   app=nginx,pod-template-hash=567c45c748
deploy-nginx-5745bb45d7   3         3         3       11m    nginx        nginx:1.10-alpine   app=nginx,pod-template-hash=5745bb45d7
deploy-nginx-67f876bcb6   0         0         0       10m    nginx        nginx:1.11-alpine   app=nginx,pod-template-hash=67f876bcb6

2.金丝雀发布实战

1) 这里,我们基于上文的1.10nginx,发布金丝雀版本:1.14

[[email protected] chapter5]# kubectl set image deployment deploy-nginx nginx=nginx:1.14-alpine && kubectl rollout pause deployment deploy-nginx
deployment.apps/deploy-nginx image updated
deployment.apps/deploy-nginx paused

2) 此时发现pod新老版本共存,2个新版本2个老版本。你可以通过控制器名称后面的HASH数列,清晰观察到不通版本的控制器。

^C[[email protected] dingqishi]# kubectl get pod  -w
NAME                            READY   STATUS    RESTARTS   AGE
deploy-nginx-5745bb45d7-5wfml   1/1     Running   0          18m
deploy-nginx-5745bb45d7-84s4c   1/1     Running   0          18m
deploy-nginx-5745bb45d7-dqt8q   1/1     Running   0          18m

deploy-nginx-754874567-l6q7h    0/1     Pending   0          0s
deploy-nginx-754874567-l6q7h    0/1     Pending   0          0s
deploy-nginx-5745bb45d7-5wfml   1/1     Terminating   0          18m
deploy-nginx-754874567-l6q7h    0/1     ContainerCreating   0          0s
deploy-nginx-754874567-q4bsh    0/1     Pending             0          0s
deploy-nginx-754874567-q4bsh    0/1     Pending             0          0s
deploy-nginx-754874567-q4bsh    0/1     ContainerCreating   0          1s
deploy-nginx-5745bb45d7-5wfml   0/1     Terminating         0          18m
deploy-nginx-5745bb45d7-5wfml   0/1     Terminating         0          18m
deploy-nginx-5745bb45d7-5wfml   0/1     Terminating         0          18m
deploy-nginx-754874567-l6q7h    0/1     Running             0          24s
deploy-nginx-754874567-l6q7h    1/1     Running             0          25s
deploy-nginx-754874567-q4bsh    0/1     Running             0          27s
deploy-nginx-754874567-q4bsh    1/1     Running             0          27s

[[email protected] dingqishi]# kubectl get pod
NAME                            READY   STATUS    RESTARTS   AGE
deploy-nginx-5745bb45d7-84s4c   1/1     Running   0          19m
deploy-nginx-5745bb45d7-dqt8q   1/1     Running   0          19m
deploy-nginx-754874567-l6q7h    1/1     Running   0          61s
deploy-nginx-754874567-q4bsh    1/1     Running   0          61s

3) 如果新版本的用户满意度不高,需要回滚的话,此时我们也可以用上文提到的rollout命令。

再次提示:--to-revision=0为默认参数,意思是上一个版本,如果要回到指定版本,按需指定就行了。

kubectl rollout undo deployment/deploy-nginx --to-revision=0

4) 如果新版本用户满意度不错,需要完成剩余Pod更新的话,需要使用resume命令


[[email protected] chapter5]# kubectl rollout resume deployment deploy-nginx
deployment.apps/deploy-nginx resumed

[[email protected] dingqishi]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
deploy-nginx-5745bb45d7-84s4c 1/1 Running 0 27m
deploy-nginx-5745bb45d7-dqt8q 1/1 Running 0 27m
deploy-nginx-754874567-l6q7h 1/1 Running 0 8m35s
deploy-nginx-754874567-q4bsh 1/1 Running 0 8m35s

deploy-nginx-5745bb45d7-84s4c 1/1 Terminating 0 30m
deploy-nginx-5745bb45d7-dqt8q 1/1 Terminating 0 30m
deploy-nginx-754874567-l6zz8 0/1 Pending 0 0s
deploy-nginx-754874567-l6zz8 0/1 Pending 0 0s
deploy-nginx-754874567-l6zz8 0/1 ContainerCreating 0 0s
deploy-nginx-5745bb45d7-84s4c 0/1 Terminating 0 30m
deploy-nginx-5745bb45d7-dqt8q 0/1 Terminating 0 30m
deploy-nginx-754874567-l6zz8 0/1 Running 0 3s
deploy-nginx-754874567-l6zz8 1/1 Running 0 3s
deploy-nginx-5745bb45d7-84s4c 0/1 Terminating 0 30m
deploy-nginx-5745bb45d7-84s4c 0/1 Terminating 0 30m
deploy-nginx-5745bb45d7-dqt8q 0/1 Terminating 0 30m
deploy-nginx-5745bb45d7-dqt8q 0/1 Terminating 0 30m

[[email protected] dingqishi]# kubectl get pod
NAME READY STATUS RESTARTS AGE
deploy-nginx-754874567-l6q7h 1/1 Running 0 14m
deploy-nginx-754874567-l6zz8 1/1 Running 0 3m33s
deploy-nginx-754874567-q4bsh 1/1 Running 0 14m


## 4.ReplicaSet
ReplicaSet组件的作用,想必现在你已经有些许的了解了:
- 在给定的任何时间,保证一个明确的pod运行数量
- 管理底层Pod
- 不应该人为介入进行调整、管理

## 5.命令补充
```bash
#实时观察Pod:
kubectl get pod -w

6.Deployment-demo

deployment-demo

7.备注

本文原址位于我的Github,我会陆续将所有专题更新过来,其中包括docker、k8s、ceph、istio和prometheus,旨在分享云原生中大而全的技术知识点和实操过程,如果对你有用,请follow、star和转发我的github,这也是我更新、分享下去的动力,谢谢~

原文地址:https://blog.51cto.com/qishiding/2464032

时间: 2024-11-07 15:12:24

Kubernetes/7.Pod控制器-Deployment的相关文章

Kubernetes之Pod控制器,ReplicaSet,Deployment,DaemonSet

目录 Kubernetes之Pod控制器,ReplicaSet,Deployment,DaemonSet ReplicaSet Deployment控制器 创建Deployment Deployment更新 Deployment扩容 金丝雀发布 Deployment回滚 DaemonSet 定义 DaemonSet演示 redis-filebeat DaemonSet的滚动更新 Kubernetes之Pod控制器,ReplicaSet,Deployment,DaemonSet Kubernete

Kubernetes之Pod控制器应用进阶

目录 Kubernetes之Pod控制器应用进阶 Pod控制器下spec常用字段 标签(Labels)和标签选择器(LabelSelector) 标签 标签选择器 Kubernetes之Pod控制器应用进阶 Pod控制器下spec常用字段 #containers [[email protected] ~]# kubectl explain pods.spec.containers. name <string> -required- #容器名,必选字段 image <string>

Kubernetes/8.Pod控制器-DaemonSet

Pod控制器-DaemonSet 本章节给你带来第二个控制器:DaemonSet的讲解.你将了解到:什么是DaemonSet,以及他的配置实战,最后我还引出了污点和容忍度的专有名词,如果你已经有了一定的基础,可以选择性地直接去阅读该章节(看个人). What is DaemonSet? 命令补充 实战配置 知识点补充 备注 1.What is DaemonSet? DaemonSet是一个确保每个符合规则的node节点有且仅有一个Pod的控制器.你要注意以下两点: 1.新节点加入集群,也会新增一

Kubernetes之Pod 控制器

定义Pod的常用资源 pods.spec.containers - name    <string>   #containers 的名字 image    <string>  #镜像地址 imagePullPolicy    <string>  #如果标签是latest  就是Always(总是下载镜像)  IfNotPresent(先看本地是否有此镜像,如果没有就下载) Never (就是使用本地镜像) ports    <[]Object>  #是给对象

Kubernetes Pod 控制器

在机器人技术和自动化中,控制环是一个控制系统状态的不终止的循环 这是一个控制环的例子:"房间里的温度自动调节器"当你设置了温度,告诉了温度自动调节器你的"期望状态",房间的实际温度是"当前状态".通过对设备的开关控制,温度自动调节器让其当前状态无限接近于期望状态.控制器通过 k8s的apiserver 去监控集群的公共状态,并致力于将当前状态转变为所期望的状态. 中文参考官方:怎么描述Kubernetes架构控制器的 kubernetes 之Po

Kubernetes之标签与Pod控制器详解

一.标签 标签的主要作用:解决同类型的资源对象越来越多,为了更好的管理,按照标签分组: 常用的标签分类:release(版本):stable(稳定版).canary(金丝雀版本.可以理解为测试版).beta(测试版)environment(环境变量):dev(开发).qa(测试).production(生产)application(应用):ui.as(应用软件).pc.sctier(架构层级):frontend(前端).backend(后端).cache(缓存.隐藏)partition(分区):

Kubernetes系列之Kubernetes Pod控制器

#一.常见Pod控制器及含义 ###1. ReplicaSets ReplicaSet是下一代复本控制器.ReplicaSet和 Replication Controller之间的唯一区别是现在的选择器支持.Replication Controller只支持基于等式的selector(env=dev或environment!=qa),但ReplicaSet还支持新的,基于集合的selector(version in (v1.0, v2.0)或env notin (dev, qa)).大多数kub

Kubernetes之StatefulSet控制器

目录 Kubernetes之StatefulSet控制器 简介 StatefulSet使用 滚动更新 扩展伸缩 更新策略和版本升级 Kubernetes之StatefulSet控制器 简介 StatefulSet 作为 Controller 为 Pod 提供唯?的标识. 它可以保证部署和 scale 的顺序. StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为?状态服务?设计) , 其应?场景包括: 稳定的持久化存储, 即Pod重新调度后还是

kubernetes之pod超详细解读--第二篇(三)

8.资源对象对pod的调度 ??在kubernetes集群中,pod基本上都是容器的载体,通常需要通过相应的资源对象来完成一组pod的调度和自动控制功能,比如:deployment.daemonSet.RC.Job等等.接下来小编将一一介绍这些资源对象如何调度pod. (1)Deployment/RC 自动化调度 ??Deployment/RC的主要功能之一就是自动部署一个容器应用的多个副本,以及持续监控副本数量,在集群内始终维持用户指定的副本数量.举例:(这里以deployment为例) ap