什么是 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
请注意,您不应在控制平面上 运行 pods,因此您应该在 yaml 文件中将 nodeName: controlplane
替换为 nodeName: worker2
。通常你需要在控制平面上使用 toleration
到 运行 pod,因为它有一个防止 运行 常规 pod 的污点...
我在 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 的副作用,特别是如果您使用 minikube
或 kind
.
我正在尝试了解 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
请注意,您不应在控制平面上 运行 pods,因此您应该在 yaml 文件中将
nodeName: controlplane
替换为nodeName: worker2
。通常你需要在控制平面上使用toleration
到 运行 pod,因为它有一个防止 运行 常规 pod 的污点...我在 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 的副作用,特别是如果您使用 minikube
或 kind
.