使用 TCP 的 Kubernetes 主机和服务入口映射
Kubernetes Host and Service Ingress Mapping using TCP
在使用 Kubernetes 几个月后,我发现了一种很好的方法来使用一个现有的域名并通过子域公开集群 IP,但也通过不同的子域公开大部分微服务使用入口控制器。
我的入口示例代码:
kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:
name: cluster-ingress-basic
namespace: ingress-basic
selfLink: >-
/apis/networking.k8s.io/v1beta1/namespaces/ingress-basic/ingresses/cluster-ingress-basic
uid: 5d14e959-db5f-413f-8263-858bacc62fa6
resourceVersion: '42220492'
generation: 29
creationTimestamp: '2021-06-23T12:00:16Z'
annotations:
kubernetes.io/ingress.class: nginx
managedFields:
- manager: Mozilla
operation: Update
apiVersion: networking.k8s.io/v1beta1
time: '2021-06-23T12:00:16Z'
fieldsType: FieldsV1
fieldsV1:
'f:metadata':
'f:annotations':
.: {}
'f:kubernetes.io/ingress.class': {}
'f:spec':
'f:rules': {}
- manager: nginx-ingress-controller
operation: Update
apiVersion: networking.k8s.io/v1beta1
time: '2021-06-23T12:00:45Z'
fieldsType: FieldsV1
fieldsV1:
'f:status':
'f:loadBalancer':
'f:ingress': {}
spec:
rules:
- host: microname1.subdomain.domain.com
http:
paths:
- pathType: ImplementationSpecific
backend:
serviceName: kylin-job-svc
servicePort: 7070
- host: microname2.subdomain.domain.com
http:
paths:
- pathType: ImplementationSpecific
backend:
serviceName: superset
servicePort: 80
- {}
status:
loadBalancer:
ingress:
- ip: xx.xx.xx.xx
使用此配置:
- microname1.subdomain.domain.com 指向 Apache Kylin
- microname2.subdomain.domain.com 指向 Apache Superset
这样所有微服务都可以使用相同的 Cluster-Load-Balancer(IP) 但不同的子域公开。
我尝试对 SQL 服务器执行相同的操作,但这不起作用,不知道为什么,但我觉得原因是 SQL 服务器使用 TCP 进行通信,而不是HTTP.
- host: microname3.subdomain.domain.com
http:
paths:
- pathType: ImplementationSpecific
backend:
serviceName: mssql-linux
servicePort: 1433
关于如何为 TCP 服务做同样的事情有什么想法吗?
您的理解很好,默认情况下 NGINX Ingress Controller 仅支持 HTTP 和 HTTPs 流量配置(第 7 层),因此您的 SQL 服务器可能因此无法正常工作。
您的 SQL 服务正在使用 TCP 连接运行,因此它是 。
您的问题的解决方案不是为此服务使用自定义子域,而是设置 exposing TCP service in NGINX Ingress Controller。例如,您可以将此 SQL 服务设置为在端口 1433 上的入口 IP 上可用:
Ingress controller uses the flags --tcp-services-configmap
and --udp-services-configmap
to point to an existing config map where the key is the external port to use and the value indicates the service to expose using the format: <namespace/service name>:<service port>:[PROXY]:[PROXY]
要设置它,您可以按照 official NGINX Ingress documentation but there are also some more detailed instructions on Whosebug, for example 中提供的步骤进行操作。
在使用 Kubernetes 几个月后,我发现了一种很好的方法来使用一个现有的域名并通过子域公开集群 IP,但也通过不同的子域公开大部分微服务使用入口控制器。
我的入口示例代码:
kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:
name: cluster-ingress-basic
namespace: ingress-basic
selfLink: >-
/apis/networking.k8s.io/v1beta1/namespaces/ingress-basic/ingresses/cluster-ingress-basic
uid: 5d14e959-db5f-413f-8263-858bacc62fa6
resourceVersion: '42220492'
generation: 29
creationTimestamp: '2021-06-23T12:00:16Z'
annotations:
kubernetes.io/ingress.class: nginx
managedFields:
- manager: Mozilla
operation: Update
apiVersion: networking.k8s.io/v1beta1
time: '2021-06-23T12:00:16Z'
fieldsType: FieldsV1
fieldsV1:
'f:metadata':
'f:annotations':
.: {}
'f:kubernetes.io/ingress.class': {}
'f:spec':
'f:rules': {}
- manager: nginx-ingress-controller
operation: Update
apiVersion: networking.k8s.io/v1beta1
time: '2021-06-23T12:00:45Z'
fieldsType: FieldsV1
fieldsV1:
'f:status':
'f:loadBalancer':
'f:ingress': {}
spec:
rules:
- host: microname1.subdomain.domain.com
http:
paths:
- pathType: ImplementationSpecific
backend:
serviceName: kylin-job-svc
servicePort: 7070
- host: microname2.subdomain.domain.com
http:
paths:
- pathType: ImplementationSpecific
backend:
serviceName: superset
servicePort: 80
- {}
status:
loadBalancer:
ingress:
- ip: xx.xx.xx.xx
使用此配置:
- microname1.subdomain.domain.com 指向 Apache Kylin
- microname2.subdomain.domain.com 指向 Apache Superset
这样所有微服务都可以使用相同的 Cluster-Load-Balancer(IP) 但不同的子域公开。
我尝试对 SQL 服务器执行相同的操作,但这不起作用,不知道为什么,但我觉得原因是 SQL 服务器使用 TCP 进行通信,而不是HTTP.
- host: microname3.subdomain.domain.com
http:
paths:
- pathType: ImplementationSpecific
backend:
serviceName: mssql-linux
servicePort: 1433
关于如何为 TCP 服务做同样的事情有什么想法吗?
您的理解很好,默认情况下 NGINX Ingress Controller 仅支持 HTTP 和 HTTPs 流量配置(第 7 层),因此您的 SQL 服务器可能因此无法正常工作。
您的 SQL 服务正在使用 TCP 连接运行,因此它是
您的问题的解决方案不是为此服务使用自定义子域,而是设置 exposing TCP service in NGINX Ingress Controller。例如,您可以将此 SQL 服务设置为在端口 1433 上的入口 IP 上可用:
Ingress controller uses the flags
--tcp-services-configmap
and--udp-services-configmap
to point to an existing config map where the key is the external port to use and the value indicates the service to expose using the format:<namespace/service name>:<service port>:[PROXY]:[PROXY]
要设置它,您可以按照 official NGINX Ingress documentation but there are also some more detailed instructions on Whosebug, for example