1. 使用

1.1. 创建 issuer

在建好 cert-manager 后,我们需要继续创建 issuer 才能颁发证书。有两种 issuer 可供我们选择:ClusterIssuer 和 Issuer,两都配置方式都是一样的,所不同的是作用域。ClusterIssuer,顾名思义是在集群中使用,作用域为所有命名空间,相对应的 Issuer 只作用于所在的命名空间。一般用 ClusterIssuer 比较方便。这里也通过 ClusterIssuer 举例。

证书的验证方式也有两种,一个是 http-01,另一个是 dns-01,由于 dns-01 需要域名解析服务商的支持,所以,在这里就没有使用了。有关这两种方式的详细说明参照 https://letsencrypt.org/zh-cn/docs/challenge-types/

创建一个名叫 letsencrypt-staging.yaml 的文件,内容是:

apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
    name: letsencrypt-staging
spec:
    acme:
        # You must replace this email address with your own.
        # Let's Encrypt will use this to contact you about expiring
        # certificates, and issues related to your account.
        email: user@example.com
        server: https://acme-staging-v02.api.letsencrypt.org/directory
        privateKeySecretRef:
        # Secret resource used to store the account's private key.
            name: example-issuer-account-key
        # Add a single challenge solver, HTTP01 using nginx
        solvers:
        - http01:
            ingress:
                class: nginx

通过kubectl安装:

kubectl apply -f letsencrypt-staging.yaml

确保创建成功

kubectl describe clusterissuer letsencrypt-staging
...
Status:
Acme:
    Uri:  https://acme-staging-v02.api.letsencrypt.org/acme/acct/7571319
Conditions:
    Last Transition Time:  2019-01-30T14:52:03Z
    Message:               The ACME account was registered with the ACME server
    Reason:                ACMEAccountRegistered
    Status:                True
    Type:                  Ready

Let’s Encrypt 不支持通过 HTTP-01 的方式颁发通配符证书。要颁发通配符证书,必须使用DNS-01。

1.2. 单独颁发

单独颁发证书,其实是一种手动的方式,一般不这么使用,但这却能加深我们对这整套流程的理解。颁发证书即创建并处理 Certificate 资源的过程。

有如下certificate-example.yaml文件:

apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
    name: acme-crt
spec:
    secretName: acme-crt-secret
    dnsNames:
    - foo.example.com
    issuerRef:
        name: letsencrypt-stagging
        kind: ClusterIssuer

使用kubectl创建 Certificate:

kubectl apply -f certificate-example.yaml

注:这前提是域名得配置好了

静待 1-2 分钟:

执行下述命令,静待READY值变成True

kubectl get certificate acme-crt -w

错误排查:

如果整个颁发过程出现问题导致证书颁发失败,可以利用kubectl describe查看对应的 order 进行排查。order是一个订单,记录了这笔交易(虽然我们并未花钱),这可以告诉我们失败的原因。

kubcectl describe order acme-crt

1.3. 指定 issuer 颁发

更多的时候我们不需要手动创建 Certificate,只需要在创建 Ingress 时作好对应的注释,cert-manager 就将自动为我们创建。对应的 yaml 文件大致是长这样的:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    acme.cert-manager.io/http01-edit-in-place: "true"
    cert-manager.io/cluster-issuer: letsencrypt-stagging
    kubernetes.io/ingress.class: nginx
  name: example
spec:
  rules:
  - host: foo.example.com
    http:
      paths:
      - backend:
          serviceName: example
          servicePort: 9000
        path: /
  tls:
  - hosts:
    - foo.example.com
    secretName: acme-crt-secret

这将自动创建一个与上一步骤中相同的 Certificate。

注:acme.cert-manager.io/http01-edit-in-place: "true" 这明 http-01 验证将就在这个 Ingress 中进行而不会另行创建。

1.4. 配置默认 issuer

在 cert-manager 的启动命令中加上这么两句:

--set ingressShim.defaultIssuerName=letsencrypt-stagging \
--set ingressShim.defaultIssuerKind=ClusterIssuer

这就为 cert-manager 设置了一个默认的 Issuer 了,设置成功后,我们就可以把 Ingress 资源中的 cert-manager.io/cluster-issuer: letsencrypt-stagging 改成kubernetes.io/tls-acme: "true" 效果是完全一样的。

Copyright © 温玉 2021 | 浙ICP备2020032454号 all right reserved,powered by Gitbook该文件修订时间: 2022-11-28 09:34:11

results matching ""

    No results matching ""