Files
zhishiku/k3s知识库.md
2026-02-04 16:01:05 +00:00

98 lines
3.3 KiB
Markdown
Raw 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.
# “杀鸡不要用屠龙刀。”
# 最佳实践 docker运行 pg 和s3 最好
# Longhorn 是你的“硬盘”,而 S3 是你的“保险柜”。
# 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 配置。**