Ssl Kubernetes NGINX入口控制器未拾取TLS证书

Ssl Kubernetes NGINX入口控制器未拾取TLS证书,ssl,nginx,kubernetes,google-kubernetes-engine,Ssl,Nginx,Kubernetes,Google Kubernetes Engine,我使用控制器在GKE上设置了一个新的kubernetes集群。TLS不起作用,它在使用假证书 有很多配置细节,所以我进行了回购- 简言之,这些步骤非常简单 创建一个没有GKE负载平衡器的新集群 使用我的密钥和证书创建tls机密 创建nginx入口部署/pod 创建入口控制器 nginx ingress配置来自(看起来与Ingres nginx repo中的许多示例非常相似) 我的ingress.yaml与 当我跑curl时,我会 $ curl -kv https://35.196.134.5

我使用控制器在GKE上设置了一个新的kubernetes集群。TLS不起作用,它在使用假证书

有很多配置细节,所以我进行了回购-

简言之,这些步骤非常简单

  • 创建一个没有GKE负载平衡器的新集群
  • 使用我的密钥和证书创建tls机密
  • 创建nginx入口部署/pod
  • 创建入口控制器
nginx ingress配置来自(看起来与Ingres nginx repo中的许多示例非常相似)

我的ingress.yaml与

当我跑curl时,我会

$ curl -kv https://35.196.134.52
[...]
*    common name: Kubernetes Ingress Controller Fake Certificate (does not match '35.196.134.52')
[...]
*    issuer: O=Acme Co,CN=Kubernetes Ingress Controller Fake Certificate
[...]
这表明我仍然在使用默认证书

我该怎么用我的



:


进一步调试后,将在服务器上找到并存在证书:

$ kubectl -n kube-system exec -it $(kubectl -n kube-system get pods | grep ingress | head -1 | cut -f 1 -d " ") -- ls -1 /ingress-controller/ssl/
default-fake-certificate-full-chain.pem
default-fake-certificate.pem
default-tls-secret-full-chain.pem
default-tls-secret.pem
从日志上看,我明白了

kubectl -n kube-system log -f $(kubectl -n kube-system get pods | grep ingress | head -1 | cut -f 1 -d " ")
[...]
I1013 17:21:45.423998       6 queue.go:111] syncing default/test-ssl-ingress
I1013 17:21:45.424009       6 backend_ssl.go:40] starting syncing of secret default/tls-secret
I1013 17:21:45.424135       6 ssl.go:60] Creating temp file /ingress-controller/ssl/default-tls-secret.pem236555242 for Keypair: default-tls-secret.pem
I1013 17:21:45.424946       6 ssl.go:118] parsing ssl certificate extensions
I1013 17:21:45.743635       6 backend_ssl.go:102] found 'tls.crt' and 'tls.key', configuring default/tls-secret as a TLS Secret (CN: [...])
[...]
但是,看看nginx.conf,它仍然使用假证书:

$ kubectl -n kube-system exec -it $(kubectl -n kube-system get pods | grep ingress | head -1 | cut -f 1 -d " ") -- cat /etc/nginx/nginx.conf | grep ssl_cert
        ssl_certificate                         /ingress-controller/ssl/default-fake-certificate.pem;
        ssl_certificate_key                     /ingress-controller/ssl/default-fake-certificate.pem;

结果表明,入口定义需要如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ssl-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  tls:
    - hosts:
      - app.example.com
      secretName: tls-secret
  rules:
    - host: app.example.com
      http:
        paths:
        - path: /
          backend:
            serviceName: demo-echo-service
            servicePort: 80

规则下的主机条目需要匹配tls下的一个主机条目。

刚刚在
v0.30.0
中也遇到了这个问题,结果证明,没有显式主机名的类似入口配置是可以的:

spec:
  tls:
    - secretName: ssl-certificate
在我这方面,问题是我在入口上有一个注释,其值
int64
未正确解析,下面是定义
kubernetes.io/ingres.class
,因此本质上nginx没有找到日志中正确说明的入口控制器:

ignoring add for ingress <ingressname> based on annotation kubernetes.io/ingress.class with value
忽略基于注释kubernetes.io/ingres.class和值的入口添加

因此,在注释中使用字符串解决了这个问题。

您需要在chrome、firefox、服务器证书池等位置将根CA证书添加到授权部分

  • 创建一个名为/usr/share/ca certificates/extras的目录
  • .pem文件的扩展名更改为.crt,并将此文件复制到 您创建的目录
  • 运行sudo dpkg重新配置ca证书
  • 在打开的窗口中,首先按enter键,然后选择要创建的文件 添加到使用空格键显示的列表中,然后再次按enter键

  • 您的计算机现在将自动识别您使用此证书生成的其他证书。

    感谢您的解释。我的集群一直存在一个问题,因为它需要通过HTTPS服务于通配符域,以及任何通过HTTP指向它的任意域。只需复制其中一个规则并显式添加通配符域,我就可以将其完全排序。对我来说,是ingress类不正确。此配置应如何查找通配符证书和域?感谢显式提供此配置。至于我,我为
    tls
    部分添加了
    hosts
    ,但出于某种原因,我跳过了
    rules
    部分。在
    规则
    中复制主机名后,它开始正常工作这对我不起作用。我如何准确地调试系统正在做什么,以便找出它为什么是一个无礼的积垢?
    spec:
      tls:
        - secretName: ssl-certificate
    
    ignoring add for ingress <ingressname> based on annotation kubernetes.io/ingress.class with value