简化K8S部署流程:通过Apisix实现蓝绿发布策略详解(上)
本次主题主要目的是为大家讲解蓝绿发布,但是发现文档和内容太长了,对此将文档拆分成了两部分,视频拆分成了好几部分,这样大家刷起来没疲劳感。 第一部分《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
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上正常的应用发布情况, 这也准备好做蓝绿的基础情况。