当前位置: 首页 > 知识库问答 >
问题:

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

孟佑运
2023-03-14

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

有很多配置细节,所以我做了一个回购https://github.com/jobevers/test_ssl_ingress

简而言之,步骤是

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

nginx-ingress配置来自https://zihao.me/post/cheap-out-google-container-engine-load-balancer/(看起来与ingres-nginx repo中的许多示例非常相似)。

我的入口。yaml与示例几乎相同

当我跑步时,我会

$ 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
[...]

这表明我仍在使用默认证书。

我该怎么用我的?

入口定义

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;

共有3个答案

施雅懿
2023-03-14

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

  1. 创建一个名为 /usr/share/ca-certificates/extras的目录
  2. 将. pem文件的扩展名更改为. crt并将此文件复制到您创建的目录
  3. 运行sudo dpkg-reconfiure ca证书
  4. 在打开的窗口中,首先按回车键,然后选择您添加在列表中的文件,然后用空格键再次按回车键

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

吴升
2023-03-14

刚刚在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

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

呼延高超
2023-03-14

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

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下的主机条目之一匹配。

 类似资料:
  • 我正在使用k3s的默认安装(版本v1.17.0 k3s.1)并验证它在我的Raspberry Pi集群上正常工作。 在使用推荐的说明(https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/)安装kubernetes-dashboard之后,我使用基于k3s traefik的负载均衡器将其暴露在集群之

  • 名为“selfsign”的群集颁发者 由秘密“测试”支持的有效自签名证书 正常运行的nginx入口部署 一个健康运行的负载平衡器型入口服务

  • 我已经安装并配置了AWS ALB入口控制器(https://github.com/kubernetes-sigs/aws-alb-ingress-controller),它可以通过HTTP正常工作。但是,它不能通过HTTPS解析。 入口资源如下: 我还按照此处的说明添加了自签名SSL证书: https://kubernetes.github.io/ingress-nginx/user-guide/

  • 我正在设置我的入口控制器、入口类和入口,以在集群外部公开服务。这是全新的集群设置。 我已经使用 nginx 入口控制器设置了 nginx-ingress 控制器 <code>kubectl应用-fhttps://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.0/deploy/static/provider/b

  • 我正试图在GKE集群上添加一个NGINX入口控制器,使用现有的HAProxy入口控制器(它在重写规则方面有一些问题) 首先,我尝试将控制器的服务公开给LoadBalancer类型。流量可以到达入口和后端,但它不适用于托管证书。 因此,我尝试使用L7负载平衡器(URL映射)将流量转发到GKE群集IP,并为入口控制器本身创建入口对象。 问题是,这个入口对象似乎不绑定到外部IP。路由到域会产生“默认后端

  • 我需要关于如何使用TLS在eks kubernetes上配置nginx入口控制器和keydepage的建议。 我的第一次尝试是在没有TLS的情况下让Keyclope工作。这很好用。但是,当我将TLS添加到入口定义中时,keyClope给出了一个无效参数:redirect\u uri error。 这是工作示例: 当我添加tls部分时,我得到了上述错误。请参阅下面的yaml文件。 有什么建议可以解决