我在 GCP 上,并使用 ElasticSearch 运算符将 ElasticSearch 和 Kibana 部署到集群中。我创建了一个带有预共享证书的外部 Ingress,用于将流量发送到 Kibana 服务。但是我收到了 502 错误,我正在尝试了解问题所在。我现在最好的猜测是 GCE Ingress 无法与加密的后端通信 - 但我不确定如何调试它。为了测试这一点,我唯一能做的就是禁用 Kibana 的 SSL - 然后连接就可以正常工作了。但是,这会删除加密,我不太喜欢 - 我宁愿从 Ingress 到 pod 的流量保持加密。
现在,从长远来看,我可以选择服务网格的路线,这也是我们计划的 - 但就目前而言,我只想让该死的 Ingress 发挥作用并连接到加密端点。看起来可以通过注释设置 nginx 控制器来执行此操作 - 但我看不到 GCE 负载均衡器有类似功能。我遗漏了什么吗?
Kibana 清单
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: kibana
namespace: my-service
spec:
version: 8.2.2
count: 1
elasticsearchRef:
name: elastic
config:
server:
publicBaseUrl: "https://example.com"
http:
service:
spec:
type: ClusterIP
metadata:
annotations:
cloud.google.com/backend-config: '{"default": "kibana-backendconfig"}'
cloud.google.com/neg: '{"ingress": true}'
后端条件
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: kibana-backendconfig
namespace: my-service
spec:
securityPolicy:
name: "cf-ip-only"
healthCheck:
checkIntervalSec: 60
healthyThreshold: 1
port: 5601
requestPath: /login
type: HTTPS
unhealthyThreshold: 2
入口清单
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: kibana-ingress
namespace: my-service
annotations:
ingress.gcp.kubernetes.io/pre-shared-cert: "example-com"
kubernetes.io/ingress.class: "gce"
kubernetes.io/ingress.allow-http: "false"
kubernetes.io/ingress.regional-static-ip-name: "kibana-static-ip"
spec:
defaultBackend:
service:
name: kibana-kb-http
port:
number: 5601
rules:
- host: "example.com"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: kibana-kb-http
port:
number: 5601
我已经通过端口转发测试了 Kibana 实例。它工作正常。我已向 Ingress 发送请求 - 它们返回 502,显示 Ingress 的正确证书。当我检查已部署的 Ingress 时,urlMap 显示后端运行正常(这意味着 BackendConfig 健康检查工作正常并将流量发送到正确的位置)。
目前,我发现导致该问题的两个可能原因:
- GCE Ingress 不知道它需要进行加密流量,或者
- Ingress 无法从 Kibana 访问自签名证书,或者
- 两个都
有人获得过 GCE Ingress 来正确地将流量路由到使用自签名证书运行的 Kibana 吗?