这一篇文章主要讲如果通过cert-manager letsencrypt的方式 自动管理你的证书。
一、怎么装?
Installation - cert-manager Documentation
选个符合你环境的,推荐helm来管理你的应用。
二、怎么用?
官网说的:
意思就是你安装了 cert-manager之后,你首先需要做的就是使用cert-manager的crd对象创建一个‘发行者’即-‘Issuer’直接译文。其实就白了就是在你的k8s集群中创建一个CA签发机构。还记得我们不用cert-manager之前用open ssl创建自签名证书的第一步吗?没错,就是用私钥创建一个CA。
然后官网又说:
这个Issuer分为两个层面一个namespace一个是整个cluster.这个很好懂。
ACME
又因为我们需要自动管理证书就需要使用letsencrypt,ACME即cert-mamanger的自动管理协议。
他的意思就是当你创建了一个Issuer的时候会颁发证书的工作交给ACME server来做,你只需要定义这个发行者即可。而且通过ACME server颁发的证书是普遍受信任的。
那么下面例子我们就创建一个ACME-Issuer.
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt-demo
namespace: demo
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: demo@qq.com
server: https://acme-staging-v02.api.letsencrypt.org/directory
privateKeySecretRef:
# Secret resource that will be used to store the account's private key.
name: demo-issuer-account-key
# Add a single challenge solver, HTTP01 using nginx
solvers:
- http01:
ingress:
ingressClassName: nginx
上面就是创建的全部内容非常简单,下面为字段介绍:
privateKeySecretRef:
需要给你的创建的 issuer要有一个密钥,secretName字段你想写啥写啥,他会自动创建一个和你写的名称一致的secret。
solvers 这是挑战方式,为什么需要呢?
原因1:ACME server颁发的证书是普遍受信任的,
原因2:因为如果你是一个fake的域名并且在公网的DNS中别人都已经注册了,你要冒充别人咋整?如果就有了挑战机制,一种为http一个为dns方式。两种方式区别下面会讲。
email: 随便写,不能是example.com,可以写qq.com 啥的。
server :不要修改!
然后执行
kubectl create -f issuer.yaml
验证:
rancher-rke-01:/demo # kubectl get secret -n demo
NAME TYPE DATA AGE
demo-issuer-account-key Opaque 1 14m
kubectl get issuer -n demo
得到:
rancher-rke-01:/demo # kubectl get issuer -n demo
NAME READY AGE
letsencrypt-demo True 7m30s
一个ACME-issuer就注册好了。
此时要使用这个ACME的issuer来颁发你的证书,怎么使用呢?
官网提供了很多种方式:
毫无疑问,那么都使用k8s了,就那么几种选择 ingress 或者 service Mesh,这次依ingress为例子;
官网又说:你要使用ingress的方式调用,别人还贴心花了图。意思就是你使用ingress来调用issuer你需要给ingress添加注解即:Annotated ingress ,然后cert-manager有一个组件叫ingress-shim会watch创建带有这个注解的ingress然后读取yaml并且自动创建ingress中的实际服务器的证书并且自动启用你创建的issuer去挑战这个实际服务器的域名然后创建一个服务器证书。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
# add an annotation indicating the issuer to use.
cert-manager.io/issuer: demo
name: myIngress
namespace: myIngress
spec:
rules:
- host: demo.qq.com
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: myservice
port:
number: 80
tls: # < placing a host in the TLS config will determine what ends up in the cert's subjectAltNames
- hosts:
- demo.qq.com
secretName: myingress-demo-cert # < cert-manager will store the created certificate in this secret.
关键点在于:
annotations:
cert-manager.io/issuer: demo --即你创建的issuer.
官网下面还有一张图表示来整个流程:
但是这个图里面缺少了对于你申请签发的服务器域名的挑战。
这个挑战不同过是得不到受信任的证书的。但是你申请签发的服务器域名可以通过https访问的,会提示这是不安全网页等等。
此致就结束了。
如何解决挑战不通过log现实:coredns无法解析内部host的文章,
请看教你读懂cert-manager官网并且使用letsencrypt(二)。