当前位置: 首页 > news >正文

简化K8S部署流程:通过Apisix实现蓝绿发布策略详解(上)

本次主题主要目的是为大家讲解蓝绿发布,但是发现文档和内容太长了,对此将文档拆分成了两部分,视频拆分成了好几部分,这样大家刷起来没疲劳感。 第一部分《apisix + argorollout 实现蓝绿发布I-使用apisix发布应用》,主要内容为:

  1. K8S环境说明与准备。

  2. 在K8S中发布一个正常的web应用。

  3. 使用apisix代理我们发布的应用。 第二份《apisix + argorollout 实现蓝绿发布II-线上热切与蓝绿发布控制》内容为:

  4. ArgoRollrout介绍与安装

  5. 怎么在线上热切换为支持蓝绿版本应用。

  6. 正常发布流程演示。

1. K8S环境说明与准备

为了演示,本地使用的是Macbook 上安装Docker,并在docker中安装minikube进行演示。如果不会的,自行百度这两个软件的安装。 当然,如果你现在有现成的k8s,那么更好,直接用。 启动minikube的命令如下:

其中后的信息

mac 安装minikube 的安装参考

在docker中能看到demo

2. 在K8S中发布一个正常的web应用

为了方便验证,搞个自己的web 程序,此处,用的python实现,访问web后,显示访问的用户名,访问的版本,以及访问的具体pod节点信息。 python代码如下:

为了方便在k8s 中发布,我将代码使用configmap来进行管理,创建一个文件:apps/config-main.yaml

apiVersion: v1
kind: ConfigMap
metadata:name: python-main-script
data:demo.py: |from flask import Flask, requestimport osapp = Flask(__name__)@app.route('/')def index():# 从请求头部获取 username,如果不存在则返回 'null'username = request.headers.get('username', 'null')# 获取环境变量中的 POD 名称和软件版本pod_name = os.getenv('HOSTNAME', 'Unknown Pod')software_version = os.getenv('SOFTWARE_VERSION', 'v1.0')# 返回响应信息return f"Username: {username} \n 访问的服务器版本: {software_version} \n访问的 Pod 信息: {pod_name}"if __name__ == '__main__':app.run(host='0.0.0.0', port=8080)

通过以上的configmap信息,创建运行的pod信息。具体的pod定义yaml:deploy-http-webserver.yaml

再创建一个pod对应的网络信息:svc-webserver.yaml

把以上资源都创建一下,创建好的信息列表如下:

为了简单访问,使用k8s 的port-forward 来测试是否可以访问。

web浏览器中打开:http:127.0.0.1:8080

使用postman,在header中添加username来进行访问,看访问是否可用。

这就是一个常见的应用,到这里,基础环境就准备好了。

3.使用apisix代理我们发布的应用

接下来,将上面应用,转换为apisix来进行转发和代理

3.1 安装apisix

直接使用helm进行安装,可以直接线上安装,或者下载下来操作。因为网络原因,我采取的是下载下来安装。

# 添加 APISIX 的 Helm 仓库: Apache APISIX 的 Helm chart 存储在其官方 Helm 仓库中。首先,您需要将其添加到您的 Helm 仓库列表中。helm repo add apisix https://charts.apiseven.com
helm repo update# 创建命名空间(可选): 如果您想将 APISIX 安装在特定的命名空间中,您可以先创建一个命名空间。
kubectl create namespace ingress-apisix# 安装 APISIX: 使用 Helm 安装 APISIX。您可以指定命名空间(如果已创建)。如果没有指定命名空间,APISIX 将被安装在默认命名空间中。
helm install apisix apisix/apisix --namespace ingress-apisix --create-namespace#验证安装: 检查 APISIX 的 Pods、Services 等是否已正确部署。
kubectl get pods,svc -n ingress-apisix
#这将列出 apisix 命名空间中的所有 Pods 和 Services。
#配置端口转发(本地测试用): 如果您在本地或无法直接访问 LoadBalancer IP 的环境中工作,可能需要设置端口转发来访问 APISIX 管理界面或 API 端点。
kubectl port-forward svc/apisix-gateway 9080:80 --namespace ingress-apisix
#这样,您就可以通过访问本地的 http://localhost:9080 来访问 APISIX 网关。
#通过以上步骤,您可以在 Kubernetes 集群中部署和运行 Apache APISIX。在部署完成后,您可以开始配置 APISIX 以满足您的 API 网关需求,包括路由、认证、监控等功能的设置。

如果网络下载不方便,可以将包下载下来后使用本地安装。

helm pull apisix/apisix
tar -zxvt apisix-2.10.0.tgz
helm install apisix -n apisix . -f values-overrite.yaml#安装命令
helm install apisix apisix/apisix --set gateway.type=NodePort --set admin.allow.ipList="{0.0.0.0/0}" --namespace ingress-apisix --create-namespace

安装好后的资源信息

(base) maoshu@maoshu-MacBook apisix % helm install apisix apisix/apisix --set gateway.type=NodePort --set admin.allow.ipList="{0.0.0.0/0}" --namespace apisix --create-namespace
NAME: apisix
LAST DEPLOYED: Fri Apr  4 14:15:30 2025
NAMESPACE: apisix
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
1. Get the application URL by running these commands:export NODE_PORT=$(kubectl get --namespace apisix -o jsonpath="{.spec.ports[0].nodePort}" services apisix-gateway)export NODE_IP=$(kubectl get nodes --namespace apisix -o jsonpath="{.items[0].status.addresses[0].address}")echo http://$NODE_IP:$NODE_PORT

同步,送一个更新命令

创建后的资源信息列表如下,主要看pod和svc

同时,查看svc信息,记录下入口,备用

如果是生产环境:采用LoadBalancer进行对外服务,以下为AWS中的生产外网配置案例。

3.2 将web案例修改问apisix代理

接下来,将我们刚才的web demo案例修改为apisix的代理。 添加一个apisix的route信息:apps/apisix-route.yaml

然后我们尝试做一个主机映射,将主机名webserver.dsinc.com.cn映射到apisix的gateway地址。 单纯的demo哪里,我们直接修改/etc/hosts 添加域名地址为:webserver.dsinc.com.cn。让他指定到apisix的gateway地址。生产环境,此处由DNS服务来设置

怎么简单怎么来。我们修改/etc/hosts文件,添加一个域名为本地解析。

然后使用k8s 的port-ftoward来做流量转发。

(base) maoshu@maoshu-MacBook apps % sudo kubectl port-forward svc/apisix-gateway -n ingress-apisix 80
Forwarding from 127.0.0.1:80 -> 9080
Forwarding from [::1]:80 -> 9080
Handling connection for 80
Handling connection for 80

这里有个小知识点,80端口属于特权端口,mac电脑需要使用的话,需要sudo。 使用浏览器试试看看能访问。

使用postman试下用户访问,非常完美。

以上就是一个在K8S上正常的应用发布情况, 这也准备好做蓝绿的基础情况。

相关文章:

  • 15.第二阶段x64游戏实战-分析怪物血量(遍历周围)
  • 多表查询之嵌套查询
  • 刷刷刷刷刷sql题
  • 进程互斥的软件实现方法
  • Spring 事务实现原理,Spring 的 ACID是如何实现的?如果让你用 JDBC 实现事务怎么实现?
  • 2025年NISP一级题库试题
  • 17.2Linux的MISC驱动实验(编程)_csdn
  • Nordic外设GPIO[nrfx_gpiote_in_init函数报NRFX_ERROR_NO_MEM并且fatal error]
  • 【c++深入系列】:万字string详解(附有sso优化版本的string模拟实现源码)
  • Centos 、Linux 基础运维命令
  • Spark-Streaming简介及核心编程
  • UML 通信图对象协作:共享汽车系统交互脉络
  • 算力网络有关论文自用笔记(2)
  • 何东山团队提到的“真正真空”(zero-point-free vacuum)
  • Power BI企业运营分析——数据大屏搭建思路
  • DeepSeek在自动驾驶领域的创新应用
  • DOCA介绍
  • move闯关 (集合)
  • 嘻游后台系统与机器人模块结构详解:功能逻辑 + 定制改造实战
  • java实现 PDF中的图片文字内容识别
  • 人民日报任仲平:为什么中国意味着确定性、未来性、机遇性
  • 博物馆有一项活动40岁以上不能参加?馆方回应
  • 全国首例!上市公司董监高未履行公开增持承诺,投资者起诉获赔
  • 石磊当选河北秦皇岛市市长
  • 潘功胜:央行将实施好适度宽松的货币政策,推动中国经济高质量发展
  • 《不眠之夜》上演8年推出特别版,多业态联动形成戏剧经济带