Files
zhishiku/k3s知识库.md
2026-02-04 15:58:38 +00:00

3.3 KiB
Raw Blame History

最佳实践 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. 创建集群时挂载源码
# 把本地项目目录 /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"

  1. **在 Deployment 中使用 hostPath**
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/devrails s,但你的 Rails 程序可以像在集群里一样访问 longhorn-storagedb-service 或者其他 K8s Service。

方案三Skaffold自动化构建流

既然你已经习惯了配置文件放在 /home/fei/k3s/,可以写一个 skaffold.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 配置。