ingress自动化https

说明

如果用cfssl或者openssl之类的工具手动生成TLS证书,这样就可以轻松搞定站点的https访问了。理想是很美好,但实际操作时却很痛苦,主要有以下几点缺陷:

  1. 如果k8s集群上部署的应用较多,要为每个应用的不同域名生成https证书,操作太麻烦。
  2. 上述这些手动操作没有跟k8s的deployment描述文件放在一起记录下来,很容易遗忘。
  3. 证书过期后,又得手动执行命令重新生成证书。

证书管理器

cert-manager的架构

上面是官方给出的架构图,可以看到cert-manager在k8s中定义了两个自定义类型资源:IssuerCertificate

其中Issuer代表的是证书颁发者,可以定义各种提供者的证书颁发者,当前支持基于LetsencryptvaultCA的证书颁发者,还可以定义不同环境下的证书颁发者。

Certificate代表的是生成证书的请求,一般其中存入生成证书的元信息,如域名等等。

一旦在k8s中定义了上述两类资源,部署的cert-manager则会根据IssuerCertificate生成TLS证书,并将证书保存进k8s的Secret资源中,然后在Ingress资源中就可以引用到这些生成的Secret资源。对于已经生成的证书,还是定期检查证书的有效期,如即将超过有效期,还会自动续期。

部署

使用常规清单安装

注意:从cert-manager v0.11.0开始,Kubernetes的最低支持版本是v1.12.0。仍在运行Kubernetes v1.11或更低版本的用户应在安装cert-manager之前升级到受支持的版本。
创建一个名称空间以在其中运行cert-manager

创建一个namespace

1
2
3
4
5
6
# namespace.yaml 
---
apiVersion: v1
kind: Namespace
metadata:
name: cert-manager

安装cert-manager,官方地址为

1
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.13.0/cert-manager.yaml

yaml中有三个镜像,分别为

  • shenshengkun/cert-manager-controller:v0.13.1
  • shenshengkun/cert-manager-cainjector:v0.13.1
  • shenshengkun/cert-manager-webhook:v0.13.1

默认是从quay.io获取镜像,如果quay.io的镜像无法获取,改成我上面的镜像库

使用Helm安装

部署前需要一些 crd

1
kubectl apply --validate=false -f https://raw.githubusercontent.com/jetstack/cert-manager/v0.13.0/deploy/manifests/00-crds.yaml

为cert-manager创建名称空间

1
kubectl create namespace cert-manager

添加Jetstack Helm存储库。

1
helm repo add jetstack https://charts.jetstack.io

更新您的本地Helm存储库缓存

1
helm repo update
  • 安装cert-manager

    • Helm v3+

      1
      2
      3
      4
      helm install \
      cert-manager jetstack/cert-manager \
      --namespace cert-manager \
      --version v0.13.0
    • Helm v2

      1
      2
      3
      4
      5
      helm install \
      --name cert-manager \
      --namespace cert-manager \
      --version v0.13.0 \
      jetstack/cert-manager

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: tomcat-test
namespace: test
annotations:
#指定使用test做代理
kubernetes.io/ingress.class: "nginx-backend"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
#关联到名为letsencrypt-prod的Issuer
cert-manager.io/issuer: "letsencrypt-prod"
spec:
tls:
- hosts:
#自定义域名
- test.sy.com
secretName: test-tls
rules:
#自定义域名
- host: test.sy.com
http:
paths:
- backend:
#服务名称
serviceName: tomcat-test-opdev
#服务端口
servicePort: 6080
path: /
---
apiVersion: cert-manager.io/v1alpha2
kind: Issuer
metadata:
name: letsencrypt-prod
#保持和ingress处于相同的ns
namespace: test
spec:
selfSigned: {}
---
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
name: test-tls
#保持和ingress处于相同的ns
namespace: test
spec:
secretName: test-tls
duration: 2160h
renewBefore: 360h
dnsNames:
#自定义域名
- test.sy.com
issuerRef:
#指定名为letsencrypt-prod的Issuer
name: letsencrypt-prod

参考链接

Donate