在kubernetes的ingress中配置let's encrypt自动https

平时在普通的机器上,用cert-manager配置let’s encrypt自动开启https非常方便。而在kubernetes中,如果使用ingress做反向代理路由,那么也可以安装对应版本的cert-manager自动开启https, 自动续证书。

1. 安装helm和tiller

helm的安装这里不详细讲,现在一般云服务商(比如阿里云)的kubernetes中都会安装好helm和tiller,只需要在客户端安装helm即可,mac下可以直接用homebrew

1
brew install kubernetes-helm

2. 安装cert-manager

直接贴上来自官方的安装命令即可。大致为新建一个cert-manager的namespace,然后用helm安装相应版本的cert-manager。为了获取更新的版本,执行前可以参考一下官方:https://docs.cert-manager.io/en/latest/getting-started/install/kubernetes.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Install the CustomResourceDefinition resources separately
kubectl apply --validate=false -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.11/deploy/manifests/00-crds.yaml

# Create the namespace for cert-manager
kubectl create namespace cert-manager

# Add the Jetstack Helm repository
helm repo add jetstack https://charts.jetstack.io

# Update your local Helm chart repository cache
helm repo update

# Install the cert-manager Helm chart
helm install \
--name cert-manager \
--namespace cert-manager \
--version v0.11.0 \
jetstack/cert-manager

检查是否安装成功

1
kubectl get pods --namespace cert-manager

成功的话类似:

1
2
3
4
NAME                                       READY   STATUS    RESTARTS   AGE
cert-manager-5c6866597-zw7kh 1/1 Running 0 2m
cert-manager-cainjector-577f6d9fd7-tr77l 1/1 Running 0 2m
cert-manager-webhook-787858fcdb-nlzsq 1/1 Running 0 2m

3. 配置issuer

注意下面的邮箱需要改成你自己的

创建一个production-issuer.yaml文件,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: cert-manager.io/v1alpha2
kind: Issuer
metadata:
name: letsencrypt-prod
spec:
acme:
# The ACME server URL
server: https://acme-v02.api.letsencrypt.org/directory
# Email address used for ACME registration
email: user@example.com
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: letsencrypt-prod
# Enable the HTTP-01 challenge provider
solvers:
- http01:
ingress:
class: nginx
1
2
$ kubectl create --edit -f production-issuer.yaml
issuer.cert-manager.io "letsencrypt-prod" created

配置完再查看一眼

1
kubectl describe issuer letsencrypt-prod

4. 开始添加域名使用

首先用常规的方法配置ingress,并等待其分配好IP等信息。然后编辑yaml, 添加issuer,在annotations中加入两行:

1
2
3
4
5
6
7
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: kuard
annotations:
kubernetes.io/ingress.class: "nginx" # letsencrypt
cert-manager.io/issuer: "letsencrypt-prod" # letsencrypt

有些云服务商需要手动添加tls证书

1
2
3
4
5
6
spec:
...
tls:
- hosts:
- www.example.com
secretName: example-com-tls

加完之后,耐心等待,cert-manager会自动申请证书,期间可以看到有临时的ingress出现,这就是在验证域名。等待最多10分钟即可配置完成。

如果需要强制https跳转,则再添加一个annotations

1
nginx.ingress.kubernetes.io/force-ssl-redirect: 'true'
文章作者: 王思捷
文章链接: https://sijie.wang/2019/10/14/kubernetes-letsencrypt/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 我爱平铺