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

bq3bfh9z  于 2023-02-07  发布在  Kubernetes
关注(0)|答案(4)|浏览(178)

我使用nginx-ingress控制器在GKE上设置了一个新的kubernetes集群。TLS不起作用,它使用了假证书。
有很多配置细节,因此我创建了一个repo -https://github.com/jobevers/test_ssl_ingress
简而言之,这些步骤是

  • 创建一个没有GKE负载平衡器的新集群
  • 用我的密钥和证书创建tls密码
  • 创建nginx入口部署/ pod
  • 创建入口控制器

nginx-ingress配置来自https://zihao.me/post/cheap-out-google-container-engine-load-balancer/(看起来与ingress-nginx存储库中的许多示例非常相似)。
我的入口.yaml与the example one几乎相同
当我运行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
[...]

这表明我仍在使用默认证书。
我怎么能用我的枪呢?
Ingress definition

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

创建密码:

kubectl create secret tls tls-secret --key tls/privkey.pem --cert tls/fullchain.pem

进一步调试,发现证书并存在于服务器上:

$ 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;
km0tfn4u

km0tfn4u1#

结果发现入口定义需要如下所示:

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

rules下的主机条目需要与tls下的主机条目之一匹配。

3j86kqsm

3j86kqsm2#

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

spec:
  tls:
    - secretName: ssl-certificate

在我这边的问题是,我有一个关于入口的int64值的注解,没有正确解析,下面是kubernetes.io/ingress.class的定义,所以基本上nginx没有找到日志中正确声明的入口控制器:

ignoring add for ingress <ingressname> based on annotation kubernetes.io/ingress.class with value

所以在注解中使用字符串解决了这个问题。

ilmyapht

ilmyapht3#

您需要将根CA证书添加到chrome、firefox、服务器证书池等位置的authorities部分。
1.创建名为**/usr/share/ca-certificates/extras的目录
1.将
.pem文件的扩展名更改为.crt**,并将此文件复制到您创建的目录
1.运行sudo dpkg-重新配置ca证书
1.在打开的窗口中,首先按Enter键,然后在使用空格键显示的列表中选择您添加的文件,并再次按Enter键
您的计算机现在将自动识别用此证书生成的其他证书。

wz3gfoph

wz3gfoph4#

我发现要使用通配符主机tls,我们需要tls主机名和rules主机名都使用通配符,例如:

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

相关问题