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

打印 上一主题 下一主题

主题 1494|帖子 1494|积分 4482

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

  • K8S环境阐明与准备。
  • 在K8S中发布一个正常的web应用。
  • 使用apisix代理我们发布的应用。 第二份《apisix + argorollout 实现蓝绿发布II-线上热切与蓝绿发布控制》内容为:
  • ArgoRollrout先容与安装
  • 怎么在线上热切换为支持蓝绿版本应用。
  • 正常发布流程演示。

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
  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4.   name: python-main-script
  5. data:
  6.   demo.py: |
  7.     from flask import Flask, request
  8.     import os
  9.     app = Flask(__name__)
  10.     @app.route('/')
  11.     def index():
  12.         # 从请求头部获取 username,如果不存在则返回 'null'
  13.         username = request.headers.get('username', 'null')
  14.         # 获取环境变量中的 POD 名称和软件版本
  15.         pod_name = os.getenv('HOSTNAME', 'Unknown Pod')
  16.         software_version = os.getenv('SOFTWARE_VERSION', 'v1.0')
  17.         # 返回响应信息
  18.         return f"Username: {username} \n 访问的服务器版本: {software_version} \n访问的 Pod 信息: {pod_name}"
  19.     if __name__ == '__main__':
  20.         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进行安装,可以直接线上安装,大概下载下来操作。因为网络缘故原由,我采取的是下载下来安装。
  1. # 添加 APISIX 的 Helm 仓库: Apache APISIX 的 Helm chart 存储在其官方 Helm 仓库中。首先,您需要将其添加到您的 Helm 仓库列表中。
  2.  
  3. helm repo add apisix https://charts.apiseven.com
  4. helm repo update
  5. # 创建命名空间(可选): 如果您想将 APISIX 安装在特定的命名空间中,您可以先创建一个命名空间。
  6. kubectl create namespace ingress-apisix
  7. # 安装 APISIX: 使用 Helm 安装 APISIX。您可以指定命名空间(如果已创建)。如果没有指定命名空间,APISIX 将被安装在默认命名空间中。
  8. helm install apisix apisix/apisix --namespace ingress-apisix --create-namespace
  9. #验证安装: 检查 APISIX 的 Pods、Services 等是否已正确部署。
  10. kubectl get pods,svc -n ingress-apisix
  11. #这将列出 apisix 命名空间中的所有 Pods 和 Services。
  12. #配置端口转发(本地测试用): 如果您在本地或无法直接访问 LoadBalancer IP 的环境中工作,可能需要设置端口转发来访问 APISIX 管理界面或 API 端点。
  13. kubectl port-forward svc/apisix-gateway 9080:80 --namespace ingress-apisix
  14. #这样,您就可以通过访问本地的 http://localhost:9080 来访问 APISIX 网关。
  15. #通过以上步骤,您可以在 Kubernetes 集群中部署和运行 Apache APISIX。在部署完成后,您可以开始配置 APISIX 以满足您的 API 网关需求,包括路由、认证、监控等功能的设置。
复制代码
如果网络下载不方便,可以将包下载下来后使用当地安装。
  1. helm pull apisix/apisix
  2. tar -zxvt apisix-2.10.0.tgz
  3. helm install apisix -n apisix . -f values-overrite.yaml
  4.  
  5. #安装命令
  6. helm install apisix apisix/apisix --set gateway.type=NodePort --set admin.allow.ipList="{0.0.0.0/0}" --namespace ingress-apisix --create-namespace
复制代码
安装好后的资源信息
  1. (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
  2. NAME: apisix
  3. LAST DEPLOYED: Fri Apr  4 14:15:30 2025
  4. NAMESPACE: apisix
  5. STATUS: deployed
  6. REVISION: 1
  7. TEST SUITE: None
  8. NOTES:
  9. 1. Get the application URL by running these commands:
  10.   export NODE_PORT=$(kubectl get --namespace apisix -o jsonpath="{.spec.ports[0].nodePort}" services apisix-gateway)
  11.   export NODE_IP=$(kubectl get nodes --namespace apisix -o jsonpath="{.items[0].status.addresses[0].address}")
  12.   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来做流量转发。
  1. (base) maoshu@maoshu-MacBook apps % sudo kubectl port-forward svc/apisix-gateway -n ingress-apisix 80
  2. Forwarding from 127.0.0.1:80 -> 9080
  3. Forwarding from [::1]:80 -> 9080
  4. Handling connection for 80
  5. Handling connection for 80
复制代码
这里有个小知识点,80端口属于特权端口,mac电脑需要使用的话,需要sudo。 使用欣赏器试试看看能访问。

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

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

圆咕噜咕噜

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表