您的 yaml 上的问题是使用的访问模式,您应该将访问模式更改为ReadWriteMany
允许的访问模式如下:参考链接
ReadWriteOnce
– 卷可以由单个节点以读写方式挂载
ReadOnlyMany
– 卷可以被许多节点以只读方式挂载
ReadWriteMany
– 卷可以被许多节点以读写方式挂载
查看这个非常基本的示例,了解如何在使用 PV/PVC 部署创建的 POD 中的容器之间共享文件内容,以及如何在扩展部署时在副本之间共享文件内容。
首先创建一个持久卷,参考下面的带有 hostPath 配置的 yaml 示例
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv-1
labels:
pv: my-pv-1
spec:
capacity:
storage: 1Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
hostPath:
path: /var/log/mypath
$ kubectl create -f pv.yaml
persistentvolume/my-pv-1 created
其次,使用以下 yaml 示例创建持久卷声明
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc-claim-1
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
selector:
matchLabels:
pv: my-pv-1
$ kubectl create -f pvc.yaml
persistentvolumeclaim/my-pvc-claim-1 created
验证 pv 和 pvc STATUS 是否设置为 BOUND
$ kubectl get persistentvolume
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
my-pv-1 1Gi RWX Retain Bound default/my-pvc-claim-1 62s
$ kubectl get persistentvolumeclaims
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
my-pvc-claim-1 Bound my-pv-1 1Gi RWX 58
第三次在部署的所需两个 Pod 中使用 pvc,请参阅下面的示例 yaml,其中卷安装在多 Pod 部署的两个 Pod 上,busy1 和busy2,其中写入第一个容器的文件在第二个容器中是可读的。
多 pod-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: multipod
name: multipod
spec:
replicas: 1
selector:
matchLabels:
app: multipod
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: multipod
spec:
containers:
- command:
- sleep
- "3600"
image: busybox
name: busy1
volumeMounts:
- name: vol
mountPath: /var/log/mypath
- command:
- sleep
- "3600"
image: busybox
name: busy2
volumeMounts:
- name: vol
mountPath: /var/log/mypath
volumes:
- name: vol
persistentVolumeClaim:
claimName: my-pvc-claim-1
$ kubectl create -f multi-pod-deploy.yaml
deployment.apps/multipod created
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/multipod-5758475c69-fkl57 2/2 Running 0 36s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 37h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/multipod 1/1 1 1 36s
NAME DESIRED CURRENT READY AGE
replicaset.apps/multipod-5758475c69 1 1 1 36s
通过连接到容器 1并写入安装路径上的文件进行测试。
$ kubectl exec -it multipod-5758475c69-fkl57 -c busy1 /bin/sh
/ # df -kh
Filesystem Size Used Available Use% Mounted on
overlay 38.7G 4.1G 34.6G 11% /
tmpfs 64.0M 0 64.0M 0% /dev
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/vda1 38.7G 4.1G 34.6G 11% /dev/termination-log
/dev/vda1 38.7G 4.1G 34.6G 11% /etc/resolv.conf
/dev/vda1 38.7G 4.1G 34.6G 11% /etc/hostname
/dev/vda1 38.7G 4.1G 34.6G 11% /etc/hosts
shm 64.0M 0 64.0M 0% /dev/shm
/dev/vda1 38.7G 4.1G 34.6G 11% /var/log/mypath
tmpfs 7.8G 12.0K 7.8G 0% /var/run/secrets/kubernetes.io/serviceaccount
tmpfs 7.8G 0 7.8G 0% /proc/acpi
tmpfs 64.0M 0 64.0M 0% /proc/kcore
tmpfs 64.0M 0 64.0M 0% /proc/keys
tmpfs 64.0M 0 64.0M 0% /proc/timer_list
tmpfs 64.0M 0 64.0M 0% /proc/timer_stats
tmpfs 64.0M 0 64.0M 0% /proc/sched_debug
tmpfs 7.8G 0 7.8G 0% /proc/scsi
tmpfs 7.8G 0 7.8G 0% /sys/firmware
# cd /var/log/mypath/
/var/log/mypath # date >> file_in_container1.txt
/var/log/mypath # date >> file_in_container1.txt
/var/log/mypath # cat file_in_container1.txt
Tue Feb 4 10:25:32 UTC 2020
Tue Feb 4 10:25:34 UTC 2020
现在在部署中连接第二个容器,它应该从第一个看到文件,如下所示
$ kubectl exec -it multipod-5758475c69-fkl57 -c busy2 /bin/sh
/ # cd /var/log/mypath/
/var/log/mypath # ls
date file_in_container1.txt
/var/log/mypath # cat file_in_container1.txt
Tue Feb 4 10:25:32 UTC 2020
Tue Feb 4 10:25:34 UTC 2020
现在,当我们扩展此部署并创建更多副本时(因为我使用的是 hostPath 而不是 nfs,所以我必须确保所有副本 pod 在同一节点上运行)
$ kubectl scale deployment --replicas=2 multipod
deployment.apps/multipod scaled
$ kubectl get all -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/multipod-5758475c69-7xl9j 2/2 Running 0 47s 192.168.58.112 k8s-node02-calico <none> <none>
pod/multipod-5758475c69-fkl57 2/2 Running 0 21m 192.168.58.111 k8s-node02-calico <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 38h <none>
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/multipod 2/2 2 2 21m busy1,busy2 busybox,busybox app=multipod
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset.apps/multipod-5758475c69 2 2 2 21m busy1,busy2 busybox,busybox app=multipod,pod-template-hash=5758475c69
新副本也能够按预期读取文件。
$ kubectl exec -it multipod-5758475c69-7xl9j /bin/sh
Defaulting container name to busy1.
Use 'kubectl describe pod/multipod-5758475c69-7xl9j -n default' to see all of the containers in this pod.
/ # cd /var/log/mypath/
/var/log/mypath # ls
file_in_container1.txt
/var/log/mypath # cat file_in_container1.txt
Tue Feb 4 10:25:32 UTC 2020
Tue Feb 4 10:25:34 UTC 2020
/var/log/mypath #