我在专用的 VMWare PKS 集群中使用 NSX/NCP Ingress。我正尝试建立 Elasticsearch 入口,后端服务使用 HTTPS。我似乎找不到让 NSX Ingress 与后端 HTTPS 服务通信的方法。
如果存在 TLS Ingress(在 Kubernetes/PKS 用例的集群中,或在 Project Pacific 用例的同一命名空间中),并且其主机与请求中的主机匹配,则负载均衡器将终止 TLS 并将 HTTP 请求发送到默认后端服务器。
背景:
- 在此环境中,k8s PKS 集群无法控制 DNS。每个专用集群分配一个 IP,并将通配符 DNS 记录指向该 IP。
- 只有 NSX 类 Ingress 控制器可以使用该专用 IP (
kuberneties.io/ingress.class: nsx
) - NSX Ingress 控制器不支持
ingress.kubernetes.io/secure-backends: 'true'
注释。 - 我可以部署其他入口控制器。例如,我使用注释建立了一个 nginx 入口控制器,
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
并且它可以正常工作。但是,这些入口控制器会获得随机分配的 IP(可能会更改)并且没有 DNS 记录。 - 我尝试删除 tls 部分并设置
ncp/ssl-mode: reencrypt
注释,但只出现 502 错误。愿意重新考虑这个问题。
我正在寻找:
- 理想情况下,我错过了一种让 NSX 入口与安全后端协同工作的方法。
- 如果失败,有一种让
ncp/ssl-mode: reencrypt
选项适用于这种情况的方法。我不想设置默认入口(规则中没有主机) - 除此之外,最简单的解决方案是将
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