如何将主机目录动态挂载到 OSX 上的 docker 桌面 k8s 部署中?

How can I dynamically mount a host directory into a docker desktop k8s deployment on OSX?

我的团队并没有将我们所有的代码都放在本地的同一个地方,但我们都在为同一个服务工作。此服务依赖于其他一些库,在开发过程中,将这些库的实时版本安装到 pod 中以加快迭代速度会很棒。

路径如何变为动态并不重要,env var、config map、奇怪的卷安装魔法等...

我目前的方法是使用 helm 来模板化 yaml。我希望能够做这样的事情:

 volumes:
   - name: my-lib
     hostPath:
       path: $CODE_PATH/my_lib
 volumeMounts:
   - name: my-lib
     mountPath: /tmp/my_lib

我的团队成员可以在外部定义 CODE_PATH,允许他们指向保存代码的位置。我不喜欢这样做的方法。目前,我的无论如何都不起作用。我只需要能够将主机目录挂载到 pod 中,而无需在 yaml 中静态定义绝对路径。

根据官方文档,有两种方法可以实现此目的,但在这两种方法中都必须定义 hostPath

第一种方法是使用hostPath,其中hostPath卷使用节点的本地磁盘挂载卷并在Preferences->File Sharing中指定hostPath Docker桌面。

第二种方法是使用 PersistentVolume 方法,在该方法中,集群管理员创建卷并且 pods 可以通过 PersistentVolumeClaims 访问它们,这是卷与其自身之间的抽象级别存储机制。

我相信@Jakub Siemaszko 有一个更正确的答案来解决这个问题而无需任何额外的工具,但我会 post 在他们的答案出现之前我最终开发的解决方案。

我们使用 Makefiles 并为我们的开发环境提供 .env 文件,所以我最后只是告诉人们将他们保存 repo 的路径放入 .env 并使用 Makefile 注入 var。

  • ~/.user.env

    USER_CODE_PATH=/Users/LISTERINE/dev
    
  • helm/Makefile

    # Attempt to export users vars into the make context
    ifneq (,$(wildcard ~/.user.env))
        include ~/.user.env
        export
    endif
    
    template:
        helm template webapp . -f dev-values.yaml --dry-run --set userCodePath=$(USER_CODE_PATH)
    
  • helm/dev-values.yaml

    env: "dev"
    
    codeVolumes:
    # Code volumes are use to mount our source code into the pod.
    # Auto volumes specify the name of the dir that will be mounted into.
    # Auto volumes are sourced from your USER_CODE_PATH
    auto:
      - name: "my-db-lib"
        dir: "my-db-lib"
        module: "my_db_lib"
    
  • helm/templates/deployment.yaml

    ...
    spec:
      ...
      template:
        ...
        spec:
          ...
          containers:
            - name: ...
              volumeMounts:
                {{- range .Values.codeVolumes.auto }}
                - name: {{ .name }}
                  mountPath: "/usr/local/lib/python3.8/site-packages/{{ .module }}"
                {{- end }}
                ...
          volumes:
            {{- if eq .Values.env "dev" }}
            {{- range .Values.codeVolumes.auto }}
            - name: {{ .name }}
              hostPath:
                path: "{{ $.Values.userCodePath }}/{{ .dir }}/{{ .module }}"
            {{- end }}
            {{- end }}
    ...
    

其中的关键部分是 Makefile 能够解析在存储库外部定义的环境变量,并将它们导出到 makefile 上下文中,以便可以使用 --set 将它们传递到 helm 模板上下文中. helm/templates/deployment.yaml 中的部分受到保护,如果它是 运行 in dev.

,则仅尝试获取用户代码挂载