簡體   English   中英

Kubernetes NGINX 入口控制器未獲取 TLS 證書

[英]Kubernetes NGINX Ingress Controller not picking up TLS Certificates

我使用nginx-ingress控制器在 GKE 上設置了一個新的 kubernetes 集群。 TLS 不起作用,它使用的是假證書。

有很多配置細節所以我做了一個 repo - https://github.com/jobevers/test_ssl_ingress

簡而言之,步驟是

  • 創建一個沒有 GKE 負載均衡器的新集群
  • 用我的密鑰和證書創建一個 tls 機密
  • 創建一個 nginx-ingress 部署/pod
  • 創建入口控制器

nginx-ingress 配置來自https://zihao.me/post/cheap-out-google-container-engine-load-balancer/ (看起來與 ingress-nginx 存儲庫中的許多示例非常相似)。

我的 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
[...]

這表明我仍在使用默認證書。

我應該如何使用我的?


入口定義

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;

事實證明,入口定義需要如下所示:

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/ingress.class所以基本上 nginx 沒有找到入口控制器中所述的入口控制器正確記錄:

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

所以在注釋中使用字符串解決了這個問題。

您需要在 chrome、firefox、服務器的證書池等地方將 ROOT CA 證書添加到權限部分。

  1. 創建一個名為/usr/share/ca-certificates/extras 的目錄
  2. .pem文件的擴展名更改為.crt並將此文件復制到您創建的目錄中
  3. 運行sudo dpkg-reconfigure ca-certificates
  4. 在打開的窗口中,先按回車,然后選擇您添加到列表中的文件,並用空格鍵再次按回車

您的計算機現在將自動識別您使用此證書生成的其他證書。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM