配置Ingress的SSL/TLS证书全过程

 更新时间:2025年10月14日 09:50:59   作者:火星MARK  
在Kubernetes中配置Ingress的SSL/TLS证书涉及两个主要步骤:首先是创建包含证书的Secret,然后是配置Ingress资源以使用该Secret,这要求已部署IngressController如NGINX,并拥有有效的SSL/TLS证书,可以通过Cert-Manager自动管理证书的申请和续期

在 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 加密访问。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • k8s中的NetworkPolicy使用详解

    k8s中的NetworkPolicy使用详解

    这篇文章主要介绍了k8s中的NetworkPolicy使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-10-10
  • 阿里云oss对象存储使用详细步骤

    阿里云oss对象存储使用详细步骤

    本文主要介绍了阿里云oss对象存储使用详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • kubernetes调度之NodeSelector使用解读

    kubernetes调度之NodeSelector使用解读

    本文介绍Kubernetes中两种简单调度策略:NodeName通过指定节点名称强制调度,跳过调度器;NodeSelector基于节点标签匹配,需为节点打标签并在Pod定义中配置,两者均为强制约束机制
    2025-08-08
  • kubernetes中pod的调度亲和性affinity详解

    kubernetes中pod的调度亲和性affinity详解

    本文简要介绍了Kubernetes中的三种亲和性机制:节点亲和性(控制Pod调度到指定节点)、Pod亲和性(与特定Pod共处同一节点)和Pod反亲和性(避免与特定Pod共处同一节点),并通过示例说明了其配置方式及实际调度效果
    2025-09-09
  • Centos 8.2 升级内核通过elrepo源的方法

    Centos 8.2 升级内核通过elrepo源的方法

    这篇文章主要介绍了Centos 8.2 升级内核通过elrepo源,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • k8s中kubeconfig的配置以及使用详解

    k8s中kubeconfig的配置以及使用详解

    每当与集群交互的时候少不了的是身份认证,使用kubeconfig(即证书)和token两种认证方式是最简单也最通用的认证方式,下面这篇文章主要给大家介绍了关于k8s中kubeconfig的配置以及使用的相关资料,需要的朋友可以参考下
    2022-01-01
  • Kubernetes有状态应用管理StatefulSet使用详解

    Kubernetes有状态应用管理StatefulSet使用详解

    这篇文章主要为大家介绍了Kubernetes有状态应用管理StatefulSet使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 阿里云kubernetes查找镜像中jar包的方法(docker查看镜像中的jar)

    阿里云kubernetes查找镜像中jar包的方法(docker查看镜像中的jar)

    这篇文章主要给大家介绍了关于阿里云kubernetes查找镜像中jar包的方法,也就是在docker查看镜像中的jar,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • K8s解决主机重启后kubelet无法自动启动问题(推荐)

    K8s解决主机重启后kubelet无法自动启动问题(推荐)

    在安装配置好Kubernetes后,正常情况下服务器关机重启,kubelet也会自动启动的,如何解决这个问题呢,下面小编给大家带来了K8s解决主机重启后kubelet无法自动启动问题,感兴趣的朋友一起看看吧
    2022-08-08
  • 虚拟化和云计算的区别分析

    虚拟化和云计算的区别分析

    这篇文章主要介绍了虚拟化和云计算的区别,深入浅出的列举分析了虚拟化与云计算的几点常见区别,需要的朋友可以参考下
    2016-10-10

最新评论