前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用 Nginx Ingress 和 APISIX 实现 Kubernetes 集群中的流量路由和跨域请求处理

使用 Nginx Ingress 和 APISIX 实现 Kubernetes 集群中的流量路由和跨域请求处理

原创
作者头像
行者深蓝
发布2024-03-18 22:23:04
5050
发布2024-03-18 22:23:04
举报
文章被收录于专栏:云原生应用工坊

背景

Kubernetes (k8s) 集群,默认配置好了 Nginx Ingress 控制器,用于处理南北流量的调度,即处理从外部到集群内部服务的流量。下面是对您的架构的重新组织和概述:

  • 前端服务配置 Nginx Ingress: 您的前端服务使用 Nginx Ingress 控制器来接收外部流量。通过配置 Ingress 资源,您可以定义如何将外部请求路由到相应的前端服务。
  • 部署 APISIX 应用网关: 在 k8s 集群内部署了 APISIX 应用网关,用于进一步处理和路由内部流量。您选择不开启 APISIX 的 Ingress 控制器功能,也不配置 APISIX 的自定义资源定义(CRD),这意味着您将以一种更传统的方式管理 APISIX 的配置,而不是通过 Kubernetes 资源。
  • 流量调度路径: 外部流量首先通过 Nginx Ingress 控制器进入集群,并被路由到前端服务。前端服务处理请求后,可以将部分请求(例如 API 请求)转发到 APISIX 应用网关。APISIX 再根据其配置将流量路由到相应的后端服务(后端服务-svc),最终到达后端服务的 Pod(后端服务-pod)。

这种架构允许您在 Nginx Ingress 和 APISIX 之间灵活地处理和路由流量,以满足不同的应用场景和性能要求。

请求路径

Kubernetes 集群配置概述及部署步骤

外部流量首先通过 Nginx Ingress 控制器进入集群,并被路由到前端服务。前端服务处理请求后,可以将部分请求(例如 API 请求)转发到 APISIX 应用网关。APISIX 再根据其配置将流量路由到相应的后端服务(后端服务-svc),最终到达后端服务的 Pod(后端服务-pod)

  1. 部署前端服务并配置 Nginx Ingress: 确保前端服务已部署,并有相应的 Service 对象。
  2. 创建 Ingress 资源来配置 Nginx Ingress 控制器以将流量路由到前端服务。
  3. 使用 Helm 部署 APISIX,确保在部署时禁用 APISIX Ingress 控制器和 CRD。 通过 Nginx Ingress 配置将前端 API 请求转发到 APISIX:
  4. 创建或修改 Ingress 资源,添加规则以将特定路径(如 /api/)的请求转发到 APISIX 服务。
  5. 在前端 API Ingress 中开启跨域请求: 在相应的 Ingress 资源中添加注解以开启 CORS 支持。
  6. 配置 APISIX 以将流量路由到后端服务: 根据需要配置 APISIX 的路由规则,以将请求正确地路由到后端服务。 请注意,以上步骤提供了一个基本的部署框架,具体的配置细节可能需要根据您的应用和环境进行调整。

完整的 配置 example

  1. 部署前端服务并配置 Nginx Ingress 假设您的前端服务是一个简单的 Web 应用:
代码语言:yaml
复制
apiVersion: v1
kind: Service
metadata:
  name: frontend-service
spec:
  selector:
    app: frontend
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: frontend
        image: your-frontend-image
        ports:
        - containerPort: 8080

Ingress 配置:

代码语言:yaml
复制
Copy code
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: frontend-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: "example.com"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: frontend-service
            port:
              number: 80
  1. 添加 APISIX 的 Helm 仓库, 部署 APISIX:
代码语言:shell
复制
helm repo add apisix https://charts.apiseven.com
helm repo update
helm install apisix apisix/apisix --set ingress-controller.enabled=false
  1. 通过 Nginx Ingress 配置将前端 API 请求转发到 APISIX, 修改前端服务的 Ingress 配置,添加 API 路径的转发规则:
代码语言:yaml
复制
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: frontend-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: "example.com"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: frontend-service
            port:
              number: 80
      - path: /api/
        pathType: Prefix
        backend:
          service:
            name: apisix-service
            port:
              number: 80
  1. 在前端 API Ingress 中开启跨域请求, 在前端服务的 Ingress 配置中添加 CORS 相关的注解:
代码语言:yaml
复制
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: frontend-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/cors-allow-methods: "GET, POST, PUT, DELETE, OPTIONS"
    nginx.ingress.kubernetes.io/cors-allow-headers: "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range"
    nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
spec:
  rules:
  - host: "example.com"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: frontend-service
            port:
              number: 80
      - path: /api/
        pathType: Prefix
        backend:
          service:
            name: apisix-service
            port:
              number: 80
  1. 配置 APISIX 以将流量路由到后端服务, 在 APISIX 中创建一个路由规则,将 /api/ 路径下的请求转发到后端服务:
代码语言:shell
复制
curl http://apisix-admin-service:9180/apisix/admin/routes/1 \
  -H 'X-API-KEY: your-api-key' \
  -X PUT \
  -d '{
    "uri": "/api/*",
    "upstream": {
      "type": "roundrobin",
      "nodes": {
        "backend-service:80": 1
      }
    }
  }'

请注意,您需要将 apisix-admin-service 替换为您的 APISIX 管理服务名称,your-api-key 替换为您的 API 密钥,backend-service 替换为您的后端服务名称。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 请求路径
    • Kubernetes 集群配置概述及部署步骤
      • 完整的 配置 example
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档