从 LB ip 重定向到服务的入口

Ingress to redirect to service from LB ip

我正在尝试创建一个 Ingress 规则来将请求从 LoadBalancer 重定向到服务。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: hostlessendpoint
spec:
  rules:
  - http:
      paths:
      - path: /hostless
        backend:
          serviceName: node-red
          servicePort: 1880

上面的 yaml 脚本应该将所有请求从 https://LOAD_BALANCER_IP/hostless 重定向到端口 1880

上的 node-red

如果我尝试请求上述 URL,我得到一个错误 Cannot GET /hostless。请求根给出 404 page not found.

我可以使用直接 URL 访问我的服务(例如 http://LOAD_BALANCER_IP:1880 将重定向到 Node-red 服务)。

服务 yaml 如下所示:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: node-red
  name: node-red
spec:
  ports:
    - name: "1880"
      port: 1880
      protocol: TCP
      targetPort: 1880
  selector:
    app: node-red
  sessionAffinity: None
  type: LoadBalancer

如何使用 ingress 连接自定义端口的服务?

尝试设置一个 rewrite-target 注释,这将有效地将 /hostless 请求重写为 /,即从外部 http://LOAD_BALANCER_IP:1880/hostless 到内部 http://node-red:1880

例如:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: hostlessendpoint
spec:
  rules:
  - http:
      paths:
      - path: /hostless(/|$)(.*)
        backend:
          serviceName: node-red
          servicePort: 1880

参见 this link,假设您使用的是 Nginx 入口控制器。

我找到了让它发挥作用的方法!

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    traefik.ingress.kubernetes.io/redirect-entry-point: https
    kubernetes.io/ingress.class: "traefik"
    traefik.ingress.kubernetes.io/router.middlewares: "kube-system-traefik-stripprefix@kubernetescrd"
  name: traefik-all
  namespace: partner
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: nginx-demo
          servicePort: 2222
      - path: /node
        backend:
          serviceName: node-red
          servicePort: 1880
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: traefik-stripprefix
  namespace: kube-system
spec:
  stripPrefixRegex:
    regex:
      - "/[^/]+"

由于K3S Traefik 不支持traefik.ingress.kubernetes.io/rewrite-target 注解,我使用中间件删除了前缀。

使用上述代码,来自 LOAD_BALANCER_IP/* 的所有流量都将重定向到 nginx-demo:2222 服务。来自 LOAD_BALANCER_IP/node/* 的所有流量将被重定向到 node-red:1880 服务。

我希望这可以帮助别人!