首页 > 解决方案 > 使用 Nginx Ingress 将 TCP 流量发送到入口的命名空间

问题描述

我正在使用 Nginx Ingress 控制器打开与带有--tcp-services-configmap=k8s-ingress/k8s-ingress-tcp标志的 postgres 数据库的连接。该配置图看起来像

apiVersion: v1
data:
  "5432": namespace-a/the-postgres-svc:5432
kind: ConfigMap

这部分工作得很好,但是我想在同一个端口上打开另一个服务,5432namespace-b/the-postgres-svc:5432.

有没有办法根据入口资源中的命名空间来选择命名空间?由于如果我只是将该记录添加到“namespace-a”记录之后,数据键将是相同的,因此我无法仅附加到 configmap 数据。

谢谢!

标签: kubernetesnginx-ingress

解决方案


因此,您希望在不同名称空间中的同一端口上提供服务。我为这种方法找到了有趣的分步教程

首先,您应该创建两个命名空间:

apiVersion: v1
kind: Namespace
metadata:
  name: namespace-a

apiVersion: v1
kind: Namespace
metadata:
  name: namespace-b

比拥有您的服务和部署定义,区别在于namenamespace字段:

apiVersion: v1
kind: Service
metadata:
  labels:
    run: nginx
  name: namespacea-nginx
  namespace: namespace-a
spec:
  ports:
  - port: 5432
    protocol: TCP
    targetPort: 5432
  selector:
    run: nginx

apiVersion: v1
kind: Service
metadata:
  labels:
    run: nginx
  name: namespaceb-nginx
  namespace: namespace-b
spec:
  ports:
  - port: 5432
    protocol: TCP
    targetPort: 5432
  selector:
    run: nginx

部署文件:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    run: nginx
  name: nginx
  namespace: namespace-a
spec:
  ...

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    run: nginx
  name: nginx
  namespace: namespace-b
spec:
  ...

最后,Ingress 文件定义:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  namespace: namespace-a
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: namespacea.com
    http:
      paths:
      - backend:
          serviceName: namespacea-nginx
          servicePort: 5432
        path: /

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  namespace: namespace-b
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: namespaceb.com
    http:
      paths:
      - backend:
          serviceName: namespaceb-nginx
          servicePort: 5432
        path: /

推荐阅读