使用Let's Encrypt自动更新kubernetes ingressHTTPS

Letsencrypt 来签发凭证">用 Letsencrypt 来签发凭证

为我们管理SSL / TLS证书的组件是Cert manager。它将为每个入口端点自动创建新证书。此外,它将在证书过期时自动续订。
手动申请证书安装 certbot,参考官方教程

kubernetes 自动申请配置TLS

使用helm安装cert-manager

如果群集未启用 RBAC,添加:–set rbac.create=false \
–set serviceAccount.create=false

1
2
3
4
5
helm 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.yaml

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: 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.yaml

1
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
22
apiVersion: 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

Ingress
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
2
kubectl delete -f certificates.yaml
kubectl delete -f cluster-issuer.yaml