在 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
但是如果没有 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 证书。
步骤
- 在您的集群上安装 Cert-manager
- 添加 LetsEncrypt 作为颁发者(或 ClusterIssuer)
- 更新入口以使用证书
安装证书管理器
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.1.1/cert-manager.yaml
通过检查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
一切顺利!继续
发行者(或 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
b. 应用清单
kubectl apply -f clusterissuer.yaml
创建(或更新)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
应用清单!
您可以验证证书是否已颁发
$ 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>
您现在应该已经配置好了 TLS!
在下面留下您的反馈、评论和问题,我很乐意为您解答。
如果您喜欢这个,您可以在Twitter 上关注我(@ileriayooo),我在那里分享大量有关 Kubernetes、Cloud Native 和 DevOps 的信息。
文章来源:https://dev.to/ileriayo/adding-free-ssltls-on-kubernetes-using-certmanager-and-letsencrypt-a1l