我从kubespray安装了Kubernetes集群-ansible脚本。 现在,我创建了一个带有卷的部署,该卷将作为spec.template.spec.volumes中的hostPath挂载。我已经通过nfs文件系统在所有节点上安装了该卷。 现在,我在k8s文档中阅读了它的不好做法,但需要了解hostPath的危害。 以下是示例yaml文件。
spec:
containers:
- image: test:latest
imagePullPolicy: Always
name: test1
ports:
- containerPort: 4006
protocol: TCP
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- name : test-data
mountPath : /RIC/
- name : test-config
mountPath : /xyz/abc.config
subPath : abc.config
volumes:
- name : test-data
hostPath :
path : /nfs-mount/RIC/
- name : test-config
configMap :
name : test-config
答案 0 :(得分:1)
如果pod崩溃了,那么kubernetes会启动新的pod。新的Pod可能会安排在群集中的其他节点上。在这种情况下,数据将丢失。为了解决此问题,您可能必须向特定节点添加标签。并始终将Pod调度到该标签节点,这样就可以将本地主机路径卷安装到Pod。 在最坏的情况下,如果节点崩溃,那么您将丢失数据。
答案 1 :(得分:1)
每次添加新部署时,首先需要添加一个NFS卷并将其安装在每个节点上。
如果您可以将NFS存储系统添加为存储提供程序,那么Kubernetes将接管大部分任务。如果添加KubernetesPersistence卷对象并将该卷安装到计划了Pod的节点上,则Kubernetes会在存储系统中创建一个卷。
答案 2 :(得分:1)
有一些原因:
从安全的角度来看,在生产集群上允许HostPaths并不是一个好主意,如果您的Pod被黑客入侵,并且某人可以访问您的主机,因为他可以写hostPath,那么整个集群就被黑客入侵了...
使用hostPaths不是可移植的,如果要部署一些有状态集(例如Elasticsearch或某些数据库等),则可以使用kubernetes本地卷提供程序使用相同的路径。
使用本地卷提供程序对其他部署没有用,例如,如果某个节点发生故障,则需要将Pod安排在其他本地可用的卷将不可用的节点上。
因此,直接从kubernetes使用NFS共享,而不是将其用作hosthpath或本地卷。例如:
volumes:
- name: test-data
nfs:
path: /projects/test/dev/data
server: 192.168.1.11
这样,您不必允许hostPaths,也不必自己管理主机上的nfs挂载,也不必管理本地卷等。