k8s实战-2

k8s实战-2

  • 一、Deployment
    • 1.多副本
    • 2.扩缩容
    • 3.自愈&故障转移
    • 4.滚动更新
    • 5.版本回退
  • 二、Service
    • 1.ClusterIP
    • 2.NodePort
  • 总结


一、Deployment

Deploymentk8s 中的一个资源对象,用于管理应用的副本(Pods)。它的主要作用是确保集群中运行着指定数量的应用实例(Pods)

简单理解:

  • Deployment 类似于一个“控制器”,它负责确保集群中有一定数量的某个应用的实例在运行。

  • 你可以把它想象成一个“工厂”,这个工厂负责生产并维护一定数量的产品(Pods)。

  • 如果产品(Pods)出现问题或者需要更新,工厂会自动修复或替换这些产品,确保始终有指定数量的产品在运行

功能特点:

  • 版本管理:通过滚动更新(Rolling Update)的方式,可以逐步更新应用的实例而不影响服务的可用性。

  • 回滚:如果更新失败,可以轻松回滚到以前的版本。

  • 自动扩展:可以根据负载自动增加或减少应用实例的数量。

  • 健康检查:自动检测并替换故障的实例。

1.多副本

使用命令行的方式创建多副本,其中关键字--replicas=:指定副本的数量

kubectl create deployment my-dep --image=nginx --replicas=3

使用yaml文件的方式创建多副本

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: my-depname: my-dep
spec:replicas: 3selector:matchLabels:app: my-deptemplate:metadata:labels:app: my-depspec:containers:- image: nginxname: nginx

在这里插入图片描述

2.扩缩容

就是可以修改副本的数量

扩充或减少副本:

kubectl scale --replicas=5 deployment/my-dep

在这里插入图片描述
在这里插入图片描述

当然也可以使用如下语句:

kubectl edit deployment my-dep#修改 replicas

3.自愈&故障转移

自愈是指系统在检测到故障时自动修复自身的能力。通常,自愈策略是在不影响服务可用性的前提下,通过自动重启服务实例、替换故障组件等方式来恢复系统的正常运行。

案例:Web 应用的自愈
假设你有一个部署在 Kubernetes 集群上的 Web 应用,该应用通过一个 Deployment 管理,确保始终有三个副本(Pods)在运行。以下是自愈的详细过程:

初始状态:有三个副本(Pods)在运行:Pod A、Pod B 和 Pod C。应用通过一个 Service 被外部客户端访问。发生故障:Pod B 因为某种原因(如内存溢出、CPU 使用率过高)变得不可用。自动修复:Deployment 配置了健康检查(Health Checks),通过探测器(Probes)检测到 Pod B 已经不再健康。Kubernetes 自动终止 Pod B,并启动一个新的 Pod D 来替代 Pod B。新的 Pod D 加入集群,并且 Service 会将其纳入负载均衡池。最终状态:系统恢复正常,有三个健康的副本(Pod A、Pod D 和 Pod C)在运行。外部客户端通过 Service 访问应用时,不会察觉到任何中断。

故障转移是指在主系统(Primary System)发生故障时,自动切换到备用系统(Secondary System)的过程。通常,故障转移用于处理更严重的故障,如整个节点或区域的故障。

案例:数据库的故障转移
假设你有一个分布式数据库系统,该系统由两个数据库实例组成:一个主数据库(Primary Database)和一个从数据库(Secondary Database)。以下是故障转移的详细过程:

初始状态:主数据库运行在节点 A 上,负责读写操作。从数据库运行在节点 B 上,负责同步主数据库的数据,并准备在需要时接管主数据库的功能。发生故障:节点 A 因为硬件故障而完全不可用。自动切换:故障检测机制(如心跳监测)检测到节点 A 的故障。自动切换脚本或工具(如 MySQL 的高可用性解决方案)将从数据库提升为主数据库。从数据库 B 成为主数据库,开始接受读写操作。客户端的连接指向新的主数据库。最终状态:系统恢复正常,客户端通过新的主数据库(原从数据库 B)继续进行读写操作。如果可能的话,可以修复或替换节点 A,并将其重新配置为从数据库。

4.滚动更新

滚动更新是一种部署策略,通过逐步替换旧的应用程序实例**(Pods)**来部署新版本的应用程序。在滚动更新的过程中,新版本的应用程序会逐渐取代旧版本的应用程序,直到所有实例都被更新为止。

优点

平滑过渡:在更新过程中,始终保持一部分应用实例可用,避免服务中断。
回滚方便:如果新版本出现问题,可以轻松回滚到旧版本。
健康检查:确保只有健康的新实例才被投入使用。

滚动更新的工作流程

滚动更新的一般工作流程如下:

创建新版本:创建一个带有新版本标签的 Deployment。
逐步替换:Kubernetes 逐步终止旧版本的 Pods,并创建新版本的 Pods。
健康检查:确保新创建的 Pods 是健康的,然后再终止旧版本的 Pods。
完成更新:重复上述步骤,直到所有旧版本的 Pods 都被新版本的 Pods 替换

案例说明

假设你有一个部署在 Kubernetes 集群上的 Web 应用,该应用通过一个 Deployment 管理,确保始终有三个副本**(Pods)**在运行。以下是滚动更新的详细过程:

初始状态

初始部署:你有一个带有标签 app:1.0 的 Deployment。Deployment 确保有三个副本(Pods)在运行:Pod A、Pod B 和 Pod C。应用通过一个 Service 被外部客户端访问。

更新应用

创建新版本:你更新 Deployment 的配置,使其使用带有标签 app:1.1 的新版本镜像。逐步替换:Kubernetes 开始逐步终止旧版本的 Pods,并创建新版本的 Pods。假设 Kubernetes 首先终止 Pod A,并创建一个新的 Pod D 使用标签 app:1.1 的镜像。健康检查:新创建的 Pod D 通过健康检查,表明它已经准备好接收流量。Pod A 被终止,Pod D 加入集群。重复过程:Kubernetes 继续终止 Pod B,并创建 Pod E 使用标签 app:1.1 的镜像。Pod E 通过健康检查,Pod B 被终止,Pod E 加入集群。最后,Pod C 被终止,Pod F 被创建并加入集群。

更新完成

最终状态:系统恢复正常,有三个带有标签 app:1.1 的健康副本(Pod D、Pod E 和 Pod F)在运行。外部客户端通过 Service 访问应用时,不会察觉到任何中断。

可以通过如下代码来查看滚动更新状态

kubectl rollout status deployment/deployment名称

5.版本回退

#历史记录
kubectl rollout history deployment/你的deploy名称#查看某个历史详情
kubectl rollout history deployment/你的deploy名称 --revision=2#回滚(回到上次)
kubectl rollout undo deployment/你的deploy名称#回滚(回到指定版本)
kubectl rollout undo deployment/你的deploy名称 --to-revision=2

二、Service

ServiceKubernetes 中的一个抽象层,用于定义一组 Pod 的逻辑集合以及访问这些 Pod 的策略。它是应用间的网络服务发现和负载均衡的基础。

简单理解:

Service 类似于一个“电话簿”,它知道如何找到你的应用实例(Pods)。
你可以把它想象成一个“电话交换机”,这个交换机负责将流量转发到正确的地方。
即使应用实例(Pods)的 IP 地址和端口发生变化,Service 仍然能够正确地找到它们并进行通信。

功能特点:

网络发现:Service 提供了一个固定的 IP 地址和端口号,即使后端的 Pods 发生变化,Service 的地址也不会变。
负载均衡:Service 会将请求均匀地分发到后端的 Pods 上,确保负载均衡。
访问策略:可以定义 Service 的访问方式,如 ClusterIP、NodePort 或 LoadBalancer。

1.ClusterIP

ClusterIP 是默认的服务类型,它为服务分配一个集群内的虚拟 IP地址(Cluster IP)。这个 IP 地址只能在集群内部访问,不能直接从集群外部访问。

特点:

内部访问:只能从集群内部访问,不能直接从集群外部访问。
固定 IP 地址:为服务分配一个固定的 Cluster IP 地址。
负载均衡:在集群内部将流量均匀地分发到后端的 Pods。
健康检查:自动过滤掉不健康的 Pods,确保只将请求发送到健康的 Pods。

使用场景:

内部服务:当你只需要在集群内部访问服务时,使用 ClusterIP 类型。
内部微服务:内部微服务之间相互调用时,可以使用 ClusterIP。

示例:

创建一个 ClusterIP 类型的服务:

apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app: my-appports:- protocol: TCPport: 80targetPort: 9376type: ClusterIP
kubectl apply -f path/to/service.yaml
kubectl get svcNAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
my-service   ClusterIP   10.96.5.203     <none>        80/TCP         1d

也可以通过命令行方式:

# 等同于没有--type的
kubectl expose deployment my-dep --port=8000 --target-port=80 --type=ClusterIP

2.NodePort

NodePort 类型的服务为集群中的每个节点分配一个固定的端口(Node Port)。这个端口可以从集群外直接访问,通过 Node Port 在这里插入代码片可以访问到集群内的服务。

特点:

外部访问:可以从集群外部通过 <node-ip>:<node-port> 的形式访问服务。
固定端口范围:端口范围通常在 30000-32767 之间(可配置)。
自动负载均衡:在集群内部将流量均匀地分发到后端的 Pods。

使用场景:

简单外部访问:当你需要从集群外部简单地访问服务时,使用 NodePort 类型。
开发和测试环境:在开发和测试环境中,快速暴露服务以便测试。

示例:

创建一个 NodePort在这里插入代码片 类型的服务:

apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app: my-appports:- protocol: TCPport: 80targetPort: 9376nodePort: 30000type: NodePort
kubectl apply -f path/to/service.yaml
kubectl get svcNAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
my-service   NodePort    10.96.5.203     <none>        80:30000/TCP     1d

总结

本篇主要介绍了k8s的deployment和service的一些基础概念和命令,具体还是的实际的动手操作。

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

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

相关文章

二分查找一>山脉数组的峰顶索引

1.题目&#xff1a; 2.解析&#xff1a; 代码&#xff1a; public int peakIndexInMountainArray(int[] arr) {int left 1, right arr.length-2;while(left < right) {int mid left (right-left1) / 2;if(arr[mid] > arr[mid-1]) left mid;else right mid-1;}ret…

软件测试:postman详解

一、Postman背景介绍 用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的&#xff0c;用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具。今天给大家介绍的这款网页调试工具不仅可以调试简单的css、html、脚本等简单的网…

更新C语言题目

1.以下程序输出结果是() int main() {int a 1, b 2, c 2, t;while (a < b < c) {t a;a b;b t;c--;}printf("%d %d %d", a, b, c); } 解析:a1 b2 c2 a<b 成立 ,等于一个真值1 1<2 执行循环体 t被赋值为1 a被赋值2 b赋值1 c-- c变成1 a<b 不成立…

如何搭建自己的域名邮箱服务器?Poste.io邮箱服务器搭建教程,Linux+Docker搭建邮件服务器的教程

Linux系统Docker搭建Poste.io电子邮件服务器&#xff0c;搭建属于自己的域名邮箱服务器&#xff0c;可以无限收发电子邮件&#xff08;Email&#xff09;&#xff01; 视频教程&#xff1a;https://www.bilibili.com/video/BV11p1mYaEpM/ 前言 什么是域名邮箱&#xff1f; …

各省份-产业链现代化水平(2001-2022年)

产业链现代化水平是一个综合性指标&#xff0c;它为我们提供了一个多维度的视角来评估各省份在产业链现代化进程中的发展水平。这个指标涵盖了技术创新、产业升级、生产效率、产业结构优化等多个方面&#xff0c;包含原始数据、测算结果以及参考文献。 2001年-2022年各省份-产…

论文翻译 | Generated Knowledge Prompting for Commonsense Reasoning

摘要 整合外部知识是否有利于常识推理&#xff0c;同时保持预训练序列模型的灵活性&#xff0c;这仍然是一个悬而未决的问题。为了研究这个问题&#xff0c;我们开发了生成知识提示&#xff0c;它包括从语言模型生成知识&#xff0c;然后在回答问题时提供知识作为附加输入。我们…

【Java】IntelliJ IDEA开发环境安装

一、下载 官方地址&#xff1a;https://www.jetbrains.com/idea/ 点击Download直接下载 二、安装 双击安装包&#xff0c;点击Next 选择安装路径&#xff0c;点击Next 勾选安装内容 安装完成。 三、创建项目 打开IDEA&#xff0c;填写项目名称&#xff0c;选择项目安装路径…

如何使用ssm实现基于SSM的宠物服务平台的设计与实现+vue

TOC ssm779基于SSM的宠物服务平台的设计与实现vue 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#x…

安全帽头盔检测数据集 3类 12000张 安全帽数据集 voc yolo

安全帽头盔检测数据集 3类 12000张 安全帽数据集 voc yolo 安全帽头盔检测数据集介绍 数据集名称 安全帽头盔检测数据集 (Safety Helmet and Person Detection Dataset) 数据集概述 该数据集专为训练和评估基于YOLO系列目标检测模型&#xff08;包括YOLOv5、YOLOv6、YOLOv7…

【C++ STL】手撕vector,深入理解vector的底层

vector的模拟实现 前言一.默认成员函数1.1常用的构造函数1.1.1默认构造函数1.1.2 n个 val值的构造函数1.1.3 迭代器区间构造1.1.4 initializer_list 的构造 1.2析构函数1.3拷贝构造函数1.4赋值运算符重载 二.元素的插入,删除,查找操作2.1 operator[]重载函数2.2 push_back函数:…

Redis篇(面试题 - 连环16炮)(持续更新迭代)

目录 目录 目录 &#xff08;第一炮&#xff09;一、Redis&#xff1f;常用数据结构&#xff1f; 1. 项目里面到了Redis&#xff0c;为什么选用Redis&#xff1f; 2. Redis 是什么&#xff1f; 3. Redis和关系型数据库的本质区别有哪些&#xff1f; 4. Redis 的线程模型…

4 思科模拟器的介绍和使用

4 思科模拟器的介绍和使用 思科的IOS给我们提供了三大模式 设备开机后&#xff0c;进入的模式是【用户模式】 Router表示设备的名称 “>”表示用户模式 在用户模式输入"?" 可列出在用户模式可以使用的命令 第二种模式是特权模式,输入enable进入特权模式&…

【C++】入门基础介绍(上)C++的发展历史与命名空间

文章目录 1. 前言2. C发展历史2. 1 C版本更新特性一览2. 2 关于C23的一个小故事: 3. C的重要性3. 1 编程语言排行榜3. 2 C在工作领域中的应用 4. C学习建议和书籍推荐4. 1 C学习难度4. 2 学习书籍推荐 5. C的第一个程序6. 命名空间6. 1 namespace的价值6. 2 namespace的定义6. …

如何解决 MySQL ERROR 1040 (08004): Too many connections ?

MySQL 是最流行的开源关系数据库管理系统之一&#xff0c;它也是开发人员中非常常用的数据库。即便它高度健壮和可伸缩性极强&#xff0c;像任何软件一样&#xff0c;它也可能出现错误。我们会经常遇到一个错误&#xff0c;特别是在高流量系统中&#xff0c;error 1040 (08004)…

DenseNet算法:口腔癌识别

本文为为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 一 DenseNet算法结构 其基本思路与ResNet一致&#xff0c;但是它建立的是前面所有层和后面层的密集连接&#xff0c;它的另一大特色是通过特征在channel上的连接来实现特征重用。 二 设计理念 三…

XSP16受电端取电快充协议芯片的应用及工作原理

受电端取电快充协议芯片XSP16是一款集成PD2.0/3.0、PD3.1、QC2.0/3.0、华为FCP/SCP、三星AFC等全协议芯片&#xff0c;这使得它能够适应不同品牌和设备的需求。支持大电流、大功率140W28V/5A给设备快速供电&#xff0c;该芯片采用小 QFN16_3*3mm封装&#xff0c;芯片支持电压向…

【网络篇】计算机网络——应用层详述(笔记)

目录 一、应用层协议原理 1. 进入应用层 2. 网络应用程序体系结构 &#xff08;1&#xff09;客户-服务器体系结构&#xff08;client-server architecture&#xff09; &#xff08;2&#xff09; P2P 体系结构&#xff08;P2P architecture&#xff09; 3. 进程间通讯 …

dll动态库加载失败导致程序启动报错以及dll库加载失败的常见原因分析与总结

目录 1、问题说明 2、dll库的隐式加载与动态加载 2.1、dll库的隐式加载 2.2、dll库的显式加载 3、使用Process Explorer查看进程加载的dll库信息以及动态加载的dll库有没有加载成功 3.1、使用Process Explorer查看进程加载的dll库信息 3.2、使用Process Explorer查看动态…

C语言语句、语句分类及注释

文章目录 一、语句和语句分类二、注释&#x1f355;注释是什么&#xff1f;为什么写注释&#xff1f;1. /**/的形式2. //的形式3. 注释会被替换 三、随机数的生成1.rand函数2.srand函数3.time函数4.设置随机数的范围 四、C99中的变长数组五、问题表达式解析表达式1表达式2表达式…

redis中的数据类型(Set与ZSet)

&#xff08;一&#xff09;set set在我们目前有两个意思&#xff0c;首先就是这里使用的集合&#xff0c;第二个是我们的set和get方法 因为set是一个集合&#xff0c;所以他具有集合的一些特点&#xff1a; 1.集合中的元素无序 2.集合中的元素是不可重复的 3.集合间是可…