Letsencrypt 来签发凭证">用 Letsencrypt 来签发凭证
为我们管理SSL / TLS证书的组件是Cert manager。它将为每个入口端点自动创建新证书。此外,它将在证书过期时自动续订。
手动申请证书安装 certbot,参考官方教程
kubernetes 自动申请配置TLS
使用helm安装cert-manager
如果群集未启用 RBAC,添加:–set rbac.create=false \
–set serviceAccount.create=false1
2
3
4
5helm install \
--name cert-manager \
--namespace kube-system \
stable/cert-manager
kubectl get pod -n ingress --selector=app=cert-manage
安装clusterissuers,指示Cert Manager使用Let的https。替换你的电子邮件地址
证书管理器必须有 Issuer 或 ClusterIssuer 资源,才能颁发证书。 这两种 Kubernetes 资源的功能完全相同,区别在于 Issuer 适用于单一命名空间,而 ClusterIssuer 适用于所有命名空间这里只讲ClusterIssuer
ClusterIssuers
cat certificate-issuer.yaml1
2
3
4
5
6
7
8
9
10
11
12apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
namespace: default
spec:
acme:
email: root@idcsec.com
server: https://acme-v01.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod
http01: {}
metadata.name 是我们创建的签发机构的名称,后面我们创建证书的时候会引用它
spec.acme.email 是你自己的邮箱,证书快过期的时候会有邮件提醒,不过 cert-manager 会利用 acme 协议自动给我们重新颁发证书来续期
spec.acme.server 是 acme 协议的服务端,我们这里用 Let’s Encrypt,这个地址就写死成这样就行
spec.acme.privateKeySecretRef 指示此签发机构的私钥将要存储到哪个 Secret 对象中,名称不重要
spec.acme.http01 这里指示签发机构使用 HTTP-01 的方式进行 acme 协议 (还可以用 DNS 方式,acme 协议的目的是证明这台机器和域名都是属于你的,然后才准许给你颁发证书)
kubectl apply -f certificate-issuer.yaml1
2
3这使我们能够在任何命名空间中创建Ingress。
只需更改1个annotations:
certmanager.k8s.io/cluster-issuer: letsencrypt-prod
创建证书对象
接下来,必须创建证书资源。 证书资源定义了必需的 X.509 证书。参考cert-manager 证书
cert-manager具有“证书”的概念,用于定义所需的X.509证书。证书是一种命名空间资源,它引用Issuer或ClusterIssuer以获取有关如何获取证书的信息。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
meteadata:
name: tls-idcsec.com
namespace: ingress-nginx
spec:
secretName: tls-idcsec.com
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
commonName: www.mydomain.com
dnsNames:
- www.idecsec.com
- test.idcsec.com
acme:
config:
- http01:
ingressClass: none
domains:
- www.idecsec.com
- test.idcsec.com
kubectl apply -f certificates.yaml
ingress-nginx配置https
1 | apiVersion: extensions/v1beta1 metadata: name: ${projectSvc} annotations: certmanager.k8s.io/cluster-issuer: letsencrypt-prod ingress.kubernetes.io/ssl-redirect: "False" 是否强制跳转https spec: tls: - hosts: - ${projectUrl} secretName: https-secret rules: - host: ${projectUrl} http: paths: - path: / backend: serviceName: ${projectSvc} servicePort: 80 |
清理资源
1 | kubectl delete -f certificates.yaml |