赞
踩
PV的属性,比如存储的大小、类型等
创建这种PV需要使用到的存储插件,比如Ceph、NFS等
操作系统 | 主机名 | 配置 | IP |
---|---|---|---|
CentOS 7.9 | master | 2C4G | 192.168.93.101 |
CentOS 7.9 | node1 | 2C4G | 192.168.93.102 |
CentOS 7.9 | node2 | 2C4G | 192.168.93.103 |
CentOS 7.9 | nfs | 2C4G | 192.168.93.104 |
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i "s/.*SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
[root@nfs ~]# yum -y install nfs-utils rpcbind
[root@nfs ~]# mkdir -p /data/nfs_pro
[root@nfs ~]# cat >> /etc/exports << EOF
/data/nfs_pro 192.168.93.0/24(rw,no_root_squash)
EOF
[root@nfs ~]# systemctl restart nfs
# 所有Kubernetes集群中的节点需要安装以下软件包用以支持NFS
yum -y install nfs-utils rpcbind
[root@master ~]# cat nfs-provisioner.yaml # 表示使用Kubernetes核心API的v1版本 apiVersion: v1 # ServiceAccount表示这是一个服务账户资源,用于定义运行在Pod中的进程可以访问权限 kind: ServiceAccount metadata: # 服务账户的名称 name: nfs-provisioner --- # 表示使用基于角色的访问控制(RBAC)的v1版本 apiVersion: rbac.authorization.k8s.io/v1 # 表示这是一个集群角色绑定资源,用于将角色(CLusterRole)绑定到一个或多个用户或组 kind: ClusterRoleBinding # 这是集群角色绑定的名称 metadata: name: nfs-provisioner-clusterrolebinding # 指定了要绑定的角色 roleRef: # rbac.authorization.k8s.io是角色所在的API组 apiGroup: rbac.authorization.k8s.io # 表示这是一个集群级别的角色 kind: ClusterRole # cluster-admin是要绑定的角色,这里给予了nfs-provisioner服务账户非常高的权限 name: cluster-admin # 指定了绑定到这个角色用户或组 subjects: # ServiceAccount表示这是一个服务账户 - kind: ServiceAccount # 服务账号的名称 name: nfs-provisioner # 指定了服务账户所在的命名空间,这里是默认的命名空间 namespace: default --- # 表示这是一个部署资源,用于管理无状态应用的Pod kind: Deployment # apps/v1表示使用应用工作负载API的v1版本 apiVersion: apps/v1 metadata: # Deployment的名字 name: nfs-provisioner # 定义了部署的规格 spec: # 定义了如何识别由这个部署管理的Pod selector: # 指定了Pod必须具有的标签 matchLabels: app: nfs-provisioner # 表示Deployment将运行一个Pod副本 replicas: 1 # 定义了Pod的更新策略 strategy: # 表示在更新时先删除除旧的Pod,然后创建新的Pod type: Recreate template: metadata: labels: app: nfs-provisioner # 定义Pod的规格 spec: # nfs-provisioner指定了Pod将使用的账户 serviceAccount: nfs-provisioner containers: - name: nfs-provisioner # 指定了容器的镜像,这里是一个NFS外部卷预配器的镜像 image: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0 # 定义了容器内部的挂载点 volumeMounts: # nfs-client-root挂载卷的名字 - name: nfs-client-root # 将卷挂载到容器内部的目录/persistentvolumes mountPath: /persistentvolumes # 定义了容器的环境变量 env: # 定义了预配器的名称,这是动态卷预配的关键 - name: PROVISIONER_NAME value: example.com/nfs # NFS_SERVER和NFS_PATH定义了NFS服务器的地址和路径,预配器将从中创建新的NFS持久化 - name: NFS_SERVER value: 192.168.93.104 - name: NFS_PATH value: /data/nfs_pro # 定义Pod中的挂载卷 volumes: # 卷的名字,与容器挂载点中的名字相匹配 - name: nfs-client-root # 定义了NFS卷的类型和配置 nfs: # server和path分别是NFS服务器的地址和路径,与环境变量中的值相同 server: 192.168.93.104 path: /data/nfs_pro
[root@master ~]# kubectl apply -f nfs-provisioner.yaml
serviceaccount/nfs-provisioner created
clusterrolebinding.rbac.authorization.k8s.io/nfs-provisioner-clusterrolebinding created
deployment.apps/nfs-provisioner created
[root@master ~]# cat StorageClass.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: nfs
# 注意:provisioner处写的example.com/nfs应该跟安装nfs provisioner时候的env下的PROVISIONER_NAME的value值保持一致,如下
provisioner: example.com/nfs
allowVolumeExpansion: true # 允许动态扩容
[root@master ~]# kubectl apply -f StorageClass.yaml
storageclass.storage.k8s.io/nfs created
[root@master ~]# cat pvc.yaml
# 定义一个PVC资源对象
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-claim1
spec:
# 访问模式ReadWriteMany表示这个卷可以被多个节点以读写的模式挂载。这是NFS存储的一个常见特性
accessModes: ["ReadWriteMany"]
resources:
requests:
# storage: 1G表示指定了这个PVC请求的存储量大小为1G
storage: 1G
# nfs指定了这个PVC应用使用的存储类(StorageClass)的名称
storageClassName: nfs
[root@master ~]# kubectl apply -f pvc.yaml
persistentvolumeclaim/test-claim1 created
[root@master ~]# cat test-pvc-pod.yaml apiVersion: v1 kind: Pod metadata: name: test-pvc-pod labels: app: busybox spec: containers: - name: busybox image: busybox:1.28 imagePullPolicy: IfNotPresent command: ["sh","-c","sleep 3600"] volumeMounts: - name: data mountPath: /opt volumes: - name: data persistentVolumeClaim: # test-claim1是这个卷将要使用的PVC的名字,这告诉Kubernetes,当Pod被调度到某个节点上时,它应该使用名为test-claim1的PVC来挂在一个持久化到Pod中的/opt目录 claimName: test-claim1
[root@master ~]# kubectl apply -f test-pvc-pod.yaml
pod/test-pvc-pod created
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nfs-provisioner-77cdc7f549-z8csl 1/1 Running 0 31m
test-pvc-pod 1/1 Running 0 46s
# pv和pvc将会自动绑定
[root@master ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-5c73d02d-1083-4d2c-85c7-85c5645c6087 1G RWX Delete Bound default/test-claim1 nfs 14m
[root@master ~]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
test-claim1 Bound pvc-5c73d02d-1083-4d2c-85c7-85c5645c6087 1G RWX nfs 14m
# 在容器里面写个文件,NFS服务器的指定目录下就会有这个
[root@master ~]# kubectl exec -it test-pvc-pod -- sh -c 'date > /opt/time.txt'
[root@master ~]# kubectl exec -it test-pvc-pod -- cat /opt/time.txt
Fri Jul 5 03:15:59 UTC 2024
# 登录到NFS服务器查看
[root@nfs ~]# cat /data/nfs_pro/default-test-claim1-pvc-5c73d02d-1083-4d2c-85c7-85c5645c6087/time.txt
Fri Jul 5 03:15:59 UTC 2024
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。