Kubernetes Ingress的SSL证书

问题描述

我想在我的 test 环境中在Google Kubernetes Engine上为我的微服务基础设施创建一个HTTPS入口。基本的HTTP入口工作正常,现在我想创建一个安全的HTTP入口。我没有域,我希望我的UI可以直接在Ingress IP上通过https发出请求。

我已使用Let's Encrypt(sslforfree网站)为我可以访问的IP创建证书。但是我在证书中用于域名的该IP不是在其上创建Ingress的IP。现在所有请求都返回401,但我不知道为什么。浏览器返回的第一个错误如下:

Websites prove their identity via certificates. Firefox does not trust this site because it uses a certificate that is not valid for 35.241.60.223. The certificate is only valid for 35.228.159.214.
 
Error code: SEC_ERROR_UNKNOWN_ISSUER

这是问题所在:如果要在GKE,HTTPS上创建Ingress,则需要证书。但是,直到我知道Ingress IP才能获得证书。

我在HTTPS和Ingress方面没有太多经验,我不知道在没有任何域名的情况下,在我的测试环境中拥有HTTP Ingress的最简单方法是什么。

编辑:我创建了一个域comanddev.tk并将其转发到入口URL位置。我为comanddev.tk创建了一个证书,并更新了入口以使用该证书。现在,该请求正在获取ERR_TIMEDOUT,除了GET https://35.241.60.223/customer-service/actuator/health 401

之外,我在使用的Ingress Controller日志中什么都看不到

解决方法

据我所知,您不能仅使用“加密”作为IP地址的证书。您需要一个域名,因为证书用于“证明”您对这个域的所有权或控制权。 参见https://community.letsencrypt.org/t/certificate-for-public-ip-without-domain-name/6082/14 您可以选择使用自签名SSL证书或注册某种廉价的(子)域以进行测试,然后可以指向入口IP。

,

发生这种情况的原因可能是您具有ClusterIssuer / Issuer + Ingress配置。 请按照以下步骤进行正确的配置:

   apiVersion: cert-manager.io/v1alpha2
   kind: Issuer
   metadata:
     name: letsencrypt-prod
   spec:
     acme:
       # The ACME server URL
       server: https://acme-v02.api.letsencrypt.org/directory
       # Email address used for ACME registration
       email: user@example.com
       # Name of a secret used to store the ACME account private key
       privateKeySecretRef:
         name: letsencrypt-prod
       # Enable the HTTP-01 challenge provider
       solvers:
       - http01:
           ingress:
             class: nginx
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: kuard
  annotations:
    kubernetes.io/ingress.class: "nginx"    
    cert-manager.io/issuer: "letsencrypt-prod"

spec:
  tls:
  - hosts:
    - example.example.com (you probably have an DNS default)
    secretName: quickstart-example-tls
  rules:
  - host: example.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: kuard
          servicePort: 80

来源: https://docs.cert-manager.io/en/release-0.11/tutorials/acme/quick-start/index.html?highlight=lets#step-6-configure-let-s-encrypt-issuer

,

回到原始问题。如果您只是进行测试,则不必一定要拥有DNS服务器才能从LetsEncrypt获得证书。您可以使用nip.ioxip.io之类的服务,将您的IP地址转换为DNS名称并无需任何设置即可解析。您可以使用https01挑战通过LetsEncrypt解决。 cert-manager会为您简化设置。

ERR_TIMEDOUT很可能是网络问题。如果您点击了它,您将从入口控制器处获得一些响应。如果正在查看群集前面的网络设备,请确保您的入口控制器已启动并正在运行。

参考:

  1. https://nip.io/
  2. https://cert-manager.io/docs/installation/kubernetes/#installing-with-regular-manifests
  3. https://cert-manager.io/docs/tutorials/acme/ingress/#step-6-configure-let-s-encrypt-issuer

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...