简体   繁体   English

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

[英]Ingress to redirect to service from LB ip

I'm trying to create an Ingress rule to redirect requests from LoadBalancer to Service.我正在尝试创建一个Ingress规则以将请求从 LoadBalancer 重定向到服务。

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

The above yaml script is supposed to redirect all requests from https://LOAD_BALANCER_IP/hostless to node-red on port 1880上面的 yaml 脚本应该将来自https://LOAD_BALANCER_IP/hostless的所有请求重定向到端口1880上的node-red

If I try to request the above URL, I got an error Cannot GET /hostless .如果我尝试请求上述 URL,我收到错误Cannot GET /hostless Requesting the root gives 404 page not found .请求 root 给出404 page not found

I can access my services with the direct URL (eg. http://LOAD_BALANCER_IP:1880 will redirect to Node-red service).我可以通过直接 URL 访问我的服务(例如http://LOAD_BALANCER_IP:1880将重定向到 Node-red 服务)。

Service yaml looks like that:服务 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

How to use ingress to reach a service whereas a custom port?如何使用ingress来访问服务,而自定义端口?

Try setting a rewrite-target annotation, which will effectively rewrite /hostless requests to / , ie http://LOAD_BALANCER_IP:1880/hostless externally to http://node-red:1880 internally.尝试设置重写目标注释,这将有效地将/hostless请求重写为/ ,即http://LOAD_BALANCER_IP:1880/hostless外部到http://node-red:1880内部。

For example:例如:

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

See this link , assuming you are using Nginx ingress controller.请参阅此链接,假设您使用的是 Nginx 入口 controller。

I've found a way to make it works !我找到了一种使它起作用的方法!

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:
      - "/[^/]+"

I use a middleware to remove the prefix as K3S Traefik does not support the traefik.ingress.kubernetes.io/rewrite-target annotation.我使用中间件删除前缀,因为 K3S Traefik 不支持traefik.ingress.kubernetes.io/rewrite-target注释。

With the above code, all trafic from LOAD_BALANCER_IP/* will be redirected to nginx-demo:2222 service.使用上面的代码,来自LOAD_BALANCER_IP/*的所有流量都将被重定向到nginx-demo:2222服务。 All trafic from LOAD_BALANCER_IP/node/* will be redicted to node-red:1880 service.来自LOAD_BALANCER_IP/node/*的所有流量都将被重定向到node-red:1880服务。

I hope this could help someone !我希望这可以帮助别人!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM