如何在 Kubernetes 上使用 Let’s Encrypt 证书?

随着互联网的普及和数字化的不断深入,安全性越来越成为人们越来越重要的关注点。使用 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


纠错反馈