大前端时代,FEer 聊 12factor-App Go 微服务项目 Podinfo 之 K8S Cert-Manager 与 Let’s Encrypt 实战

1,633 阅读2分钟

介绍

这是一个系列

  1. 大前端时代,使用容器探索开源的 Golang 微服务模板项目
  2. 大前端时代,FEer 聊 12factor-App Go 微服务项目 Podinfo 之开篇
  3. 大前端时代,FEer 聊 12factor-App Go 微服务项目 Podinfo 之 K8S 从 0 到 1 自建实战篇

Cert-Manager 是什么?

Cert-Manager 是一个云原生证书管理开源项目,用于在 Kubernetes 集群中提供 HTTPS 证书并自动续期。我们可以通过 Kubernetes Ingress 和 Let’s Encrypt 实现外部服务的自动化 HTTPS。

准备工作

K8S 集群

域名

为少cloud-fe.com 域名是在 dynadot 申请的(城外)。

停靠 CloudFlare(你可能不需要)

CloudFlare

因为为少的机器在 Vultr,所以加速是非常必要的。

letsencrypt 域名验证方式

这里选择 DNS-01 验证方式

CloudFlare API Token

CloudFlare 允许我们透過 API 的方式修改 DNS Record 从而通过 Let's Encrypt 的验证。这里,我将使用 CloudFlare 作为 Let's Encrypt 的 DNS 验证。

我们创建令牌:

在令牌创建成功页面,我们根据提示进行测试。

curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \
     -H "Authorization: Bearer your-token" \
     -H "Content-Type:application/json"
## 成功则返回
# {"result":{"id":"e257639048a053c025772fa91f5ae253","status":"active"},"success":true,"errors":[],"messages":[{"code":10000,"message":"This API Token is valid and active","type":null}]}

K8S 内部署 Cert-Manager

Helm 的安装

wget https://get.helm.sh/helm-v3.2.1-linux-amd64.tar.gz
tar -zxvf helm-v3.2.1-linux-amd64.tar.gz
cp linux-amd64/helm /usr/bin/

Helm 部署 Cert-Manager

kubectl create namespace cert-manager
helm repo add jetstack https://charts.jetstack.io
helm repo update

# Kubernetes 1.15+
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.16.0/cert-manager.crds.yaml

# Helm v3+
helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --version v0.16.0

验证安装

kubectl get pods --namespace cert-manager

创建 Issuer,测试 cert-manager-webhook

cat <<EOF > test-resources.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: cert-manager-test
---
apiVersion: cert-manager.io/v1alpha2
kind: Issuer
metadata:
  name: test-selfsigned
  namespace: cert-manager-test
spec:
  selfSigned: {}
---
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
  name: selfsigned-cert
  namespace: cert-manager-test
spec:
  dnsNames:
    - example.com
  secretName: selfsigned-cert-tls
  issuerRef:
    name: test-selfsigned
EOF

kubectl apply -f test-resources.yaml

查看一下,有无问题:

kubectl describe certificate -n cert-manager-test

Ready,没有问题。

我们清除掉它:

kubectl delete -f test-resources.yaml

配置 secret

注意更改 api-token

cat > cloudflare-api-token-secret.yaml << EOF
apiVersion: v1
kind: Secret
metadata:
  name: cloudflare-api-token-secret
  namespace: cert-manager
type: Opaque
stringData:
  api-token: your-token

EOF

配置 ClusterIssue

注意更改 email

cat > cluster-issuer.yaml << EOF
apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  labels:
    name: letsencrypt-prod
  name: letsencrypt-prod
  namespace: cert-manager
spec:
  acme:
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - dns01:
        cloudflare:
          email: your@gmail.com
          apiTokenSecretRef:
            name: cloudflare-api-token-secret
            key: api-token

EOF

配置 Certificate

cat > cloudfe-certificate.yaml << EOF
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
  name: cloudfe-cert
spec:
  secretName: cloudfe-cert-tls
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  commonName: '*.cloud-fe.com'
  dnsNames:
  - cloud-fe.com
  - "*.cloud-fe.com"

EOF

应用配置

kubectl apply -f cloudflare-api-token-secret.yaml

kubectl apply -f cluster-issuer.yaml

手动签发泛域名证书

kubectl apply -f cloudfe-certificate.yaml

验证是否配置成功

等个一、两分钟,然后键入:

kubectl describe Certificate

看到没,完美 Ready

为少现在做的一切基础工作,都是为了 Podinfo 项目上云。

这一节就到这里了,下一讲会和大家一起探讨下 IngressTraefik(云原生边缘路由) 。

参考 & 感谢

这些文章同时也会同步在 为少的博客 黑客下午茶