站点图标 AI技术聚合

使用 Cert-Manager 为您的 Kubernetes 集群提供 SSL/TLS

使用 Cert-Manager 为您的 Kubernetes 集群提供 SSL/TLS

在用户浏览您的域时为他们设置安全连接

如果您从为您的 AWS Kubernetes 集群处理 DNS 和 SSL/TLS 中找到这篇文章,那么您的集群上某些服务的域路由流量,但您的用户仍然在他们的浏览器上看到这条讨厌的消息告诉他们这是一个不安全的连接。让我们解决这个问题。

需要 SSL 证书,以便浏览器可以与您的服务建立安全连接。在 Kubernetes 中,SSL 证书存储为 Kubernetes 机密。证书通常有效期为一到两年,然后过期,因此管理开销很大,并且可能会出现一些停机时间。我们需要一个自我管理的设置,并自动更新过期的证书。

这就是 Cert-manager 的用武之地。Cert-manager 是我们在您的集群中部署的资源,它可以与 Let’s Encrypt(免费)等证书颁发机构对话,为您的域生成证书。所以在我们深入之前,让我们在你的集群中部署 cert-manager[0][1]

我将使用 v1.8.0,但您可以在此处查看最新的 cert-manager 版本。[0]

让我们从发布中下载 cert-manager.yaml 文件。

curl -LO https://github.com/jetstack/cert-manager/releases/download/v1.8.0/cert-manager.yaml

然后让我们将 cert-manager 部署到名为 cert-manager 的命名空间。

kubectl create namespace cert-managerkubectl apply --validate=false -f cert-manager.yaml

为了将 cert-manager 连接到像 Let’s Encrypt 这样的证书颁发机构,需要部署另一个称为 Issuer 的 Kubernetes 对象。基本上,当我们从 cert-manager 请求证书时,它会创建一个 Certificate-request 对象,该对象要求颁发者从证书颁发机构请求新证书。

现在,在我们部署发行者之前,我们需要部署一个 nginx 入口控制器。为什么?因为当 cert-manager 向 Let’s Encrypt 之类的颁发者请求证书时,Let’s Encrypt 会发送一个 http 质询,需要 cert-manager 完成才能提供证书。因此,为了让 cert-manager 与 Let’s Encrypt 对话,我们需要使用 nginx 入口控制器将其向互联网开放。

让我们将入口控制器部署到 ingress-nginx 命名空间。

kubectl create ns ingress-nginxkubectl -n ingress-nginx apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.1.2.0/deploy/static/provider/cloud/deploy.yaml

接下来我们将设置发行者。颁发者指定证书颁发机构的服务器以及应存储颁发者密钥的 Kubernetes 密钥引用的名称。在我们的例子中,我们使用 acme 作为发布者(即 Let’s Encrypt),因此我们还指定了我们希望如何解决求解器下的 Let’s Encrypt 挑战。你可以在这里读更多关于它的内容。这是颁发者模板。[0]

apiVersion: cert-manager.io/v1                             
kind: ClusterIssuer
metadata:
name: letsencrypt-cluster-issuer
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: your-email@email.com
privateKeySecretRef:
name: letsencrypt-cluster-issuer-key
solvers:
- http01:
ingress:
class: nginx

让我们部署 Issuer。

kubectl apply -f cert-issuer.yaml# view the 
kubectl describe clusterissuer letsencrypt-cluster-issuer

我们已经有了 cert-manager 和 issuer。现在我们可以申请证书了。这是证书对象的模板。

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: example-cert #name of this object
namespace: default #same namespace as
spec:
dnsNames:
- example.com

secretName: example-tls-cert
issuerRef:
name: letsencrypt-cluster-issuer
kind: ClusterIssue
r

在模板中,我们指定了我们想要证书的 DNS 名称、应存储证书的 Kubernetes 机密中的机密名称,以及对我们之前部署的颁发者的引用。还要确保使用相同的名称空间,您将在其中部署将使用此证书的服务。

让我们部署它:

kubectl apply -f certificate.yaml

颁发证书后,您应该可以在 Kubernetes 机密中看到它。

kubectl get secrets

使用证书

假设您已经部署了一个应用程序及其服务,并且您希望通过入口将应用程序公开到 Internet,并使用我们上面颁发的证书为其设置 TLS。这是您将使用的模板:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
tls:
- hosts:
- example.com

secretName: example-tls-cert

rules:
- host: example.com
http:
paths:
- path: /
pathType: Exact
backend:
service:
name: backend-service
port:
number: 80

在 tls 部分下,我们指定此入口路由的 DNS 主机和我们之前创建的证书的秘密名称。我们还传递了入口将路由到的服务的名称。然后部署:

kubectl apply -f ingress.yaml

你有它。总而言之,我们已经在集群中部署了 cert-manager 和 Issuer 资源。然后我们为 cert-manager 创建了一个证书对象,以通过 Issuer 发出证书请求,并将新证书添加到 Kubernetes Secrets。然后我们创建了一个使用证书的 nginx 路由。

如果您设法使用上一篇文章中描述的 ExternalDNS(或其他方式)连接您的域,并使用 cert-manager 获取 TLS 证书,那么您的用户在浏览器中访问您的域时应该获得安全连接。

文章出处登录后可见!

已经登录?立即刷新
退出移动版