Kubernetes 入口相同路径多个端口
Kubernetes ingress same path multiple ports
经过多次谷歌搜索和搜索(甚至在这里),我无法找到我的问题的明确答案。所以我希望这里有人可以为我指明正确的方向。
我有一个已经为我工作的 Kube 服务定义,但现在我只是用 LoadBalancer
公开了它。这是我当前的服务 yaml:
apiVersion: v1
kind: Service
metadata:
name: my-service
namespace: namespace1
labels:
app: my-service
spec:
type: LoadBalancer
selector:
app: my-service
tier: web
ports:
- name: proxy-port
port: 8080
targetPort: 8080
- name: metrics-port
port: 8082
targetPort: 8082
- name: admin-port
port: 8092
targetPort: 8092
- name: grpc-port
port: 50051
targetPort: 50051
这显然只是 TCP 负载平衡。我想做的是使用 Mutual TLS 来保护它,这样服务器将只接受来自我的客户端的具有授权证书的连接。
据我所知,在 Kube 领域,我需要做的是 Ingress
定义。我一直在研究我可以在 kind:Ingress
上找到的所有文档,但我似乎找不到任何允许我创建一个 Ingress
和 多个端口的地方路径!
我是不是漏掉了什么?有没有办法创建一个与上述服务定义具有相同功能的 K8s Ingress
?
据我所知,您不能为由入口控制器(例如 NGINX HTTP(S) 代理)支持的 HTTPS LoadBalancer 使用自定义端口(例如 8080),因为
目前 Ingress 的端口对于 http 隐式为 :80,对于 https 隐式为 :443,正如 IngressRule 的官方 doc reference 所解释的那样。
我认为解决方法是为每个服务使用不同的主机,就像这个 Ingress 资源示例:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: name-virtual-host-ingress
spec:
rules:
- host: proxy.foo.com
http:
paths:
- backend:
serviceName: proxy-svc
servicePort: 8080
- host: metrics.foo.com
http:
paths:
- backend:
serviceName: metrics-svc
servicePort: 8082
- host: admin.foo.com
http:
paths:
- backend:
serviceName: admin-svc
servicePort: 8092
- host: grpc.foo.com
http:
paths:
- backend:
serviceName: grpc-svc
servicePort: 50051
我遇到了同样的情况,我们必须在同一台主机上公开端口 80,443 和 50051。在K3S上使用traefik v2+,我是这样解决的:
应用此文件修改traefik配置;这是K3S。如果你直接用图表安装了traefik,添加一个与下面配置相同的值文件。
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
name: traefik
namespace: kube-system
spec:
valuesContent: |-
ports:
grpc:
port: 50051
protocol: TCP
expose: true
exposedPort: 50051
完成后,观察使用新配置更新 traefik 服务。
如果它不起作用,请确保您设置的端口是空闲的并且未被其他服务使用。
完成后,您可以创建 IngressRoute 对象。在这里我得到了一个用于 grpc (50051) 和一个用于网络 (80/443)。
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: db
spec:
entryPoints:
- web
- websecure
routes:
- kind: Rule
match: Host(`lc1.nebula.global`)
services:
- name: db
port: 80
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: db-grpc
spec:
entryPoints:
- grpc
routes:
- kind: Rule
match: Host(`lc1.nebula.global`)
services:
- name: db-grpc
port: 50051
经过多次谷歌搜索和搜索(甚至在这里),我无法找到我的问题的明确答案。所以我希望这里有人可以为我指明正确的方向。
我有一个已经为我工作的 Kube 服务定义,但现在我只是用 LoadBalancer
公开了它。这是我当前的服务 yaml:
apiVersion: v1
kind: Service
metadata:
name: my-service
namespace: namespace1
labels:
app: my-service
spec:
type: LoadBalancer
selector:
app: my-service
tier: web
ports:
- name: proxy-port
port: 8080
targetPort: 8080
- name: metrics-port
port: 8082
targetPort: 8082
- name: admin-port
port: 8092
targetPort: 8092
- name: grpc-port
port: 50051
targetPort: 50051
这显然只是 TCP 负载平衡。我想做的是使用 Mutual TLS 来保护它,这样服务器将只接受来自我的客户端的具有授权证书的连接。
据我所知,在 Kube 领域,我需要做的是 Ingress
定义。我一直在研究我可以在 kind:Ingress
上找到的所有文档,但我似乎找不到任何允许我创建一个 Ingress
和 多个端口的地方路径!
我是不是漏掉了什么?有没有办法创建一个与上述服务定义具有相同功能的 K8s Ingress
?
据我所知,您不能为由入口控制器(例如 NGINX HTTP(S) 代理)支持的 HTTPS LoadBalancer 使用自定义端口(例如 8080),因为 目前 Ingress 的端口对于 http 隐式为 :80,对于 https 隐式为 :443,正如 IngressRule 的官方 doc reference 所解释的那样。
我认为解决方法是为每个服务使用不同的主机,就像这个 Ingress 资源示例:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: name-virtual-host-ingress
spec:
rules:
- host: proxy.foo.com
http:
paths:
- backend:
serviceName: proxy-svc
servicePort: 8080
- host: metrics.foo.com
http:
paths:
- backend:
serviceName: metrics-svc
servicePort: 8082
- host: admin.foo.com
http:
paths:
- backend:
serviceName: admin-svc
servicePort: 8092
- host: grpc.foo.com
http:
paths:
- backend:
serviceName: grpc-svc
servicePort: 50051
我遇到了同样的情况,我们必须在同一台主机上公开端口 80,443 和 50051。在K3S上使用traefik v2+,我是这样解决的:
应用此文件修改traefik配置;这是K3S。如果你直接用图表安装了traefik,添加一个与下面配置相同的值文件。
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
name: traefik
namespace: kube-system
spec:
valuesContent: |-
ports:
grpc:
port: 50051
protocol: TCP
expose: true
exposedPort: 50051
完成后,观察使用新配置更新 traefik 服务。
如果它不起作用,请确保您设置的端口是空闲的并且未被其他服务使用。
完成后,您可以创建 IngressRoute 对象。在这里我得到了一个用于 grpc (50051) 和一个用于网络 (80/443)。
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: db
spec:
entryPoints:
- web
- websecure
routes:
- kind: Rule
match: Host(`lc1.nebula.global`)
services:
- name: db
port: 80
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: db-grpc
spec:
entryPoints:
- grpc
routes:
- kind: Rule
match: Host(`lc1.nebula.global`)
services:
- name: db-grpc
port: 50051