在Kubernetes中托管SSL的方法主要有以下几种:使用Ingress资源、使用证书管理器Cert-Manager、手动配置TLS秘密。其中,使用Ingress资源结合Cert-Manager 是最常见和推荐的方式,因为它能自动管理和更新证书,大大简化了运维工作。通过配置Ingress资源并利用Cert-Manager,Kubernetes可以自动申请和续期Let's Encrypt等CA机构的证书,从而实现HTTPS流量的自动管理。此外,手动配置TLS秘密虽然也能实现SSL托管,但需要手动更新证书,不推荐用于生产环境。
一、INGRESS资源
Ingress资源是Kubernetes中用于管理外部访问服务(通常是HTTP和HTTPS)的API对象。它提供了一个灵活的方式来定义如何将外部流量路由到集群内部的服务。通过定义Ingress资源,可以很容易地将流量引导到不同的服务,同时也能配置SSL证书,实现HTTPS加密。
使用Ingress资源托管SSL的基本步骤如下:
- 创建Ingress控制器:首先需要在集群中部署一个Ingress控制器,比如NGINX Ingress Controller或Traefik。Ingress控制器负责实际处理Ingress资源并管理流量转发。
- 配置Ingress资源:定义一个Ingress资源,指定域名和目标服务,同时配置TLS部分来引用SSL证书。
- 申请和配置SSL证书:可以手动创建Kubernetes Secret来存储SSL证书和密钥,或者使用Cert-Manager自动申请和管理证书。
具体示例如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
tls:
- hosts:
- example.com
secretName: example-tls
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
上述示例中,Ingress资源配置了example.com
的TLS部分,使用了example-tls
这个Secret来存储SSL证书和密钥。
二、CERT-MANAGER
Cert-Manager 是Kubernetes的一个扩展,用于自动化管理和配置SSL/TLS证书。它支持从各种证书颁发机构(如Let's Encrypt)自动申请和续期证书,大大简化了证书管理流程。
使用Cert-Manager托管SSL证书的步骤如下:
- 安装Cert-Manager:可以通过Helm或YAML文件来安装Cert-Manager。安装后,Cert-Manager会在集群中运行并监控相关资源。
- 配置ClusterIssuer或Issuer:定义一个ClusterIssuer或Issuer,指定如何申请证书(例如,使用HTTP-01或DNS-01挑战来验证域名)。
- 申请证书:通过创建Certificate资源来申请证书,Cert-Manager会自动处理申请和续期过程。
具体示例如下:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: user@example.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: example-com
namespace: default
spec:
secretName: example-tls
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
commonName: example.com
dnsNames:
- example.com
上述配置中,ClusterIssuer定义了Let's Encrypt的生产环境,并使用HTTP-01挑战来验证域名。Certificate资源则请求了example.com
的证书,并将其存储在example-tls
这个Secret中。
三、手动配置TLS秘密
在某些情况下,可能需要手动管理SSL证书和密钥。这通常用于没有自动化需求的简单场景或测试环境。手动配置TLS秘密的步骤如下:
- 获取SSL证书和密钥:从证书颁发机构(CA)获取SSL证书和密钥文件。
- 创建Kubernetes Secret:将SSL证书和密钥存储在Kubernetes Secret中。
- 配置Ingress资源:在Ingress资源中引用创建的Secret,实现SSL托管。
具体示例如下:
kubectl create secret tls example-tls --cert=path/to/tls.crt --key=path/to/tls.key
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
tls:
- hosts:
- example.com
secretName: example-tls
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
上述步骤中,首先通过kubectl create secret
命令创建了一个包含SSL证书和密钥的Secret,然后在Ingress资源中引用了这个Secret,从而实现了SSL托管。
四、SSL证书更新
SSL证书通常有有效期,到期后需要更新。如果使用Cert-Manager,它会自动处理证书更新,简化了运维工作。如果手动管理证书,则需要定期手动更新Secret并更新Ingress资源。
自动更新:Cert-Manager会在证书到期前自动申请新证书并更新相关Secret,无需人工干预。通过配置合理的监控和告警机制,可以确保证书始终有效。
手动更新:需要重新获取新的SSL证书和密钥,然后通过kubectl create secret
命令更新Kubernetes Secret,并确保Ingress资源引用的Secret名称不变。可以通过脚本或自动化工具简化这个过程。
kubectl create secret tls example-tls --cert=path/to/new/tls.crt --key=path/to/new/tls.key --dry-run=client -o yaml | kubectl apply -f -
上述命令使用了--dry-run=client
和-o yaml
选项生成更新Secret的YAML文件,并通过kubectl apply
命令应用更新,从而实现无缝更新SSL证书。
五、监控和告警
为了确保SSL证书始终有效,需要配置监控和告警机制。可以使用Prometheus和Alertmanager等工具,结合Kubernetes的监控能力,实时监控证书状态并在证书即将到期时发送告警通知。
- 监控证书有效期:使用Prometheus监控证书的剩余有效期,配置告警规则,在证书即将到期时触发告警。
- 告警通知:通过Alertmanager将告警信息发送到邮件、Slack等通知渠道,及时提醒运维人员更新证书。
具体示例如下:
groups:
- name: ssl-certs
rules:
- alert: SSLCertificateExpiringSoon
expr: (time() > (kube_secret_info{namespace="default", secret="example-tls"} + 2592000))
for: 24h
labels:
severity: warning
annotations:
summary: "SSL Certificate for example.com is expiring soon"
description: "The SSL certificate for example.com will expire in less than 30 days. Please renew the certificate."
上述Prometheus告警规则配置了SSL证书到期前30天的告警,结合Alertmanager可以将告警信息发送到指定的通知渠道。
通过以上方法,可以在Kubernetes中高效、自动化地托管SSL证书,确保服务的安全性和可用性。
相关问答FAQs:
常见问题解答:K8s 如何托管 SSL 证书
1. 如何在 Kubernetes 中配置 SSL 证书?
在 Kubernetes (K8s) 中配置 SSL 证书主要涉及到创建和管理 Kubernetes Secret,Deployment,Service 和 Ingress 等资源。首先,您需要准备好 SSL 证书文件(通常是一个 .crt
文件和一个 .key
文件)。然后,将这些证书数据以 Secret 的形式存储在 Kubernetes 集群中。可以通过以下命令创建 Secret:
kubectl create secret tls my-tls-secret --cert=path/to/tls.crt --key=path/to/tls.key
接下来,您需要配置一个 Ingress 资源来使用这些证书。Ingress 资源能够管理集群外部的 HTTP 和 HTTPS 请求,并将其路由到集群内部的服务。以下是一个配置示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
tls:
- hosts:
- mydomain.com
secretName: my-tls-secret
rules:
- host: mydomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
在这个配置中,tls
部分指定了需要使用的证书和密钥的 Secret,rules
部分定义了如何将流量路由到后端服务。确保将 mydomain.com
和 my-service
替换成您的实际域名和服务名称。
2. 如何更新 Kubernetes 中的 SSL 证书?
更新 Kubernetes 中的 SSL 证书需要执行几个步骤,确保服务保持可用且没有中断。首先,您需要生成或获取新的 SSL 证书和私钥文件。接下来,使用以下命令更新 Secret 中的证书:
kubectl create secret tls my-tls-secret --cert=path/to/new-tls.crt --key=path/to/new-tls.key --dry-run=client -o yaml | kubectl apply -f -
这个命令会先创建一个包含新证书的 Secret,但使用 --dry-run=client
参数确保不会立即创建实际资源。然后,通过 kubectl apply
更新现有的 Secret。完成后,Injress Controller 通常会自动检测到 Secret 的变化,并应用新的证书。如果 Ingress Controller 没有自动重新加载证书,您可能需要手动重启相关的 Pods 或 Controllers 以确保更新生效。
3. Kubernetes 中如何处理自签名 SSL 证书?
在 Kubernetes 集群中使用自签名 SSL 证书时,首先要将自签名证书和私钥创建为 Secret。您可以使用以下命令:
kubectl create secret tls my-selfsigned-tls --cert=path/to/selfsigned.crt --key=path/to/selfsigned.key
创建 Secret 后,配置 Ingress 资源来使用自签名证书,方法与使用受信任的证书类似。需要注意的是,浏览器和客户端在访问使用自签名证书的网站时会显示警告,因为自签名证书不被广泛信任。为了在生产环境中提高安全性,推荐使用由可信 CA 签发的证书。如果需要为开发或测试环境使用自签名证书,确保相应的客户端也被配置为信任这些自签名证书,以避免不必要的警告。
关于 GitLab 的更多内容,可以查看官网文档:
官网地址: https://gitlab.cn
文档地址: https://docs.gitlab.cn
论坛地址: https://forum.gitlab.cn
原创文章,作者:jihu002,如若转载,请注明出处:https://devops.gitlab.cn/archives/52707