圆咕噜咕噜 发表于 4 天前

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

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

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

1. K8S环境阐明与准备

为了演示,当地使用的是Macbook 上安装Docker,并在docker中安装minikube进行演示。如果不会的,自行百度这两个软件的安装。 当然,如果你现在有现成的k8s,那么更好,直接用。 启动minikube的命令如下:
https://i-blog.csdnimg.cn/direct/a605c27a7fe64a9a99a7ae1d9801296a.png
此中后的信息https://i-blog.csdnimg.cn/direct/8c786b3591444098976119dd5a0e6023.png
mac 安装minikube 的安装参考
https://i-blog.csdnimg.cn/direct/ac13ed0c67dc40019cd6dd6307eec61d.png
在docker中能看到demo
https://i-blog.csdnimg.cn/direct/d8e7cbf742e049ba90f07fc028e472c9.png

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

为了方便验证,搞个自己的web 程序,此处,用的python实现,访问web后,显示访问的用户名,访问的版本,以及访问的详细pod节点信息。 python代码如下:
https://i-blog.csdnimg.cn/direct/2b2d2975c06045628e5a00992c24cc39.png
为了方便在k8s 中发布,我将代码使用configmap来进行管理,创建一个文件:apps/config-main.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: python-main-script
data:
  demo.py: |
    from flask import Flask, request
    import os

    app = 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
https://i-blog.csdnimg.cn/direct/9ce2b760391046ca8806047ffe7da850.png
再创建一个pod对应的网络信息:svc-webserver.yaml
https://i-blog.csdnimg.cn/direct/ef4fecb6eaf04188846e2f95822ec19e.png
把以上资源都创建一下,创建好的信息列表如下:
https://i-blog.csdnimg.cn/direct/21c7669eb6374d26806429c2e3274ed1.png
为了简单访问,使用k8s 的port-forward 来测试是否可以访问。
https://i-blog.csdnimg.cn/direct/eea598c1b587476aa5039bf2c5a63421.png
https://i-blog.csdnimg.cn/direct/e82a598e174142398d786c7ac83cfad1.png
web欣赏器中打开:http:127.0.0.1:8080
https://i-blog.csdnimg.cn/direct/2c67f8e2fc93422393fcb9862b1d7ccc.png
使用postman,在header中添加username来进行访问,看访问是否可用。
https://i-blog.csdnimg.cn/direct/84276bb23f7c48639a0f04f7877c2f7b.png
这就是一个常见的应用,到这里,基础环境就准备好了。

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.nodePort}" services apisix-gateway)
  export NODE_IP=$(kubectl get nodes --namespace apisix -o jsonpath="{.items.status.addresses.address}")
  echo http://$NODE_IP:$NODE_PORT 同步,送一个更新命令
https://i-blog.csdnimg.cn/direct/5d2eee97d3dc41c886b1b36829cc9d3b.png
创建后的资源信息列表如下,主要看pod和svc
https://i-blog.csdnimg.cn/direct/98c1d61cd5a3429aac8930571ef1e054.png
同时,查看svc信息,记载下入口,备用
https://i-blog.csdnimg.cn/direct/322f32c01f9747ec834554aa1715b430.png
如果是生产环境:接纳LoadBalancer进行对外服务,以下为AWS中的生产外网配置案例。
https://i-blog.csdnimg.cn/direct/904fb59e348a482f93824f433f2c2885.png
3.2 将web案例修改问apisix代理

接下来,将我们刚才的web demo案例修改为apisix的代理。 添加一个apisix的route信息:apps/apisix-route.yaml
https://i-blog.csdnimg.cn/direct/46cea043e8044190b2bcc9197ffd5ffe.png
然后我们尝试做一个主机映射,将主机名webserver.dsinc.com.cn映射到apisix的gateway地点。 单纯的demo那里,我们直接修改/etc/hosts 添加域名地点为:webserver.dsinc.com.cn。让他指定到apisix的gateway地点。生产环境,此处由DNS服务来设置
https://i-blog.csdnimg.cn/direct/0dae70f89cd44849a4d49bcd58197a90.png
怎么简单怎么来。我们修改/etc/hosts文件,添加一个域名为当地解析。https://i-blog.csdnimg.cn/direct/177542c5ae2e4225a1a624ee6ab0c2f5.png
然后使用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。 使用欣赏器试试看看能访问。
https://i-blog.csdnimg.cn/direct/f7c1031ba7a5498b9ee5fb162747642a.png
使用postman试下用户访问,非常完善。
https://i-blog.csdnimg.cn/direct/2da866331b174024b90d981c99741a39.png
以上就是一个在K8S上正常的应用发布情况, 这也准备好做蓝绿的基础情况。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 简化K8S摆设流程:通过Apisix实现蓝绿发布策略详解(上)