添加了 SSL 证书,但显示“Kubernetes 入口控制器假证书”

Vij*_*eni 12 ssl google-cloud-platform kubernetes google-kubernetes-engine

我是 GCP/Cloud 的新手,我在 GKE 中创建了一个集群并在那里部署了我们的应用程序,在集群中安装了 nginx 作为 pod,我们公司拥有一个授权的 SSL 证书,我已将其上传到 GCP 的证书中。

在 DNS 服务中,我创建了一条与 Ingress IP 匹配的 A 记录。当我在浏览器中调用该 URL 时,它仍然显示该网站仍然不安全,并显示消息“Kubernetes Ingress 控制器假证书”。

我使用了以下指南https://cloud.google.com/load-balancing/docs/ssl-certificates/self-management-certs#console_1

但是,我无法执行步骤 3“将 SSL 证书与目标代理关联”,因为它要求“URL 映射”,而我无法在 GCP Console 中找到它。

有没有人和我一样经历过同样的问题,或者如果有人帮助我,那就太好了。

Vin*_*cia 12

我可以通过向 ingress-nginx-controller 部署添加额外的参数来解决这个问题。

对于上下文:我的 TLS 密钥位于默认命名空间并名为letsencrypt-secret-prod,因此我想将其添加为 Nginx 控制器的默认 SSL 证书。

我的第一个解决方案是编辑deployment.yamlNginx 控制器并在列表末尾添加containers[0].args以下行:

- '--default-ssl-certificate=default/letsencrypt-secret-prod'
Run Code Online (Sandbox Code Playgroud)

这使得 yaml 的该部分看起来像这样:

      containers:
        - name: controller
          image: >-
            k8s.gcr.io/ingress-nginx/controller:v1.2.0-beta.0@sha256:92115f5062568ebbcd450cd2cf9bffdef8df9fc61e7d5868ba8a7c9d773e0961
          args:
            - /nginx-ingress-controller
            - '--publish-service=$(POD_NAMESPACE)/ingress-nginx-controller'
            - '--election-id=ingress-controller-leader'
            - '--controller-class=k8s.io/ingress-nginx'
            - '--ingress-class=nginx'
            - '--configmap=$(POD_NAMESPACE)/ingress-nginx-controller'
            - '--validating-webhook=:8443'
            - '--validating-webhook-certificate=/usr/local/certificates/cert'
            - '--validating-webhook-key=/usr/local/certificates/key'
            - '--default-ssl-certificate=default/letsencrypt-secret-prod'
Run Code Online (Sandbox Code Playgroud)

但我使用的是 helm Chart: ingress-nginx/ingress-nginx,所以我希望这个配置位于values.yaml该图表的文件中,以便我可以在必要时升级它。

因此,读取值文件时,我替换了属性:controller.extraArgs,如下所示:

  extraArgs: {}
Run Code Online (Sandbox Code Playgroud)

为了这:

  extraArgs:
    default-ssl-certificate: default/letsencrypt-secret-prod
Run Code Online (Sandbox Code Playgroud)

这将重新启动部署,并将参数放置在正确的位置。

tls.secretName现在我可以使用入口而无需为每个入口指定,这太棒了。

这是一个适用于我的 HTTPS 入口示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: some-ingress-name
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
spec:
  rules:
  - http:
      paths:
      - path: /some-prefix
        pathType: Prefix
        backend:
          service:
            name: some-service-name
            port:
              number: 80
Run Code Online (Sandbox Code Playgroud)


Har*_*var 2

您可以将 SSL/TLS 证书保存到K8s 密钥中并将其附加到ingress

您需要在 ingress 中配置 TLS 块,不要忘记ingress.class在 ingress 中添加详细信息

apiVersion: extensions/v1beta1
kind: Ingress
metadata: 
  name: tls-example-ingress
spec: 
  rules: 
    - host: mydomain.com
      http: 
        paths: 
          - 
            backend: 
              serviceName: my-service
              servicePort: 80
            path: /
  tls: 
    - hosts: 
        - mydomain.com
      secretName: my-tls-secret
Run Code Online (Sandbox Code Playgroud)

您可以在以下位置阅读更多信息:https://medium.com/avmconsulting-blog/how-to-secure-applications-on-kubernetes-ssl-tls-certificates-8f7f5751d788

您可能会在浏览器中看到类似这样的内容:

在此输入图像描述

这是来自入口控制器附加到入口或入口控制器默认假证书的错误证书。