K8s 之 Deployment 应用案例

news2024/11/27 12:44:49

k8s-cert


目录

    • 一、YAML 配置文件
    • 二、运行服务
    • 三、更新 Deployment
      • 3.1 动态伸缩容
      • 3.2 触发上线
    • 四、故障自动转移
    • 五、指定节点运行 Pod
    • 六、删除 deployment


一、YAML 配置文件

我们要清楚,在 K8s 中有两种创建资源的方式:

(1)命令行方式:如 kubectl create ...

(2)配置文件方式:如 kubectl apply -f nginx.yml

命令行方式:

# 创建Seployment资源
kubectl create deployment nginx --image=nginx:1.20.0 --replicas=2

# 使用Service将Pod暴露出去
kubectl expose deployment nginx --port=8090 --target-port=80 --type=NodePort

配置文件方式:

配置文件采用的是 YAML 格式。

vim nginx.yml
apiVersion: apps/v1        # 指定deployment的api版本
kind: Deployment           # 指定创建资源的角色/类型 
metadata:                  # 指定Deployment的元数据
  name: nginx              # 创建名为nginx的Deployment
  labels:                  # 指定Deployment的标签(可自定义多个),这里的标签不需要与任何地方的标签匹配,根据实际场景随意自定义即可
    app: demo
spec:                      # Deployment的资源规格
  replicas: 2              # Deployment将创建2个Pod副本(默认为 1)
  selector:                # 匹配标签选择器,定义Deployment如何查找要管理的Pod,因此这里必须与Pod的template模板中定义的标签保持一致
    matchLabels:
      app: demo
  template:                # 指定Pod模板
    metadata:              # 指定Pod的元数据
      labels:              # 指定Pod的标签(可自定义多个)
        app: demo
    spec:                  # Pod的资源规格
      containers:          # 指定Pod运行的容器信息
      - name: nginx        # 指定Pod中运行的容器名
        image: nginx:1.20.0     # 指定Pod中运行的容器镜像与版本(不指定镜像版本号则默认为latest)
        ports:
        - containerPort: 80     # 指定容器的端口(即Nginx默认端口)

说明:对应资源的apiVersion须在kubectl api-versions中,如下图所示。

image-20221213144141447

二、运行服务

kubectl apply -f nginx.yml

查看 Deployment 上线状态

kubectl get deployment

# 字段说明
# NAME:列出namespace中Deployment的名称(不指定namespace则默认为Default)
# READY:显示应用程序的可用的副本数。显示的模式是“就绪个数/期望个数”
# UP-TO-DATE:为了达到期望状态已经更新的副本数
# AVAILABLE:显示应用可供用户使用的副本数
# AGE:显示应用程序运行的总时间

image-20221215154541133

查看 Deployment 创建的 ReplicaSet

kubectl get rs
kubectl get replicaset

# 字段说明
# NAME:列出namespace中ReplicaSet的名称(不指定namespace则默认为Default)
# DESIRED:表示期望状态,显示应用的期望副本个数,即在创建Deployment时所定义的值
# CURRENT:显示当前运行状态中的副本个数
# READY:显示应用中有多少副本可以为用户提供服务
# AGE:显示应用已经运行的总时间

image-20221215155221009

注意:ReplicaSet 的名称始终被格式化为 [Deployment名称]-[哈希]。其中的哈希字符串与 ReplicaSet 上的 pod-template-hash 标签一致。

# 查看ReplicaSet的标签
kubectl get replicaset --show-labels

image-20221215160348797

我们都知道 Pod 副本通过 ReplicaSet 管理,而 ReplicaSet 又是创建于 Deployment,那为什么不直接通过 Deployment 来直接管理,而是 ReplicaSet呢?

原因是每个控制器的标签或者选择算符不能与其他控制器(包括其他 Deployment 和 StatefulSet)重叠,那 K8s 是如何保证各控制器之间标签的唯一性呢?就是通过 ReplicaSet,因为 Pod 的 PodTemplate标签就是通过 ReplicaSet 进行哈希处理,如下图,可看到 Pod 的 PodTemplate 标签值,此标签可确保了 Deployment 的子 ReplicaSets 不发生重叠现象。

image-20221215164012597

三、更新 Deployment

3.1 动态伸缩容

所谓的伸缩容就是在线增加或减少 Pod 的副本数(只须修改 replicas 的值即可,大于当前值为伸,小于当前值为缩)。

1、修改配置文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: demo
spec:
  replicas: 5
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: nginx
        image: nginx:1.20.0
        ports:
        - containerPort: 80

2、执行 kubectl apply

kubectl apply -f nginx.yml

3、查看 Pod 运行状态

kubectl get pod -o wide

image-20221213163619736

出于安全考虑,默认情况下 K8s 不会将 Pod 调度到 master 节点,如果希望将 k8s-master 节点也作为 work 节点,可执行以下命令:

kubectl taint node k8s-master node-role.kubernetes.io/master-

再新增一个副本,此时可看到新增的这个 Pod 已经被调度到 Master 节点上了

image-20221213164259241

如果要恢复为原来的 Master Only,执行以下语句即可:

kubectl taint node k8s-master node-role.kubernetes.io/master="":NoSchedule

3.2 触发上线

需要注意的是,动态伸缩容不会触发上线动作,仅当 Deployment Pod 模板(即 .spec.template)发生改变时,例如模板的标签或容器镜像被更新,才会触发 Deployment 上线,以下为一个更新镜像版本的触发上线案例。

kubectl set image deployment.v1.apps/nginx nginx=nginx:1.20.2

# 或使用下面的命令:
kubectl set image deployment/nginx nginx=nginx:1.20.2
# 或使用下面的命令:直接编辑修改镜像版本即可
kubectl edit deployment/nginx

查看上线状态:

image-20221215170337761

看看 replicaset 状态:

image-20221215170534723

可看到 Deployment 通过创建新的 ReplicaSet 并将其扩容到 2 个副本并将旧 ReplicaSet 缩容到 0 个副本完成了 Pod 的更新操作。

Deployment 可确保在更新时仅关闭一定数量的 Pod。默认情况下,它确保至少所需 Pod 的 75% 处于运行状态(最大不可用比例为 25%)。 默认情况下,它可确保启动的 Pod 个数比期望个数最多多出 125%(最大峰值 25%)。

仔细查看下图的 Pod 变换情况 ,其流程是先创建一个新的 Pod,然后再删除旧的 Pod。但需要注意的是,更新时它不会立即杀死旧的 Pod,直到有足够数量的新 Pod 已经出现才会杀死旧的 Pod,因为它需要确保至少 2 个 Pod 可用, 同时最多总共 3 个 Pod 可用。

image-20221215170122738

也可以查看 Deployment 的详情来看到整体更新流程

kubectl describe deployments

image-20221215171801610

四、故障自动转移

故障前 Pod 运行的节点(work1 节点运行1个、work2 节点运行2个节点)

image-20221213170334741

模拟 k8s-work2 故障(关闭节点)

init 0    # 直接关机

image-20221213165326214

等待 5 分钟后会自动在其他可用 work 节点进行创建并运行,之所以要等待5分钟,这是因为 k8s 的 Taint(污点)与 Toleration(容忍)机制所造成。Taint和Toleration相互配合,可以避免pod被分配到不合适的节点上。每个节点上都可以应用一个或多个Taint,这表示对于那些不能容忍 Taint 的 pod,是不会被该节点接受的。如果将 Toleration 应用于 pod 上,则表示这些 pod 可以(但不要求)被调度到具有匹配 Taint 的节点上。

此时可看到 work2 上原来的两个节点已经 Terminating(终止),并转移到了 work1 上。

image-20221213171510077

因此,此服务中断时间=停机等待5分钟时间+重建时间+服务启动时间+readiness探针检测正常时间

疑问?那当 K8s-work2 节点恢复后,其原来的 Pod 还会被重新调度回来吗?

答案是:不会

此时我恢复 k8s-work2 节点

image-20221213172602657

再看看 Pod 的分布情况

image-20221213172532546

五、指定节点运行 Pod

默认情况下,Scheduler 会将 Pod 调度到所有可用的 Work 节点,不过在某些情况下我们需要将 Pod 部署到指定的 Work 节点,比如将有大量磁盘 I/O 的 Pod 部署到有 SSD 的 work 节点上来保证其 I/O。

因此,在 K8s 中可通过 label 来实现这个功能,label 是一对 key-value,各种资源都可以设置 label。具体操作如下。

1、先标记 work 节点

比如:我标记 work2 节点为配置有 SSD 的节点

kubectl label node k8s-work2 disktype=ssd

image-20221213174401273

如何查看节点已设置的标签?

kubectl get node --show-labels

image-20221213174625940

2、修改配置文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: demo
spec:
  replicas: 4
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: nginx
        image: nginx:1.20.0
        ports:
        - containerPort: 80

3、执行 kubectl apply

kubectl apply -f nginx.yml

4、查看 这4个副本都只在 work2 节点运行

image-20221213180223675

如何删除标签?

kubectl label node k8s-work2 disktype-

image-20221213180731696

此时 k8s-work2 节点上的 Pod 并不会因为其标签的删除而删除,依然是正常运行的,除非删除 nginx.yml 配置文件中的 nodeSelect 字段,并再次执行 kubectl apply ,master 才会自动调度到其他可用节点(当然也可以包括 work2),如下图所示:

image-20221213181237256

六、删除 deployment

会创建当然也要会删除,K8s 中删除资源的方法有以下两种。

1、直接删除

kubectl delete deployment nginx

2、或通过配置文件删除

kubectl delete -f nginx.yml

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

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

相关文章

【GO】 K8s 管理系统项目[API部分--Pod]

K8s 管理系统项目[API部分–Pod] 前端: Vueelement plus 后端: gogin 1. 功能设计 2. 初始化 2.1创建项目 2.2 配置goproxy GOPROXYhttps://goproxy.cn 2.3 添加格式化工具 2.4 安装模块 go get k8s.io/client-go/tools/clientcmd go get k8s.io/api/core/v1 go get k8s.i…

使用 docker buildx 构建跨平台 Go 镜像

目录 前提 docker buildx 启用 Buildx builder 实例 构建驱动 buildx 的跨平台构建策略 一次构建多个架构 Go 镜像实践 源代码和 Dockerfile 执行跨平台构建 验证构建结果 如何交叉编译 Golang 的 CGO 项目 准备交叉编译环境和依赖 交叉编译 CGO 示例 总结 参考链接…

供水设备远程监控客户案例

一、客户介绍 客户积累多年的技术研发和工程运维经验,对传统的恒压供水工程所面临的维护难、维修难、运维效率低和能耗管控弱等诸多问题有深刻的体会,经过广泛调研,客户最终选择使用蓝蜂物联网的云平台和边缘计算产品对恒压供水设备和工程进行…

数据处理指令(一)—— 搬移指令MOV、MVN

数据处理指令指的是和数学运算、逻辑运算相关的指令,比如加减乘、与或非、赋值比较等 目录 1、MOV —— 直接搬移 (1) MOV 指令格式 (2) MOV生成指令的策略(MOV的优点) (3) MOV 只能搬移“立即数”的原因(MOV的缺点&#x…

问卷设计一:问卷题目哪些有类型和注意要点?

问卷法常被人们应用于社会调查中,它能反馈出最真实的社会信息。所以,很多企业为了最大程度地了解市场,也经常使用问卷调查法进行研究。不过,想要发挥出问卷法的最大用处,前提是要将问卷设计规范并且可量化。 想要设计…

用ArkTs在鸿蒙系统上画一个世界杯海报

偶然看到了CSDN关于世界杯的征文活动: 用代码画一个足球? 哈哈很有意思! 想了想,画一个自定义View(足球),当然是使用Canvas了,但除了Canvas还有没有其它方法呢?那是必须…

c语言算数转换 操作符

【题目名称】下面代码的结果是&#xff1a;( b)#include <stdio.h> int main() {int a, b, c;a 5;c a;b c, c, a, a;//逗号表达式从左向右以此计算 表达式结果是最后一个表达式b a c; //a9 先算加后算加等printf("a %d b %d c %d\n:", a, b, c);retu…

【软件测试】工作瓶颈?测试的出路在哪?

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 3年软件测试经验&am…

【内网安全-隧道技术】SMB、ICMP、DNS隧道、SSH协议

目录 一、基础知识 二、隧道技术 1、简介&#xff1a; 2、SMB隧道 3、ICMP隧道 4、DNS隧道 5、SSH协议 6、控制上线-插件 一、基础知识 【内网安全-基础】基础知识、信息收集、工具https://blog.csdn.net/qq_53079406/article/details/128292587?spm1001.2014.3001.55…

Seata 术语

爬虫组件分析目录概述需求&#xff1a;设计思路实现思路分析1.TC (Transaction Coordinator) - 事务协调者2.TM (Transaction Manager) - 事务管理器3.RM参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&…

[附源码]Nodejs计算机毕业设计基于的防疫隔离服务系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

ruoyi-vue 集成electron详细步骤

刚使用ruoyi-vue开始集成electron的可以直接去这个地址下载源码 ruoyi-vue-electron: 使用ruoyi-vue集成electron 集成步骤&#xff1a; 1、在ruoyi-vue项目中安装electron相关插件 //进入ruoyi-ui 按顺序执行安装以下4个插件yarn add electron yarn add electron-devtools-…

5、英飞凌-AURIX-TC3X7: PWM实验之使用 GTM -TOM 实现

目录5、英飞凌-AURIX-TC3X7&#xff1a; PWM实验之使用 GTM -TOM 实现1、GTM -TOM简介2、TOM框图3、TOM全局通道控制--TGC0, TGC14、实验简介4.1、实验目的4.2、TC3X7 GTM 简介4.3、具体配置流程5、具体实现5.1、Cpu0_Main.c5.2、TOM_PWM.C5.3、TOM_PWM.h5、英飞凌-AURIX-TC3X7…

StyleGAN系列

1. Progressive Growing of GANs for Improved Quality, Stability, and Variation (PGGAN) 作者&#xff1a; Tero Karras Timo Aila Samuli Laine Jaakko Lehtinen 基于一个理论&#xff0c;高分辨率的图像相对于较小分辨率的图像&#xff0c;是更难train的&#xff0c;…

List<T>, IQueryable, IEnumerable 关系和区别

最近在修项目的历史代码&#xff0c;发现搞混了很多拓展方法&#xff0c;写一篇博客澄清一下。 概念需要&#xff1a;iqueryable不应该和ienumerable比而应该和ilist比&#xff0c;ienumerable是这两者的父接口。 问题&#xff1a;IQueryable, IEnumerable的&#xff1f; &…

Linux vi/vim

vi/vim 的使用 基本上 vi/vim 共分为三种模式&#xff0c;分别是命令模式&#xff08;Command mode&#xff09;&#xff0c;输入模式&#xff08;Insert mode&#xff09;和底线命令模式&#xff08;Last line mode&#xff09;。 这三种模式的作用分别是&#xff1a; 命令模…

数据分析可视化-FineReport 图表排序接口

1. 概述 1.1 应用场景 图表数据展示的顺序是由图表绑定的数据顺序决定的&#xff0c;一般建议在 SQL 中排好序再用图表实现。 但总有些场景不支持提前在 SQL 中排好序&#xff0c;或需要图表实现动态排序&#xff0c;此时可参考本文方法使用排序接口实现。 1.2 功能简介 Fi…

文本转语音免费 微软Azure官网

使用跨 140 种语言和变体的 400 种神经网络语音吸引全球受众。使用极具表现力和类似人类的声音&#xff0c;使文本阅读器和已启用语音的助理等方案栩栩如生。神经网络文本转语音支持多种朗读风格&#xff0c;包括新闻广播、客户服务、呼喊、耳语以及高兴、悲伤等情感。 地址 文…

数据结构---二叉堆

二叉堆二叉堆自我调整插入节点&#xff08;上浮&#xff09;删除节点(下沉)构建二叉堆(所有非叶子节点依次“下沉”)二叉堆本质上是一种完全二叉树&#xff0c;它分为两个类型。最大堆最小堆 最大堆的任何一个父节点的值&#xff0c;都大于或等于它左、右孩子\节点的值 最小堆…

【实测】windows安装部署go实录(超详细)

之前我的课程中&#xff0c;关于go语言的安装是主要展示了mac的&#xff0c;windows的就一笔带过了。 结果被我说着了&#xff08;可能在第一步直接被劝退&#xff09;&#xff0c;好多用windows的小伙伴部署go语言环境各种问题各种坑&#xff0c;网上教程看了个一知半解。没办…