什么是 Kubernetes 卷中的访问模式

What are AccessModes in Kubernetes Volumes

我正在尝试了解 Kubernetes 的访问模式 PersistentVolumes

根据 Kubernetes 文档,访问模式为:

ReadWriteOnce -- the volume can be mounted as read-write by a single node
ReadOnlyMany -- the volume can be mounted read-only by many nodes
ReadWriteMany -- the volume can be mounted as read-write by many nodes

音量插件 HostPath 支持 ReadWriteOnce

我有一个 1 controlplane and 1 worker1 node 的 K8s 集群,我按照以下配置在同一个 namespace 中为每个节点、pv、pvc 部署了两个 Pods。不同节点上的 pods 运行 都可以读写本地路径 /tmp/test.

根据我的理解,这不应该发生。只有一个节点应该能够读写,而另一个节点应该只能读取。

谁能解释一下这里发生了什么,如果可能请提供 examples/blogs 以查看 RWO, RWX, ROX 之间的区别?大部分的博客,只是简单的说说PV、PVC和访问方式。

apiVersion: v1
kind: Pod
metadata:
  name: pod2
spec:
  nodeName: controlplane
  containers:
  - image: nginx
    name: pod2
    volumeMounts:
      - name: vol
        mountPath: /usr/share/nginx/html
  volumes:
  - name: vol
    persistentVolumeClaim:
      claimName: pvc
---
apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  nodeName: worker1
  containers:
  - image: nginx
    name: pod1
    volumeMounts:
      - name: vol
        mountPath: /usr/share/nginx/html
  volumes:
  - name: vol
    persistentVolumeClaim:
      claimName: pvc
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /tmp/test
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  1. 请注意,您不应在控制平面上 运行 pods,因此您应该在 yaml 文件中将 nodeName: controlplane 替换为 nodeName: worker2。通常你需要在控制平面上使用 toleration 到 运行 pod,因为它有一个防止 运行 常规 pod 的污点...

  2. 我在 Google Kubernetes Engine (gke) 上尝试了你的 yaml,我必须替换 nodeName 字段才能使其工作:

diff example.yaml example-gke.yaml 
6c6
<   nodeName: controlplane
---
>   nodeName: gke-qserv-dev-worker-pool-a64a-01bc5238-3zl9 
23c23
<   nodeName: worker1
---
>   nodeName: gke-qserv-dev-worker-pool-a64a-01bc5238-23t3 

如您所见,k8s 拒绝创建 pod2:

kubectl get pods
NAME                                   READY   STATUS              RESTARTS   AGE
pod1                                   1/1     Running             0          6m27s
pod2                                   0/1     ContainerCreating   0          6m27s

这是我收到的消息:

kubectl describe pod pod2 | tail -n 1
  Warning  FailedAttachVolume  7m28s                 attachdetach-controller                                Multi-Attach error for volume "pvc-2fb657ce-4678-4e92-9f64-e4b46b9a3ec7" Volume is already used by pod(s) pod1

因此,如您所见,您不能在两个不同的 pods 运行ning 上的两个不同节点上安装 PV。所以你得到的不是常规的 k8s 行为。这可能是您的存储 class 的副作用,特别是如果您使用 minikubekind.