通过 cert-manager 在 Kubernetes Ingress 中来自 Let's Encrypt 的 SSL 证书

use*_*338 3 certificate kubernetes kubernetes-ingress cert-manager

我正在尝试使用 cert-manager v0.16.0 进入,让我们加密证书。我使用 microk8s 并遵循了几个教程,但没有一个让我达到目标。

通过本教程链接,我一直在创建发行者,并在尝试应用它时收到错误消息:

kc apply -f clusterIssuer.yaml
namespace/cloud unchanged
Error from server (InternalError): error when creating "clusterIssuer.yaml": Internal error occurred: failed calling webhook "webhook.cert-manager.io": Post "https://certmgr-cert-manager-webhook.cert-manager.svc:443/mutate?timeout=10s": service "certmgr-cert-manager-webhook" not found
Run Code Online (Sandbox Code Playgroud)

找不到该服务,因为这不是它的名称。尝试查找:certmgr-cert-manager-webhook,但服务名称是:cert-manager-webhook。也没有 dns 别名或任何可以证明这一点的东西。创建 cert-manager 和 webhook 的部署是这样的:

证书管理器-0.16.0.yaml

如果我将发行者的类型从 ClusterIssuer 更改为 Issuer,我得到:

kc apply -f clusterIssuer.yaml
namespace/git created
error: unable to recognize "clusterIssuer.yaml": no matches for kind "Issuer" in version "cert-manager.io/v1"
Run Code Online (Sandbox Code Playgroud)

一些调试帮助将不胜感激。

--- 更多信息 clusterIssuer.yaml:

    kind: Namespace
apiVersion: v1
metadata:
  name: cloud
---
apiVersion: cert-manager.io/v1beta1
kind: Issuer
metadata:
  name: letsencrypt-staging
  namespace: cloud
spec:
  acme:
    # Staging API
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    email: mail@mail.de
    privateKeySecretRef:
      name: cloud-account-key-staging
    solvers:
    - http01:
       ingress:
         class: nginx
Run Code Online (Sandbox Code Playgroud)

Har*_*var 7

看起来 cert-manager 没有使用 CRD 正确设置,您可以尝试从官方文档中删除并设置 cert-manager 一次:https ://cert-manager.io/docs/installation/kubernetes/

您可以直接设置最新版本,这个 YAML 包含 CRD、部署、svc 的所有内容:

kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.3.0/cert-manager.yaml
Run Code Online (Sandbox Code Playgroud)

应用 YAML 后,您可以检查部署情况

kubectl get pods -n cert-manager
Run Code Online (Sandbox Code Playgroud)

如果一切正常,您可以应用集群颁发者和入口的配置来获取 SSL/TLS 证书,该证书将存储到 Kubernetes 密钥中。

这是Clusterissueringress YAML的简单且正确的示例(请注意,您正在尝试使用 staging API https://acme-staging-v02.api.letsencrypt.org/directory 如果可能,请使用生产服务器地址,以便它适用于所有浏览器)

apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: cluster-issuer-name
  namespace: development
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: harsh@example.com
    privateKeySecretRef:
      name: secret-name
    solvers:
    - http01:
        ingress:
          class: nginx-class-name
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx-class-name
    cert-manager.io/cluster-issuer: cluster-issuer-name
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: example-ingress
spec:
  rules:
  - host: sub.example.com
    http:
      paths:
      - path: /api
        backend:
          serviceName: service-name
          servicePort: 80
  tls:
  - hosts:
    - sub.example.com
    secretName: secret-name
Run Code Online (Sandbox Code Playgroud)