Kubernetes清单中hostPath中特定于POD的文件夹清单

时间:2018-07-09 07:55:59

标签: kubernetes kubernetes-helm

我是Kubernetes的新手,需要一些帮助。

我正在使用StatefulSet和3个副本。有2个工作节点。

我希望为每个副本提供单独的hostPath,而不是为硬编码的hostPath。另外,hostPath在工作程序节点上也是“本地”的。

例如-

  volumeMounts:
    - mountPath: /usr/local/store
      name: store
volumes:
  - name: store
    hostPath:
      path: /space/myapp/$(POD_NAME)

此处POD_NAME是app-0,app-1,app-2(3个副本)。
很好,因为我们需要在多个工作程序节点上创建/ space / myapp / app-0,/ space / myapp / app-1,/ space / myapp / app-2。

我做了一些阅读,没有发现任何明显的解决方案。
解决方案是不使用副本并使用其自己的硬编码hostPath创建3个单独的POD。但这是不可取的。

请指导一下,Kubernetes中有什么可以帮助我实现这一目标?感谢您的帮助或指导。

2 个答案:

答案 0 :(得分:0)

您想要的是StatefulSet,它附带了PVC templates。您肯定需要hostPath才能处于更糟糕的境地,但是正式的CSI或以前的FlexVolume支持都可以帮助解决该问题。

答案 1 :(得分:0)

  

我没有在讨论您是否需要使用“部署”与“有状态”   设置PVC模板,因为这超出了问题的范围-   尽管这可能有助于首先进行研究。

一种可能的解决方案是自己管理副本,而不是使用Kubernetes副本功能(因为“所有内容”都没有被复制)。标记问题“ kubernetes-helm”是假设您可以使用头盔模板。

您可以使用以下方法实现您想要的:

  1. values.yaml文件中定义所有非常见的pod属性。

指示代码:

chartname:
  pods:
  - name: pod1
    path: volumeHostpathForPod1
  - name: pod2
    path: volumeHostpathForPod2
  ...etc
  1. 在您的chartname/templates/pod.yaml(或等效文件)中

指示代码:

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: "statefulset"
...(other stateful set properties)
spec: #stateful set specs
  template:
    spec: #pod(s) specs
      containers:
{{- range .Values.pods }}
      - ... (common pod properties) 
        name: "pod{{ .name }}"
        volumeMounts:
        - mountPath: /usr/local/store
        name: "storeForPod{{ .name }}"
{{- end }}
      volumes:
{{- range .Values.pods }}
      - name: "storeForPod{{ .name }}"
        hostPath:
          path: "/space/myapp/{{ .path }}"
{{- end }}
  1. 使用helm生成最终的Kubernetes规范。例如。命令:helm install <deployment-name> ./chartname -f values.yaml <--dry-run> <--debug>