在 Kubernetes 上添加免费 SSL/TLS(使用 CertManager 和 LetsEncrypt)Cert-manager + LetsEncrypt

2025-06-07

在 Kubernetes 上添加免费 SSL/TLS(使用 CertManager 和 LetsEncrypt)

证书管理器 + LetsEncrypt

您拥有一个崭新的 Kubernetes 集群。您部署了 hello-world 应用,现在可以通过 NodePort 服务 http://:30000 访问它。

随着工作负载的增加,您决定改用负载均衡服务。但随后您发现,为每个工作负载都使用负载均衡服务的成本会非常高昂。

Ingress 来救援!

你只需要写一个简单的入口清单,然后使用 kubectl apply!Boom 💥

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  labels:
    app: hello-world
  name: example.com
spec:
  rules:
  - host: example.com
    http:
      paths:
      - backend:
          service:
            name: hello-world
            port:
              number: 80
        path: /
        pathType: Prefix
Enter fullscreen mode Exit fullscreen mode

但是如果没有 Ingress 控制器,你的 Ingress 资源就毫无用处。你记得 YouTube 上有人提到过 Ingress-Nginx 控制器,于是想去看看。

糟糕!2 小时后,你在 StackOverflow 上发现你的 k3s 集群已经绑定了 Traefik Ingress Controller 😡

您创建了一条 A 记录,将域名配置为指向集群中单个节点的公网 IP 地址。您开心地打开浏览器的新标签页,前往 URL 栏,导航到您的域名 (example.com)。结果收到一条回复:“您的连接不安全”。

你现在做什么?

在下一节中,我将向您展示如何使用 cert-manager 将 TLS 添加到您的 Kubernetes 集群,以自动执行证书管理操作,例如颁发和续订。

证书管理器 + LetsEncrypt

Cert-manager 是一个原生的 Kubernetes 证书管理控制器。它可以帮助从各种来源颁发证书,例如 Let's Encrypt、HashiCorp Vault、Venafi、简单的签名密钥对或自签名证书。

Let's Encrypt 是一个非营利性证书颁发机构,为 3 亿个网站提供 TLS 证书。

步骤

  1. 在您的集群上安装 Cert-manager
  2. 添加 LetsEncrypt 作为颁发者(或 ClusterIssuer)
  3. 更新入口以使用证书

安装证书管理器

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.1.1/cert-manager.yaml
Enter fullscreen mode Exit fullscreen mode

通过检查cert-manager正在运行的 Pod 的命名空间来验证 cert-manager 的安装

$ kubectl get pods --namespace cert-manager

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
Enter fullscreen mode Exit fullscreen mode

一切顺利!继续

发行者(或 ClusterIssuer) - Let's Enncrypt

a. 创建clusterissuer.yaml清单

apiVersion: cert-manager.io/v1
kind: ClusterIssuer # I'm using ClusterIssuer here
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: <your-email-address>
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - http01:
        ingress:
          class: traefik 
Enter fullscreen mode Exit fullscreen mode

b. 应用清单

kubectl apply -f clusterissuer.yaml
Enter fullscreen mode Exit fullscreen mode

创建(或更新)Ingress

以下清单是入口资源的示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  labels:
    app: hello-world
  name: 
  namespace: <namespace> # if non-default namespace
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  rules:
  - host: example.com # your domain
    http:
      paths:
      - backend:
          service:
            name: <your-service>
            port:
              number: 80 # use appropriate port
        path: /
        pathType: Prefix
  tls:
  - hosts:
    - example.com # your domain 
    secretName: letsencrypt-prod # secret name, same as the privateKeySecretRef in the (Cluster)Issuer
Enter fullscreen mode Exit fullscreen mode

应用清单!

您可以验证证书是否已颁发

$ kubectl -n <namespace> describe certificate letsencrypt-prod
Spec:
  Dns Names:
    example.com
  Issuer Ref:
    Group:      cert-manager.io
    Kind:       ClusterIssuer
    Name:       letsencrypt-prod
  Secret Name:  letsencrypt-prod
  Usages:
    digital signature
    key encipherment
Status:
  Conditions:
    Last Transition Time:  2023-06-14T03:24:49Z
    Message:               Certificate is up to date and has not expired
    Observed Generation:   1
    Reason:                Ready
    Status:                True
    Type:                  Ready
  Not After:               2023-09-12T02:10:00Z
  Not Before:              2023-06-14T02:10:01Z
  Renewal Time:            2023-08-13T02:10:00Z
Events:                    <none>
Enter fullscreen mode Exit fullscreen mode

您现在应该已经配置好了 TLS!

在下面留下您的反馈、评论和问题,我很乐意为您解答。

如果您喜欢这个,您可以在Twitter 上关注我(@ileriayooo),我在那里分享大量有关 Kubernetes、Cloud Native 和 DevOps 的信息。

文章来源:https://dev.to/ileriayo/adding-free-ssltls-on-kubernetes-using-certmanager-and-letsencrypt-a1l
PREV
设置 NGINX 负载均衡器 设置 Nginx 负载均衡
NEXT
60% 的键盘很适合你