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"
效果是完全一样的。