【问题标题】:Cert-manager "remote error: tls: unrecognized name" errors证书管理器“远程错误:tls:无法识别的名称”错误
【发布时间】:2022-07-08 00:45:38
【问题描述】:

我在尝试使用 GKE 集群中的 cert-manager 创建证书时遇到问题。这一定是我正在做的事情,因为我已经尝试了 1.7.1、1.7.0 和 1.6.2 版本,但都遇到了相同的错误。

我看到的错误是:

E0219 00:57:39.270717       1 sync.go:186] cert-manager/controller/challenges "msg"="propagation check failed" "error"="failed to perform self check GET request 'http://mysubdomain.mmydomain.com/.well-known/acme-challenge/secretKey': Get \"https://mysubdomain.mmydomain.com:443/.well-known/acme-challenge/secretKey\": remote error: tls: unrecognized name" "dnsName"="mysubdomain.mmydomain.com" "resource_kind"="Challenge" "resource_name"="elasticsearch-tls-cert-somenumbers" "resource_namespace"="elastic-stack" "resource_version"="v1" "type"="HTTP-01"

这是我安装的设置:

安装 CRD kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.7.1/cert-manager.crds.yaml

Helm 安装证书管理器

helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --version v1.7.1

确认安装良好:

➜  ~ helm list -n cert-manager
NAME            NAMESPACE       REVISION    UPDATED                                 STATUS      CHART               APP VERSION
cert-manager    cert-manager    1           2022-02-18 16:07:57.258172 -0800 PST    deployed    cert-manager-v1.6.2 v1.6.2
➜  ~

应用了 ClusterIssuer:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt
spec:
  acme:
    email: "myemail@myemail.com"
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt
    solvers:
    - http01:
        ingress:
          class: nginx

部署了我的入口:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: kibana-ingress
  namespace: elastic-stack
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
spec:
  rules:
  - host: mysubdomain.mmydomain.com
    http:
      paths:
      - path: /
        backend:
          serviceName: kibana-kb-http
          servicePort: 5601
  tls:
    - hosts:
      - mysubdomain.mmydomain.com
      secretName: kibana-tls-cert

然后,当我跟踪 cert-manager pod 时,我看到了 remote error: tls: unrecognized name" "dnsName 错误。

对证书挑战的描述也说了同样的话:

Status:
  Presented:   true
  Processing:  true
  Reason:      Waiting for HTTP-01 challenge propagation: failed to perform self check GET request 'http://mysubdomain.mmydomain.com/.well-known/acme-challenge/secretKey': Get "https://mysubdomain.mmydomain.com:443/.well-known/acme-challenge/secretKey": remote error: tls: unrecognized name
  State:       pending
Events:
  Type    Reason     Age    From          Message
  ----    ------     ----   ----          -------
  Normal  Started    8m45s  cert-manager  Challenge scheduled for processing
  Normal  Presented  8m45s  cert-manager  Presented challenge using HTTP-01 challenge mechanism

这在另一个集群中完全正常,所以我无法弄清楚我在这里做错了什么。

【问题讨论】:

  • 添加 service.beta.kubernetes.io/do-loadbalancer-hostname 注解并使用 kubectl edit service ingress-nginx-controller -n ingress-nginx 编辑资源。请记住,您可能有不同的名称和命名空间。 Reference
  • @AbhijithChitrapu 我相信注释仅适用于 AWS,但我可能是错的。问题实际上是我使用了不同的 NGINX 图表,因此入口的配置不同。当我将 NGINX 聊天切换到我在另一个集群中使用的图表时,一切正常。

标签: google-kubernetes-engine lets-encrypt cert-manager


【解决方案1】:

只是为了详细说明这一点。

我的错误也与使用cert-manager 不支持的nginx-stable 图表而不是ingress-nginx 图表有关。

所以不要这样:

helm repo add nginx-stable https://helm.nginx.com/stable
helm repo update
helm upgrade --install nginx-ingress nginx-stable/nginx-ingress \
  --namespace nginx-ingress \
  --create-namespace \
  --timeout 600s \
  --debug
  --set controller.publishService.enabled=true    

使用它来安装 ingress-nginx:

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --create-namespace \
  --timeout 600s \
  --debug \
  --set controller.publishService.enabled=true

然后安装 cert-manager:

helm repo add jetstack https://charts.jetstack.io
helm repo update
helm upgrade --install cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --atomic \
  --version v1.8.2 \
  --set installCRDs=true

【讨论】:

    【解决方案2】:

    问题最终是我在第二个集群中错误地使用了不同的 nginx 图表,因此入口的配置不同,进而无法正常工作。我将第二个集群上的图表切换到第一个集群中使用的图表,一切正常。

    【讨论】:

    • 很高兴听到这个消息。感谢您发布决议。
    • 我在 AWS 上使用相同的解决方案遇到了完全相同的问题。遗憾的是,cert-manager 没有强调它只适用于 kubernetes.github.io/ingress-nginx 上的那个,而不适用于其他的,包括 Nginx Inc 自己的 Nginx Ingress Controller。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-26
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    相关资源
    最近更新 更多