k8s集群中金丝雀发布 + 声明式资源管理yaml

一、K8S常见的发布方式

旨在降低发布风险并提高发布速度

1、蓝绿发布

两套环境(设备)交替升级,旧版本保留一定时间便于回滚

优点:对用户无感,是最安全的发布方式,业务稳定

缺点:需要两套系统,对资源要求比较高,成本特别高
根据比例将老版本升级,例如80%用户访问是老版本,20%用户访问是新版本

2、灰度发布(金丝雀发布) 

特点:对自动要求比较高,对比起来系统更加稳定发布,如果遇到问题可以减少影响范围

先更新一部分pod,然后再暂停更新

安排一小部分的用户流量去访问更新的pod来进行测试,高比例的流量(如95%)继续走旧版本,而低比例的流量(如5%)被切换到新版本。当测试没问题后再扩大比例,直到全部更新完成为止(测试服,体验服

类似于“金丝雀”在煤矿中用来检测有害气体的角色

3、滚动发布 

按批次停止老版本实例,启动新版本实例。

特点:节约资源,用户无感,但是部署和回滚的速度慢

按照他的比例,一部分一部分滚动更新,是k8s默认的更新机制

不用创建一定比例的pod;先创建,确定没问题后,删除旧日版本的pod

滚动发布涉及整个服务器集群的逐步升级,而金丝雀发布则更侧重于一小部分用户进行初步测试和验证。

简单的说

滚动发布是一个持续的过程,涉及分批升级服务器或实例,直到所有实例都升级到新版本。

而金丝雀发布则是一个分阶段的过程,首先进行小范围的测试,然后逐渐扩大发布范围。

二、金丝雀发布详细+部署

Deployment控制器支持自定义控制更新过程中的滚动节奏,如“暂停(pause)”或“继续(resume)”更新操作。比如等待第一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用,主体部分还是旧的版本

然后,再筛选一小部分的用户请求路由到新版本的Pod应用,继续观察能否稳定地按期望的方式运行。确定没问题之后再继续完成余下的Pod资源滚动更新,否则立即回滚更新操作。这就是所谓的金丝雀发布

金丝雀发布的思想则是将少量的请求引流到新版本上,因此部署新版本服务只需极小数的机器。验证新版本符合预期后,逐步调整流量权重比例,使得流量慢慢从老版本迁移至新版本,期间可以根据设置的流量比例,对新版本服务进行扩容,同时对老版本服务进行缩容,使得底层资源得到最大化利用

创建一个命名空间隔离

kubectl create namespace test

创建deployment

因为我们刚刚删除了,所有我们重新创建一个

kubectl create deployment nginx-yc --image=nginx:1.14 --port=80 --replicas=3 -n test

暴露服务 (创建svc)

kubectl expose deployment nginx-yc --port=80 --target-port=80 --name=nginx-service -n test --type=NodePort

更新deployment的版本,并配置暂停deployment(多一个新版本)

  1. 更新名为"nginx-yc"的部署(Deployment)中的 "nginx" 容器的镜像版本为"nginx:1.22

  2. 暂停名为"nginx-yc"的部署的滚动更新,这意味着在执行这个命令后,将不会继续推进新的副本集,并且当前的副本集将保持不变

  3.  查看在 test 命名空间下名为 nginx-yc 的部署的更新(rollout)状态

kubectl set image deployment/nginx-yc nginx=nginx:1.22 -n test && kubectl rollout pause deployment nginx-yc -n test
 
kubectl rollout status deployment nginx-yc -n test

观察更新状态

开启另一个窗口查看 pod 信息

监控更新的过程,可以看到已经新增了一个资源,但是并未按照预期的状态去删除一个旧的资源,就是因为使用了 pause 暂停命令

-w 选项,它会使命令进入监视模式,实时显示资源的变化情况

kubectl get pod -w -n test

查看信息 

kubectl get pod -owide -n test

查看新版本

curl -I

其他的

如何做新旧版本分离呢

分阶段访问

在金丝雀发布中,将流量分流到新旧版本的这个过程被称为分阶段访问(Staged Access),也可以称为阶段性流量调度(Staged Traffic Shifting)。即将流量逐步引导到新版本的过程,以确保新版本的稳定性和可靠性。

默认情况下,访问 server 流量将会负载均衡至4个实例上,新增 server 实现新的实例与旧实例访问分流:

在开始的时候我们创了一个svc

查看kubectl get endpoints -n tesst

发现在这个service有四个地址,我们再创一个svc,并且把新版本放到新svc,老svc存老svc就可以了

创建新svc

kubectl expose deployment nginx-yc --port=80 --target-port=80 --name=new-nginx-service -n test --type=NodePort

现在要把svc对应放入

kubectl get svc -n test new-nginx-service -oyaml

或者

kubectl edit svc new-nginx-service -n test

复制内容

复制内容,替换标签

kubectl get pod --show-labels  -n test

对应

vim new-nginx.yaml

删除new-nginx-sevice 并且用申明式写

kubectl delete svc  new-nginx-service -n tes

kubectl apply -f new-nginx.yaml  

老版本同样过程

kubectl edit svc nginx-service -n test

#vim old-nginx.yaml

kubectl delete svc  nginx-service -n test

kubectl apply -f old-nginx.yaml -n test

测试

总结: 简单的来说就把看kubectl edit svc内容找新老两个svc(当一个模版),对应不同名称在kubectl get pod --show-lables的LABELS中查看不同的名称放到spec.selector下的标签名称用键值对去写,本质是用svc访问新旧的pod

当业务没有问题

确保更新的pod没问题了,继续更新

kubectl rollout resume deployment/nginx-yc -n test
 
kubectl rollout status deployment nginx-yc -n test

测试下新旧版本访问

旧service无法访问,由于更新了新版本,现在由新的版本提供服务

kubectl get pods,svc -n test -o wide

三、声明式管理方法

适合于对资源的修改操作
声明式资源管理方法依赖于资源配置清单文件对资源进行管理
资源配置清单文件有两种格式:yaml(人性化,易读),json(易于api接口解析)
对资源的管理,是通过事先定义在统一资源配置清单内,再通过陈述式命令应用到k8s集群里

语法格式:kubectl create/apply/delete -f xxxx.yaml


3.1、解释资源配置清单

kubectl explain deployment.metadata
 
kubectl explain service.metadata
 
修改资源配置清单并应用
离线修改:
修改yaml文件,并用 kubectl apply -f xxxx.yaml 文件使之生效
注意:当apply不生效时,先使用delete清除资源,再apply创建资源
 
kubectl get service -n test new-nginx-service  -o yaml > nginx-svc.yaml
vim nginx-svc.yaml                #修改port: 8080
kubectl delete -f nginx-svc.yaml
kubectl apply -f nginx-svc.yaml
kubectl get svc
 
在线修改:
直接使用 kubectl edit service nginx 在线编辑资源配置清单并保存退出即时生效(如port: 888)
PS:此修改方式不会对yaml文件内容修改
 
 
删除资源配置清单


陈述式删除:
kubectl delete service nginx
 
声明式删除:
kubectl delete -f nginx-svc.yaml

3.2、常用字段含义


每一个控制器通常对应一种资源类型,如Deployment、Service等等,在YAML中,我们可以指定这些资源的状态以及如何管理它们

Deployment控制器在YAML文件中的定义可能包括:

Metadata:例如控制器的名称和命名空间
Spec:例如应用的副本数量,以及图像的URL

spec 是 "specification"(规范)的缩写,它用于定义资源的期望状态或配置
Selector:例如确定哪些Pods应由该控制器管理的标签
Template:例如Pod的基本设计

3.3、快速编写YAML文件

--dry-run——读取而不创建
kubectl run nginx-cs --image=soscscs/myapp:v1 --port=80 --dry-run=clientkubectl create deployment nginx-dpm --image=soscscs/myapp:v1 --port=80 --replicas=3 --dry-run=client
-o yaml——查看生成yaml格式
kubectl run nginx-cs --image=soscscs/myapp:v1 --port=80 --dry-run=client -o yaml

查看字段帮助信息,可一层层的查看相关资源对象的帮助信息

kubectl explain pods.spec.containers

3.4、示例

需求

资源名称:my-nginx-yc

命名空间:my-yc

容器镜像:nginx:1.21

容器端口:80

标签:yc-: my-bq

创建 server去关联上面的pod

nodePort: 32037

结果:首先修改页面:welcome to china 对外访问, 输入地址就能访问

 vim my-nginx-yc-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: my-nginx-ycnamespace: my-yclabels:yc-: my-bq
spec:replicas: 1selector:matchLabels:app: my-nginx-yctemplate:metadata:labels:app: my-nginx-ycyc-: my-bqspec:containers:- name: nginximage: nginx:1.21ports:- containerPort: 80# Add an init container to modify the default Nginx pageinitContainers:- name: modify-nginx-pageimage: busybox:1.32command: ["sh", "-c", "echo 'welcome to china' > /tmp/index.html && cp /tmp/index.html /usr/share/nginx/html/index.html"]volumeMounts:- name: nginx-htmlmountPath: /usr/share/nginx/htmlvolumes:- name: nginx-htmlemptyDir: {}

创建 Service

 vim my-nginx-yc-deployment.yaml

# my-nginx-yc-service.yaml
apiVersion: v1
kind: Service
metadata:name: my-nginx-ycnamespace: my-yc
spec:selector:app: my-nginx-ycports:- protocol: TCPport: 80targetPort: 80nodePort: 32037type: NodePort

kubectl apply -f my-nginx-yc-deployment.yaml
kubectl apply -f my-nginx-yc-service.yaml 

四、yaml介绍语法格式

  • 通过缩进表示层级关系
  • 不能使用Tab进行缩进,只能使用空格缩进(一般缩进两个空格)
  • 字符后缩进一个空格,比如" : "、" , "等
  • 使用" --- "表示新的yaml文件的开头
  • 使用" # "表示注释

此章内容有点赶,后期会修改

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

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

相关文章

openssl的运用

一、概述 Opssl是一个用于TLS/SSL协议的工具包,也是一个通用密码库。 包含了国密sm2 sm3 sm4,包含了对称加密,非对称加密,单项散列,伪随机、签名,密码交换,证书等一些算法库。 为了深层次的学习…

基于SpringBoot+Vue的靓车汽车销售网站-无偿分享 (附源码+LW+调试)

目录 1. 项目技术 2. 功能菜单 3. 部分功能截图 4. 研究背景 5. 研究目的 6. 可行性分析 6.1 技术可行性 6.2 经济可行性 6.3 操作可行性 7. 系统设计 7.1 概述 7.2 系统流程和逻辑 7.3 系统结构 8. 数据库设计 8.1 数据库ER图 (1)材料分…

基于飞腾S2500处理器的全国产加固服务器

近日,西安康德航测电子科技有限公司凭借其深厚的行业底蕴和创新精神,正式推出了基于飞腾S2500处理器的全国产加固服务器。这一产品的问世,不仅标志着我国在信息技术领域的自立自强迈出了坚实的一步,更以其卓越的性能、坚固的设计和…

OpenStack-Glance组件

Glance Glance使用磁盘格式和容器格式基础配置镜像转换 Glance 是 OpenStack 的镜像服务,负责存储、发现和管理虚拟机镜像。它允许用户创建和共享镜像,用于启动虚拟机实例。 Glance 的主要功能 (1)虚拟机镜像的管理 支持镜像的上…

求助——AssertionError: Attribute pipeline is missing from configuration.json.

我在本地运行Sunsimiao大模型的时候遇到了“AssertionError: Attribute pipeline is missing from configuration.json.”的问题。在网上找了很多问题都没有解决,求助一下广大网友。有什么好的解决方法吗? 本地环境如上所示,不知是哪里出…

2024年顶级小型语言模型前15名

本文,我们将深入了解2024年备受瞩目的十五款小型语言模型(SLMs),它们分别是Llama 3.1 8B、Gemma2、Qwen 2、Mistral Nemo、Phi-3.5等。这些SLMs以其精巧的体积和高效率著称,它们不需要依赖庞大的服务器资源&#xff0c…

P3916 图的遍历(Tarjan缩点和反向建边)

P3916 图的遍历 - 洛谷 | 计算机科学教育新生态 写法一:Tarjan 思路:先运用Tarjan算法得到每个连通块中最大的编号,然后对每个连通块进行缩点重新建图,进行dfs,得到缩点后的连通块能够达到的最大编号。 Code: conste…

Android ConstraintLayout 约束布局的使用手册

目录 前言 一、ConstraintLayout基本介绍 二、ConstraintLayout使用步骤 1、引入库 2、基本使用,实现按钮居中。相对于父布局的约束。 3、A Button 居中展示,B Button展示在A Button正下方(距离A 46dp)。相对于兄弟控件的约束…

三步入门Log4J 的使用

本篇基于Maven 的Project项目&#xff0c; 快速演示Log4j 的导入和演示。 第一步&#xff1a; 导入Log4j依赖 <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.24.2</version&…

【强化学习入门笔记】1.5 贝尔曼最优公式

本系列为学习赵世钰老师的《强化学习的数学原理》所作的学习笔记. 课程视频网址&#xff1a;https://space.bilibili.com/2044042934 1.5.1 定义 1.5.1.1 Contraction mapping theorem (收缩映射定理) fixed point(不动点) 如果 x ∗ x^* x∗满足下式, x ∗ x^* x∗称之为…

Nmap脚本使用

Nmap是主机扫描工具&#xff0c;他的图形化界面是Zenmap&#xff0c;分布式框架为Dnamp。 Nmap可以完成以下任务&#xff1a; 主机探测端口扫描版本检测系统检测支持探测脚本的编写 Nmap在实际中应用场合如下&#xff1a;通过对设备或者防火墙的探测来审计它的安全性探测目标主…

python源码实例游戏开发小程序办公自动化网络爬虫项目开发源码(250+个项目、26.6GB)

文章目录 源代码下载地址项目介绍预览 项目备注源代码下载地址 源代码下载地址 点击这里下载源码 项目介绍 python源码实例游戏开发小程序办公自动化网络爬虫项目开发源码(250个项目、26.6GB) 预览 项目备注 1、该资源内项目代码都经过测试运行成功&#xff0c;功能ok的情…

MySql:理解数据库

目录 一、什么是数据库 第一层理解 第二层理解 第三层理解 二、Linux下的数据库 三、基本认识 登录数据库时&#xff0c; mysql -u root -h 127.0.0.1 -P 3306 -p -h指定MySql服务器所在主机&#xff0c;若在本地则为回环地址。-P表示目标主机上MySql服务端口号 一般简单…

BERT模型的输出格式探究以及提取出BERT 模型的CLS表示,last_hidden_state[:, 0, :]用于提取每个句子的CLS向量表示

说在前面 最近使用自己的数据集对bert-base-uncased进行了二次预训练&#xff0c;只使用了MLM任务&#xff0c;发现在加载训练好的模型进行输出CLS表示用于下游任务时&#xff0c;同一个句子的输出CLS表示都不一样&#xff0c;并且控制台输出以下警告信息。说是没有这些权重。…

Vue框架开发一个简单的购物车(Vue.js)

让我们利用所学知识来开发一个简单的购物车 &#xff08;记得暴露属性和方法&#xff01;&#xff01;&#xff01;&#xff09; 首先来看一下最基本的一个html框架 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&…

系统加固-Linux不允许用户使用密码登录,只能使用密钥登录

一、密码登录的安全隐患 传统的密码登录方式&#xff0c;尽管简单直接&#xff0c;却存在诸多安全隐患。首先&#xff0c;密码本身容易被猜测或通过暴力破解手段获得。特别是当用户设置了过于简单或常见的密码时&#xff0c;系统面临的安全风险将显著增加。其次&#xff0c;密…

大数据实验E5HBase:安装配置,shell 命令和Java API使用

实验目的 熟悉HBase操作常用的shell 命令和Java API使用&#xff1b; 实验要求 掌握HBase的基本操作命令和函数接口的使用&#xff1b; 实验平台 操作系统&#xff1a;Linux&#xff08;建议Ubuntu16.04或者CentOS 7 以上&#xff09;&#xff1b;Hadoop版本&#xff1a;3…

【Vivado】xdc约束文件编写

随手记录一下项目中学到的约束文件编写技巧。 时序约束 创建生成时钟 参考链接&#xff1a; Vivado Design Suite Tcl Command Reference Guide (UG835) Vivado Design Suite User Guide: Using Constraints (UG903) 通过Clocking Wizard IP创建的时钟&#xff08;MMCM或…

Electron + Vue 简单实现窗口程序(Windows)从零到一

前言 想做一个桌面应用程序&#xff0c;一直没有找到简单快速可上手的框架。刚好有点前端的底子&#xff0c;就发现了Electron。关于Electron的介绍&#xff0c;请移步 https://www.electronjs.org/ 查阅。 简单来说&#xff0c;引用官网的话&#xff0c;Electron是一个使用 …

健康养生生活

在快节奏的现代生活中&#xff0c;健康养生愈发成为人们关注的焦点。它不仅是一种生活方式&#xff0c;更是对生命质量的珍视与呵护。 健康养生&#xff0c;饮食为先。合理的膳食结构是维持身体健康的基石。我们应确保每餐营养均衡&#xff0c;增加蔬菜、水果、全谷物以及优质蛋…