从 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
服务。
我希望这可以帮助别人!
我正在尝试创建一个 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
服务。
我希望这可以帮助别人!