NSX/NCP 入口至安全 (HTTPS/TLS) 后端

NSX/NCP 入口至安全 (HTTPS/TLS) 后端

我在专用的 VMWare PKS 集群中使用 NSX/NCP Ingress。我正尝试建立 Elasticsearch 入口,后端服务使用 HTTPS。我似乎找不到让 NSX Ingress 与后端 HTTPS 服务通信的方法。

https://docs.vmware.com/en/VMware-NSX-T-Data-Center/3.0/ncp-kubernetes/GUID-E03D6EE5-9C6C-457F-AD81-25CF2056F4D8.html

如果存在 TLS Ingress(在 Kubernetes/PKS 用例的集群中,或在 Project Pacific 用例的同一命名空间中),并且其主机与请求中的主机匹配,则负载均衡器将终止 TLS 并将 HTTP 请求发送到默认后端服务器。

背景:

  1. 在此环境中,k8s PKS 集群无法控制 DNS。每个专用集群分配一个 IP,并将通配符 DNS 记录指向该 IP。
  2. 只有 NSX 类 Ingress 控制器可以使用该专用 IP ( kuberneties.io/ingress.class: nsx)
  3. NSX Ingress 控制器不支持ingress.kubernetes.io/secure-backends: 'true'注释。
  4. 我可以部署其他入口控制器。例如,我使用注释建立了一个 nginx 入口控制器,nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"并且它可以正常工作。但是,这些入口控制器会获得随机分配的 IP(可能会更改)并且没有 DNS 记录。
  5. 我尝试删除 tls 部分并设置ncp/ssl-mode: reencrypt注释,但只出现 502 错误。愿意重新考虑这个问题。

我正在寻找:

  1. 理想情况下,我错过了一种让 NSX 入口与安全后端协同工作的方法。
  2. 如果失败,有一种让ncp/ssl-mode: reencrypt选项适用于这种情况的方法。我不想设置默认入口(规则中没有主机)
  3. 除此之外,最简单的解决方案是将eventsink-opendistro-es-client-service端口 9200 HTTPS 作为 HTTP 服务呈现给 NSX 入口控制器。我考虑过建立一个单独的 nginx pod,它连接到后端的服务,并在前端将其呈现为 HTTP,然后入口控制器就可以访问它。

我也不想将 Elasticsearch 映像重建为非 https 的自定义映像,但如果有 helm chart 方法可以使暴露的端口 9200 仅为 HTTP,我就可以这样做。

最后,这是我的入口定义:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: eventsink-opendistro-es-client
  annotations: 
    kubernetes.io/ingress.class: nsx
    ingress.kubernetes.io/secure-backends: 'true'
    # ncp/ssl-mode: reencrypt
  namespace: default
spec:
  rules:
  - host: elasticsearch.clustername.pks.example.net
    http:
      paths:
      - backend:
          serviceName: eventsink-opendistro-es-client-service
          servicePort: 9200
  tls:
  - hosts:
    - elasticsearch.clustername.pks.example.net
    secretName: clustername.pks.example.net-ssl

答案1

我最终使用的解决方法是创建一个反向代理服务,将 9200 HTTPS 作为 HTTP 公开给入口控制器。

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: eventsink-reverseproxy-conf
data:
  default.conf: |
    server {
        listen       80;
        server_name  _;
        location / {
            proxy_pass    https://eventsink-opendistro-es-client-service:9200;
        }
    }

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: eventsink-reverseproxy
  labels:
    app: eventsink-reverseproxy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: eventsink-reverseproxy
  template:
    metadata:
      labels:
        app: eventsink-reverseproxy
    spec:
      containers:
      - name: nginx
        image: nginx:1.19.0
        ports:
        - name: http
          containerPort: 80
        volumeMounts:
              - name: nginxconfd
                mountPath: /etc/nginx/conf.d
      volumes:
        - name: nginxconfd
          configMap:
            name: eventsink-reverseproxy-conf

---
apiVersion: v1
kind: Service
metadata:
  name: eventsink-reverseproxy-svc
spec:
  selector:
    app: eventsink-reverseproxy
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80

相关内容