多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] > 1. k8s提供五种控制器Deployment、DaemonSet、StatefulSet、Job和Cronjob > 2. 控制器可以保证pod的副本数,保证服务的运行,也可以平滑升级容器版本如Deployment # 1. Deployment ## 1.1 基础概念 > 1. Deployment是一种控制器资源,控制pod和ReplicaSet,通过控制replicaSet间接完成对pod的期望控制 > 2. Deployment用来取代老的ReplicationController > 3. Deployment可以 ## 1.2 功能 1. Deployment用来创建ReplicaSet,ReplicaSet创建pod,也可以不用Deployment,直接用ReplicaSet直接创建Pod 2. 滚动升级和回滚`->`不影响服务正常运行 3. 扩缩容 4. 启动、停止和删除Deployment ## 1.3 功能实践 ### 1.3.1 通过ReplicaSet创建pod **1. ReplicaSet创建** ``` apiVersion: apps/v1 kind: ReplicaSet metadata: # RS 元素信息 name: rsnginx # RS 名称 labels: # 自定义标签 app: test # RS 标签 tier: nginx # RS 标签 spec: replicas: 3 # Pod 副本数 selector: # 选择标签 matchLabels: # 匹配标签 tier: ng-pod # 匹配 frontend 标签 template: # Pod 模板 metadata: # Pod 元素信息 labels: # 自定义标签 tier: ng-pod # 标签 frontend spec: containers: - name: mynginx # 容器名称 image: nginx:1.14.0 # 镜像地址 ``` **2. 利用文件创建** `kubectl apply -f rs_nginx.yaml` ``` [root@master ~]# kubectl get rs NAME DESIRED CURRENT READY AGE nginx-deployment-6876dc68c9 3 3 1 41h rsnginx 3 3 3 95s ``` > pod名称 = Deployment名称-ReplicaSet名称-随机字母 ``` [root@master ~]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx 1/1 Running 3 4d14h run=nginx nginx-deployment-6876dc68c9-gpjjv 1/1 Running 1 41h app=nginx,pod-template-hash=6876dc68c9 nginx-deployment-6876dc68c9-j7vhl 0/1 Completed 0 41h app=nginx,pod-template-hash=6876dc68c9 nginx-deployment-6876dc68c9-sdcdx 0/1 Completed 0 41h app=nginx,pod-template-hash=6876dc68c9 nginx2 1/1 Running 2 2d18h run=nginx2 rsnginx-fj6hg 1/1 Running 0 7m20s tier=ng-pod rsnginx-j6djf 1/1 Running 0 7m20s tier=ng-pod rsnginx-thpmb 1/1 Running 0 7m20s tier=ng-pod ``` **3. 修改pod标签** ``` [root@master ~]# kubectl label pod rsnginx-j6djf tier=ng-podbak --overwrite pod/rsnginx-j6djf labeled [root@master ~]# [root@master ~]# [root@master ~]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx 1/1 Running 3 4d14h run=nginx nginx-deployment-6876dc68c9-gpjjv 1/1 Running 1 41h app=nginx,pod-template-hash=6876dc68c9 nginx-deployment-6876dc68c9-j7vhl 0/1 Completed 0 41h app=nginx,pod-template-hash=6876dc68c9 nginx-deployment-6876dc68c9-sdcdx 0/1 Completed 0 41h app=nginx,pod-template-hash=6876dc68c9 nginx2 1/1 Running 2 2d18h run=nginx2 rsnginx-fj6hg 1/1 Running 0 9m6s tier=ng-pod rsnginx-hlqlc 1/1 Running 0 3s tier=ng-pod rsnginx-j6djf 1/1 Running 0 9m6s tier=ng-podbak rsnginx-thpmb 1/1 Running 0 9m6s tier=ng-pod ``` 因为rs或Deployment根据标签Label识别pod 修改标签后,相当于pod少了一个,rs维持了pod的副本数,又增加了一个pod 但是ReplicaSet不能滚动升级 ### 1.3.2 通过Deployment创建pod deployment 不写 matchLabels: app: nginx **1. yaml配置文件** ``` apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx:1.14.0 name: nginx tolerations: - key: "disktype" operator: "Equal" value: "ssd" effect: "NoExecute" ``` **2. 通过yaml文件创建pod** `kubectl apply -f nginx-dp.yaml` 注意名称的变化 **3. 扩缩容** --replicas=4,改变数量达到扩缩容 ``` [root@master ~]# kubectl scale deployment nginx-deployment --replicas=4 deployment.apps/nginx-deployment scaled [root@master ~]# [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx 1/1 Running 3 4d14h nginx-deployment-6876dc68c9-67hdm 0/1 ContainerCreating 0 13s nginx-deployment-6876dc68c9-gpjjv 1/1 Running 1 41h nginx-deployment-6876dc68c9-j7vhl 0/1 Completed 0 41h nginx-deployment-6876dc68c9-sdcdx 0/1 Completed 0 41h ``` **4. 更新镜像** 【格式】:kubectl set image Deployment名称 容器名称=镜像 `kubectl set image deployment/nginx-deployment nginx=nginx:latest` 原来的rs被停止 ``` [root@master ~]# kubectl get rs NAME DESIRED CURRENT READY AGE nginx-deployment-65875d475b 3 3 3 21s nginx-deployment-6876dc68c9 0 0 0 14m ``` **5.回滚镜像** 【格式】`kubectl rollout undo [Deployment名称]` ``` [root@master ~]# kubectl get rs NAME DESIRED CURRENT READY AGE nginx-deployment-65875d475b 2 2 2 5m4s nginx-deployment-6876dc68c9 2 2 1 19m [root@master ~]# kubectl get rs NAME DESIRED CURRENT READY AGE nginx-deployment-65875d475b 1 1 1 5m6s nginx-deployment-6876dc68c9 3 3 2 19m [root@master ~]# kubectl get rs NAME DESIRED CURRENT READY AGE nginx-deployment-65875d475b 0 0 0 5m8s nginx-deployment-6876dc68c9 3 3 3 19m ``` 如上,镜像变更没有使得原来的rs(ReplicaSet)全部停止,达到平稳升级的效果 也可以set指定镜像版本,达到回滚的目的, **6. 回滚到指定版本** 1. 查看历史版本 `kubectl rollout history DeploymentName` 2. 回滚到指定版本 `kubectl rollout undo deployment/nginx-deployment --to-revision=3` ### 1.3.3 根据负载动态扩缩容 https://www.cnblogs.com/l-hh/p/14840573.html # 2. DaemonSet ## 2.1 功能 1. 确保每个(某些)节点都有这个pod,新加入的节点自动部署pod **DaemonSet 典型应用场景:** * 运行集群存储,例如在每个Node上运行`glusterd`、`ceph`等 * 每个Node 上运行日志收集,例如`fluentd`、`logstash`等 * 每个Node上运行监控程序,例如`Prometheus Node Exporter`、`collectd`等 ## 2.2 使用 ### 2.1 每个节点都部署pod ``` apiVersion: apps/v1 kind: DaemonSet metadata: name: daemonset labels: app: daemonset spec: selector: matchLabels: name: daemonset-ng template: metadata: labels: name: daemonset-ng spec: containers: - name: mynginx image: nginx:1.14.0 ``` 每个节点都有一个pod ``` [root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES daemonset-c8w2j 1/1 Running 0 14s 10.244.1.31 node01 <none> <none> daemonset-tg2c8 1/1 Running 0 14s 10.244.2.19 node02 <none> <none> ``` # 3. StatefulSet ## 3.1 功能 1. StatefulSet 是用来管理**有状态服务**,为了解决有状态服务的问题,而 Deployment 和 ReplicaSet 更适用于无状态服务的部署。 2. StatefulSet的pod无论怎么调度,每个 Pod 都有一个永久不变的 ID。 **StatefulSet 应用场景:** * 稳定的、唯一的网络标识符。 * 稳定的、持久的存储。 * 有序的、优雅的部署和缩放。 * 有序的、自动的滚动更新。 # 4. Job ## 4.1 功能 1. Job 负载批处理任务,**仅执行一次的任务**,它能够保证批处理任务的一个或者多个 Pod 成功执行结束。 2. 可以设置 Job 执行成功的数值,Job 跟踪记录成功完成的 Pod 个数,当数量达到指定的成功个数阈值时,任务结束。 3. 如果 Jod 没有以`0代码`成功退出的话,它会重新执行这个程序。 ``` apiVersion: batch/v1 kind: Job metadata: name: pi # Job 名称 spec: template: spec: containers: - name: pi # Pod 名称 image: perl # 镜像名称 command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] # 计算圆周率,计算小数点后 2000 位 restartPolicy: Never # 重启策略,永不重启 backoffLimit: 4 # 设置重试次数,达到后将 Job 标记为失败 ``` 其他参数 `.spec.completions`标志 Job 需要成功完成 Pod 个数,才视为整个 Job 完成。(默认1) `.spec.parallelism`标志 Pod 并行运行个数。(默认1) `.spec.activeDeadlineSeconds`标志 Job 的整个生命期,一旦 Job 运行时间达到设定值,则所有运行中的 Pod 都会被终止。(秒数值) # 5. Cronjob 定期的执行Job