【问题标题】:Use kustomize to set hostPath path使用 kustomize 设置 hostPath 路径
【发布时间】:2020-09-03 11:39:50
【问题描述】:

是否可以使用 kustomize 从环境变量中指定卷 hostPath?

我有一个 Kubernetes 清单,它描述了由一个容器组成的部署。 在开发过程中,我使用不同的图像(包含开发工具)并将代码从我的主机安装到容器中。这样我就可以更改代码而无需重新部署。

我正在使用 patchStategicMerge 将生产映像替换为我想在开发期间使用的映像,并将代码安装到容器中,即

kustomization.yaml

kind: Kustomization

bases:
- ../../base

patchesStrategicMerge:
- my-service.yaml

我的服务.yaml

---
apiVersion: apps/v1
...
...
    spec:
      containers:
        - name: myservice
          image: myservice-dev-image:1.0.0
          command: ['CompileDaemon',  '--build=make build', '--command=./myservice']
          volumeMounts:
          - name: code
            mountPath: /go/src/app
      volumes:
      - name: code
        hostPath:
          path: /source/mycodepath/github.com/myservice

我想做的是通过环境变量使路径可配置,这样我就不必将我的特定路径(/source/mycodepath/)检查到 git 中,以便其他开发人员可以轻松使用在他们自己的环境中。

是否可以使用 kustomize 做到这一点?

【问题讨论】:

  • 我不知道如何使用环境变量来做到这一点,但可以定义具有不同路径的覆盖。查看 Kustomize 叠加层。这是一个使用覆盖github.com/kubernetes-sigs/kustomize/tree/master/examples/…
  • 我是否正确,您的问题可以简化为“如何将本地路径(从我的笔记本电脑)安装到 pod?” ,另外,你在哪里运行 pod?你是在独立的 k8s 上运行它,还是直接在你的主机/笔记本电脑/PC(minikube 等)上运行它,还是像 GKE、EKS 等一样托管?
  • @Nick 不完全是。我知道如何从我的笔记本电脑安装本地路径。问题出在我的笔记本电脑上,路径可能是 /users/bob/github/somecode,而在同事的笔记本电脑上,路径可能是 /users/sue/github/mycode。如果我使用叠加层,我可以在叠加层中定义我的路径。但我不想将它检查到 git 中。在 docker-compose 中,我们通过使用相对路径来解决这个问题,但这似乎不适用于 k8s
  • @JustinTamblyn 谢谢。我正在使用叠加层。问题是如何创建不同开发人员可以共享的覆盖,而无需修改卷路径。使用变量或相对路径会有所帮助。
  • @CoderJones 我想我明白了。我会把一些东西放在一起作为答案

标签: kubernetes kustomize


【解决方案1】:

创建以下目录结构

  • k8s
  • k8s/基础
  • k8s/叠加层
  • k8s/overlays/bob
  • k8s/overlays/sue

首先我们需要创建基础。基础是默认模板,它提供适用于两个人的位。在k8s/base 创建一个名为app.yaml 的文件并填充以下内容(实际上将您的粘贴到此处。您可以将其他常见位也放入其中,并用--- 和新行分隔)。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: myservice
  namespace: default
spec:
  strategy:
    type: RollingUpdate
  replicas: 1
  template:
    metadata:
      labels:
        name: myservice
        app: myservice
    spec:
      containers:
        - name: myservice
          image: myservice-dev-image:1.0.0
          command: ['CompileDaemon',  '--build=make build', '--command=./myservice']
          volumeMounts:
          - name: code
            mountPath: /go/src/app
      volumes:
      - name: code
        hostPath:
          path: /xxx

接下来在同一目录 (k8s/base) 中创建另一个名为 kustomization.yaml 的文件并填充:

resources:
 - app.yaml

接下来我们将创建两个叠加层:一个给 Bob,一个给 Sue。

k8s/overlays/bob 中,我们将 Bob 的自定义更改创建为 app.yaml 并填充以下内容:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: myservice
  namespace: default
spec:
  template:
    spec:
      volumes:
      - name: code
        hostPath:
          path: /users/bob/code

现在还在k8s/overlays/bob 中创建另一个名为kustomization.yaml 的文件,内容如下:

resources:
  - ../../base
patchesStrategicMerge:
  - app.yaml

我们可以将k8s/overlays/bob中的两个文件复制到k8s/overlays/sue目录下,只需更改volumes:位中的路径即可。

接下来我们需要执行kustomize build 来生成结果版本 - bob 和 sue。

如果k8s 目录在你的代码目录中,打开终端(安装 Kustomize 并运行:

kustomize build k8s/overlays/bob

这应该会向您展示 Bob 的定制化将是什么样子:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: myservice
  namespace: default
spec:
  replicas: 1
  strategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: myservice
        name: myservice
    spec:
      containers:
      - command:
        - CompileDaemon
        - --build=make build
        - --command=./myservice
        image: myservice-dev-image:1.0.0
        name: myservice
        volumeMounts:
        - mountPath: /go/src/app
          name: code
      volumes:
      - hostPath:
          path: /users/bob/code
        name: code

要应用,您可以运行:

kustomize build k8s/overlays/bob | kubectl apply -f -

要申请 Sue,您可以运行:

kustomize build k8s/overlays/sue| kubectl apply -f -

Yaml 对空格很敏感,我不确定这是否适合 Stackoverflow 的答案,所以我也将其放在 Github 上:https://github.com/just1689/kustomize-local-storage

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2016-06-30
    • 2012-01-21
    • 2017-08-02
    • 1970-01-01
    相关资源
    最近更新 更多