AVa*_*arf 5 kubernetes kubernetes-pvc kubernetes-pod
我们在 K8s 上运行的平台有不同的组件。我们需要在其中两个组件(comp-A 和 comp-B)之间共享存储,但我们错误地为此定义了 PV 和 PVC ReadWriteOnce,即使这两个组件在不同的节点上运行,一切正常,我们能够从两个组件读取和写入存储。
根据 K8s 文档,ReadWriteOnce可以挂载到一个节点,我们必须使用ReadWriteMany:
所以我想知道为什么一切正常,而它不应该?
更多信息:我们使用 NFS 进行存储,我们没有使用动态配置,下面是我们如何定义我们的 pv 和 pvc(我们使用 helm):
- apiVersion: v1
kind: PersistentVolume
metadata:
name: gstreamer-{{ .Release.Namespace }}
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
mountOptions:
- hard
- nfsvers=4.1
nfs:
server: {{ .Values.global.nfsserver }}
path: /var/nfs/general/gstreamer-{{ .Release.Namespace }}
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gstreamer-claim
namespace: {{ .Release.Namespace }}
spec:
volumeName: gstreamer-{{ .Release.Namespace }}
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
Run Code Online (Sandbox Code Playgroud)
一些 kubectl 命令的输出:
$ kubectl get -n 149 pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
gstreamer-claim Bound gstreamer-149 10Gi RWO 177d
$ kubectl get -n 149 pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
gstreamer-149 10Gi RWO Recycle Bound 149/gstreamer-claim 177d
Run Code Online (Sandbox Code Playgroud)
我认为它会以某种方式处理它,因为 pod 唯一需要做的就是连接到该 IP。
关于accessMode,这是非常具有误导性的概念,尤其是在NFS.
在 Kubernetes Persistent Volume 文档中提到它NFS支持所有类型的访问。RWO,RXX和RWX。
然而accessMode就像matching criteria,一样storage size。它在OpenShift 访问模式文档中有更好的描述
A
PersistentVolume可以以资源提供者支持的任何方式挂载在主机上。提供者具有不同的能力,每个 PVaccess modes被设置为该特定卷支持的特定模式。例如,NFS 可以支持多个read-write客户端,但特定的 NFS PV 可能在服务器上以只读形式导出。每个 PV 都有自己的一组访问模式来描述该特定 PV 的功能。
声明与具有类似访问模式的卷相匹配。仅有的两个匹配标准是访问模式和大小。声明的访问模式代表一个请求。因此,您可能会获得更多,但绝不会更少。例如,如果声明请求 RWO,但唯一可用的卷是 NFS PV (RWO+ROX+RWX),则该声明将匹配 NFS,因为它支持 RWO。
总是首先尝试直接匹配。卷的模式必须匹配或包含比您请求的更多的模式。大小必须大于或等于预期的大小。如果两种类型的卷(例如 NFS 和 iSCSI)具有相同的访问模式集,则它们中的任何一个都可以将声明与这些模式匹配。卷类型之间没有排序,也无法选择一种类型而不是另一种类型。
所有具有相同模式的卷被分组,然后按大小排序,从最小到最大。活页夹获取具有匹配模式的组,并按大小顺序迭代每个组,直到一个大小匹配。
在下一段中:
卷
AccessModes是卷功能的描述符。它们不是强制约束。存储提供程序负责因无效使用资源而导致的运行时错误。
例如,NFS 提供 ReadWriteOnce 访问模式。如果要使用卷的 ROX 功能,则必须将声明标记为只读。提供程序中的错误在运行时显示为安装错误。
另一个例子是您可以选择几个,AccessModes因为它不是约束而是匹配条件。
$ cat <<EOF | kubectl create -f -
> apiVersion: v1
> kind: PersistentVolumeClaim
> metadata:
> name: exmaple-pvc
> spec:
> accessModes:
> - ReadOnlyMany
> - ReadWriteMany
> - ReadWriteOnce
> resources:
> requests:
> storage: 1Gi
> EOF
Run Code Online (Sandbox Code Playgroud)
或根据 GKE 示例:
$ cat <<EOF | kubectl create -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: exmaple-pvc-rwo-rom
spec:
accessModes:
- ReadOnlyMany
- ReadWriteOnce
resources:
requests:
storage: 1Gi
EOF
persistentvolumeclaim/exmaple-pvc-rwo-rom created
Run Code Online (Sandbox Code Playgroud)
PVC输出
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
exmaple-pvc Pending standard 2m18s
exmaple-pvc-rwo-rom Bound pvc-d704d346-42b3-4090-af96-aebeee3053f5 1Gi RWO,ROX standard 6s
persistentvolumeclaim/exmaple-pvc created
Run Code Online (Sandbox Code Playgroud)
exmaple-pvc处于Pending默认 GKE 状态,GCEPersistentDisk不支持 RreadWriteMany。
Warning ProvisioningFailed 10s (x5 over 69s) persistentvolume-controller Failed to provision volume with StorageClass "standard": invalid AccessModes [ReadOnlyMany ReadWriteMany ReadWr
iteOnce]: only AccessModes [ReadWriteOnce ReadOnlyMany] are supported
Run Code Online (Sandbox Code Playgroud)
但是exmaple-pvc-rwo-rom创建了第二个 pvc ,您可以看到它有 2 个访问模式RWO, ROX。
简而言之accessMode,更像是对 PVC/PV 的要求Bind。如果NFS它提供所有access modes绑定RWO满足要求,那么它将作为 RWMNFS提供该功能。
希望它回答清楚一点。
此外,您可以检查有关 accessMode 的其他StackOverflow 线程
| 归档时间: |
|
| 查看次数: |
2031 次 |
| 最近记录: |