使用ingress做路由转发和负载均衡。

cms.test域名 访问 cms-web service
cms.test/api/xx 访问 cms-gateway service
但是遇到请求地址错误的问题,因为默认转发到cms-gateway服务的请求地址多了/api,所以要对请求地址作处理。

需要添加配置,将请求/api/xx转发到gateway服务/xx接口。

    nginx.ingress.kubernetes.io/configuration-snippet: rewrite "^/api(/.*)?$" "$1" break;

完整配置:

kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: content-manage-system
  namespace: cms-test
  annotations:
    kubesphere.io/creator: yuwb
    kubesphere.io/description: test
    nginx.ingress.kubernetes.io/configuration-snippet: rewrite "^/api(/.*)?$" "$1" break;
    nginx.ingress.kubernetes.io/proxy-body-size: 20M
spec:
  ingressClassName: nginx
  rules:
    - host: cms.test
      http:
        paths:
          - path: /
            pathType: ImplementationSpecific
            backend:
              service:
                name: cms-web
                port:
                  number: 7770
          - path: /api/
            pathType: ImplementationSpecific
            backend:
              service:
                name: cms-gateway
                port:
                  number: 8061

为什么不直接使用nginx转发?

因为pod的ip是会变的,用ingress可以直接指向servicename,servicename是固定的,而service又指向了podname,避免了pod ip发生变化带来的问题。