安装cert-manager
官方文档 https://cert-manager.io/docs/
官方仓库 https://github.com/jetstack/cert-manager
wget https://github.com/jetstack/cert-manager/releases/download/v1.7.1/cert-manager.yaml
kubectl apply -f cert-manager.yaml
查看安装情况
kubectl get pods -n cert-manager -w
输出
NAME READY STATUS RESTARTS AGE
cert-manager-6c576bddcf-k9pdr 1/1 Running 0 78s
cert-manager-cainjector-669c966b86-fdx9f 1/1 Running 0 78s
cert-manager-webhook-7ff944cc49-mw5rq 1/1 Running 0 78s
另开终端查看cert-manager运行日志
kubectl logs -f $(kubectl get pods -n cert-manager | grep cert-manager | grep -v 'cainjector\|webhook' | awk '{print $1}') -n cert-manager
也可以查看临时生成的专门验证证书的 Ingress 对象的运行情况
kubectl get pods -w
临时对象cm-acme-http-solver-xxxx从创建到消亡的过程
配置dns自动颁发证书-阿里云域名解析
安装 alidns-webhook
官方仓库 https://github.com/pragkent/alidns-webhook
下载文件
wget https://raw.githubusercontent.com/pragkent/alidns-webhook/master/deploy/bundle.yaml
替换文件中域名
sed -i s/'acme.yourcompany.com'/'acme.foxwho.com'/g bundle.yaml
创建 阿里云 secret
kubectl -n cert-manager create secret generic alidns-secret \
--from-literal=access-key='YOUR_ACCESS_KEY'
--from-literal=secret-key='YOUR_SECRET_KEY'
YOUR_ACCESS_KEY :阿里云 AccessKey YOUR_SECRET_KEY :阿里云 AccessSECRET
安装 alidns-webhook
kubectl apply -f bundle.yaml
创建 ClusterIssuer
cluster-issuer-letsencrypt-prod.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
namespace: cert-manager
name: letsencrypt-prod
spec:
acme:
email: foxiswho@gmail.com
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- dns01:
webhook:
groupName: acme.foxwho.com
solverName: alidns
config:
region: ""
accessKeySecretRef:
name: alidns-secret
key: access-key
secretKeySecretRef:
name: alidns-secret
key: secret-key
metadata.name 是我们创建的签发机构的名称,后面我们创建证书的时候会引用它 spec.acme.email 是你自己的邮箱,证书快过期的时候会有邮件提醒,不过 cert-manager 会利用 acme 协议自动给我们重新颁发证书来续期 spec.acme.server 是 acme 协议的服务端,我们这里用 Let’s Encrypt,这个地址就写死成这样就行 spec.acme.privateKeySecretRef 指示此签发机构的私钥将要存储到哪个 Secret 对象中,名称不重要 spec.acme.dns01 这里指示签发机构使用 DNS-01 的方式进行 acme 协议 (还可以用 DNS 方式,acme 协议的目的是证明这台机器和域名都是属于你的,然后才准许给你颁发证书)
执行命令
kubectl apply -f cluster-issuer-letsencrypt-prod.yaml
申请一个证书
foxwho-tls-certificate.yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
namespace: cert-manager
name: foxwho-tls
spec:
secretName: foxwho-tls
dnsNames:
- "*.foxwho.com"
- "dev.foxwho.com"
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
说明:
spec.secretName 指示证书最终存到哪个 Secret 中 spec.issuerRef.kind 值为 ClusterIssuer 说明签发机构不在本 namespace 下,而是在全局 spec.issuerRef.name 我们创建的签发机构的名称 (ClusterIssuer.metadata.name) spec.dnsNames 指示该证书的可以用于哪些域名,与域名解析的一致,支持泛域名和单个域名
执行命令,申请证书
kubectl apply -f foxwho-tls-certificate.yaml
查看certificate创建结果
kubectl get certificate -A
结果输出
NAMESPACE NAME READY SECRET AGE
cert-manager alidns-webhook-ca True alidns-webhook-ca 34m
cert-manager alidns-webhook-webhook-tls True alidns-webhook-webhook-tls 34m
cert-manager foxwho-tls True foxwho-tls 22m
刚创建后查看certificate会发现ready状态为false, 稍等一会自动在dns解析里创建txt 记录,然后去签发证书,该字段就会变为true
查看签发证书
kubectl get secrets -A
结果输出
NAMESPACE NAME TYPE DATA AGE
cert-manager default-token-b8rp5 kubernetes.io/service-account-token 3 55m
cert-manager cert-manager-token-gqqhh kubernetes.io/service-account-token 3 55m
cert-manager cert-manager-cainjector-token-mdh6s kubernetes.io/service-account-token 3 55m
cert-manager cert-manager-webhook-token-4srgb kubernetes.io/service-account-token 3 55m
cert-manager cert-manager-webhook-ca Opaque 3 55m
cert-manager alidns-webhook-token-z68gg kubernetes.io/service-account-token 3 42m
cert-manager alidns-webhook-ca kubernetes.io/tls 3 42m
cert-manager alidns-webhook-webhook-tls kubernetes.io/tls 3 42m
cert-manager alidns-secret Opaque 2 37m
cert-manager letsencrypt-prod Opaque 1 32m
cert-manager foxwho-tls kubernetes.io/tls 2 27m
foxwho-tls 这一行,此时DATA 变为2,说明里面存着真正的证书文件
Issuer 与 ClusterIssuer 的区别是 ClusterIssuer 可跨命名空间使用,而 Issuer 需在每个命名空间下配置后才可使用。这里我们使用 ClusterIssuer,其类型选择 Let‘s Encrypt
可以看到这个证书是个泛域名证书,此时我们ingress 可以直接使用该secert,不需要再去添加注解执行使用的issuer/cluseteissuer了
证书使用案例
Ingress 版本
test.foxwho.com.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: whoami-https
namespace: default
annotations:
kubernetes.io/ingress.class: traefik
spec:
tls:
- hosts:
- test.foxwho.com
secretName: foxwho-tls
rules:
- host: test.foxwho.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: whoami
port:
number: 80
nginx 版本
test.foxwho.com.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: whoami-https
namespace: default
annotations:
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: nginx
tls:
- hosts:
- test.foxwho.com
secretName: foxwho-tls
rules:
- host: test.foxwho.com
http:
paths:
- path: /
pathType: Prefix
backend:
serviceName: whoami
servicePort: 80
|