在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

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

# 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 cert-manager \
  --namespace cert-manager \
  --version v0.11.0 \
  jetstack/cert-manager

注意,如果是v3以前的版本,最后一句换成:

helm install \
  --name cert-manager \
  --namespace cert-manager \
  --version v0.11.0 \
  jetstack/cert-manager

检查是否安装成功

kubectl get pods --namespace cert-manager

成功的话类似下方,可以看到3个pod都ready:

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

如果是国内的机器,这一步可能非常慢,这些pod拉取镜像会需要比较久的时间

3. 配置issuer

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

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

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
$ kubectl create --edit -f production-issuer.yaml
issuer.cert-manager.io "letsencrypt-prod" created

配置完再查看一眼

kubectl describe issuer letsencrypt-prod

4. 开始添加域名使用

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

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: kuard
  annotations:
    kubernetes.io/ingress.class: "nginx"    # letsencrypt
    cert-manager.io/issuer: "letsencrypt-prod" # letsencrypt

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

spec:
  ...
  tls:
    - hosts:
        - www.example.com
      secretName: example-com-tls

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

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

nginx.ingress.kubernetes.io/force-ssl-redirect: 'true'

文章原始链接:https://sijie.wang/posts/kubernetes-letsencrypt/

本站文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请保留原始链接