kubernetes工作负载之控制器

news2025/1/20 22:00:09

目录

​一、概述

二、Deployment 控制器

2.1Deployment 部署应用

2.2Deployment滚动升级

2.2.1应用部署完成

2.2.2更新镜像三种方式

2.3 Deployment 发布失败回滚

2.4Deployment 水平扩容

三、DaemonSet控制器

四、Job控制器

4.1Job一次性执行

4.2定时任务(CronJob)

五、总结


一、概述


 在Kubernetes中,Pod是最小的管理单元,是一组紧密关联的容器组合。

但是,单独的Pod并不能保障总是可用,比如我们创建一个nginx的Pod,因为某些原因,该Pod被意外删除,我们希望其能够自动新建一个同属性的Pod。很遗憾,单纯的Pod并不能满足需求。

为此,Kubernetes实现了一系列控制器来管理Pod,使Pod的期望状态和实际状态保持一致

工作负载控制器(Workload Controllers)是K8s的一个抽象概念,用于更高级层次对象,部署和管理Pod。常用工作负载控制器:

• Deployment :无状态应用部署

• StatefulSet :有状态应用部署

• DaemonSet :确保所有Node运行同一个Pod

• Job :一次性任务

• Cronjob :定时任务

控制器的作用

• 管理Pod对象

• 使用标签与Pod关联

• 控制器实现了Pod的运维,例如滚动更新、伸缩、副本管理、维护Pod状态等。

Deployment的功能:

• 管理Pod和ReplicaSet

• 具有上线部署、副本设定、滚动升级、回滚等功能

• 提供声明式更新,例如只更新一个新的Image 应用场景:网站、API、微服务


二、Deployment 控制器


2.1Deployment 部署应用

deployment部署一个应用,副本数为3

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: default
spec:
  replicas: 3  # 副本数量
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx  # Pod副本的标签
    spec:
      containers:
      - name: web
        image: nginx:1.15

pod 副本为3 , 成功调度到 node1和node2两个节点上

服务暴露出来,查询对用的服务端口

kubectl expose deployment web --port=80 --target-port=80 --type=NodePort

三个节点的任意 IP加上 31812端口 都可以访问

2.2Deployment滚动升级

业务应用基本都是通过Deployment的方式部署在Kubernetes中的,应用的更新和回滚是常态的工作,特别是在互联网企业,快速迭代抓住用户的一个重要途径。

但是,并不是每一次的迭代都是100%正常的,如果异常,如何快速恢复也是要考虑的事情。为适应这种场景,Deployment提供滚动更新和快速回滚的能力。

Deployment默认的更新方式就是滚动更新,可以通过strategy.type来指定更新方式。

  • Recreate:先删除所有的Pod,再创建
  • RollingUpdate:先启动新的Pod,再替换老的Pod

2.2.1应用部署完成

## 部署应用
kubectl apply -f deployment.yaml

## 暴露应用服务的端口
kubectl expose deployment web --port=80 --target-port=80 --type=NodePort

2.2.2更新镜像三种方式

• kubectl apply -f xxx.yaml

• kubectl set image deployment/web nginx=nginx:1.16

• kubectl edit deployment/web

 滚动升级:K8s对Pod升级的默认策略,通过使用新版本Pod逐步更新旧版本Pod,实现零停机发布,用户无感知。

查看三个pod 服务 对应的 IP和端口

[root@k8s-master1 ~]# kubectl get ep
NAME         ENDPOINTS                                            AGE
kubernetes   192.168.2.117:6443,192.168.2.119:6443                7d2h
pod-check    <none>                                               6h
web          10.244.159.134:80,10.244.224.10:80,10.244.36.74:80   32m

nginx:1.15 镜像升级到 nginx:1.16

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: web
        image: nginx:1.16

replicas 一个一个升级创建一个新的删除旧的,具体的策略可以,自行配置

导出 web deployment, 查看完整的 Deployment 配置

kubectl get deployment   web    -o yaml >  deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "7"
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{"kubernetes.io/change-cause":"web.v1-nginx-1.17"},"name":"web","namespace":"default"},"spec":{"replicas":3,"selector":{"matchLabels":{"app":"nginx"}},"template":{"metadata":{"labels":{"app":"nginx"}},"spec":{"containers":[{"image":"nginx:1.17","name":"web"}]}}}}
    kubernetes.io/change-cause: web.v1-nginx-1.17
  creationTimestamp: "2022-11-12T09:11:15Z"
  generation: 8
  managedFields:
  - apiVersion: apps/v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .: {}
          f:kubectl.kubernetes.io/last-applied-configuration: {}
      f:spec:
        f:progressDeadlineSeconds: {}
        f:replicas: {}
        f:revisionHistoryLimit: {}
        f:selector:
          f:matchLabels:
            .: {}
            f:app: {}
        f:strategy:
          f:rollingUpdate:
            .: {}
            f:maxSurge: {}
            f:maxUnavailable: {}
          f:type: {}
        f:template:
          f:metadata:
            f:labels:
              .: {}
              f:app: {}
          f:spec:
            f:containers:
              k:{"name":"web"}:
                .: {}
                f:imagePullPolicy: {}
                f:name: {}
                f:resources: {}
                f:terminationMessagePath: {}
                f:terminationMessagePolicy: {}
            f:dnsPolicy: {}
            f:restartPolicy: {}
            f:schedulerName: {}
            f:securityContext: {}
            f:terminationGracePeriodSeconds: {}
    manager: kubectl-client-side-apply
    operation: Update
    time: "2022-11-12T10:33:02Z"
  - apiVersion: apps/v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          f:kubernetes.io/change-cause: {}
      f:spec:
        f:template:
          f:spec:
            f:containers:
              k:{"name":"web"}:
                f:image: {}
    manager: kubectl
    operation: Update
    time: "2022-11-12T10:33:12Z"
  - apiVersion: apps/v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          f:deployment.kubernetes.io/revision: {}
      f:status:
        f:availableReplicas: {}
        f:conditions:
          .: {}
          k:{"type":"Available"}:
            .: {}
            f:lastTransitionTime: {}
            f:lastUpdateTime: {}
            f:message: {}
            f:reason: {}
            f:status: {}
            f:type: {}
          k:{"type":"Progressing"}:
            .: {}
            f:lastTransitionTime: {}
            f:lastUpdateTime: {}
            f:message: {}
            f:reason: {}
            f:status: {}
            f:type: {}
        f:observedGeneration: {}
        f:readyReplicas: {}
        f:replicas: {}
        f:updatedReplicas: {}
    manager: kube-controller-manager
    operation: Update
    time: "2022-11-12T10:33:21Z"
  name: web
  namespace: default
  resourceVersion: "1262530"
  selfLink: /apis/apps/v1/namespaces/default/deployments/web
  uid: 7b334d04-b47e-4023-bb3f-8043fd1474e2
spec:
  progressDeadlineSeconds: 600
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%            ### 
      maxUnavailable: 25%      ###
    type: RollingUpdate        ###
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.17
        imagePullPolicy: IfNotPresent
        name: web
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 3      ### 
  conditions:
  - lastTransitionTime: "2022-11-12T09:23:15Z"
    lastUpdateTime: "2022-11-12T09:23:15Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2022-11-12T09:11:15Z"
    lastUpdateTime: "2022-11-12T10:33:21Z"
    message: ReplicaSet "web-76f5f6d7f5" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  observedGeneration: 8
  readyReplicas: 3
  replicas: 3
  updatedReplicas: 3
  • maxSurge: 表示升级过程中最多可以比原先设置多出的pod数量,如上maxSurge=1,replicas:3 就表示kubennetes会先启动一个新的pod,然后删除掉一个旧的pod,整个升级过程中最多会有3+1pod
  • maxUnavailable: 表示升级过程中最多有多少个pod处于无法提供服务的状态,当manSurge不为0时,该值也不能为0,maxUnavailable =1 表示kubernetes整个升级过程中最多会有一个pod处于无法服务的状态
  • minReadySeconds: 表示kubernetes在等待设置时间后才进行升级,如果没有设置该值kubernete会假设容器启动起来就提供服务了,如果没有设置该值,在某些极端情况下可能会造成服务不正常运行,默认值是0
  • type:RollingUpdate表示,设置更新策略为滚动更新,可以设置为recreate和RollingUpdate两个值,recreate表示全部重新创建,默认值就是RollingUpdate

当然,这时候应在Pod中加上health check检查应用的健康状态,而不是简单的依赖容器的running状态。配置相应的健康检查可以确保服务的可靠性和延续性。

2.3 Deployment 发布失败回滚

发布失败恢复正常版本

# 查看历史发布版本
kubectl rollout history deployment/web 
# 回滚上一个版本
kubectl rollout undo deployment/web	
# 回滚历史指定版本
kubectl rollout undo deployment/web --to-revision=2

ngnix 版本可自由改动 ,尝试 升级和回滚

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: default
  annotations:       # 记录回滚参数
    kubernetes.io/change-cause: "web.v1-nginx-1.17"   #记录到revision中的内容,记录版本号
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: web
        image: nginx:1.17

 注:回滚是重新部署某一次部署时的状态,即当时版本所有配置

查看正在运行的服务版本,镜像是 nginx: 1.17

回滚到上个版本,镜像是 nginx: 1.16

2.4Deployment 水平扩容

ReplicaSet控制器用途:

• Pod副本数量管理,不断对比当前Pod数量与期望Pod数量

• Deployment每次发布都会创建一个RS作为记录,用于实现回滚

# 查看RS记录
kubectl get rs	
# 版本对应RS记录
kubectl rollout history deployment web

# 命令直接修改副本个数,或者 修改yaml重新应用下
kubectl scale deployment web --replicas 5 deployment.apps/web scaled

##  也可以直接修改 ep 文件
kubectl edit  ep web -o yaml

新增两个 pod


三、DaemonSet控制器


DaemonSet保证在每个Node上都运行一个Pod,如果新增一个Node,这个Pod也会运行在新增的Node上,如果删除这个DadmonSet,就会清除它所创建的Pod。常用来部署一些集群日志收集,监控等全局应用。

DaemonSet也是支持更新和回滚的,具体操作和Deployment类似。

常见的场景如下:

1、运行存储集群daemon,比如ceph,glusterd等;

2、运行一个日志收集daemon,比如logstash,fluentd等;

3、运行监控daemon,比如Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond等;

 部署一个日志采集程序,因为使用 kubeadm 安装 所以 master 节点打了污点,下面filebeat 配置污点容忍,使其在 master 节点 也可以调度成功。

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeat
  namespace: kube-system
spec:
  selector:
    matchLabels:
      name: filebeat
  template:
    metadata:
      labels:
        name: filebeat
    spec:
      tolerations:
      - effect: NoSchedule
        operator: Exists
      containers:
      - name: log
        image: elastic/filebeat:7.3.2

 三个 节点成功部署 filebeat


四、Job控制器


4.1Job一次性执行

计算圆周率

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl # 自定义的一次性需要运行的镜像
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never

4.2定时任务(CronJob)

应用场景:离线数据处理,视频解码等业务

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello kangll
          restartPolicy: OnFailure

 需要注意的是,由于cron的特殊性,有时候会存在由于上一个定时任务还没有执行完成,新的定时任务又开始了的情况,我们可以通过定义spec.concurrencyPolicy字段来定义规则,比如:

  • concurrencyPolicy=Allow:表示这些Job可以同时存在
  • concurrencyPolicy=Firbid:表示不会创建新的Job,也就是这个定时任务被跳过
  • concurrencyPolicy=Replace:表示产生的新Job会替代旧的Job

五、总结


上面介绍的是日常工作中常用的控制器,其中Deployment和DaemonSet的使用频率最高,熟练掌握这些控制器,并且学会在什么时候选择什么样的控制器,合理使用使工作效率最高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/40872.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

查询:按A分组,满足B时对应的C

1.场景 这种问题我自己归纳为“找对应行”问题&#xff0c;例如有下面一场表&#xff08;学生做题&#xff0c;对每个知识点的得分情况&#xff09; 字段&#xff1a;主键id、user_id、score、is_study、knowledgeName、updateTime场景1&#xff1a;按用户分组&#xff0c;求…

Nginx (7):nginx高可用配置

所谓的高可用&#xff0c;就是虽然nginx可以反向代理&#xff0c;如果某个内部服务器down了&#xff0c;可以使用其他的内部服务器&#xff0c;然而万一nginx挂了呢&#xff1f;&#xff1f;&#xff1f;&#xff1f;布置多个nginx再反向代理nginx&#xff1f;&#xff1f;反向…

数据结构学习笔记(V):树与二叉树

目录 1 树 1.1 树的定义和基本术语 1.定义 2.基本术语 1.2 树的性质 2 二叉树 2.1 二叉树的定义和基本术语 1.定义 2.特殊二叉树 2.2 二叉树性质 2.3 二叉树存储结构 1.顺序存储 2.链式存储 3 二叉树进阶 3.1 二叉树顺序遍历 1.先序遍历 2.中序遍历 3.后序遍…

第十二周总结

这周我来总结一下数论分块和佩尔方程&#xff1a; 已知正整数n&#xff0c;求&#xff0c;对n/i下取整&#xff0c;相当于把一组数分块了&#xff0c;首先我们来找一下规律&#xff1a;n20时 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 …

现代密码学导论-20-流密码

目录 3.6 实际操作和加密方式 3.6.1 流密码 CONSTRUCTION 3.30 使用伪随机函数构造流密码 3.6.2 流密码的同步模式 CONSTRUCTION 3.31 流密码的异步模式 3.6 实际操作和加密方式 现代密码学导论-14-基于伪随机发生器的EAV安全_南鸢北折的博客-CSDN博客 CONSTRUCTION 3.17…

Spring Cloud整合Nacos集群

目录 第一章 微服务架构图 第二章 Spring Cloud整合Nacos集群 第三章 Spring Cloud GateWay 第四章 Spring Cloud Alibaba 整合Sentinel 第五章 Spring Cloud Alibaba 整合SkyWalking链路跟踪 第六章 Spring Cloud Alibaba 整合Seata分布式事务 第七章 Spring Cloud 集成Auth用…

计量数据分析数据库-Stata分析包使用指南、计量分析资料等八大数据大全

一、计量前沿stata 分析包使用指南 当考虑自变量X对因变量Y的影响时&#xff0c;如果X通过影响变量M来影响Y,则称M为中介变量&#xff08;mediator或mediating variable) (Judd & Kenny, 1981; Baron &Kenny,1986)。X通过中介变量M对Y产生的影响就是中介效应&#xff…

【深入理解C++】可调用对象、std::function、std::bind()

文章目录1.可调用对象1.1 函数指针1.2 具有operator()成员函数的类对象/仿函数/函数对象1.3 可被转换为函数指针的类对象1.4 类成员函数指针2.std::function2.1 绑定普通函数2.2 绑定类的静态成员函数2.3 绑定具有operator()成员函数的类对象2.4 绑定可被转换为函数指针的类对象…

【无标题】SAR雷达系统反设计及典型目标建模与仿真实现研究——目标生成与检测(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

408考研科目《数据结构》第八章第一节:排序的基本概念和插入排序(直接插入排序,折半插入排序,希尔排序)

文章目录教程1.排序的基本概念1.1 排序算法的评价指标1.2 排序算法的分类2. 插入排序2.1 直接插入排序2.1.1 算法效率分析2.2 折半插入排序总结2.3 希尔排序 &#xff08;Shell Sort&#xff09;总结教程 排序&#xff1a; https://www.bilibili.com/video/BV1b7411N798/?p77…

队列——算法专项刷题(七)

七、队列 常用于辅助遍历树&#xff0c;设计队列先进先出特性的数据结构 7.1 滑动窗口的平均值 给定一个整数数据流和一个窗口大小&#xff0c;根据该滑动窗口的大小&#xff0c;计算滑动窗口里所有数字的平均值。 实现 MovingAverage 类&#xff1a; MovingAverage(int si…

图书管理系(附源码PPT)

图书管理系统1 绪 论1.1 研究背景1.2 研究意义1.3 相关研究现状1.3.1 高校图书管理面临的问题1.3.2 信息化为图书管理带来新变化2 相关技术2.1 JSP 概述2.2 MySQL 数据库技术2.3 Spring2.4 SpringMVC2.5 Dbcp2.6 Maven3 系统分析3.1 需求分析3.1.1 系统的功能需求分析3.1.2 系统…

利用衍射表面消色差的混合目镜建模

1. 摘要 同时具有折射和衍射表面的混合透镜已成为一种极具潜力的解决方案应用于多种领域。在此案例中&#xff0c;我们将演示混合目镜的一个例子&#xff0c;其中利用衍射透镜表面对色差进行了校正。由ZemaxOpticStudio进行初始化设计&#xff0c;并导入VirtualLab Fusion进行进…

TensorRt(2)快速入门介绍

文章目录1、使用ONNX部署的示例1.1、导出模型1.2、设置batch size批处理大小1.3、指定数值精度1.4、转换模型1.5、部署模型2、使用ONNX转换为engine再部署的示例2.1、导出ONNX模型2.1.1、从TensorFlow中导出ONNX2.1.1、从PyTorch中导出ONNX2.2、ONNX 转化为 TensorRT Engine2.3…

27个超实用Chrome控制台调试技巧 Source 全局搜索(关注更新)

谷歌开发者工具提供了一系列的功能来帮助开发者高效 Debug 网页应用&#xff0c;让他们可以更快地查找和修复 bug。在谷歌的开发者工具中&#xff0c;有非常多有用的小工具&#xff0c;但是很多开发者并不知道。通过这篇文章&#xff0c;我把我常用的那些高效 Debug 的 Chrome …

ARM 汇编指令集1_2

一、两个概念&#xff1a;指令与伪指令 &#xff08;汇编&#xff09;指令&#xff0c;是 CPU 机器指令的助记符&#xff0c;经过编译后会得到一串10组成的机器码&#xff0c;可以由 CPU 读取执行。&#xff08;汇编&#xff09;伪指令&#xff0c;本质上不是指令&#xff08;…

版本控制利器——changelog

问题描述 当前&#xff0c;我们项目需要进行版本的确定&#xff0c;人工审核代码已接近尾声&#xff0c;但为了防止后续继续出现该问题&#xff0c;我希望能够做到在每次push到master时&#xff0c;更新changelog 将每一个版本的commit记录下来&#xff0c;类似于下列 解决…

K8s 集成 Jenkins 部署Go Web项目

风离不摆烂学习日志 Day9 K8s 集成 Jenkins 部署Go Web项目 Dockerfile FROM golang:alpine as builder # 需要go环境 MAINTAINER fl1906WORKDIR /work # 源 RUN go env -w GOPROXYhttps://goproxy.cn && go env -w CGO_ENABLED0 && go env -w GO111MODULEon C…

Splunk UBA 从 Ldap 成功导入 HR 数据

1: 今天在配置Splunk UBA 的HRdata 和asset data 的时候,都要用到ldap, 所以还非要装add-on:\ add-on 的名字: Splunk Supporting Add-on for Active Directory (SA-LDAPSearch) (SA-LDAPSearch) 这个add-on 的配置: Configure the Splunk Supporting Add-on for Activ…

使用腾讯云cos搭建图片服务器

背景 当我们能不希望把图片上传到自己的服务器时&#xff0c;可以采用腾讯云cos帮我们免费代图片&#xff0c;我们只需要在自己的数据库里保存一个图片地址就行了 二、注册账号免费试用 1、注册腾讯云账号 按照腾讯云的注册方式&#xff0c;注册自己的账号 2、实名认证 选择个…