随着互联网的普及和数字化的不断深入,安全性越来越成为人们越来越重要的关注点。使用 HTTPS 协议来保护网络通信已经成为标配,而 Let's Encrypt 证书则成为了一个免费获得 HTTPS 证书的不错选择。
在这篇文章中,我们将重点介绍如何在 Kubernetes 集群上使用 Let's Encrypt 证书。我们将从创建 ClusterIssuer 开始,一步步介绍证书的申请和使用过程。
1. 创建 ClusterIssuer
在 Kubernetes 上使用 Let's Encrypt 证书的第一步是创建一个 ClusterIssuer。在 Kubernetes 中,ClusterIssuer 可以让我们定义一些组织中所有的证书颁发机制。接下来的所有证书申请都将通过这个 ClusterIssuer 所定义的机制颁发证书。
在 Kubernetes 1.12 及其以上版本中,我们可以使用 cert-manager
来管理证书。在此之前,需要手动安装 kube-lego
来管理证书。
创建 ClusterIssuer 的 YAML 文件如下:
apiVersion: cert-manager.io/v1alpha2 kind: ClusterIssuer metadata: name: letsencrypt-staging spec: acme: server: https://acme-staging-v02.api.letsencrypt.org/directory email: youremail@example.com privateKeySecretRef: name: letsencrypt-staging solvers: - http01: ingress: class: nginx
`
在上述 YAML 文件中,acme
字段是关键。由于 Let's Encrypt 是一个提供免费证书的机构,因此他们会限制证书的频率。为了避免过度使用 Let's Encrypt 资源导致被封禁,我们可以使用 Let's Encrypt 测试服务器 https://acme-staging-v02.api.letsencrypt.org/directory
来创建无限量的测试证书。测试证书与生产证书在加密和认证程度上没有差别,所以我们可以通过简单的修改来轻松切换到生产服务器。
2. 创建 Ingress
接下来,我们需要创建 Ingress。在 Kubernetes 中,Ingress 是一个负责将客户端请求路由到正确的服务或后端 Pod 的入口点。因为我们要使用 Let's Encrypt 发布 HTTPS 页面,因此一定要在创建 Ingress 的时候定义 SSL。否则,我们将无法使用 HTTPS。
创建 Ingress 的 YAML 文件如下:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: example-ingress annotations: kubernetes.io/tls-acme: "true" cert-manager.io/cluster-issuer: "letsencrypt-staging" spec: tls: - hosts: - example.com secretName: example-com-tls rules: - host: example.com http: paths: - path: / backend: serviceName: example-service servicePort: 80
上述 YAML 文件中,我们定义了 kubernetes.io/tls-acme
,这是一个需要包含证书信息的强制属性。同时,我们也定义了 cert-manager.io/cluster-issuer
,指向上文中定义的 ClusterIssuer 名称。这个 Ingress 文件还包含了需要申请 SSL 证书的域名和相应的证书名称。
3. 部署应用
最后一步是在 Kubernetes 上部署我们的应用。在这个例子中,我们将使用一个名为 example
的 Deployment,并将其服务暴露到 Ingress 之前。
apiVersion: apps/v1 kind: Deployment metadata: name: example-deployment spec: replicas: 2 selector: matchLabels: app: example template: metadata: labels: app: example spec: containers: - name: example image: example:latest ports: - containerPort: 80
apiVersion: v1 kind: Service metadata: name: example-service spec: type: ClusterIP selector: app: example ports: - protocol: TCP port: 80 targetPort: 80
这些 YAML 文件定义了我们的应用和 Kubernetes 资源之间的关系。这如果我们已经安装了 nginx-ingress-controller
,则部署可以成功。
至此,让我们来看看完整的 YAML 文件如何工作。假设我们已经安装了 Let's Encrypt,执行以下命令:
kubectl apply -f cluster-issuer.yaml kubectl apply -f deployment.yaml kubectl apply -f ingress.yaml
现在 Ingress 应该已经成功地创建了,部署也已经完成。您应该可以通过 HTTPS 访问您的 Kubernetes Cluster 域名。同时,如果您认为测试已完成,并想申请生产证书,只需将 acme.server
字段更改为生产服务器的 URL 即可。
总结
在这篇文章中,我们已经介绍了如何在 Kubernetes 上使用 Let's Encrypt 证书。在此过程中,我们创建了 ClusterIssuer 和 Ingress,并部署了一个简单的应用程序以检查证书的颁发和使用情况。此处的示例代码可以帮助您更好地理解如何在 Kubernetes 上使用 Let's Encrypt 证书,以便您的 Kubernetes 集群更加安全。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6593d950eb4cecbf2d8785b6