这个章节展示了如何使用PersistentVolume配置pod的存储。以下是过程的摘要:
1.集群管理员创建一个由物理存储支持的PersistentVolume。集群管理员不将该卷跟任何pod关联。
2.集群用户创建一个PersistentVolumeClaim,它自动绑定到一个合适的PersistentVolume。
3.创建一个pod使用PersistentVolumeClaim作为存储。
在node上创建一个index.html文件
打开集群节点上的shell。如何打开shell取决于如何设置集群。例如,如果使用的是Minikube,可以使用minikube ssh打开集群节点上的shell。
在shell里创建一个/tmp/data文件目录:
mkdir /tmp/data
在/tmp/data文件目录里创建一个index.html文件:
echo 'Hello from Kubernetes storage' > /tmp/data/index.html
创建一个PersistentVolume
在本次实验,新建一个主机路径 PersistentVolume。kubernetes支持在单节点集群上的开发和测试的主机路径。主机路径PersistentVolume使用节点上的文件或目录模拟网络连接存储。
在生成集群中不能使用主机路径。相反,集群管理员可以提供网络资源,如Google Compute Engine持久磁盘,NFS共享或Amazon弹性块存储卷。集群管理员还可以使用StorageClasses来设置动态配置。
以下是主机路径PersistentVolume配置文件:
kind: PersistentVolume
apiVersion: v1
metadata:
name: task-pv-volume
labels:
type: local
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/tmp/data"
配置文件指定卷/tmp/data在集群的节点。配置也指定了10G大小和ReadWriteOnce访问模式,这意味着卷可以通过单个节点的读写来安装。
创建一个PersistentVolume:
kubectl create -f http://k8s.io/docs/tasks/configure-pod-container/task-pv-volume.yaml
查看PersistentVolume的详细信息:
kubectl get pv tesk-pv-volume
输出展示PersistentVolume的STATUS是Available。这意味着还没有被绑定到PersistentVolumeClaim。
创建一个PersistentVolumeClaim
下一步是创建一个PersistentVolumeClaim。pod使用PersistentVolumeClaim请求物理存储。在本次实验,你创建一个PersistentVolumeClaim,它请求一个至少三个可以为至少一个节点提供读写访问的gibibytes的卷。下面是PersistentVolumeClaim的配置文件:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: task-pv-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
创建一个PersistentVolumeClaim:
kubectl create -f http://k8s.io/docs/tasks/configure-pod-container/task-pv-claim.yaml
创建PersistentVolumeClaim以后,Kubernetes控制面板会查找满足声明要求的PersistentVolume。如果控制面板找到合适的PersistentVolume,它将声明绑定到卷。
重新看一下PersistentVolume:
kubectl get pv tesk-pv-volume
现在输出展示STATUS是Bound。
kubectl get pv task-pv-volume
NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE
task-pv-volume 10Gi RWO Retain Bound default/task-pv-claim 8m
查看PersistentVolumeClaim:
kubectl get pvc tesk-pv-claim
输出展示PersistentVolumeClaim绑定到了你的PersistentVolume,task-pv-volume。
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
task-pv-claim Bound task-pv-volume 10Gi RWO 5s
创建一个pod
下一步是创建一个pod使用PersistentVolumeClaim作为一个卷。
下面是pod的配置文件:
kind: Pod
apiVersion: v1
metadata:
name: task-pv-pod
spec:
volumes:
- name: task-pv-storage
persistentVolumeClaim:
claimName: task-pv-claim
containers:
- name: task-pv-container
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: task-pv-storage
注意pod配置文件指定了PersistentVolumeClaim,但是没有指定PersistentVolume。从pod的角度来看claim是一个卷。
创建一个pod:
kubectl create -f http://k8s.io/docs/tasks/configure-pod-container/task-pv-pod.yaml
验证容器是否运行:
kubectl get pod task-pv-pod
使用shell进入到运行容器的内部:
kubectl exec -it task-pv-pod -- /bin/bash
在shell里面验证nginx是否应用从主机路径卷提供的index.html文件:
root@task-pv-pod:/# apt-get update
root@task-pv-pod:/# apt-get install curl
root@task-pv-pod:/# curl localhost
输出展示了写入到主机路径卷index.html里的内容:
Hello from Kubernetes storage
访问控制
配置存储组ID(GID)只允许pod使用相同的GID进行写操作。不匹配或者丢失GID将引起权限定义错误。为了减少与用户协调的需要,管理员可以使用GID注释PersistentVolume。然后GID自动加到任何使用PersistentVolume的pod。
使用 pv.beta.kubernetes.io/gid注释如下面的例子:
kind: PersistentVolume
apiVersion: v1
metadata:
name: pv1
annotations:
pv.beta.kubernetes.io/gid: "1234"
当pod消耗具有GID注释的persistentVolume时,注释的GID将以与pod的安全的上下文中指定的GID相同的方式应用与pod中所有的容器。每个GID无论是源自PersistentVolume注释还是pod的规范,都会应用与每个container中运行的第一个进程。
注意:当pod消耗PersistentVolume时,与PersistentVolume相关联的GID不存在于pod资源本身。
网友评论