web-dev-qa-db-ja.com

Kubernetes NGINX Ingress ControllerがTLS証明書を取得しない

nginx-ingress コントローラーを使用して、GKEに新しいkubernetesクラスターをセットアップしました。 TLSは機能していません。偽の証明書を使用しています。

設定の詳細がたくさんあるので、レポを作成しました- https://github.com/jobevers/test_ssl_ingress

要するに、ステップは

  • gKEのロードバランサなしで新しいクラスタを作成します
  • 私のキーと証明書でTLSシークレットを作成する
  • nginx-ingressデプロイ/ポッドを作成する
  • イングレスコントローラーを作成する

Nginx-ingress設定は から取得しますhttps://zihao.me/post/cheap-out-google-container-engine-load-balancer/ (そして、イングレス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;
10
jobevers

イングレスの定義は次のようにする必要があることがわかります。

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の下のホストエントリの1つと一致する必要があります。

12
jobevers

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

したがって、注釈で文字列を使用すると問題が解決しました。

0
Techradar