From 5d1771428977de38a5f65bdae80dabf55841be24 Mon Sep 17 00:00:00 2001 From: gitea_admin Date: Wed, 4 Feb 2026 15:57:23 +0000 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20k3s=E7=9F=A5=E8=AF=86?= =?UTF-8?q?=E5=BA=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- k3s知识库.md | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/k3s知识库.md b/k3s知识库.md index e69de29..7c4c8f8 100644 --- a/k3s知识库.md +++ b/k3s知识库.md @@ -0,0 +1,88 @@ +# k3s和k3d + + +你说得太对了。如果只是为了**纯粹的代码开发**,直接用 `docker-compose` 挂载代码目录确实更爽,反馈更及时。 + +但之所以在开发阶段引入 **k3d**,通常是为了解决“**环境一致性**”问题。如果你打算最终把 Rails 部署到 K3s 集群(配合你的 PG16 和 Longhorn),在 k3d 里开发能让你提前踩坑,比如:容器间的网络发现、Ingress 配置、以及 K8s 的环境变量注入。 + +如果你觉得频繁构建镜像很痛苦,那是**姿势不对**。我们完全可以把 k3d 玩出 Docker 的丝滑感。这里有三个进阶方案: + +--- + +## 方案一:代码挂载(像 Docker Compose 一样开发) + +k3d 支持在创建集群时直接挂载宿主机目录到 Node 容器。我们可以把 Rails 代码挂载进去,然后通过 K8s 的 `hostPath` 卷映射给 Pod。 + +1. **创建集群时挂载源码**: +```bash +# 把本地项目目录 /home/fei/k3s/my-rails 挂载到 k3d 节点内的 /src +k3d cluster create rails-dev \ + -v "/home/fei/k3s/my-rails:/src@agent:0" \ + -p "8081:80@loadbalancer" + +``` + + +2. **在 Deployment 中使用 `hostPath**`: +```yaml +spec: + containers: + - name: rails + image: rails-base-image:latest # 只需要一个装好 bundle 的基础镜像 + volumeMounts: + - name: code + mountPath: /app + volumes: + - name: code + hostPath: + path: /src # 对应 k3d 节点里的路径 + +``` + + +**优点**:修改本地代码,Pod 里的代码同步更新。配合 `rails s` 的热重载,基本不需要重新构建。 + +--- + +## 方案二:使用 Telepresence(神器级别的“黑科技”) + +如果你觉得挂载卷太麻烦,**Telepresence** 是目前 K8s 开发的最优解。它的逻辑是:**把你的开发机“瞬移”进集群内部。** + +* **它是怎么工作的?** 它会在 k3d 集群里运行一个代理,拦截发往 `rails-service` 的流量,并转发到你**本地机器**上运行的 Rails 进程。 +* **体验**:你在本地直接运行 `bin/dev` 或 `rails s`,但你的 Rails 程序可以像在集群里一样访问 `longhorn-storage`、`db-service` 或者其他 K8s Service。 + +--- + +## 方案三:Skaffold(自动化构建流) + +既然你已经习惯了配置文件放在 `/home/fei/k3s/`,可以写一个 `skaffold.yaml`。 + +```yaml +# skaffold.yaml 核心配置 +build: + artifacts: + - image: my-rails-app + sync: + manual: + - src: 'app/**/*.rb' # 监控 ruby 文件 + dest: '.' # 自动同步进容器,不重新构建镜像 +deploy: + kubectl: + manifests: + - k8s/*.yaml + +``` + +执行 `skaffold dev` 后,你改一行代码,它会发现并自动把这个文件 `kubectl cp` 到运行中的 Pod 里,速度非常快。 + +--- + +## 总结建议 + +| 场景 | 推荐工具 | +| --- | --- | +| **初期写业务代码** | 直接用 Docker Compose,最简单。 | +| **联调 K8s 资源** | **k3d + 方案一 (Mount)**,成本最低。 | +| **微服务联调/高级测试** | **Telepresence**,本地跑代码,环境在云端(集群)。 | + +**你现在的情况,是已经写好了 Rails 的核心逻辑,准备开始对接 K8s 的存储和网络了吗?如果是,我们可以试着写一个带 HostPath 挂载的 k3d 配置。** \ No newline at end of file