为了测试我是否可以使用docker映像在amazon上部署自己编写的软件,我有一个测试周集群。我写了一个小的测试脚本,读取和写入一个文件,看看我是否理解如何部署。我已经成功地在minikube中部署了它,使用了三个副本。副本都使用我本地文件系统上的共享目录,在minikube中,它通过卷
挂载到pod中。下一步是将其部署到eks集群中。然而,我不能让它在几周内工作。问题是pod看不到挂载目录的内容。
这并不完全出乎我的意料,因为在minikube中,我必须首先创建一个挂载到服务器上的本地目录。我没有在周服务器上做类似的事情。我的问题是我应该做些什么来使它工作(如果可能的话)。
我使用这个yaml文件在几周内创建了一个pod:
apiVersion: v1
kind: PersistentVolume
metadata:
name: "pv-volume"
spec:
storageClassName: local-storage
capacity:
storage: "1Gi"
accessModes:
- "ReadWriteOnce"
hostPath:
path: /data/k8s
type: DirectoryOrCreate
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: "pv-claim"
spec:
storageClassName: local-storage
accessModes:
- "ReadWriteOnce"
resources:
requests:
storage: "500M"
---
apiVersion: v1
kind: Pod
metadata:
name: ruudtest
spec:
containers:
- name: ruud
image: MYIMAGE
volumeMounts:
- name: cmount
mountPath: "/config"
volumes:
- name: cmount
persistentVolumeClaim:
claimName: pv-claim
所以我期望是我有一个本地目录,/data/k8s,这在pod中作为路径/config可见。当我应用这个yaml时,我得到一个pod,它给出一个错误消息,表明/data/k8s目录中的数据对pod不可见。
Kubectl在创建卷和claim
之后给我这个信息[rdgon@NL013-PPDAPP015 probeer]$ kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/pv-volume 1Gi RWO Retain Available 15s
persistentvolume/pvc-156edfef-d272-4df6-ae16-09b12e1c2f03 1Gi RWO Delete Bound default/pv-claim gp2 9s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/pv-claim Bound pvc-156edfef-d272-4df6-ae16-09b12e1c2f03 1Gi RWO gp2 15s
这似乎表明一切正常。但是,主节点的文件系统(我在其上运行yaml文件以创建卷)似乎不是pod访问/config目录时所查找的位置。
在EKS上,默认没有名为'local-storage'的存储类。
只有一个'gp2'存储类,当你不指定storageClassName时也会使用。
'gp2'存储类创建一个专用的EBS卷,并在需要时将其连接到Kubernetes节点,因此它不使用本地文件夹。您也不需要手动创建pv,只需要创建pvc:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: "pv-claim"
spec:
storageClassName: gp2
accessModes:
- "ReadWriteOnce"
resources:
requests:
storage: "500M"
---
apiVersion: v1
kind: Pod
metadata:
name: ruudtest
spec:
containers:
- name: ruud
image: MYIMAGE
volumeMounts:
- name: cmount
mountPath: "/config"
volumes:
- name: cmount
persistentVolumeClaim:
claimName: pv-claim
如果你想在Node本身上有一个文件夹,你可以使用'hostPath'卷,你不需要pv或pvc:
apiVersion: v1
kind: Pod
metadata:
name: ruudtest
spec:
containers:
- name: ruud
image: MYIMAGE
volumeMounts:
- name: cmount
mountPath: "/config"
volumes:
- name: cmount
hostPath:
path: /data/k8s
这是一个坏主意,因为如果另一个节点启动,数据将丢失,并且您的pod被移动到新节点。
如果它只用于配置,你也可以使用configMap,并将文件直接放在kubernetes manifest文件中。
apiVersion: v1
kind: ConfigMap
metadata:
name: ruud-config
data:
ruud.properties: |
my ruud.properties file content...
---
apiVersion: v1
kind: Pod
metadata:
name: ruudtest
spec:
containers:
- name: ruud
image: MYIMAGE
volumeMounts:
- name: cmount
mountPath: "/config"
volumes:
- name: cmount
configMap:
name: ruud-config
请检查pv是否已创建及其"边界";通过运行以下命令
kubectl get pv
kubectl get pvc
给出对象是否被正确创建的信息
您引用的本地路径无效。试一试:
apiVersion: v1
kind: Pod
metadata:
name: ruudtest
spec:
containers:
- name: ruud
image: MYIMAGE
volumeMounts:
- name: cmount
mountPath: /config
volumes:
- name: cmount
hostPath:
path: /data/k8s
type: DirectoryOrCreate # <-- You need this since the directory may not exist on the node.