# 04-12-nodejs-TLS与证书 > 为 `nodejs-demo` 的 **Ingress** 启用 **HTTPS**:`spec.tls` + 证书 **Secret**。集群侧 Traefik **ACME 自动证书** 以 [`03-02-k3s-traefik-acme.md`](03-02-k3s-traefik-acme.md) 为主;本篇侧重 **应用 Ingress 如何声明 TLS** 与验证。 ## TL;DR - **手动练习**:复制本课目录 `ansible/files/04-12/` 下清单到目标路径,按需改字段后按本文 `kubectl`/bash 操作(学习路径可不使用 verify)。 - **自动化验收**:`./ansible/bin/verify.sh run 04-12` - **关键前置**:按本文「前置条件」准备环境变量/Secret/入口 IP - **成功判据**:达到本文「预期」且 playbook 断言通过 - **排障**:见本文「排障」 ## 前置条件 - 已完成 `03-02`(推荐):Traefik 已配置 `websecure` 与证书解析器;或你已手动/其他方式准备好 TLS Secret。 - 已能 **从客户端访问** 到 Traefik 的 443(或你环境中的 HTTPS 入口)。 ## 清单路径(本课分目录) | 本篇完整清单(Ingress 已切 **websecure** + `spec.tls`;**不含** Secret 内容) | [`ansible/files/04-12/04-12-nodejs-demo.yaml`](../ansible/files/04-12/04-12-nodejs-demo.yaml) | | 应用 | 先创建 TLS Secret(见下),再 `kubectl apply -f ansible/files/04-12/04-12-nodejs-demo.yaml` | **证书 Secret**:使用命令创建(不提交私钥到 Git): ```bash kubectl create secret tls nodejs-demo-tls \ --cert=path/to/fullchain.pem \ --key=path/to/privkey.pem \ -n default ``` `spec.tls.hosts` / `rules.host` 须与证书 SAN 一致(清单默认为 **app.example.local**)。 ## 场景说明(白话) - **集群怎么收 HTTPS**:多半由 Traefik 终结 TLS(`03-02`);应用侧要在 Ingress 上声明「用哪个证书、哪个域名」。 - **Secret 里有什么**:通常是 **`tls.crt`(完整链)** + **`tls.key`(私钥)**,类型为 `kubernetes.io/tls`。 ### 相对 `04-11` 的变更(原文 → 新文) | 位置 | 原文(`04-11`) | 新文(`04-12`) | |------|-----------------|-----------------| | Ingress 注解 `router.entrypoints` | `web` | `websecure` | | Ingress `spec.tls` | (无) | `hosts: [app.example.local]`,`secretName: nodejs-demo-tls` | 若使用 **ACME**,Secret 可能由 cert-manager 或 Traefik 自动生成;此时 `secretName` 填控制器生成的名称即可。 ## 验证 ```bash kubectl describe ing nodejs-demo -n default curl -vk --max-time 5 https://app.example.local/api/ ``` 预期:TLS 握手成功;证书 CN/SAN 与域名匹配(自签或测试环境会有告警属正常)。 ## HTTP 重定向 可由 Traefik 全局中间件或 Ingress 注解实现 `web` → `websecure`;细节见 `03-02` / Traefik 文档。 ## 失败排查 - **证书不匹配**:Secret 中证书与 `rules.host` 不一致。 - **default backend 404**:`router.entrypoints` 与 Traefik 监听不一致;或仍走 `web` 访问 HTTPS 路径。 - `06-01-k3s-networkpolicy-故障排查.md` - 集群证书:`03-02-k3s-traefik-acme.md`、`03-03-k3s-traefik-dashboard-acme.md` ## 相关文档 - [`04-07-nodejs-Ingress与Traefik.md`](04-07-nodejs-Ingress与Traefik.md) - [`04-01-k3s-nodejs-高级部署.md`](04-01-k3s-nodejs-高级部署.md) ## 排障 - **先看 playbook 输出**:失败时先定位是 deploy/wait/http_check 哪一步。 - **集群侧总览**:`kubectl get nodes -o wide`、`kubectl -n kube-system get pods -o wide`。 - **事件与日志**:`kubectl -n describe ...`、`kubectl -n logs ... --tail=200`。