我是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中有什么可以帮助我实现这一目标?感谢您的帮助或指导。
答案 0 :(得分:0)
您想要的是StatefulSet
,它附带了PVC templates。您肯定需要hostPath
才能处于更糟糕的境地,但是正式的CSI或以前的FlexVolume支持都可以帮助解决该问题。
答案 1 :(得分:0)
我没有在讨论您是否需要使用“部署”与“有状态” 设置PVC模板,因为这超出了问题的范围- 尽管这可能有助于首先进行研究。
一种可能的解决方案是自己管理副本,而不是使用Kubernetes副本功能(因为“所有内容”都没有被复制)。标记问题“ kubernetes-helm”是假设您可以使用头盔模板。
您可以使用以下方法实现您想要的:
values.yaml
文件中定义所有非常见的pod属性。指示代码:
chartname:
pods:
- name: pod1
path: volumeHostpathForPod1
- name: pod2
path: volumeHostpathForPod2
...etc
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 }}
helm install <deployment-name> ./chartname -f values.yaml <--dry-run> <--debug>