仅按主机名进行动态路由 - Kubernetes Ingress 规则
Dynamic Routing by Hostname only - Kubernetes Ingress Rules
我有一个部署了多个不同服务的 K8s 集群,我想使用一个 Ingress
通过唯一的主机名 DNS
.[=16= 将每个传入请求路由到适当的服务]
目前,我只能在使用根路径时解决请求,即 service-123.app.com
。
当我尝试使用无法解析的路径发出请求时。这些路径是每个服务的有效路径。例如,应用程序需要 service-123.app.com/page/12345
。
我可能不完全理解 K8s Ingress 规则的预期工作方式,但我希望它仅基于主机名进行匹配,并简单地转发到适当服务的路径上。
我是不是漏掉了一些非常简单的东西?任何帮助深表感谢。谢谢!
这是我的配置文件。
Ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
......
name: app-name
namespace: default
spec:
rules:
- host: service-123.app.com
http:
- path: "/*"
backend:
serviceName: service-123
servicePort: 80
- host: service-456.app.com
http:
paths:
- path: "/*"
backend:
serviceName: service-456
servicePort: 80
service.yaml
---
apiVersion: v1
kind: Service
metadata:
annotations: {}
labels:
app: service-123
name: service-123
namespace: default
spec:
ports:
- name: port8080
port: 80
targetPort: 8080
selector:
app: service-123
type: NodePort
不确定您使用的是哪个 K8s 和入口控制器,但在后来的 K8s 中,您可以指定 pathType
来更好地处理路径通配符。
你会得到这样的结果:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
......
name: app-name
namespace: default
spec:
rules:
- host: service-123.app.com
http:
- path: /
pathType: Prefix
backend:
serviceName: service-123
servicePort: 80
- host: service-456.app.com
http:
paths:
- path: /
pathType: Prefix
backend:
serviceName: service-456
servicePort: 80
如果您使用 nginx ingress controller 查看正确的 nginx 配置的一个好方法是查看入口控制器生成的实际 nginx.conf
。
$ kubectl cp <nginx-ingress-controller-pod>:nginx.conf nginx.conf
$ cat nginx.conf
我有一个部署了多个不同服务的 K8s 集群,我想使用一个 Ingress
通过唯一的主机名 DNS
.[=16= 将每个传入请求路由到适当的服务]
目前,我只能在使用根路径时解决请求,即 service-123.app.com
。
当我尝试使用无法解析的路径发出请求时。这些路径是每个服务的有效路径。例如,应用程序需要 service-123.app.com/page/12345
。
我可能不完全理解 K8s Ingress 规则的预期工作方式,但我希望它仅基于主机名进行匹配,并简单地转发到适当服务的路径上。
我是不是漏掉了一些非常简单的东西?任何帮助深表感谢。谢谢!
这是我的配置文件。
Ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
......
name: app-name
namespace: default
spec:
rules:
- host: service-123.app.com
http:
- path: "/*"
backend:
serviceName: service-123
servicePort: 80
- host: service-456.app.com
http:
paths:
- path: "/*"
backend:
serviceName: service-456
servicePort: 80
service.yaml
---
apiVersion: v1
kind: Service
metadata:
annotations: {}
labels:
app: service-123
name: service-123
namespace: default
spec:
ports:
- name: port8080
port: 80
targetPort: 8080
selector:
app: service-123
type: NodePort
不确定您使用的是哪个 K8s 和入口控制器,但在后来的 K8s 中,您可以指定 pathType
来更好地处理路径通配符。
你会得到这样的结果:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
......
name: app-name
namespace: default
spec:
rules:
- host: service-123.app.com
http:
- path: /
pathType: Prefix
backend:
serviceName: service-123
servicePort: 80
- host: service-456.app.com
http:
paths:
- path: /
pathType: Prefix
backend:
serviceName: service-456
servicePort: 80
如果您使用 nginx ingress controller 查看正确的 nginx 配置的一个好方法是查看入口控制器生成的实际 nginx.conf
。
$ kubectl cp <nginx-ingress-controller-pod>:nginx.conf nginx.conf
$ cat nginx.conf