不同的主机(Kubernetes 中的 Pods)对同一主机名使用不同的证书进行响应

Different hosts (Pods in Kubernetes) responds with different certificate for the same hostname

我有一个奇怪的问题 - 当询问我的内部主机名时,xxx.home.arpa 通过例如 openssl s_client -connect xxx.home.arpa:443 一个(示例)pod

 -  image: docker.io/library/node:8.17.0-slim
    name: node
    args:
      - "86400"
    command:
      - sleep

正在收到 DEFAULT NGINX INGRESS CERTIFICATE 的响应。

同一命名空间中的其他 pod 对于同一命令 正在使用我的 自定义证书 获得响应。

问题: 为什么同一个 pod 收到不同的证书?

为了这个问题的目的,请假设 cert-manager 和 certs 应该正确配置 - 它们在系统的大部分工作,只有少数 pods 行为不当

配置: k8s nginx ingress, calico CNI, custom coredns svc which manages DNS responses (might be important?), my own CA authority.

e:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: ca-issuer
    kubernetes.io/ingress.class: nginx
  creationTimestamp: "2022-03-13T06:54:17Z"
  generation: 1
  name: gerrit-ingress
  namespace: gerrit
  resourceVersion: "739842"
  uid: f22034ab-0ed8-4779-b01e-2738e6f63eb7
spec:
  rules:
  - host: gerrit.home.arpa
    http:
      paths:
      - backend:
          service:
            name: gerrit-gerrit-service
            port:
              number: 80
        pathType: ImplementationSpecific
  tls:
  - hosts:
    - gerrit.home.arpa
    secretName: gerrit-tls
status:
  loadBalancer:
    ingress:
    - ip: 192.168.10.2                  

大部分配置(DNS 除外)is up here

事实证明,我最初的猜测大相径庭——特定容器有一组工具,它们都配置为不发送服务器名(或者根本不支持 SNI,这是问题所在),具体来说 yarn:1.xopenssl:1.0.x.

问题当然出在 SNI 上,较新的 openssl 或 curl 默认使用 -servername 来满足 SNI 要求。

为此我考虑了两种解决方案:

  • 不支持SNI的客户端使用通配符DNS,更简单但感觉不安全
  • 带反向代理的 TLS 终止允许我透明地使用支持 SNI 的客户端,我还没有尝试过。

我使用了通配符 DNS,但我认为这不应该在产品中完成。 :)