首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kubernetes NGINX侵入控制器没有获取TLS证书

Kubernetes NGINX侵入控制器没有获取TLS证书
EN

Stack Overflow用户
提问于 2017-10-13 17:03:25
回答 3查看 26.8K关注 0票数 18

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

有很多配置细节,所以我做了一个回购入口

总之,这些步骤是

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

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

我的ingress.yaml与示例一几乎相同

当我跑到卷发的时候

代码语言:javascript
复制
$ 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
[...]

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

我怎么才能用我的?

入口定义

代码语言:javascript
复制
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

创造秘密

代码语言:javascript
复制
kubectl create secret tls tls-secret --key tls/privkey.pem --cert tls/fullchain.pem

此外,正在服务器上找到并存在证书:

代码语言:javascript
复制
$ 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

从原木上我看到

代码语言:javascript
复制
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,它还在使用假证书:

代码语言:javascript
复制
$ 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;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-13 19:45:34

事实证明,入口定义需要看起来像:

代码语言:javascript
复制
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下的一个主机条目。

票数 25
EN

Stack Overflow用户

发布于 2020-04-10 15:15:54

只是在v0.30.0中也遇到了这个问题,事实证明,在没有显式主机名的情况下拥有这样的入口配置是可以的:

代码语言:javascript
复制
spec:
  tls:
    - secretName: ssl-certificate

就我而言,问题是我在入口上有一个注释,它的int64值没有被正确地解析,下面是定义kubernetes.io/ingress.class,因此本质上nginx找不到日志中正确声明的入口控制器:

代码语言:javascript
复制
ignoring add for ingress <ingressname> based on annotation kubernetes.io/ingress.class with value

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

票数 1
EN

Stack Overflow用户

发布于 2021-03-16 21:08:58

您需要将根CA证书添加到诸如chrome、firefox等地方的权威部分,这是服务器的证书池。

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

您的计算机现在将自动识别其他证书,您已经生成了此证书。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46734784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档