在 Kubernetes 中为 Ingress 配置 SSL/TLS 证书,需要完成「准备证书 Secret」和「配置 Ingress 资源」两个核心步骤,以下是详细操作指南:
一、前提条件
- 已部署 Ingress Controller(如 NGINX、Traefik 等),确保其正常运行。
- 拥有有效的 SSL/TLS 证书文件:
- 公钥证书(通常命名为
tls.crt
) - 私钥文件(通常命名为
tls.key
)证书可通过 Let's Encrypt 免费获取,或使用自签名证书(仅用于测试)。
- 公钥证书(通常命名为
二、步骤 1:创建存储证书的 Secret
Kubernetes 中需将证书存储为 kubernetes.io/tls
类型的 Secret,供 Ingress 引用。
1. 准备证书文件
假设证书文件路径为:
- 公钥:
./tls.crt
- 私钥:
./tls.key
2. 创建 Secret
执行以下命令,在目标命名空间(与 Ingress 相同)创建 Secret:
kubectl create secret tls my-tls-secret \
--cert=./tls.crt \
--key=./tls.key \
--namespace=default # 替换为实际命名空间
my-tls-secret
:自定义 Secret 名称(后续 Ingress 需引用此名称)--namespace
:需与 Ingress 资源所在命名空间一致
3. 验证 Secret
kubectl get secret my-tls-secret -n default -o yaml
输出中应包含 tls.crt
和 tls.key
的 Base64 编码内容,类型为 kubernetes.io/tls
。
三、步骤 2:配置 Ingress 资源引用证书
在 Ingress YAML 中通过 tls
字段关联上一步创建的 Secret,并指定证书对应的域名。
示例 Ingress 配置(启用 HTTPS)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: https-ingress
namespace: default
annotations:
# 可选:强制 HTTP 重定向到 HTTPS(以 NGINX 为例)
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: nginx # 匹配部署的 Ingress Controller 类型
tls:
- hosts:
- example.com # 证书绑定的域名(必须与证书中 CN 或 SAN 一致)
- api.example.com # 支持多个域名(需证书包含这些域名)
secretName: my-tls-secret # 引用之前创建的证书 Secret
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-service
port:
number: 8080
关键配置说明
tls.hosts
:指定证书生效的域名,必须与证书中配置的域名(Common Name 或 Subject Alternative Name)完全一致。tls.secretName
:关联存储证书的 Secret 名称(与步骤 1 中创建的名称一致)。annotations
中的ssl-redirect: "true"
:自动将 HTTP 请求(80 端口)重定向到 HTTPS(443 端口),需 Ingress Controller 支持(如 NGINX)。
四、测试 HTTPS 访问
-
部署 Ingress 资源:
kubectl apply -f ingress-https.yaml
-
验证 Ingress 状态:
kubectl get ingress https-ingress -n default
输出中
ADDRESS
字段为 Ingress Controller 的入口 IP(或域名)。 -
测试访问:
curl https://example.com --resolve example.com:443:<INGRESS-IP>
若配置正确,会返回后端服务响应,且浏览器访问时显示「安全锁」图标。
五、扩展场景
1. 自签名证书(仅用于测试)
若没有正式证书,可生成自签名证书:
# 生成私钥和证书(有效期 365 天)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout ./tls.key \
-out ./tls.crt \
-subj "/CN=example.com/O=example" # CN 为域名
# 后续步骤同正式证书(创建 Secret 并配置 Ingress)
注意:自签名证书会被浏览器标记为「不安全」,仅用于测试环境。
2. 多证书配置
若需为不同域名配置不同证书,可在 tls
字段中添加多个条目:
tls:
- hosts:
- example.com
secretName: example-tls-secret # 对应 example.com 的证书
- hosts:
- test.com
secretName: test-tls-secret # 对应 test.com 的证书
3. 自动证书管理(生产推荐)
通过 Cert-Manager 工具可自动申请、续期 Let's Encrypt 证书,无需手动管理:
-
部署 Cert-Manager:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.yaml
-
创建
Issuer
或ClusterIssuer
资源定义证书来源。 -
在 Ingress 中添加注解
cert-manager.io/cluster-issuer: "letsencrypt-prod"
自动关联证书。
六、常见问题排查
-
证书不生效:
- 检查
tls.hosts
与证书域名是否完全一致。 - 确认 Secret 与 Ingress 在同一命名空间。
- 查看 Ingress Controller 日志:
kubectl logs -n ingress-nginx <nginx-controller-pod>
。
- 检查
-
HTTP 无法重定向到 HTTPS:
确认 Ingress Controller 支持
ssl-redirect
注解(不同控制器注解可能不同,如 Traefik 使用traefik.ingress.kubernetes.io/redirect-entry-point: https
)。
通过以上步骤,即可为 Ingress 配置 SSL/TLS 证书,实现 HTTPS 加密访问。