【问题标题】:How can I dynamically mount a host directory into a docker desktop k8s deployment on OSX?如何将主机目录动态挂载到 OSX 上的 docker 桌面 k8s 部署中?
【发布时间】:2021-08-21 17:32:55
【问题描述】:

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

路径如何变成动态并不重要,环境变量、配置映射、奇怪的卷挂载魔法等等......

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

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

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

【问题讨论】:

    标签: kubernetes yaml kubernetes-helm docker-desktop


    【解决方案1】:

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

    第一种方法是使用hostPath,其中hostPath卷使用节点的本地磁盘来挂载卷,并在Preferences->Docker Desktop中的文件共享中指定hostPath

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

    【讨论】:

    • 我什至没有考虑过直接在 UI 上添加挂载。我可以要求我的团队指定一个挂载到他们的代码目录,该目录附加到节点上的预定义位置。
    【解决方案2】:

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

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

    • ~/.user.env

      USER_CODE_PATH=/Users/LISTERINE/dev
      
    • 掌舵/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 能够解析它们在存储库之外定义的 env var,并将它们导出到 makefile 上下文中,以便可以使用 --set 将它们传递到 helm 模板上下文中。 helm/templates/deployment.yaml 中的部分受到保护,仅当它在 dev 中运行时才尝试获取用户代码安装。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-08
      • 2019-07-08
      • 1970-01-01
      • 2017-04-15
      • 2014-06-19
      • 2016-11-10
      • 1970-01-01
      相关资源
      最近更新 更多