日常更新

This commit is contained in:
2026-03-29 09:08:01 +08:00
parent 31709425e2
commit befdefd222
224 changed files with 7240 additions and 3297 deletions

View File

@@ -0,0 +1,9 @@
# 01-01单控制节点安装
| 文件 | 说明 |
|------|------|
| `k3s-server-install.example.sh` | 默认或 `--data-dir=/storage` 安装片段备忘 |
- **手动**:在控制节点按 [docs/01-01-k3s-控制节点含traefik.md](../../../docs/01-01-k3s-控制节点含traefik.md) 执行;可与本目录示例对照。
- **自动**`./ansible/bin/verify.sh run 01-01`(专用 playbook`kubectl` 断言;与本目录 shell 示例共用真源路径)。
- 本篇**无** Kubernetes 应用清单;扩展名 `.sh` 不会进入 `kubectl apply --dry-run` 列表。

View File

@@ -0,0 +1,11 @@
#!/usr/bin/env bash
# 控制节点安装 k3s server示例— 真源目录 ansible/files/01-01/
# 详见docs/01-01-k3s-控制节点含traefik.md
# 方案一:默认数据目录
# curl -sfL https://get.k3s.io | sh -
# 方案二:数据盘
# curl -sfL https://get.k3s.io | sh -s - server --data-dir=/storage
echo "[INFO] 取消注释其一并在节点上执行token 路径随方案在文档中说明。"

View File

@@ -0,0 +1,8 @@
# 01-02工作节点加入 + Traefik 基线)
| 文件 | 说明 |
|------|------|
| `k3s-agent-join.example.sh` | worker 使用环境变量或 `agent --data-dir` 加入集群的片段 |
- **手动**:按 [docs/01-02-k3s-工作节点.md](../../../docs/01-02-k3s-工作节点.md) 在 worker 执行;替换 `K3S_URL``TOKEN` 与 IP。
- **自动**`./ansible/bin/verify.sh run 01-02`(与手工步骤共用本目录作为命令真源备忘)。

View File

@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# 工作节点加入 k3s示例— ansible/files/01-02/
# 详见docs/01-02-k3s-工作节点.md
# 方案一:默认数据目录
# curl -sfL https://get.k3s.io | \
# K3S_URL=https://192.168.2.61:6443 \
# K3S_TOKEN=<TOKEN> \
# sh -
# 方案二:数据盘
# curl -sfL https://get.k3s.io | sh -s - agent \
# --data-dir=/storage \
# --server https://192.168.2.61:6443 \
# --token <TOKEN>
echo "[INFO] 将占位符替换为控制面地址与 token 后执行。"

View File

@@ -0,0 +1,6 @@
# 01-03armv7 独立 Docker
- **手动**:在 armv7 主机按 [docs/01-03-armv7-standalone-docker.md](../../../docs/01-03-armv7-standalone-docker.md)**get.docker.com** 官方脚本 + 先 `docker info` 再决定是否安装)。
- **远程脚本**:仓库根执行 [ansible/tools/armv7-docker-verify-install.sh](../../tools/armv7-docker-verify-install.sh)(与文档流程一致;`ARMV7_SSH='ssh …' ./ansible/tools/...`)。
- **自动**`./ansible/bin/verify.sh run 01-03``SKIP_ARMV7=0` 时调用上述脚本)。
- 本篇无通用 K8s 清单;若后续补充 compose 或单元脚本,请用 `.example.` 命名或放在非 `.yml`/`.yaml` 扩展名以避免误 dry-run。

View File

View File

@@ -0,0 +1,6 @@
# 01-05Ansible 一键装集群)
- **真源 playbook**`ansible/playbooks/verify/01-05.yml`(与 `deploy-lab.sh` 调用一致)。
- **文档**[docs/01-05-节点初始化-ansible-实践.md](../../../docs/01-05-节点初始化-ansible-实践.md)。
- **自动**`./ansible/bin/verify.sh run 01-05``./ansible/bin/deploy-lab.sh k3s`
- 本目录用于与 `doc_id` 三元契约对齐;集群对象由 playbook / 其它 `ansible/files` 篇生成,此处可不放置额外 YAML。

View File

@@ -0,0 +1,12 @@
# 01-06OpenWrt HAProxy
- **说明与选用**[`docs/01-06-openwrt-haproxy.md`](../../../docs/01-06-openwrt-haproxy.md)(文首有各 `*.cfg` 对照表)。
- **本目录**HAProxy 示例配置(非 K8s YAML复制到 OpenWrt 后改 IP/端口并 `haproxy -c -f …` 校验。
| 文件 | 用途摘要 |
|------|----------|
| `haproxy-no-check.cfg` | 最简,无 check |
| `haproxy-http.cfg` | 80 明文 httpchk |
| `haproxy-tls.cfg` | 443 TCP + ssl-hello-chk |
| `haproxy-https.cfg` | 443 应用层 HTTPS 检查HAProxy 终结 TLS |
| `haproxy-proxy-http-tls.cfg` | 检查 + PROXY v2 |

View File

@@ -1,6 +1,6 @@
# 01-07 HAProxy - 3.2 HTTP 健康检查80 明文)
# 01-06 HAProxy - 3.2 HTTP 健康检查80 明文)
# backend k3s_http 增加 option httpchk GET /
# 文档docs/01-07-openwrt-haproxy.md 第 3.2 节
# 文档docs/01-06-openwrt-haproxy.md 第 3.2 节
global
log /dev/log local0
maxconn 4096

View File

@@ -1,8 +1,8 @@
# 01-07 HAProxy - 3.4 HTTPS 健康检查443 应用层HAProxy 终结 TLS由 HAProxy 提供证书)
# 01-06 HAProxy - 3.4 HTTPS 健康检查443 应用层HAProxy 终结 TLS由 HAProxy 提供证书)
# frontend 需 bind *:443 sslbackend mode http 连 K3s:443 做 HTTP over TLS 检查
# 将 your-ingress.example.com 改为实际 Host将 /etc/ssl/haproxy.pem 改为实际证书路径
# 自签/内网 CA 用 verify none生产建议 ca-file
# 文档docs/01-07-openwrt-haproxy.md 第 3.4 节
# 文档docs/01-06-openwrt-haproxy.md 第 3.4 节
global
log /dev/log local0
maxconn 4096

View File

@@ -1,5 +1,5 @@
# 01-07 OpenWrt HAProxy 负载均衡 - 原生最简(无健康检查)
# 文档docs/01-07-openwrt-haproxy.md 第 2 节
# 01-06 OpenWrt HAProxy 负载均衡 - 原生最简(无健康检查)
# 文档docs/01-06-openwrt-haproxy.md 第 2 节
# 将 192.168.2.6164 按实际 K3s 节点 IP 修改
# 如需健康检查,见第 3 节对应 cfg
global

View File

@@ -1,6 +1,6 @@
# 01-07 HAProxy - 健康检查升级HTTP+TLS+ PROXY Protocol
# 01-06 HAProxy - 健康检查升级HTTP+TLS+ PROXY Protocol
# 组合k3s_http 用 option httpchkk3s_https 用 ssl-hello-chk均带 send-proxy-v2
# 文档docs/01-07-openwrt-haproxy.md 第 5 节「健康检查与 PROXY 组合」
# 文档docs/01-06-openwrt-haproxy.md 第 5 节「健康检查与 PROXY 组合」
global
log /dev/log local0
maxconn 4096

View File

@@ -1,6 +1,6 @@
# 01-07 HAProxy - 3.3 TLS 健康检查443 握手mode tcp
# 01-06 HAProxy - 3.3 TLS 健康检查443 握手mode tcp
# backend k3s_https 增加 option ssl-hello-chk
# 文档docs/01-07-openwrt-haproxy.md 第 3.3 节
# 文档docs/01-06-openwrt-haproxy.md 第 3.3 节
global
log /dev/log local0
maxconn 4096

View File

@@ -0,0 +1,9 @@
# 01-07 双控制节点 HA手工演练为主
本目录用于满足 `doc_id=01-07` 的真源目录一致性约束。
当前 `01-07` 主要是手工 runbook切换/演练类),自动验证入口为:
- `ansible/playbooks/verify/01-07.yml`(文档存在性与说明提示)
如后续将 01-07 演练步骤自动化,可在本目录新增对应清单与配置文件。

View File

@@ -0,0 +1,101 @@
# 02-05: Nginx + 控制节点 + IngressM1
# 路径 /demo-m1随机一台控制节点nodeSelector + toleration控制节点常有 NoSchedule 污点)
# ConfigMap首页 + default.conf单文件 subPath 挂载,与 M2M4 一致,便于 nginx 后续扩展)
---
apiVersion: v1 # ConfigMap 使用的 API 版本
kind: ConfigMap # 配置资源类型ConfigMap
metadata: # 对该 ConfigMap 的标识信息
name: nginx-m1-html # ConfigMap 名称
namespace: default # 命名空间
data: # ConfigMap 数据键值区
index.html: | # HTML 内容:会挂载到 nginx 的网页目录
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>M1</title></head>
<body><h1>M1</h1><p>控制节点 + Ingress</p><p><strong>Backend: M1</strong></p></body></html>
default.conf: | # nginx 配置:通过 subPath 单文件挂载到 conf.d/default.conf
server { listen 80 default_server; server_name _; root /usr/share/nginx/html; index index.html; location / { add_header X-Backend "M1"; try_files $uri $uri/ /index.html; } }
---
apiVersion: apps/v1 # Deployment 使用的 API 版本
kind: Deployment # 工作负载Deployment
metadata: # Deployment 标识信息
name: nginx-m1 # Deployment 名称
namespace: default # 部署命名空间
labels: # 额外标签(用于检索/筛选)
app: nginx-m1 # 应用标签
matrix: "02-05-m1" # 矩阵编号标签(用于你后续调试/统计)
spec: # Deployment 期望状态
replicas: 1 # 副本数:本例为 1便于对应路径验证
selector: # Deployment 用于选择 Pod 的条件
matchLabels: # 标签匹配集合(用于选中模板 Pod
app: nginx-m1 # 必须与 template.metadata.labels 对上
template: # Pod 模板
metadata: # Pod 的元信息
labels: # Pod 标签
app: nginx-m1 # Pod 标签
spec: # Pod 规范
nodeSelector: # 节点选择:固定跑在 control-plane 上
node-role.kubernetes.io/control-plane: "" # 选择带 control-plane 角色标签的节点
tolerations: # 容忍污点:让 Pod 能调度到 control-plane
- key: node-role.kubernetes.io/control-plane # 污点 key
operator: Exists # 存在即匹配
effect: NoSchedule # 匹配 NoSchedule 污点效果
volumes: # Pod 内卷定义
- name: html # 卷名:给 volumeMounts 引用
configMap: # 卷来源ConfigMap
name: nginx-m1-html # 引用的 ConfigMap 名称
containers: # 容器列表
- name: nginx # 容器名
image: nginx:alpine # nginx 镜像
ports: # 容器端口列表
- containerPort: 80 # nginx HTTP 端口
volumeMounts: # 容器内挂载点列表
- name: html # 对应 volumes[].name
mountPath: /usr/share/nginx/html/index.html # 挂载到网页文件路径
subPath: index.html # 从 ConfigMap 里选取单个 key
readOnly: true # 只读挂载(配置文件更安全)
- name: html # 第二处也使用同一个卷
mountPath: /etc/nginx/conf.d/default.conf # nginx 配置文件路径
subPath: default.conf # 从 ConfigMap 里选取对应 key
readOnly: true # 只读挂载
---
apiVersion: v1 # Service 使用的 API 版本
kind: Service # 网络抽象:把 Pod 暴露成稳定访问入口
metadata: # Service 标识
name: nginx-m1 # Service 名称
namespace: default # Service 所在命名空间
spec: # Service 期望状态
selector: # Service 按标签选择后端 Pod
app: nginx-m1 # 选择 nginx-m1 Pod
ports: # Service 端口映射
- port: 80 # Service 端口
targetPort: 80 # 转发到 Pod 的端口
---
apiVersion: traefik.io/v1alpha1 # Traefik Middleware 使用的 API 版本
kind: Middleware # 路由中间件stripPrefix
metadata: # Middleware 标识
name: stripprefix-m1 # Middleware 名称
namespace: default # 命名空间
spec: # Middleware 配置
stripPrefix: # 去掉前缀
prefixes: # 要剔除的前缀列表
- /demo-m1 # 本矩阵的路径前缀
---
apiVersion: networking.k8s.io/v1 # Ingress 使用的 API 版本
kind: Ingress # 入口资源:把路径转发到 Service
metadata: # Ingress 标识
name: nginx-m1 # Ingress 名称
namespace: default # 命名空间
annotations: # Ingress 注解Traefik 用来绑定中间件
traefik.ingress.kubernetes.io/router.middlewares: default-stripprefix-m1@kubernetescrd # 绑定 stripprefix-m1
spec: # Ingress 规则
rules: # 规则列表
- http: # HTTP 规则
paths: # 路径匹配列表
- path: /demo-m1 # 匹配路径
pathType: Prefix # 前缀匹配类型
backend: # 后端目标
service: # 后端 Service
name: nginx-m1 # Service 名
port: # Service 端口
number: 80 # 端口号

View File

@@ -0,0 +1,6 @@
# 02-01nginx 分课)
本目录 YAML 与 `ansible/files/02-05/` 中对应课节清单为**同构副本**,专供本 `doc_id` 解耦学习与手工复制。
- **手动**:将清单拷到目标机路径,按文档改字段后执行 `kubectl` / bash不必使用 verify
- **自动**`./ansible/bin/verify.sh run 02-01`

View File

@@ -0,0 +1,95 @@
# 03-02: Nginx + 控制节点 + IngressRouteM2
# 路径 /demo-m2指定一台控制节点按实际 FQDN 修改 kubernetes.io/hostname
# ConfigMap首页 + default.confX-Backend: M2 便于区分
---
apiVersion: v1 # ConfigMap 使用的 API 版本
kind: ConfigMap # 配置资源类型ConfigMap
metadata: # ConfigMap 标识信息
name: nginx-m2-html # ConfigMap 名称
namespace: default # 命名空间
data: # ConfigMap 数据区
index.html: | # HTML 内容:会挂载到 nginx 的网页目录
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>M2</title></head>
<body><h1>M2</h1><p>控制节点 + IngressRoute</p></body></html>
default.conf: | # nginx 配置:通过 subPath 单文件挂载到 conf.d/default.conf
server { listen 80; server_name localhost; root /usr/share/nginx/html; index index.html; location / { add_header X-Backend "M2"; try_files $uri $uri/ /index.html; } }
---
apiVersion: apps/v1 # Deployment 使用的 API 版本
kind: Deployment # 工作负载Deployment
metadata: # Deployment 标识信息
name: nginx-m2 # Deployment 名称
namespace: default # 部署命名空间
labels: # 标签集合
app: nginx-m2 # 应用标签
matrix: "02-05-m2" # 矩阵编号标签
spec: # Deployment 期望状态
replicas: 1 # 副本数:单副本便于验证
selector: # Deployment 选择 Pod
matchLabels: # 标签匹配集合(用于选中模板 Pod
app: nginx-m2 # 必须与 template.metadata.labels 对上
template: # Pod 模板
metadata: # Pod 元信息
labels: # Pod 标签
app: nginx-m2 # Pod 标签
spec: # Pod 规范
nodeSelector: # 固定调度节点(按实际修改)
kubernetes.io/hostname: ylc61 # 目标节点主机名
volumes: # 卷定义
- name: html # 卷名
configMap: # 卷来源为 ConfigMap
name: nginx-m2-html # 引用的 ConfigMap 名称
containers: # 容器列表
- name: nginx # 容器名
image: nginx:alpine # nginx 镜像
ports: # 容器端口声明
- containerPort: 80 # nginx 监听端口
volumeMounts: # 容器内挂载点
- name: html # 对应 volumes[].name
mountPath: /usr/share/nginx/html/index.html # 挂到网页文件
subPath: index.html # 使用 ConfigMap 的 index.html key
readOnly: true # 配置只读挂载
- name: html # 第二处配置仍复用该卷
mountPath: /etc/nginx/conf.d/default.conf # 挂到 nginx 配置文件
subPath: default.conf # 使用 ConfigMap 的 default.conf key
readOnly: true # 只读挂载
---
apiVersion: v1 # Service 使用的 API 版本
kind: Service # 网络抽象:为 Pod 提供稳定访问地址
metadata: # Service 标识
name: nginx-m2 # Service 名称
namespace: default # 命名空间
spec: # Service 期望状态
selector: # 通过标签选择后端 Pod
app: nginx-m2 # 选择 app 标签为 nginx-m2 的 Pod
ports: # Service 端口映射
- port: 80 # Service 暴露端口
targetPort: 80 # 转发到 Pod 容器端口
---
apiVersion: traefik.io/v1alpha1 # Traefik Middleware 使用的 API 版本
kind: Middleware # 中间件类型stripPrefix
metadata: # Middleware 标识
name: stripprefix-m2 # Middleware 名称
namespace: default # 命名空间
spec: # 中间件配置
stripPrefix: # 去掉路径前缀
prefixes: # 需要剔除的前缀列表
- /demo-m2 # 本矩阵的路径前缀
---
apiVersion: traefik.io/v1alpha1 # IngressRoute 的 API 版本
kind: IngressRoute # 路由资源类型
metadata: # IngressRoute 标识
name: nginx-m2 # 路由名称
namespace: default # 命名空间
spec: # 路由规则
entryPoints: # Traefik 入口点列表
- web # 使用 web entrypoint
routes: # 路由列表
- match: PathPrefix(`/demo-m2`) # 匹配 /demo-m2 前缀
kind: Rule # 规则类型Rule
middlewares: # 绑定中间件(去前缀)
- name: stripprefix-m2 # 使用 stripprefix-m2
services: # 匹配后转发的服务
- name: nginx-m2 # 后端 Service 名称
port: 80 # 后端 Service 端口

View File

@@ -0,0 +1,6 @@
# 02-02nginx 分课)
本目录 YAML 与 `ansible/files/02-05/` 中对应课节清单为**同构副本**,专供本 `doc_id` 解耦学习与手工复制。
- **手动**:将清单拷到目标机路径,按文档改字段后执行 `kubectl` / bash不必使用 verify
- **自动**`./ansible/bin/verify.sh run 02-02`

View File

@@ -0,0 +1,97 @@
# 03-03: Nginx + 工作节点 + IngressM3
# 路径 /demo-m3随机一台工作节点nodeSelector: node-role.kubernetes.io/worker
# ConfigMap首页 + default.confX-Backend: M3 便于区分
---
apiVersion: v1 # ConfigMap 使用的 API 版本
kind: ConfigMap # 配置资源类型ConfigMap
metadata: # 对该 ConfigMap 的标识信息
name: nginx-m3-html # ConfigMap 名称
namespace: default # 命名空间
data: # ConfigMap 数据键值区
index.html: | # HTML 内容:会挂载到 nginx 网页目录(内部内容行不改动)
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>M3</title></head>
<body><h1>M3</h1><p>工作节点 + Ingress</p></body></html>
default.conf: | # nginx 配置:通过 subPath 单文件挂载到 conf.d/default.conf内部内容行不改动
server { listen 80; server_name localhost; root /usr/share/nginx/html; index index.html; location / { add_header X-Backend "M3"; try_files $uri $uri/ /index.html; } }
---
apiVersion: apps/v1 # Deployment 使用的 API 版本
kind: Deployment # 工作负载Deployment
metadata: # Deployment 标识信息
name: nginx-m3 # Deployment 名称
namespace: default # 部署命名空间
labels: # 额外标签(用于筛选/统计)
app: nginx-m3 # 应用标签
matrix: "02-05-m3" # 矩阵编号标签
spec: # Deployment 期望状态
replicas: 1 # 副本数:这里为 1
selector: # Deployment 用于选择 Pod 的条件
matchLabels: # 标签匹配集合(用于选中模板 Pod
app: nginx-m3 # 必须与 template.metadata.labels 对上
template: # Pod 模板
metadata: # Pod 元信息
labels: # Pod 标签
app: nginx-m3 # Pod 标签
spec: # Pod 规范
nodeSelector: # 固定跑到 worker 节点
node-role.kubernetes.io/worker: "" # worker 节点 selector
volumes: # 卷定义
- name: html # 卷名(供 volumeMounts 引用)
configMap: # 卷来源ConfigMap
name: nginx-m3-html # 引用的 ConfigMap 名称
containers: # 容器列表
- name: nginx # 容器名
image: nginx:alpine # nginx 镜像
ports: # 容器端口声明
- containerPort: 80 # nginx HTTP 端口
volumeMounts: # 容器内挂载点
- name: html # 对应 volumes[].name
mountPath: /usr/share/nginx/html/index.html # 挂到网页首页
subPath: index.html # 从 ConfigMap 取该 key
readOnly: true # 配置只读
- name: html # 第二处仍引用同一个卷
mountPath: /etc/nginx/conf.d/default.conf # 挂到 nginx 配置文件路径
subPath: default.conf # 从 ConfigMap 取该 key
readOnly: true # 配置只读
---
apiVersion: v1 # Service 使用的 API 版本
kind: Service # 网络抽象:把 Pod 暴露成稳定访问入口
metadata: # Service 标识
name: nginx-m3 # Service 名称
namespace: default # 命名空间
spec: # Service 期望状态
selector: # Service 通过标签选中后端 Pod
app: nginx-m3 # 选择 app 标签
ports: # Service 端口映射列表
- port: 80 # Service 暴露端口
targetPort: 80 # 转发到 Pod 的容器端口
---
apiVersion: traefik.io/v1alpha1 # Traefik Middleware API 版本
kind: Middleware # 中间件类型stripPrefix
metadata: # Middleware 标识
name: stripprefix-m3 # 名称
namespace: default # 命名空间
spec: # 中间件配置
stripPrefix: # 去掉指定路径前缀
prefixes: # 前缀列表
- /demo-m3 # 本矩阵路径前缀
---
apiVersion: networking.k8s.io/v1 # Ingress 使用的 API 版本
kind: Ingress # 入口资源:把路径转发到 Service
metadata: # Ingress 标识
name: nginx-m3 # Ingress 名称
namespace: default # 命名空间
annotations: # Traefik 注解:绑定中间件
traefik.ingress.kubernetes.io/router.middlewares: default-stripprefix-m3@kubernetescrd # 绑定 stripprefix-m3 中间件
spec: # Ingress 规则
rules: # 规则列表
- http: # HTTP 规则
paths: # 路径匹配列表
- path: /demo-m3 # 匹配路径
pathType: Prefix # 前缀匹配类型
backend: # 后端目标
service: # 后端是 Service
name: nginx-m3 # Service 名称
port: # 后端端口
number: 80 # 端口号

View File

@@ -0,0 +1,6 @@
# 02-03nginx 分课)
本目录 YAML 与 `ansible/files/02-05/` 中对应课节清单为**同构副本**,专供本 `doc_id` 解耦学习与手工复制。
- **手动**:将清单拷到目标机路径,按文档改字段后执行 `kubectl` / bash不必使用 verify
- **自动**`./ansible/bin/verify.sh run 02-03`

View File

@@ -0,0 +1,95 @@
# 03-04: Nginx + 工作节点 + IngressRouteM4
# 路径 /demo-m4指定一台工作节点按实际 FQDN 修改 kubernetes.io/hostname
# ConfigMap首页 + default.confX-Backend: M4 便于区分
---
apiVersion: v1 # ConfigMap 使用的 API 版本
kind: ConfigMap # 配置资源类型ConfigMap
metadata: # ConfigMap 标识信息
name: nginx-m4-html # ConfigMap 名称
namespace: default # 命名空间
data: # ConfigMap 数据区
index.html: | # HTML 内容:挂载到 nginx 网页目录(内部内容行不改动)
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>M4</title></head>
<body><h1>M4</h1><p>工作节点 + IngressRoute</p></body></html>
default.conf: | # nginx 配置:通过 subPath 挂载到 conf.d/default.conf内部内容行不改动
server { listen 80; server_name localhost; root /usr/share/nginx/html; index index.html; location / { add_header X-Backend "M4"; try_files $uri $uri/ /index.html; } }
---
apiVersion: apps/v1 # Deployment 使用的 API 版本
kind: Deployment # 工作负载Deployment
metadata: # Deployment 标识信息
name: nginx-m4 # Deployment 名称
namespace: default # 部署命名空间
labels: # 应用标签/矩阵标签
app: nginx-m4 # 应用标签
matrix: "02-05-m4" # 矩阵编号
spec: # Deployment 期望状态
replicas: 1 # 副本数
selector: # Deployment 选择器
matchLabels: # 标签匹配集合(用于选中模板 Pod
app: nginx-m4 # 必须与 template.metadata.labels 对上
template: # Pod 模板
metadata: # Pod 元信息
labels: # Pod 标签
app: nginx-m4 # Pod 标签
spec: # Pod 规范
nodeSelector: # 固定运行的工作节点
kubernetes.io/hostname: ylc64 # worker 节点主机名
volumes: # 卷定义
- name: html # 卷名
configMap: # 卷来源
name: nginx-m4-html # 引用的 ConfigMap 名称
containers: # 容器列表
- name: nginx # 容器名
image: nginx:alpine # nginx 镜像
ports: # 容器端口
- containerPort: 80 # HTTP 端口
volumeMounts: # 容器内挂载
- name: html # 引用 volumes[].name
mountPath: /usr/share/nginx/html/index.html # 挂到首页文件
subPath: index.html # 取 ConfigMap 的 index.html key
readOnly: true # 只读
- name: html # 仍复用同一个卷
mountPath: /etc/nginx/conf.d/default.conf # 挂到 nginx 配置文件
subPath: default.conf # 取 ConfigMap 的 default.conf key
readOnly: true # 只读
---
apiVersion: v1 # Service 使用的 API 版本
kind: Service # 网络抽象:把 Pod 暴露为稳定入口
metadata: # Service 标识
name: nginx-m4 # Service 名称
namespace: default # 命名空间
spec: # Service 期望状态
selector: # Service 选择器
app: nginx-m4 # 选中后端 Pod
ports: # 端口映射列表
- port: 80 # Service 端口
targetPort: 80 # 转发到 Pod 容器端口
---
apiVersion: traefik.io/v1alpha1 # Traefik Middleware API 版本
kind: Middleware # 中间件stripPrefix
metadata: # Middleware 标识
name: stripprefix-m4 # 名称
namespace: default # 命名空间
spec: # 中间件配置
stripPrefix: # 去除路径前缀
prefixes: # 前缀列表
- /demo-m4 # 本矩阵路径前缀
---
apiVersion: traefik.io/v1alpha1 # IngressRoute API 版本
kind: IngressRoute # Traefik 路由 CRD
metadata: # IngressRoute 标识
name: nginx-m4 # 路由名称
namespace: default # 命名空间
spec: # IngressRoute 规则
entryPoints: # 入口点列表
- web # webHTTP
routes: # 路由列表
- match: PathPrefix(`/demo-m4`) # 匹配 /demo-m4 前缀
kind: Rule # 规则类型
middlewares: # 绑定中间件
- name: stripprefix-m4 # 需要去前缀
services: # 后端服务列表
- name: nginx-m4 # Service 名称
port: 80 # Service 端口

View File

@@ -0,0 +1,6 @@
# 02-04nginx 分课)
本目录 YAML 与 `ansible/files/02-05/` 中对应课节清单为**同构副本**,专供本 `doc_id` 解耦学习与手工复制。
- **手动**:将清单拷到目标机路径,按文档改字段后执行 `kubectl` / bash不必使用 verify
- **自动**`./ansible/bin/verify.sh run 02-04`

View File

@@ -39,3 +39,8 @@ spec: # chart 注入配置的具体内容
nodeSelector: # 把 Traefik Pod 固定到指定节点(配合 RWO 本地存储更安全)
kubernetes.io/hostname: ylc61 # 固定节点主机名(按你的实际节点修改)
# ping 绑定 websecure 时chart 默认对 8080 做 HTTP /ping须与 03-03 一致改为 HTTPS:8443
deployment:
healthchecksPort: 8443
healthchecksScheme: HTTPS

View File

@@ -9,13 +9,17 @@ metadata:
namespace: kube-system
spec:
valuesContent: |-
# chart 39.xexpose 须为表,布尔会与默认 values 合并冲突并导致 helm upgrade 模板失败
ports:
web:
expose: true
expose:
default: true
websecure:
expose: true
expose:
default: true
traefik:
expose: true
expose:
default: true
additionalArguments:
# Dashboard
@@ -48,13 +52,20 @@ spec:
nodeSelector:
kubernetes.io/hostname: ylc61
# persistence将 /data 持久化local-path PVC保证 acme.json 落盘
# ping 绑定 websecure 时chart 默认仍对 traefik(8080) 做 HTTP /ping → 404与 chart 39 对齐探针
deployment:
healthchecksPort: 8443
healthchecksScheme: HTTPS
# persistence将 /data 持久化,保证 acme.json 落盘
# 显式 local-path避免集群默认 StorageClass 为 longhorn 等未就绪时 Pod 长期 Pending
persistence:
enabled: true
name: data
accessMode: ReadWriteOnce
size: 128Mi
path: /data
storageClass: local-path
---
apiVersion: traefik.io/v1alpha1

View File

@@ -1,38 +1,31 @@
# docs/03-04-k3s-cloudflare-tunnel-配置接入.md — 替换 TUNNEL_TOKEN 后应用
apiVersion: v1 # Secret 使用的 Kubernetes API 版本
kind: Secret # 资源类型Secret用于保存 Cloudflare Tunnel token
metadata: # 元信息(名称/命名空间等)
name: cloudflared-credentials # Secret 名称Deployment 中会引用)
namespace: kube-system # Secret 所在命名空间
type: Opaque # Secret 类型(普通自定义键值)
stringData: # 以字符串方式提供 Secret 数据(便于直接写明文)
TUNNEL_TOKEN: "<YOUR_TUNNEL_TOKEN>" # Cloudflare Tunnel Token用你真实的 token 替换)
# docs/03-04-k3s-cloudflare-tunnel-配置接入.md
# Secret `cloudflared-credentials`key=TUNNEL_TOKEN由 verify playbook / 手工 kubectl create secret 创建,勿与此 Deployment 同 apply避免覆盖 token。
# 参考ansible/playbooks/verify/03-04.yml → ensure-cloudflared-tunnel-secret
---
apiVersion: apps/v1 # Deployment 使用的 API 版本
kind: Deployment # 工作负载Deployment管理 Pod 副本)
metadata: # Deployment 元信息
name: cloudflared # Deployment 名称
namespace: kube-system # 部署到的命名空间
spec: # Deployment 期望状态
replicas: 1 # 副本数Tunnel 通常只跑一个副本即可)
selector: # Deployment 选择器:匹配 template 的 Pod
matchLabels: # 必须与 template.metadata.labels 对齐
app: cloudflared # 应用标签
template: # Pod 模板
metadata: # Pod 元信息
labels: # Pod 标签
app: cloudflared # 与 selector.matchLabels 相同
spec: # Pod 规范
containers: # 容器列表
- name: cloudflared # 容器名
image: cloudflare/cloudflared:latest # cloudflared 镜像
args: # 容器启动参数
- tunnel # 命令子参数tunnel
- run # 命令子参数run
env: # 环境变量
- name: TUNNEL_TOKEN # 容器内使用的环境变量名
valueFrom: # 从某个来源取值
secretKeyRef: # 从 Secret 的 key 取值
name: cloudflared-credentials # Secret 名称
key: TUNNEL_TOKEN # Secret 中的 key
apiVersion: apps/v1
kind: Deployment
metadata:
name: cloudflared
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
app: cloudflared
template:
metadata:
labels:
app: cloudflared
spec:
containers:
- name: cloudflared
image: cloudflare/cloudflared:latest
args:
- tunnel
- run
env:
- name: TUNNEL_TOKEN
valueFrom:
secretKeyRef:
name: cloudflared-credentials
key: TUNNEL_TOKEN

View File

@@ -4,6 +4,7 @@ kind: PersistentVolume # 资源类型:持久卷(集群级)
metadata: # PV 元信息
name: nfs-pv-demo # PV 名称
spec: # PV 规格
storageClassName: "" # 显式禁用默认 StorageClass供静态绑定 PVC 使用
capacity: # 容量声明
storage: 20Gi # PV 总容量
accessModes: # 访问模式列表
@@ -19,6 +20,7 @@ metadata: # PVC 元信息
name: nfs-pvc-demo # PVC 名称
namespace: default # PVC 所在命名空间
spec: # PVC 规格
storageClassName: "" # 与 PV 对齐,避免被默认 longhorn class 注入导致绑定失败
accessModes: # 访问模式要求
- ReadWriteMany # 申请 RWX 访问模式
resources: # 资源请求

View File

@@ -0,0 +1,27 @@
# docs/03-06-k3s-使用nfs存储.md — 自动化验收用:挂载 nfs-pvc-demo 并写文件OC3 证据)
# 与 nfs-pv-pvc-demo.yaml 配合;手动学习 PV/PVC 时可不应用本文件。
apiVersion: batch/v1
kind: Job
metadata:
name: nfs-pvc-verify-demo
namespace: default
spec:
backoffLimit: 3
template:
spec:
restartPolicy: Never
containers:
- name: verify-write
image: busybox:1.36
command:
- /bin/sh
- -c
- echo "ok-$(date +%s)" > /data/.verify-nfs && sync && test -f /data/.verify-nfs
volumeMounts:
- name: data
mountPath: /data
readOnly: false
volumes:
- name: data
persistentVolumeClaim:
claimName: nfs-pvc-demo

View File

@@ -0,0 +1,9 @@
# 03-08K3s HA 配置与切换)
| 文件 | 说明 |
|------|------|
| `k3s-server-ha-env.example.sh` | 外部 datastore、`tls-san`、第二节点 `K3S_URL`/`TOKEN` 等环境变量示例(**非** Kubernetes 清单) |
- **手动**将示例中的连接串、LB IP、token 替换为真实值;与 systemd/k3s 安装参数对照 [docs/03-08-k3s-ha-集群配置与切换.md](../../../docs/03-08-k3s-ha-集群配置与切换.md)。
- **自动**`./ansible/bin/verify.sh run 03-08`noop + 基线HA 步骤仍以文档与手工为准)。
- 本篇**不提供**可 `kubectl apply` 的 HA 安装真源(控制平面由 k3s 与 datastore 决定)。

View File

@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# k3s 多 server + 外部 datastore 参数备忘(示例,勿直接 source 到生产)
# 完整步骤见docs/03-08-k3s-ha-集群配置与切换.md
# 真源目录ansible/files/03-08/
# --- 首个 server示例 IP 请替换)---
# export K3S_DATASTORE_ENDPOINT='postgres://k3s:CHANGE_ME@192.168.2.50:5432/k3s?sslmode=disable'
# sudo k3s server --datastore-endpoint="$K3S_DATASTORE_ENDPOINT" --tls-san 192.168.2.60
# --- 第二个 server经 LB 加入token 与控制端一致)---
# export K3S_URL='https://192.168.2.60:6443'
# export K3S_TOKEN='<SAME_TOKEN_AS_SERVER1>'
# export K3S_DATASTORE_ENDPOINT='postgres://k3s:CHANGE_ME@192.168.2.50:5432/k3s?sslmode=disable'
# sudo k3s server --server "$K3S_URL" --token "$K3S_TOKEN" \
# --datastore-endpoint="$K3S_DATASTORE_ENDPOINT" --tls-san 192.168.2.60
echo "[INFO] 编辑本文件中的占位符后,将命令复制到节点上执行;或写入 systemd ExecStart。"

View File

@@ -0,0 +1,9 @@
# 03-09GitOps 框架)
| 文件 | 说明 |
|------|------|
| `argocd-namespace.example.yaml` | 仅创建 `argocd` 命名空间的极简示例(正式安装请用官方 `install.yaml` 或 Helm |
- **手动**:集群声明性配置的**主真源**建议在独立 GitOps 仓库(见 [docs/03-09-k3s-gitops-集群配置管理.md](../../../docs/03-09-k3s-gitops-集群配置管理.md));本目录只放与本仓库文档对齐的**示意**文件。
- **自动**`./ansible/bin/verify.sh run 03-09`noop + 基线)。
- 同一套 YAML 路径既可供你 `kubectl apply -f` 试跑,也与自动化验收引用同一目录,避免文档与仓库脱节。

View File

@@ -0,0 +1,8 @@
# 极简示例:为后续 Argo CD 安装预留命名空间
# 生产请改用官方清单: https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
apiVersion: v1
kind: Namespace
metadata:
name: argocd
labels:
app.kubernetes.io/part-of: argocd

View File

@@ -0,0 +1,59 @@
# 对应文档docs/04-02-nodejs-镜像与运行命令.md
# 累积04-01 + 固定镜像 tag、imagePullPolicy、command/args
apiVersion: apps/v1 # Deployment API 版本
kind: Deployment # 工作负载Deployment
metadata: # Deployment 元信息
name: nodejs-demo # Deployment 名称
namespace: default # 命名空间
spec: # Deployment 规格
replicas: 1 # 副本数
selector: # Deployment 选择器
matchLabels: # 标签匹配集合
app: nodejs-demo # 匹配 app=nodejs-demo 的 Pod
template: # Pod 模板
metadata: # Pod 元信息
labels: # Pod 标签
app: nodejs-demo # 与 selector.matchLabels 对齐
spec: # Pod 规格
containers: # 容器列表
- name: nodejs-demo # 容器名
image: node:18.20-alpine # 固定 tag 的 Node.js 镜像
imagePullPolicy: IfNotPresent # 拉取策略:本地有则不重复拉取
command: ["node"] # 主命令
args: # 命令参数
- "-e" # 执行内联脚本
- "require('http').createServer((req,res)=>res.end('Hello from pinned image')).listen(3000)" # Node.js 内联服务逻辑
ports: # 容器端口
- containerPort: 3000 # 应用监听端口
---
apiVersion: v1 # Service API 版本
kind: Service # Service 资源
metadata: # Service 元信息
name: nodejs-demo # Service 名称
namespace: default # 命名空间
spec: # Service 规格
selector: # 选择后端 Pod
app: nodejs-demo # 选中 app=nodejs-demo
ports: # 端口映射
- port: 80 # Service 暴露端口
targetPort: 3000 # 转发到容器端口
---
apiVersion: networking.k8s.io/v1 # Ingress API 版本
kind: Ingress # Ingress 资源
metadata: # Ingress 元信息
name: nodejs-demo # Ingress 名称
namespace: default # 命名空间
annotations: # Traefik 注解
traefik.ingress.kubernetes.io/router.entrypoints: web # 使用 web(HTTP) 入口
spec: # Ingress 规则
rules: # 规则列表
- http: # HTTP 路由
paths: # 路径列表
- path: /node # 匹配路径前缀
pathType: Prefix # 前缀匹配
backend: # 后端目标
service: # 后端 Service
name: nodejs-demo # Service 名称
port: # Service 端口
number: 80 # 端口号

View File

@@ -0,0 +1,6 @@
# 04-02nodejs 分课)
本目录 `04-02-nodejs-demo.yaml``ansible/files/04-01/` 同名文件复制,与总集目录内文件**同构**,专供本课独立阅读;改本课清单时以本目录为准即可最小化影响其他篇。
- **手动**`kubectl apply -f ansible/files/04-02/04-02-nodejs-demo.yaml`(按需改字段)。
- **自动**`./ansible/bin/verify.sh run 04-02`

View File

@@ -0,0 +1,76 @@
# 对应文档docs/04-03-nodejs-环境变量与配置注入.md
# 累积04-02 + ConfigMap + 通过 env 注入 APP_MSG镜像仍用 18.20-alpine 与 04-02 一致)
apiVersion: v1 # ConfigMap API 版本
kind: ConfigMap # 配置资源ConfigMap
metadata: # ConfigMap 元信息
name: nodejs-demo-config # ConfigMap 名称
namespace: default # 命名空间
data: # 配置键值
APP_MSG: "Hello from ConfigMap" # 注入给应用的消息内容
---
apiVersion: apps/v1 # Deployment API 版本
kind: Deployment # 工作负载Deployment
metadata: # Deployment 元信息
name: nodejs-demo # Deployment 名称
namespace: default # 命名空间
spec: # Deployment 规格
replicas: 1 # 副本数
selector: # Deployment 选择器
matchLabels: # 标签匹配集合
app: nodejs-demo # 匹配 app=nodejs-demo 的 Pod
template: # Pod 模板
metadata: # Pod 元信息
labels: # Pod 标签
app: nodejs-demo # 与 selector.matchLabels 对齐
spec: # Pod 规格
containers: # 容器列表
- name: nodejs-demo # 容器名
image: node:18.20-alpine # Node.js 镜像
imagePullPolicy: IfNotPresent # 拉取策略
env: # 环境变量注入
- name: APP_MSG # 环境变量名
valueFrom: # 从资源引用取值
configMapKeyRef: # 从 ConfigMap key 读取
name: nodejs-demo-config # ConfigMap 名称
key: APP_MSG # ConfigMap 键名
command: # 启动命令
- node # 运行 node
- "-e" # 执行内联脚本
- | # 多行 JS 脚本(内部内容不改动)
const http=require('http');
const msg=process.env.APP_MSG||'no env';
http.createServer((q,s)=>s.end(msg)).listen(3000);
ports: # 容器端口
- containerPort: 3000 # 应用监听端口
---
apiVersion: v1 # Service API 版本
kind: Service # Service 资源
metadata: # Service 元信息
name: nodejs-demo # Service 名称
namespace: default # 命名空间
spec: # Service 规格
selector: # 选择后端 Pod
app: nodejs-demo # 选中 app=nodejs-demo
ports: # 端口映射
- port: 80 # Service 暴露端口
targetPort: 3000 # 转发到容器端口
---
apiVersion: networking.k8s.io/v1 # Ingress API 版本
kind: Ingress # Ingress 资源
metadata: # Ingress 元信息
name: nodejs-demo # Ingress 名称
namespace: default # 命名空间
annotations: # Traefik 注解
traefik.ingress.kubernetes.io/router.entrypoints: web # 使用 web(HTTP) 入口
spec: # Ingress 规则
rules: # 规则列表
- http: # HTTP 路由
paths: # 路径列表
- path: /node # 匹配路径前缀
pathType: Prefix # 前缀匹配
backend: # 后端目标
service: # 后端 Service
name: nodejs-demo # Service 名称
port: # Service 端口
number: 80 # 端口号

View File

@@ -0,0 +1,6 @@
# 04-03nodejs 分课)
本目录 `04-03-nodejs-demo.yaml``ansible/files/04-01/` 同名文件复制,与总集目录内文件**同构**,专供本课独立阅读;改本课清单时以本目录为准即可最小化影响其他篇。
- **手动**`kubectl apply -f ansible/files/04-03/04-03-nodejs-demo.yaml`(按需改字段)。
- **自动**`./ansible/bin/verify.sh run 04-03`

View File

@@ -0,0 +1,76 @@
# 对应文档docs/04-04-nodejs-端口与Service.md
# 累积04-03 + 容器与进程改监听 8080Service targetPort 对齐
apiVersion: v1 # ConfigMap API 版本
kind: ConfigMap # 配置资源ConfigMap
metadata: # ConfigMap 元信息
name: nodejs-demo-config # ConfigMap 名称
namespace: default # 命名空间
data: # 配置键值
APP_MSG: "Hello from ConfigMap" # 注入给应用的消息内容
---
apiVersion: apps/v1 # Deployment API 版本
kind: Deployment # 工作负载Deployment
metadata: # Deployment 元信息
name: nodejs-demo # Deployment 名称
namespace: default # 命名空间
spec: # Deployment 规格
replicas: 1 # 副本数
selector: # Deployment 选择器
matchLabels: # 标签匹配集合
app: nodejs-demo # 匹配 app=nodejs-demo 的 Pod
template: # Pod 模板
metadata: # Pod 元信息
labels: # Pod 标签
app: nodejs-demo # 与 selector.matchLabels 对齐
spec: # Pod 规格
containers: # 容器列表
- name: nodejs-demo # 容器名
image: node:18.20-alpine # Node.js 镜像
imagePullPolicy: IfNotPresent # 拉取策略
env: # 环境变量注入
- name: APP_MSG # 环境变量名
valueFrom: # 从资源引用取值
configMapKeyRef: # 从 ConfigMap key 读取
name: nodejs-demo-config # ConfigMap 名称
key: APP_MSG # ConfigMap 键名
command: # 启动命令
- node # 运行 node
- "-e" # 执行内联脚本
- | # 多行 JS 脚本(内部内容不改动)
const http=require('http');
const msg=process.env.APP_MSG||'no env';
http.createServer((q,s)=>s.end(msg)).listen(8080);
ports: # 容器端口
- containerPort: 8080 # 应用监听端口
---
apiVersion: v1 # Service API 版本
kind: Service # Service 资源
metadata: # Service 元信息
name: nodejs-demo # Service 名称
namespace: default # 命名空间
spec: # Service 规格
selector: # 选择后端 Pod
app: nodejs-demo # 选中 app=nodejs-demo
ports: # 端口映射
- port: 80 # Service 暴露端口
targetPort: 8080 # 转发到容器端口
---
apiVersion: networking.k8s.io/v1 # Ingress API 版本
kind: Ingress # Ingress 资源
metadata: # Ingress 元信息
name: nodejs-demo # Ingress 名称
namespace: default # 命名空间
annotations: # Traefik 注解
traefik.ingress.kubernetes.io/router.entrypoints: web # 使用 web(HTTP) 入口
spec: # Ingress 规则
rules: # 规则列表
- http: # HTTP 路由
paths: # 路径列表
- path: /node # 匹配路径前缀
pathType: Prefix # 前缀匹配
backend: # 后端目标
service: # 后端 Service
name: nodejs-demo # Service 名称
port: # Service 端口
number: 80 # 端口号

View File

@@ -0,0 +1,6 @@
# 04-04nodejs 分课)
本目录 `04-04-nodejs-demo.yaml``ansible/files/04-01/` 同名文件复制,与总集目录内文件**同构**,专供本课独立阅读;改本课清单时以本目录为准即可最小化影响其他篇。
- **手动**`kubectl apply -f ansible/files/04-04/04-04-nodejs-demo.yaml`(按需改字段)。
- **自动**`./ansible/bin/verify.sh run 04-04`

View File

@@ -0,0 +1,83 @@
# 对应文档docs/04-05-nodejs-资源请求与限制.md
# 累积04-04 + resources.requests/limits
apiVersion: v1 # ConfigMap API 版本
kind: ConfigMap # 配置资源ConfigMap
metadata: # ConfigMap 元信息
name: nodejs-demo-config # ConfigMap 名称
namespace: default # 命名空间
data: # 配置键值
APP_MSG: "Hello from ConfigMap" # 注入给应用的消息内容
---
apiVersion: apps/v1 # Deployment API 版本
kind: Deployment # 工作负载Deployment
metadata: # Deployment 元信息
name: nodejs-demo # Deployment 名称
namespace: default # 命名空间
spec: # Deployment 规格
replicas: 1 # 副本数
selector: # Deployment 选择器
matchLabels: # 标签匹配集合
app: nodejs-demo # 匹配 app=nodejs-demo 的 Pod
template: # Pod 模板
metadata: # Pod 元信息
labels: # Pod 标签
app: nodejs-demo # 与 selector.matchLabels 对齐
spec: # Pod 规格
containers: # 容器列表
- name: nodejs-demo # 容器名
image: node:18.20-alpine # Node.js 镜像
imagePullPolicy: IfNotPresent # 拉取策略
env: # 环境变量注入
- name: APP_MSG # 环境变量名
valueFrom: # 从资源引用取值
configMapKeyRef: # 从 ConfigMap key 读取
name: nodejs-demo-config # ConfigMap 名称
key: APP_MSG # ConfigMap 键名
command: # 启动命令
- node # 运行 node
- "-e" # 执行内联脚本
- | # 多行 JS 脚本(内部内容不改动)
const http=require('http');
const msg=process.env.APP_MSG||'no env';
http.createServer((q,s)=>s.end(msg)).listen(8080);
ports: # 容器端口
- containerPort: 8080 # 应用监听端口
resources: # 资源请求与限制
requests: # 最小资源请求
cpu: "50m" # 请求 CPU
memory: "64Mi" # 请求内存
limits: # 资源上限
cpu: "500m" # CPU 限制
memory: "256Mi" # 内存限制
---
apiVersion: v1 # Service API 版本
kind: Service # Service 资源
metadata: # Service 元信息
name: nodejs-demo # Service 名称
namespace: default # 命名空间
spec: # Service 规格
selector: # 选择后端 Pod
app: nodejs-demo # 选中 app=nodejs-demo
ports: # 端口映射
- port: 80 # Service 暴露端口
targetPort: 8080 # 转发到容器端口
---
apiVersion: networking.k8s.io/v1 # Ingress API 版本
kind: Ingress # Ingress 资源
metadata: # Ingress 元信息
name: nodejs-demo # Ingress 名称
namespace: default # 命名空间
annotations: # Traefik 注解
traefik.ingress.kubernetes.io/router.entrypoints: web # 使用 web(HTTP) 入口
spec: # Ingress 规则
rules: # 规则列表
- http: # HTTP 路由
paths: # 路径列表
- path: /node # 匹配路径前缀
pathType: Prefix # 前缀匹配
backend: # 后端目标
service: # 后端 Service
name: nodejs-demo # Service 名称
port: # Service 端口
number: 80 # 端口号

View File

@@ -0,0 +1,6 @@
# 04-05nodejs 分课)
本目录 `04-05-nodejs-demo.yaml``ansible/files/04-01/` 同名文件复制,与总集目录内文件**同构**,专供本课独立阅读;改本课清单时以本目录为准即可最小化影响其他篇。
- **手动**`kubectl apply -f ansible/files/04-05/04-05-nodejs-demo.yaml`(按需改字段)。
- **自动**`./ansible/bin/verify.sh run 04-05`

View File

@@ -0,0 +1,95 @@
# 对应文档docs/04-06-nodejs-探针与健康检查.md
# 累积04-05 + livenessProbe/readinessProbe端口 8080路径 /
apiVersion: v1 # ConfigMap API 版本
kind: ConfigMap # 配置资源ConfigMap
metadata: # ConfigMap 元信息
name: nodejs-demo-config # ConfigMap 名称
namespace: default # 命名空间
data: # 配置键值
APP_MSG: "Hello from ConfigMap" # 注入给应用的消息内容
---
apiVersion: apps/v1 # Deployment API 版本
kind: Deployment # 工作负载Deployment
metadata: # Deployment 元信息
name: nodejs-demo # Deployment 名称
namespace: default # 命名空间
spec: # Deployment 规格
replicas: 1 # 副本数
selector: # Deployment 选择器
matchLabels: # 标签匹配集合
app: nodejs-demo # 匹配 app=nodejs-demo 的 Pod
template: # Pod 模板
metadata: # Pod 元信息
labels: # Pod 标签
app: nodejs-demo # 与 selector.matchLabels 对齐
spec: # Pod 规格
containers: # 容器列表
- name: nodejs-demo # 容器名
image: node:18.20-alpine # Node.js 镜像
imagePullPolicy: IfNotPresent # 拉取策略
env: # 环境变量注入
- name: APP_MSG # 环境变量名
valueFrom: # 从资源引用取值
configMapKeyRef: # 从 ConfigMap key 读取
name: nodejs-demo-config # ConfigMap 名称
key: APP_MSG # ConfigMap 键名
command: # 启动命令
- node # 运行 node
- "-e" # 执行内联脚本
- | # 多行 JS 脚本(内部内容不改动)
const http=require('http');
const msg=process.env.APP_MSG||'no env';
http.createServer((q,s)=>s.end(msg)).listen(8080);
ports: # 容器端口
- containerPort: 8080 # 应用监听端口
resources: # 资源请求与限制
requests: # 最小资源请求
cpu: "50m" # 请求 CPU
memory: "64Mi" # 请求内存
limits: # 资源上限
cpu: "500m" # CPU 限制
memory: "256Mi" # 内存限制
livenessProbe: # 存活探针(判断容器是否需要重启)
httpGet: # 通过 HTTP 探测
path: / # 探测路径
port: 8080 # 探测端口
initialDelaySeconds: 3 # 启动后首次探测延迟
periodSeconds: 10 # 探测周期
readinessProbe: # 就绪探针(判断是否接收流量)
httpGet: # 通过 HTTP 探测
path: / # 探测路径
port: 8080 # 探测端口
initialDelaySeconds: 2 # 启动后首次探测延迟
periodSeconds: 5 # 探测周期
---
apiVersion: v1 # Service API 版本
kind: Service # Service 资源
metadata: # Service 元信息
name: nodejs-demo # Service 名称
namespace: default # 命名空间
spec: # Service 规格
selector: # 选择后端 Pod
app: nodejs-demo # 选中 app=nodejs-demo
ports: # 端口映射
- port: 80 # Service 暴露端口
targetPort: 8080 # 转发到容器端口
---
apiVersion: networking.k8s.io/v1 # Ingress API 版本
kind: Ingress # Ingress 资源
metadata: # Ingress 元信息
name: nodejs-demo # Ingress 名称
namespace: default # 命名空间
annotations: # Traefik 注解
traefik.ingress.kubernetes.io/router.entrypoints: web # 使用 web(HTTP) 入口
spec: # Ingress 规则
rules: # 规则列表
- http: # HTTP 路由
paths: # 路径列表
- path: /node # 匹配路径前缀
pathType: Prefix # 前缀匹配
backend: # 后端目标
service: # 后端 Service
name: nodejs-demo # Service 名称
port: # Service 端口
number: 80 # 端口号

View File

@@ -0,0 +1,6 @@
# 04-06nodejs 分课)
本目录 `04-06-nodejs-demo.yaml``ansible/files/04-01/` 同名文件复制,与总集目录内文件**同构**,专供本课独立阅读;改本课清单时以本目录为准即可最小化影响其他篇。
- **手动**`kubectl apply -f ansible/files/04-06/04-06-nodejs-demo.yaml`(按需改字段)。
- **自动**`./ansible/bin/verify.sh run 04-06`

View File

@@ -0,0 +1,97 @@
# 对应文档docs/04-07-nodejs-调度与亲和.md
# 累积04-06 + nodeSelector默认 ylc62请改为本集群节点短主机名
apiVersion: v1 # ConfigMap API 版本
kind: ConfigMap # 配置资源ConfigMap
metadata: # ConfigMap 元信息
name: nodejs-demo-config # ConfigMap 名称
namespace: default # 命名空间
data: # 配置键值
APP_MSG: "Hello from ConfigMap" # 注入给应用的消息内容
---
apiVersion: apps/v1 # Deployment API 版本
kind: Deployment # 工作负载Deployment
metadata: # Deployment 元信息
name: nodejs-demo # Deployment 名称
namespace: default # 命名空间
spec: # Deployment 规格
replicas: 1 # 副本数
selector: # Deployment 选择器
matchLabels: # 标签匹配集合
app: nodejs-demo # 匹配 app=nodejs-demo 的 Pod
template: # Pod 模板
metadata: # Pod 元信息
labels: # Pod 标签
app: nodejs-demo # 与 selector.matchLabels 对齐
spec: # Pod 规格
nodeSelector: # 调度到指定节点
kubernetes.io/hostname: ylc62 # 节点主机名(按实际修改)
containers: # 容器列表
- name: nodejs-demo # 容器名
image: node:18.20-alpine # Node.js 镜像
imagePullPolicy: IfNotPresent # 拉取策略
env: # 环境变量注入
- name: APP_MSG # 环境变量名
valueFrom: # 从资源引用取值
configMapKeyRef: # 从 ConfigMap key 读取
name: nodejs-demo-config # ConfigMap 名称
key: APP_MSG # ConfigMap 键名
command: # 启动命令
- node # 运行 node
- "-e" # 执行内联脚本
- | # 多行 JS 脚本(内部内容不改动)
const http=require('http');
const msg=process.env.APP_MSG||'no env';
http.createServer((q,s)=>s.end(msg)).listen(8080);
ports: # 容器端口
- containerPort: 8080 # 应用监听端口
resources: # 资源请求与限制
requests: # 最小资源请求
cpu: "50m" # 请求 CPU
memory: "64Mi" # 请求内存
limits: # 资源上限
cpu: "500m" # CPU 限制
memory: "256Mi" # 内存限制
livenessProbe: # 存活探针
httpGet: # HTTP 探测
path: / # 探测路径
port: 8080 # 探测端口
initialDelaySeconds: 3 # 启动后首次探测延迟
periodSeconds: 10 # 探测周期
readinessProbe: # 就绪探针
httpGet: # HTTP 探测
path: / # 探测路径
port: 8080 # 探测端口
initialDelaySeconds: 2 # 启动后首次探测延迟
periodSeconds: 5 # 探测周期
---
apiVersion: v1 # Service API 版本
kind: Service # Service 资源
metadata: # Service 元信息
name: nodejs-demo # Service 名称
namespace: default # 命名空间
spec: # Service 规格
selector: # 选择后端 Pod
app: nodejs-demo # 选中 app=nodejs-demo
ports: # 端口映射
- port: 80 # Service 暴露端口
targetPort: 8080 # 转发到容器端口
---
apiVersion: networking.k8s.io/v1 # Ingress API 版本
kind: Ingress # Ingress 资源
metadata: # Ingress 元信息
name: nodejs-demo # Ingress 名称
namespace: default # 命名空间
annotations: # Traefik 注解
traefik.ingress.kubernetes.io/router.entrypoints: web # 使用 web(HTTP) 入口
spec: # Ingress 规则
rules: # 规则列表
- http: # HTTP 路由
paths: # 路径列表
- path: /node # 匹配路径前缀
pathType: Prefix # 前缀匹配
backend: # 后端目标
service: # 后端 Service
name: nodejs-demo # Service 名称
port: # Service 端口
number: 80 # 端口号

View File

@@ -0,0 +1,6 @@
# 04-07nodejs 分课)
本目录 `04-07-nodejs-demo.yaml``ansible/files/04-01/` 同名文件复制,与总集目录内文件**同构**,专供本课独立阅读;改本课清单时以本目录为准即可最小化影响其他篇。
- **手动**`kubectl apply -f ansible/files/04-07/04-07-nodejs-demo.yaml`(按需改字段)。
- **自动**`./ansible/bin/verify.sh run 04-07`

View File

@@ -0,0 +1,110 @@
# 对应文档docs/04-08-nodejs-安全上下文.md
# 累积04-07 + pod securityContext.fsGroup、容器 securityContext、只读根、/tmp emptyDir
apiVersion: v1 # ConfigMap API 版本
kind: ConfigMap # 配置资源ConfigMap
metadata: # ConfigMap 元信息
name: nodejs-demo-config # ConfigMap 名称
namespace: default # 命名空间
data: # 配置键值
APP_MSG: "Hello from ConfigMap" # 注入给应用的消息内容
---
apiVersion: apps/v1 # Deployment API 版本
kind: Deployment # 工作负载Deployment
metadata: # Deployment 元信息
name: nodejs-demo # Deployment 名称
namespace: default # 命名空间
spec: # Deployment 规格
replicas: 1 # 副本数
selector: # Deployment 选择器
matchLabels: # 标签匹配集合
app: nodejs-demo # 匹配 app=nodejs-demo 的 Pod
template: # Pod 模板
metadata: # Pod 元信息
labels: # Pod 标签
app: nodejs-demo # 与 selector.matchLabels 对齐
spec: # Pod 规格
nodeSelector: # 调度到指定节点
kubernetes.io/hostname: ylc62 # 节点主机名(按实际修改)
securityContext: # Pod 级安全上下文
fsGroup: 1000 # 挂载卷文件组 ID
containers: # 容器列表
- name: nodejs-demo # 容器名
image: node:18.20-alpine # Node.js 镜像
imagePullPolicy: IfNotPresent # 拉取策略
securityContext: # 容器级安全上下文
allowPrivilegeEscalation: false # 禁止提权
runAsNonRoot: true # 强制非 root 运行
runAsUser: 1000 # 运行用户 UID
readOnlyRootFilesystem: true # 根文件系统只读
env: # 环境变量注入
- name: APP_MSG # 环境变量名
valueFrom: # 从资源引用取值
configMapKeyRef: # 从 ConfigMap key 读取
name: nodejs-demo-config # ConfigMap 名称
key: APP_MSG # ConfigMap 键名
command: # 启动命令
- node # 运行 node
- "-e" # 执行内联脚本
- | # 多行 JS 脚本(内部内容不改动)
const http=require('http');
const msg=process.env.APP_MSG||'no env';
http.createServer((q,s)=>s.end(msg)).listen(8080);
ports: # 容器端口
- containerPort: 8080 # 应用监听端口
resources: # 资源请求与限制
requests: # 最小资源请求
cpu: "50m" # 请求 CPU
memory: "64Mi" # 请求内存
limits: # 资源上限
cpu: "500m" # CPU 限制
memory: "256Mi" # 内存限制
livenessProbe: # 存活探针
httpGet: # HTTP 探测
path: / # 探测路径
port: 8080 # 探测端口
initialDelaySeconds: 3 # 启动后首次探测延迟
periodSeconds: 10 # 探测周期
readinessProbe: # 就绪探针
httpGet: # HTTP 探测
path: / # 探测路径
port: 8080 # 探测端口
initialDelaySeconds: 2 # 启动后首次探测延迟
periodSeconds: 5 # 探测周期
volumeMounts: # 卷挂载
- name: tmp # 引用临时卷
mountPath: /tmp # 容器内临时目录
volumes: # 卷定义
- name: tmp # 临时卷名称
emptyDir: {} # 空目录卷Pod 生命周期内)
---
apiVersion: v1 # Service API 版本
kind: Service # Service 资源
metadata: # Service 元信息
name: nodejs-demo # Service 名称
namespace: default # 命名空间
spec: # Service 规格
selector: # 选择后端 Pod
app: nodejs-demo # 选中 app=nodejs-demo
ports: # 端口映射
- port: 80 # Service 暴露端口
targetPort: 8080 # 转发到容器端口
---
apiVersion: networking.k8s.io/v1 # Ingress API 版本
kind: Ingress # Ingress 资源
metadata: # Ingress 元信息
name: nodejs-demo # Ingress 名称
namespace: default # 命名空间
annotations: # Traefik 注解
traefik.ingress.kubernetes.io/router.entrypoints: web # 使用 web(HTTP) 入口
spec: # Ingress 规则
rules: # 规则列表
- http: # HTTP 路由
paths: # 路径列表
- path: /node # 匹配路径前缀
pathType: Prefix # 前缀匹配
backend: # 后端目标
service: # 后端 Service
name: nodejs-demo # Service 名称
port: # Service 端口
number: 80 # 端口号

View File

@@ -0,0 +1,6 @@
# 04-08nodejs 分课)
本目录 `04-08-nodejs-demo.yaml``ansible/files/04-01/` 同名文件复制,与总集目录内文件**同构**,专供本课独立阅读;改本课清单时以本目录为准即可最小化影响其他篇。
- **手动**`kubectl apply -f ansible/files/04-08/04-08-nodejs-demo.yaml`(按需改字段)。
- **自动**`./ansible/bin/verify.sh run 04-08`

View File

@@ -0,0 +1,128 @@
# 对应文档docs/04-09-nodejs-存储与卷.md
# 累积04-08 + PVC nodejs-demo-data默认 storageClassName: local-path可按集群改为 longhorn 等)+ 挂载 /data
apiVersion: v1 # PVC API 版本
kind: PersistentVolumeClaim # 持久卷声明
metadata: # PVC 元信息
name: nodejs-demo-data # PVC 名称
namespace: default # 命名空间
spec: # PVC 规格
accessModes: # 访问模式
- ReadWriteOnce # RWO同一时间仅单节点挂载读写
storageClassName: local-path # 存储类(按集群可改)
resources: # 资源请求
requests: # 配额请求
storage: 1Gi # 申请容量
---
apiVersion: v1 # ConfigMap API 版本
kind: ConfigMap # 配置资源
metadata: # ConfigMap 元信息
name: nodejs-demo-config # ConfigMap 名称
namespace: default # 命名空间
data: # 配置键值
APP_MSG: "Hello from ConfigMap" # 示例消息内容
---
apiVersion: apps/v1 # Deployment API 版本
kind: Deployment # 工作负载Deployment
metadata: # Deployment 元信息
name: nodejs-demo # Deployment 名称
namespace: default # 命名空间
spec: # Deployment 规格
replicas: 1 # 副本数
selector: # Pod 选择器
matchLabels: # 标签匹配集合
app: nodejs-demo # 匹配 app=nodejs-demo 的 Pod
template: # Pod 模板
metadata: # Pod 元信息
labels: # Pod 标签
app: nodejs-demo # 与 selector.matchLabels 对齐
spec: # Pod 规格
nodeSelector: # 节点选择
kubernetes.io/hostname: ylc62 # 固定到指定节点(按实际修改)
securityContext: # Pod 级安全上下文
fsGroup: 1000 # 挂载卷文件组 ID
containers: # 容器列表
- name: nodejs-demo # 容器名
image: node:18.20-alpine # Node.js 镜像
imagePullPolicy: IfNotPresent # 拉取策略
securityContext: # 容器级安全上下文
allowPrivilegeEscalation: false # 禁止提权
runAsNonRoot: true # 非 root 运行
runAsUser: 1000 # 运行用户 UID
readOnlyRootFilesystem: true # 根文件系统只读
env: # 环境变量
- name: APP_MSG # 环境变量名
valueFrom: # 从引用源取值
configMapKeyRef: # 从 ConfigMap key 读取
name: nodejs-demo-config # ConfigMap 名称
key: APP_MSG # ConfigMap 键名
command: # 启动命令
- node # 执行 node
- "-e" # 执行内联脚本
- | # 多行 JS 脚本(内容保持原样)
const http=require('http');
const msg=process.env.APP_MSG||'no env';
http.createServer((q,s)=>s.end(msg)).listen(8080);
ports: # 容器端口
- containerPort: 8080 # 监听端口
resources: # 资源请求与限制
requests: # 最小资源请求
cpu: "50m" # 请求 CPU
memory: "64Mi" # 请求内存
limits: # 资源上限
cpu: "500m" # CPU 限制
memory: "256Mi" # 内存限制
livenessProbe: # 存活探针
httpGet: # HTTP 探测
path: / # 探测路径
port: 8080 # 探测端口
initialDelaySeconds: 3 # 初始延迟
periodSeconds: 10 # 探测周期
readinessProbe: # 就绪探针
httpGet: # HTTP 探测
path: / # 探测路径
port: 8080 # 探测端口
initialDelaySeconds: 2 # 初始延迟
periodSeconds: 5 # 探测周期
volumeMounts: # 卷挂载
- name: tmp # 临时卷名称
mountPath: /tmp # 容器内临时目录
- name: data # 数据卷名称
mountPath: /data # 容器内数据目录
volumes: # 卷定义
- name: tmp # 临时卷
emptyDir: {} # 空目录卷
- name: data # 数据卷
persistentVolumeClaim: # 卷来源为 PVC
claimName: nodejs-demo-data # 绑定 PVC 名称
---
apiVersion: v1 # Service API 版本
kind: Service # Service 资源
metadata: # Service 元信息
name: nodejs-demo # Service 名称
namespace: default # 命名空间
spec: # Service 规格
selector: # 选择后端 Pod
app: nodejs-demo # 选中 app=nodejs-demo
ports: # 端口映射
- port: 80 # Service 暴露端口
targetPort: 8080 # 转发到容器端口
---
apiVersion: networking.k8s.io/v1 # Ingress API 版本
kind: Ingress # Ingress 资源
metadata: # Ingress 元信息
name: nodejs-demo # Ingress 名称
namespace: default # 命名空间
annotations: # Traefik 注解
traefik.ingress.kubernetes.io/router.entrypoints: web # 使用 web(HTTP) 入口
spec: # Ingress 规则
rules: # 规则列表
- http: # HTTP 路由
paths: # 路径列表
- path: /node # 路径前缀
pathType: Prefix # 前缀匹配
backend: # 后端目标
service: # 后端 Service
name: nodejs-demo # Service 名称
port: # Service 端口
number: 80 # 端口号

View File

@@ -0,0 +1,6 @@
# 04-09nodejs 分课)
本目录 `04-09-nodejs-demo.yaml``ansible/files/04-01/` 同名文件复制,与总集目录内文件**同构**,专供本课独立阅读;改本课清单时以本目录为准即可最小化影响其他篇。
- **手动**`kubectl apply -f ansible/files/04-09/04-09-nodejs-demo.yaml`(按需改字段)。
- **自动**`./ansible/bin/verify.sh run 04-09`

View File

@@ -0,0 +1,129 @@
# 对应文档docs/04-10-nodejs-Ingress与Traefik.md
# 累积04-09 + Ingress 增加 host、path 改为 /api访问需 Host: app.example.local
apiVersion: v1 # PVC API 版本
kind: PersistentVolumeClaim # 持久卷声明
metadata: # PVC 元信息
name: nodejs-demo-data # PVC 名称
namespace: default # 命名空间
spec: # PVC 规格
accessModes: # 访问模式
- ReadWriteOnce # RWO同一时间仅单节点挂载读写
storageClassName: local-path # 存储类
resources: # 资源请求
requests: # 配额请求
storage: 1Gi # 申请容量
---
apiVersion: v1 # ConfigMap API 版本
kind: ConfigMap # 配置资源
metadata: # ConfigMap 元信息
name: nodejs-demo-config # ConfigMap 名称
namespace: default # 命名空间
data: # 配置键值
APP_MSG: "Hello from ConfigMap" # 示例消息内容
---
apiVersion: apps/v1 # Deployment API 版本
kind: Deployment # 工作负载Deployment
metadata: # Deployment 元信息
name: nodejs-demo # Deployment 名称
namespace: default # 命名空间
spec: # Deployment 规格
replicas: 1 # 副本数
selector: # Pod 选择器
matchLabels: # 标签匹配集合
app: nodejs-demo # 匹配 app=nodejs-demo 的 Pod
template: # Pod 模板
metadata: # Pod 元信息
labels: # Pod 标签
app: nodejs-demo # 与 selector.matchLabels 对齐
spec: # Pod 规格
nodeSelector: # 节点选择
kubernetes.io/hostname: ylc62 # 固定到指定节点(按实际修改)
securityContext: # Pod 级安全上下文
fsGroup: 1000 # 挂载卷文件组 ID
containers: # 容器列表
- name: nodejs-demo # 容器名
image: node:18.20-alpine # Node.js 镜像
imagePullPolicy: IfNotPresent # 拉取策略
securityContext: # 容器级安全上下文
allowPrivilegeEscalation: false # 禁止提权
runAsNonRoot: true # 非 root 运行
runAsUser: 1000 # 运行用户 UID
readOnlyRootFilesystem: true # 根文件系统只读
env: # 环境变量
- name: APP_MSG # 环境变量名
valueFrom: # 从引用源取值
configMapKeyRef: # 从 ConfigMap key 读取
name: nodejs-demo-config # ConfigMap 名称
key: APP_MSG # ConfigMap 键名
command: # 启动命令
- node # 执行 node
- "-e" # 执行内联脚本
- | # 多行 JS 脚本(内容保持原样)
const http=require('http');
const msg=process.env.APP_MSG||'no env';
http.createServer((q,s)=>s.end(msg)).listen(8080);
ports: # 容器端口
- containerPort: 8080 # 监听端口
resources: # 资源请求与限制
requests: # 最小资源请求
cpu: "50m" # 请求 CPU
memory: "64Mi" # 请求内存
limits: # 资源上限
cpu: "500m" # CPU 限制
memory: "256Mi" # 内存限制
livenessProbe: # 存活探针
httpGet: # HTTP 探测
path: / # 探测路径
port: 8080 # 探测端口
initialDelaySeconds: 3 # 初始延迟
periodSeconds: 10 # 探测周期
readinessProbe: # 就绪探针
httpGet: # HTTP 探测
path: / # 探测路径
port: 8080 # 探测端口
initialDelaySeconds: 2 # 初始延迟
periodSeconds: 5 # 探测周期
volumeMounts: # 卷挂载
- name: tmp # 临时卷名称
mountPath: /tmp # 容器内临时目录
- name: data # 数据卷名称
mountPath: /data # 容器内数据目录
volumes: # 卷定义
- name: tmp # 临时卷
emptyDir: {} # 空目录卷
- name: data # 数据卷
persistentVolumeClaim: # 卷来源为 PVC
claimName: nodejs-demo-data # 绑定 PVC 名称
---
apiVersion: v1 # Service API 版本
kind: Service # Service 资源
metadata: # Service 元信息
name: nodejs-demo # Service 名称
namespace: default # 命名空间
spec: # Service 规格
selector: # 选择后端 Pod
app: nodejs-demo # 选中 app=nodejs-demo
ports: # 端口映射
- port: 80 # Service 暴露端口
targetPort: 8080 # 转发到容器端口
---
apiVersion: networking.k8s.io/v1 # Ingress API 版本
kind: Ingress # Ingress 资源
metadata: # Ingress 元信息
name: nodejs-demo # Ingress 名称
namespace: default # 命名空间
annotations: # Traefik 注解
traefik.ingress.kubernetes.io/router.entrypoints: web # 使用 web(HTTP) 入口
spec: # Ingress 规则
rules: # 规则列表
- host: app.example.local # 主机名匹配
http: # HTTP 路由
paths: # 路径列表
- path: /api # 匹配 API 路径前缀
pathType: Prefix # 前缀匹配
backend: # 后端目标
service: # 后端 Service
name: nodejs-demo # Service 名称
port: # Service 端口
number: 80 # 端口号

View File

@@ -0,0 +1,6 @@
# 04-10nodejs 分课)
本目录 `04-10-nodejs-demo.yaml``ansible/files/04-01/` 同名文件复制,与总集目录内文件**同构**,专供本课独立阅读;改本课清单时以本目录为准即可最小化影响其他篇。
- **手动**`kubectl apply -f ansible/files/04-10/04-10-nodejs-demo.yaml`(按需改字段)。
- **自动**`./ansible/bin/verify.sh run 04-10`

View File

@@ -0,0 +1,134 @@
# 对应文档docs/04-11-nodejs-副本与滚动发布.md
# 累积04-10 + replicas: 3 + RollingUpdatemaxSurge:1 maxUnavailable:0
apiVersion: v1 # PVC API 版本
kind: PersistentVolumeClaim # 持久卷声明
metadata: # PVC 元信息
name: nodejs-demo-data # PVC 名称
namespace: default # 命名空间
spec: # PVC 规格
accessModes: # 访问模式
- ReadWriteOnce # RWO同一时间仅单节点挂载读写
storageClassName: local-path # 存储类
resources: # 资源请求
requests: # 配额请求
storage: 1Gi # 申请容量
---
apiVersion: v1 # ConfigMap API 版本
kind: ConfigMap # 配置资源
metadata: # ConfigMap 元信息
name: nodejs-demo-config # ConfigMap 名称
namespace: default # 命名空间
data: # 配置键值
APP_MSG: "Hello from ConfigMap" # 示例消息内容
---
apiVersion: apps/v1 # Deployment API 版本
kind: Deployment # 工作负载Deployment
metadata: # Deployment 元信息
name: nodejs-demo # Deployment 名称
namespace: default # 命名空间
spec: # Deployment 规格
replicas: 3 # 副本数(高可用)
strategy: # 更新策略
type: RollingUpdate # 滚动更新
rollingUpdate: # 滚动更新参数
maxSurge: 1 # 更新时最多额外增加 1 个 Pod
maxUnavailable: 0 # 更新时不可用 Pod 数为 0
selector: # Pod 选择器
matchLabels: # 标签匹配集合
app: nodejs-demo # 匹配 app=nodejs-demo 的 Pod
template: # Pod 模板
metadata: # Pod 元信息
labels: # Pod 标签
app: nodejs-demo # 与 selector.matchLabels 对齐
spec: # Pod 规格
nodeSelector: # 节点选择
kubernetes.io/hostname: ylc62 # 固定到指定节点(按实际修改)
securityContext: # Pod 级安全上下文
fsGroup: 1000 # 挂载卷文件组 ID
containers: # 容器列表
- name: nodejs-demo # 容器名
image: node:18.20-alpine # Node.js 镜像
imagePullPolicy: IfNotPresent # 拉取策略
securityContext: # 容器级安全上下文
allowPrivilegeEscalation: false # 禁止提权
runAsNonRoot: true # 非 root 运行
runAsUser: 1000 # 运行用户 UID
readOnlyRootFilesystem: true # 根文件系统只读
env: # 环境变量
- name: APP_MSG # 环境变量名
valueFrom: # 从引用源取值
configMapKeyRef: # 从 ConfigMap key 读取
name: nodejs-demo-config # ConfigMap 名称
key: APP_MSG # ConfigMap 键名
command: # 启动命令
- node # 执行 node
- "-e" # 执行内联脚本
- | # 多行 JS 脚本(内容保持原样)
const http=require('http');
const msg=process.env.APP_MSG||'no env';
http.createServer((q,s)=>s.end(msg)).listen(8080);
ports: # 容器端口
- containerPort: 8080 # 监听端口
resources: # 资源请求与限制
requests: # 最小资源请求
cpu: "50m" # 请求 CPU
memory: "64Mi" # 请求内存
limits: # 资源上限
cpu: "500m" # CPU 限制
memory: "256Mi" # 内存限制
livenessProbe: # 存活探针
httpGet: # HTTP 探测
path: / # 探测路径
port: 8080 # 探测端口
initialDelaySeconds: 3 # 初始延迟
periodSeconds: 10 # 探测周期
readinessProbe: # 就绪探针
httpGet: # HTTP 探测
path: / # 探测路径
port: 8080 # 探测端口
initialDelaySeconds: 2 # 初始延迟
periodSeconds: 5 # 探测周期
volumeMounts: # 卷挂载
- name: tmp # 临时卷名称
mountPath: /tmp # 容器内临时目录
- name: data # 数据卷名称
mountPath: /data # 容器内数据目录
volumes: # 卷定义
- name: tmp # 临时卷
emptyDir: {} # 空目录卷
- name: data # 数据卷
persistentVolumeClaim: # 卷来源为 PVC
claimName: nodejs-demo-data # 绑定 PVC 名称
---
apiVersion: v1 # Service API 版本
kind: Service # Service 资源
metadata: # Service 元信息
name: nodejs-demo # Service 名称
namespace: default # 命名空间
spec: # Service 规格
selector: # 选择后端 Pod
app: nodejs-demo # 选中 app=nodejs-demo
ports: # 端口映射
- port: 80 # Service 暴露端口
targetPort: 8080 # 转发到容器端口
---
apiVersion: networking.k8s.io/v1 # Ingress API 版本
kind: Ingress # Ingress 资源
metadata: # Ingress 元信息
name: nodejs-demo # Ingress 名称
namespace: default # 命名空间
annotations: # Traefik 注解
traefik.ingress.kubernetes.io/router.entrypoints: web # 使用 web(HTTP) 入口
spec: # Ingress 规则
rules: # 规则列表
- host: app.example.local # 主机名匹配
http: # HTTP 路由
paths: # 路径列表
- path: /api # 匹配 API 路径前缀
pathType: Prefix # 前缀匹配
backend: # 后端目标
service: # 后端 Service
name: nodejs-demo # Service 名称
port: # Service 端口
number: 80 # 端口号

View File

@@ -0,0 +1,6 @@
# 04-11nodejs 分课)
本目录 `04-11-nodejs-demo.yaml``ansible/files/04-01/` 同名文件复制,与总集目录内文件**同构**,专供本课独立阅读;改本课清单时以本目录为准即可最小化影响其他篇。
- **手动**`kubectl apply -f ansible/files/04-11/04-11-nodejs-demo.yaml`(按需改字段)。
- **自动**`./ansible/bin/verify.sh run 04-11`

View File

@@ -0,0 +1,141 @@
# 对应文档docs/04-12-nodejs-TLS与证书.md
# 累积04-11 + Ingress TLSwebsecure、secretName: nodejs-demo-tls
# 应用前请先创建 TLS Secret例如
# kubectl create secret tls nodejs-demo-tls --cert=fullchain.pem --key=privkey.pem -n default
# 证书 SAN 须覆盖 app.example.local与 rules.host / tls.hosts 一致)
apiVersion: v1 # PVC API 版本
kind: PersistentVolumeClaim # 持久卷声明
metadata: # PVC 元信息
name: nodejs-demo-data # PVC 名称
namespace: default # 命名空间
spec: # PVC 规格
accessModes: # 访问模式
- ReadWriteOnce # RWO同一时间仅单节点挂载读写
storageClassName: local-path # 存储类
resources: # 资源请求
requests: # 配额请求
storage: 1Gi # 申请容量
---
apiVersion: v1 # ConfigMap API 版本
kind: ConfigMap # 配置资源
metadata: # ConfigMap 元信息
name: nodejs-demo-config # ConfigMap 名称
namespace: default # 命名空间
data: # 配置键值
APP_MSG: "Hello from ConfigMap" # 示例消息内容
---
apiVersion: apps/v1 # Deployment API 版本
kind: Deployment # 工作负载Deployment
metadata: # Deployment 元信息
name: nodejs-demo # Deployment 名称
namespace: default # 命名空间
spec: # Deployment 规格
replicas: 3 # 副本数
strategy: # 更新策略
type: RollingUpdate # 滚动更新
rollingUpdate: # 滚动更新参数
maxSurge: 1 # 更新时最多额外增加 1 个 Pod
maxUnavailable: 0 # 更新时不可用 Pod 数为 0
selector: # Pod 选择器
matchLabels: # 标签匹配集合
app: nodejs-demo # 匹配 app=nodejs-demo 的 Pod
template: # Pod 模板
metadata: # Pod 元信息
labels: # Pod 标签
app: nodejs-demo # 与 selector.matchLabels 对齐
spec: # Pod 规格
nodeSelector: # 节点选择
kubernetes.io/hostname: ylc62 # 固定到指定节点(按实际修改)
securityContext: # Pod 级安全上下文
fsGroup: 1000 # 挂载卷文件组 ID
containers: # 容器列表
- name: nodejs-demo # 容器名
image: node:18.20-alpine # Node.js 镜像
imagePullPolicy: IfNotPresent # 拉取策略
securityContext: # 容器级安全上下文
allowPrivilegeEscalation: false # 禁止提权
runAsNonRoot: true # 非 root 运行
runAsUser: 1000 # 运行用户 UID
readOnlyRootFilesystem: true # 根文件系统只读
env: # 环境变量
- name: APP_MSG # 环境变量名
valueFrom: # 从引用源取值
configMapKeyRef: # 从 ConfigMap key 读取
name: nodejs-demo-config # ConfigMap 名称
key: APP_MSG # ConfigMap 键名
command: # 启动命令
- node # 执行 node
- "-e" # 执行内联脚本
- | # 多行 JS 脚本(内容保持原样)
const http=require('http');
const msg=process.env.APP_MSG||'no env';
http.createServer((q,s)=>s.end(msg)).listen(8080);
ports: # 容器端口
- containerPort: 8080 # 监听端口
resources: # 资源请求与限制
requests: # 最小资源请求
cpu: "50m" # 请求 CPU
memory: "64Mi" # 请求内存
limits: # 资源上限
cpu: "500m" # CPU 限制
memory: "256Mi" # 内存限制
livenessProbe: # 存活探针
httpGet: # HTTP 探测
path: / # 探测路径
port: 8080 # 探测端口
initialDelaySeconds: 3 # 初始延迟
periodSeconds: 10 # 探测周期
readinessProbe: # 就绪探针
httpGet: # HTTP 探测
path: / # 探测路径
port: 8080 # 探测端口
initialDelaySeconds: 2 # 初始延迟
periodSeconds: 5 # 探测周期
volumeMounts: # 卷挂载
- name: tmp # 临时卷名称
mountPath: /tmp # 容器内临时目录
- name: data # 数据卷名称
mountPath: /data # 容器内数据目录
volumes: # 卷定义
- name: tmp # 临时卷
emptyDir: {} # 空目录卷
- name: data # 数据卷
persistentVolumeClaim: # 卷来源为 PVC
claimName: nodejs-demo-data # 绑定 PVC 名称
---
apiVersion: v1 # Service API 版本
kind: Service # Service 资源
metadata: # Service 元信息
name: nodejs-demo # Service 名称
namespace: default # 命名空间
spec: # Service 规格
selector: # 选择后端 Pod
app: nodejs-demo # 选中 app=nodejs-demo
ports: # 端口映射
- port: 80 # Service 暴露端口
targetPort: 8080 # 转发到容器端口
---
apiVersion: networking.k8s.io/v1 # Ingress API 版本
kind: Ingress # Ingress 资源
metadata: # Ingress 元信息
name: nodejs-demo # Ingress 名称
namespace: default # 命名空间
annotations: # Traefik 注解
traefik.ingress.kubernetes.io/router.entrypoints: websecure # 使用 websecure(HTTPS) 入口
spec: # Ingress 规则
tls: # TLS 配置
- hosts: # 证书覆盖域名
- app.example.local # 域名
secretName: nodejs-demo-tls # 引用的 TLS Secret 名称
rules: # 路由规则列表
- host: app.example.local # 主机名匹配
http: # HTTP 路由
paths: # 路径列表
- path: /api # 匹配 API 路径前缀
pathType: Prefix # 前缀匹配
backend: # 后端目标
service: # 后端 Service
name: nodejs-demo # Service 名称
port: # Service 端口
number: 80 # 端口号

View File

@@ -0,0 +1,6 @@
# 04-12nodejs 分课)
本目录 `04-12-nodejs-demo.yaml``ansible/files/04-01/` 同名文件复制,与总集目录内文件**同构**,专供本课独立阅读;改本课清单时以本目录为准即可最小化影响其他篇。
- **手动**`kubectl apply -f ansible/files/04-12/04-12-nodejs-demo.yaml`(按需改字段)。
- **自动**`./ansible/bin/verify.sh run 04-12`

View File

@@ -0,0 +1,158 @@
# 对应文档docs/04-13-nodejs-HPA.md
# 累积04-12 + HorizontalPodAutoscalerCPU 50%min 1 max 5
apiVersion: v1 # PVC API 版本
kind: PersistentVolumeClaim # 持久卷声明
metadata: # PVC 元信息
name: nodejs-demo-data # PVC 名称
namespace: default # 命名空间
spec: # PVC 规格
accessModes: # 访问模式
- ReadWriteOnce # RWO同一时间仅单节点挂载读写
storageClassName: local-path # 存储类
resources: # 资源请求
requests: # 配额请求
storage: 1Gi # 申请容量
---
apiVersion: v1 # ConfigMap API 版本
kind: ConfigMap # 配置资源
metadata: # ConfigMap 元信息
name: nodejs-demo-config # ConfigMap 名称
namespace: default # 命名空间
data: # 配置键值
APP_MSG: "Hello from ConfigMap" # 示例消息内容
---
apiVersion: apps/v1 # Deployment API 版本
kind: Deployment # 工作负载Deployment
metadata: # Deployment 元信息
name: nodejs-demo # Deployment 名称
namespace: default # 命名空间
spec: # Deployment 规格
replicas: 3 # 副本数
strategy: # 更新策略
type: RollingUpdate # 滚动更新
rollingUpdate: # 滚动更新参数
maxSurge: 1 # 更新时最多额外增加 1 个 Pod
maxUnavailable: 0 # 更新时不可用 Pod 数为 0
selector: # Pod 选择器
matchLabels: # 标签匹配集合
app: nodejs-demo # 匹配 app=nodejs-demo 的 Pod
template: # Pod 模板
metadata: # Pod 元信息
labels: # Pod 标签
app: nodejs-demo # 与 selector.matchLabels 对齐
spec: # Pod 规格
nodeSelector: # 节点选择
kubernetes.io/hostname: ylc62 # 固定到指定节点(按实际修改)
securityContext: # Pod 级安全上下文
fsGroup: 1000 # 挂载卷文件组 ID
containers: # 容器列表
- name: nodejs-demo # 容器名
image: node:18.20-alpine # Node.js 镜像
imagePullPolicy: IfNotPresent # 拉取策略
securityContext: # 容器级安全上下文
allowPrivilegeEscalation: false # 禁止提权
runAsNonRoot: true # 非 root 运行
runAsUser: 1000 # 运行用户 UID
readOnlyRootFilesystem: true # 根文件系统只读
env: # 环境变量
- name: APP_MSG # 环境变量名
valueFrom: # 从引用源取值
configMapKeyRef: # 从 ConfigMap key 读取
name: nodejs-demo-config # ConfigMap 名称
key: APP_MSG # ConfigMap 键名
command: # 启动命令
- node # 执行 node
- "-e" # 执行内联脚本
- | # 多行 JS 脚本(内容保持原样)
const http=require('http');
const msg=process.env.APP_MSG||'no env';
http.createServer((q,s)=>s.end(msg)).listen(8080);
ports: # 容器端口
- containerPort: 8080 # 监听端口
resources: # 资源请求与限制
requests: # 最小资源请求
cpu: "50m" # 请求 CPU
memory: "64Mi" # 请求内存
limits: # 资源上限
cpu: "500m" # CPU 限制
memory: "256Mi" # 内存限制
livenessProbe: # 存活探针
httpGet: # HTTP 探测
path: / # 探测路径
port: 8080 # 探测端口
initialDelaySeconds: 3 # 初始延迟
periodSeconds: 10 # 探测周期
readinessProbe: # 就绪探针
httpGet: # HTTP 探测
path: / # 探测路径
port: 8080 # 探测端口
initialDelaySeconds: 2 # 初始延迟
periodSeconds: 5 # 探测周期
volumeMounts: # 卷挂载
- name: tmp # 临时卷名称
mountPath: /tmp # 容器内临时目录
- name: data # 数据卷名称
mountPath: /data # 容器内数据目录
volumes: # 卷定义
- name: tmp # 临时卷
emptyDir: {} # 空目录卷
- name: data # 数据卷
persistentVolumeClaim: # 卷来源为 PVC
claimName: nodejs-demo-data # 绑定 PVC 名称
---
apiVersion: v1 # Service API 版本
kind: Service # Service 资源
metadata: # Service 元信息
name: nodejs-demo # Service 名称
namespace: default # 命名空间
spec: # Service 规格
selector: # 选择后端 Pod
app: nodejs-demo # 选中 app=nodejs-demo
ports: # 端口映射
- port: 80 # Service 暴露端口
targetPort: 8080 # 转发到容器端口
---
apiVersion: networking.k8s.io/v1 # Ingress API 版本
kind: Ingress # Ingress 资源
metadata: # Ingress 元信息
name: nodejs-demo # Ingress 名称
namespace: default # 命名空间
annotations: # Traefik 注解
traefik.ingress.kubernetes.io/router.entrypoints: websecure # 使用 websecure(HTTPS) 入口
spec: # Ingress 规则
tls: # TLS 配置
- hosts: # 证书覆盖域名
- app.example.local # 域名
secretName: nodejs-demo-tls # 引用的 TLS Secret 名称
rules: # 路由规则列表
- host: app.example.local # 主机名匹配
http: # HTTP 路由
paths: # 路径列表
- path: /api # 匹配 API 路径前缀
pathType: Prefix # 前缀匹配
backend: # 后端目标
service: # 后端 Service
name: nodejs-demo # Service 名称
port: # Service 端口
number: 80 # 端口号
---
apiVersion: autoscaling/v2 # HPA API 版本
kind: HorizontalPodAutoscaler # 水平自动扩缩容资源
metadata: # HPA 元信息
name: nodejs-demo # HPA 名称
namespace: default # 命名空间
spec: # HPA 规格
scaleTargetRef: # 伸缩目标引用
apiVersion: apps/v1 # 目标 API 版本
kind: Deployment # 目标资源类型
name: nodejs-demo # 目标 Deployment 名称
minReplicas: 1 # 最小副本数
maxReplicas: 5 # 最大副本数
metrics: # 伸缩指标
- type: Resource # 资源指标类型
resource: # 资源指标配置
name: cpu # 指标资源CPU
target: # 目标值
type: Utilization # 目标类型:利用率
averageUtilization: 50 # 目标平均 CPU 利用率(%

View File

@@ -0,0 +1,6 @@
# 04-13nodejs 分课)
本目录 `04-13-nodejs-demo.yaml``ansible/files/04-01/` 同名文件复制,与总集目录内文件**同构**,专供本课独立阅读;改本课清单时以本目录为准即可最小化影响其他篇。
- **手动**`kubectl apply -f ansible/files/04-13/04-13-nodejs-demo.yaml`(按需改字段)。
- **自动**`./ansible/bin/verify.sh run 04-13`

View File

@@ -0,0 +1,5 @@
# 04-14 truth source placeholder
`04-14` 当前以流程说明GitOps/CI 流水线)为主,暂无独立可直接 `kubectl apply` 的单一清单。
本目录用于满足 `doc_id -> ansible/files/<doc_id>/` 一致性约束。

View File

@@ -0,0 +1,69 @@
# GitLab Helm Chart 示例 values实验室用
#
# 使用方式:
# cp ansible/files/05-03/values-gitlab.example.yaml values-gitlab.yaml
# 按需修改域名、资源、Ingress完整键名以当前 Chart 为准:
# helm show values gitlab/gitlab
#
# Chart 文档https://docs.gitlab.com/charts/
global:
# 实验室固定调度到指定节点PVClocal-path与 Pod 同节点 → 数据落在该节点本地盘
# 本仓库 inventory 中 192.168.2.63 对应节点名 ylc63若你的集群节点名不同请 kubectl get nodes 后改写
nodeSelector:
kubernetes.io/hostname: ylc63
hosts:
# 根域占位;请改为你的域名(内网实验可配合 hosts / split-horizon DNS
domain: example.com
# GitLab Web 主机名片段:最终为 <name>.<domain>,例如 git.example.com
gitlab:
name: git
registry:
name: registry
ingress:
# 集群已用 Traefik 或在外层终止 TLS 时,通常不启用 Chart 内置 cert-manager
configureCertmanager: false
tls:
enabled: true
# 若使用已有 Secret例如 Traefik / 手工证书),取消注释并填写:
# secretName: gitlab-wildcard-tls
# 实验室缩小副本(可选;生产请按官方 sizing 与监控数据调整)
gitlab:
webservice:
minReplicas: 1
sidekiq:
minReplicas: 1
# Gitaly 仓库数据盘:与 global.nodeSelector 同节点时local-path 卷落在该节点本地
gitaly:
persistence:
storageClass: local-path
size: 50Gi
# Bitnami PostgreSQL / Redis、MinIO 子 chart **不**继承 global.nodeSelector 时需单独写(见 GitLab Chart 文档 Node Selector 节)
postgresql:
primary:
nodeSelector:
kubernetes.io/hostname: ylc63
persistence:
storageClass: local-path
size: 8Gi
redis:
master:
nodeSelector:
kubernetes.io/hostname: ylc63
persistence:
storageClass: local-path
size: 5Gi
minio:
nodeSelector:
kubernetes.io/hostname: ylc63
persistence:
storageClass: local-path
size: 10Gi
# 资源紧张时可考虑关闭捆绑 Prometheus按需取消注释
# prometheus:
# install: false

View File

@@ -0,0 +1,9 @@
# 05-05Prometheus + Grafana
| 文件 | 说明 |
|------|------|
| `kube-prometheus-stack-values.example.yaml` | Helm `kube-prometheus-stack` 的实验室向 values 示例(**非** `kubectl apply` 对象) |
- **手动**:按 [docs/05-05-prometheus与grafana.md](../../../docs/05-05-prometheus与grafana.md) 执行 `helm repo add` / `helm upgrade --install`,可附加 `-f ansible/files/05-05/kube-prometheus-stack-values.example.yaml`
- **自动**`./ansible/bin/verify.sh run 05-05`noop + 集群基线;与本目录示例共用真源,便于对照文档改 values
- 文件名含 `example.``verify_common` 不会对其实施 `kubectl apply --dry-run`

View File

@@ -0,0 +1,22 @@
# Helm values for prometheus-community/kube-prometheus-stack
# 用法(仓库根):
# helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# helm repo update
# kubectl create namespace monitoring --dry-run=client -o yaml | kubectl apply -f -
# helm upgrade --install monitoring prometheus-community/kube-prometheus-stack -n monitoring \
# -f ansible/files/05-05/kube-prometheus-stack-values.example.yaml
#
# 注意:本文件是 Helm values不要用 kubectl apply。
prometheus:
prometheusSpec:
retention: 7d
resources:
requests:
cpu: 100m
memory: 256Mi
grafana:
enabled: true
persistence:
enabled: false

View File

@@ -0,0 +1,10 @@
# 06-01NetworkPolicy 与连通性排障)
| 文件 | 说明 |
|------|------|
| `networkpolicy-traefik-egress.example.yaml` | Traefik 出站示例后端命名空间、Service CIDR、DNS |
| `networkpolicy-backend-ingress.example.yaml` | 后端仅允许来自 `kube-system`Traefik的入站示例 |
- **手动**:复制为正式名后 `kubectl apply -f ...`,并按集群实际 **namespace / 标签 / CIDR** 修改(见 [docs/06-01-k3s-networkpolicy-故障排查.md](../../../docs/06-01-k3s-networkpolicy-故障排查.md))。
- **自动**`./ansible/bin/verify.sh run 06-01`noop + 基线;策略真源以本目录为准,与手工 `kubectl` 一致)。
- 示例文件名含 `example.`,默认验证流程跳过对其的 `kubectl dry-run`

View File

@@ -0,0 +1,21 @@
# 示例:后端 Namespace 仅允许来自 kube-systemTraefik的入站
# 将 namespace、podSelector、端口改为你的应用标签与 Service 端口。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: backend-from-traefik-example
namespace: default
spec:
podSelector:
matchLabels:
app: nginx
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system
ports:
- protocol: TCP
port: 80

View File

@@ -0,0 +1,32 @@
# 示例:为 Traefik 放行出站(按实际 namespace 与标签调整)
# 适用场景:后端在其它命名空间、需访问集群 DNS 与 Service VIP。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: traefik-egress-lab-example
namespace: kube-system
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: traefik
policyTypes:
- Egress
egress:
# 访问任意命名空间内 Pod可按需收窄为 namespaceSelector + podSelector
- to:
- namespaceSelector: {}
ports:
- protocol: TCP
port: 8080
- protocol: TCP
port: 8000
# Service CIDRk3s 默认常为 10.43.0.0/16请与集群一致
- to:
- ipBlock:
cidr: 10.43.0.0/16
# 集群 DNS
- ports:
- protocol: UDP
port: 53
- protocol: TCP
port: 53

View File

@@ -0,0 +1,5 @@
# 06-02运维小结
- **文档**[docs/06-02-运维小结.md](../../../docs/06-02-运维小结.md)(检查项、命令速查、变更记录建议)。
- **自动**`./ansible/bin/verify.sh run 06-02`noop + 集群基线)。
- 本篇无独立 Kubernetes 清单;运维动作以 `kubectl`/脚本为主。

View File

@@ -0,0 +1,5 @@
# 07-01Calico 双栈实验)
- **文档**[docs/07-01-k3s-calico-dualstack.md](../../../docs/07-01-k3s-calico-dualstack.md)。
- **自动**`./ansible/bin/verify.sh run 07-01`(实验环境与主线 Flannel 可能冲突,仅在隔离环境操作)。
- 清单与安装步骤以文档为准;本目录占位满足契约,避免与生产集群误用。

View File

@@ -0,0 +1,5 @@
# 07-02Cilium 双栈 / eBPF 实验)
- **文档**[docs/07-02-k3s-cilium-dualstack-ebpf.md](../../../docs/07-02-k3s-cilium-dualstack-ebpf.md)。
- **自动**`./ansible/bin/verify.sh run 07-02`
- 实验性 CNI 切换风险高YAML 真源随文档演进时再纳入本目录。