{
  "markdown": "<div align=\"center\">\n\n# talos-cluster\n\n个人自用的 Talos Kubernetes 集群仓库。\n\n[![Kubernetes](https://img.shields.io/endpoint?url=https%3A%2F%2Fkromgo.tomyail.com%2Fkubernetes_version&style=for-the-badge&logo=kubernetes&logoColor=white&color=326ce5&label=Kubernetes)](https://kubernetes.io)\n[![Talos](https://img.shields.io/endpoint?url=https%3A%2F%2Fkromgo.tomyail.com%2Ftalos_version&style=for-the-badge&color=0f6fff&label=Talos)](https://www.talos.dev/)\n[![Status](https://img.shields.io/uptimerobot/status/m798277065-6ebf858e537ac04b79e23625?label=Status%20Page&style=for-the-badge&color=2ea44f&logo=statuspage)](https://status-dev.tomyail.com/)\n\n[![Age](https://img.shields.io/endpoint?url=https%3A%2F%2Fkromgo.tomyail.com%2Fcluster_age_days&style=flat-square&label=Age)](https://kromgo.tomyail.com/cluster_age_days)\n[![Uptime](https://img.shields.io/endpoint?url=https%3A%2F%2Fkromgo.tomyail.com%2Fcluster_uptime_days&style=flat-square&label=Uptime)](https://kromgo.tomyail.com/cluster_uptime_days)\n[![Nodes](https://img.shields.io/endpoint?url=https%3A%2F%2Fkromgo.tomyail.com%2Fcluster_node_count&style=flat-square&label=Nodes)](https://kromgo.tomyail.com/cluster_node_count)\n[![Pods](https://img.shields.io/endpoint?url=https%3A%2F%2Fkromgo.tomyail.com%2Fcluster_pods_running&style=flat-square&label=Pods)](https://kromgo.tomyail.com/cluster_pods_running)\n[![CPU](https://img.shields.io/endpoint?url=https%3A%2F%2Fkromgo.tomyail.com%2Fcluster_cpu_usage&style=flat-square&label=CPU)](https://kromgo.tomyail.com/cluster_cpu_usage)\n[![Memory](https://img.shields.io/endpoint?url=https%3A%2F%2Fkromgo.tomyail.com%2Fcluster_memory_usage&style=flat-square&label=Memory)](https://kromgo.tomyail.com/cluster_memory_usage)\n[![Net Up](https://img.shields.io/endpoint?url=https%3A%2F%2Fkromgo.tomyail.com%2Fcluster_network_transmit_usage&style=flat-square&label=Net%E2%AC%86)](https://kromgo.tomyail.com/cluster_network_transmit_usage)\n[![Net Down](https://img.shields.io/endpoint?url=https%3A%2F%2Fkromgo.tomyail.com%2Fcluster_network_receive_usage&style=flat-square&label=Net%E2%AC%87)](https://kromgo.tomyail.com/cluster_network_receive_usage)\n\n</div>\n\n## 🚀 当前架构\n\n- 操作系统：Talos Linux\n- Kubernetes GitOps：Flux\n- 网络：Cilium、Cloudflare Tunnel、Tailscale\n- Secret 管理：SOPS + age、External Secrets、Bitwarden Connect\n- 观测：kube-prometheus-stack、Grafana、Loki、Thanos、Gatus、Uptime Kuma\n- 存储：Topolvm、Volsync、snapshot-controller、NFS CSI、local-path-provisioner\n\n仓库里的应用已经按 namespace / domain 分组放在 `kubernetes/apps/` 下，当前主要包括：\n\n- `kube-system`：Cilium、CoreDNS、metrics-server、node-feature-discovery、system-upgrade\n- `flux-system`：flux-operator、flux-instance\n- `network`：cloudflare-tunnel、adguard-dns、k8s-gateway、smtp-relay、tailscale\n- `observability`：Grafana、Prometheus、Loki、Thanos、Gatus、promtail\n- `storage`：Topolvm、Volsync、NFS CSI、snapshot-controller、Nextcloud\n- `default`：一批个人业务应用，例如 Gitea、Paperless、Navidrome、Jellyfin、qBittorrent、RSSHub、n8n、Ollama 等\n\n## 🗂️ 目录说明\n\n```text\n.\n├── bootstrap/              # 集群首次引导时直接安装的 Helm charts\n├── kubernetes/\n│   ├── apps/               # Flux 管理的应用清单\n│   ├── components/         # 通用组件与复用片段\n│   └── flux/               # Flux cluster/meta kustomization\n├── scripts/                # bootstrap 脚本\n├── talos/\n│   ├── talconfig.yaml      # Talhelper 主配置\n│   ├── talenv.yaml         # Talos / Kubernetes 版本\n│   ├── clusterconfig/      # 生成后的 talos 配置\n│   └── patches/            # Talos 机器级 patch\n├── .taskfiles/             # task 子命令定义\n└── Taskfile.yaml           # 常用入口\n```\n\n## 🧰 本地依赖\n\n仓库用 [mise](https://mise.jdx.dev/) 管理工具链，见 [`.mise.toml`](./.mise.toml)。\n\n初始化本地环境：\n\n```sh\nmise trust\nmise install\n```\n\n常用 CLI：\n\n- `task`\n- `talhelper`\n- `talosctl`\n- `kubectl`\n- `flux`\n- `helmfile`\n- `sops`\n- `age`\n- `yq`\n\n`mise` 还会自动设置这些环境变量：\n\n- `KUBECONFIG=./kubeconfig`\n- `TALOSCONFIG=./talos/clusterconfig/talosconfig`\n- `SOPS_AGE_KEY_FILE=./age.key`\n\n## 🛠️ 引导流程\n\n### 1. ⚙️ 准备 Talos 配置\n\n当前仓库直接维护 [`talos/talconfig.yaml`](./talos/talconfig.yaml) 和 [`talos/talenv.yaml`](./talos/talenv.yaml)，而不是依赖旧模版里的生成流程。\n\n修改时通常关注：\n\n- 节点定义、IP、VIP、磁盘选择器\n- Talos / Kubernetes 版本\n- machine patches\n- 自定义 inline manifests\n\n如果只想重新生成 Talos 配置：\n\n```sh\ntask talos:generate-config\n```\n\n### 2. 🚧 引导 Talos 集群\n\n首次安装：\n\n```sh\ntask bootstrap:talos\n```\n\n这个任务会：\n\n- 生成或复用 `talos/talsecret.sops.yaml`\n- 运行 `talhelper genconfig`\n- 将 machine config apply 到节点\n- 执行 Talos bootstrap\n- 导出 `kubeconfig`\n\n### 3. 📦 引导基础组件\n\nTalos 可用后，执行：\n\n```sh\ntask bootstrap:apps\n```\n\n这个流程由 [`scripts/bootstrap-apps.sh`](./scripts/bootstrap-apps.sh) 完成，主要会：\n\n- 等待节点进入可继续安装的状态\n- 创建所需 namespace\n- 预先应用 SOPS secrets\n- 安装必要 CRD\n- 用 [`bootstrap/helmfile.yaml`](./bootstrap/helmfile.yaml) 同步首批 Helm releases\n\n当前 bootstrap 阶段直接安装的核心组件有：\n\n- Cilium\n- CoreDNS\n- cert-manager\n- flux-operator\n- flux-instance\n\n之后由 Flux 持续接管 `kubernetes/apps/` 下的资源。\n\n## 🔧 日常运维\n\n强制同步 Flux：\n\n```sh\ntask reconcile\n```\n\n单节点重刷 Talos 配置：\n\n```sh\ntask talos:apply-node IP=<node-ip>\n```\n\n升级单个节点 Talos：\n\n```sh\ntask talos:upgrade-node IP=<node-ip>\n```\n\n按 `talos/talenv.yaml` 升级 Kubernetes：\n\n```sh\ntask talos:upgrade-k8s\n```\n\n重置整个 Talos 集群：\n\n```sh\ntask talos:reset\n```\n\n## 🔐 Secret 管理\n\n仓库使用 SOPS + age：\n\n- `talos/*.sops.yaml`：整文件加密\n- `bootstrap/`、`kubernetes/` 下的 `*.sops.yaml`：只加密 `data` / `stringData`\n\n规则见 [`.sops.yaml`](./.sops.yaml)。\n\n修改 secret 后，提交前至少确认：\n\n- 文件仍然是加密态\n- `age.key` 与集群中的 `sops-age` secret 对应\n- Flux 能正常解密 `kubernetes/components/common/sops/` 下资源\n\n## 📝 备注\n\n- 项目最初通过 [onedr0p/cluster-template](https://github.com/onedr0p/cluster-template) 初始化。\n- `talos/patches/` 里的 patch 会被 talhelper 合并进最终 machine config。\n- 仓库中包含不少强绑定个人环境的配置，复用时应先清理网络、域名、凭据和应用清单。\n",
  "bytes": 5572,
  "sha": "070ec0c8846595d545be5500ff3bb32845644f5e1154db5245b35116cd269f47",
  "repo_slug": "tomyail/talos-cluster",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/okf_tomyail_talos_cluster_openwiki_index_md_819536bd/readme"
}