Files
Deploy-Laboratory/docs/04-12-nodejs-TLS与证书.md
2026-03-29 09:08:01 +08:00

79 lines
3.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 <ns> describe ...``kubectl -n <ns> logs ... --tail=200`