StorageClass自动创建pv
https://github.com/likaiyuan00/k8s-StorageClass.git
前提安装nfs
1.检查并安装软件
rpm -q rpcbind nfs-utils
yum install -y rpcbind nfs-utils
2.创建共享目录
vim /etc/exports //NFS的配置文件,默认文件内容为空(无任何共享)
/data/testnfs 192.168.48.0/24(rw,sync,no_root_squash)/opt *(rw)
//设置/data/testnfs为共享目录,允许192.168.48.0网段的IP地址主机访问
3.启动服务
systemctl start rpcbind //一定要先开启rpcbind服务
systemctl start nfs //如服务已启动,更改完配置信息后需要重启服务exportfs -v //查看详细的nfs信息
exportfs -r //重读配置文件
showmount -e //查看本机发布的NFS共享目录
showmount -e +IP //查看IP地址发布的NFS共享目录
mount -t nfs 127.0.0.1:/opt /mnt //将NFS服务端127.0.0.1下的/opt挂载到/mnt下
rpcinfo -p localhost //查看rpc注册的端口信息
账户和驱动安装可以理解为干活的

# 表示使用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-hangzhou.aliyuncs.com/lky-deploy/nfs-provisioner:v4.0.0
# 定义了容器内部的挂载点
volumeMounts:
# nfs-client-root挂载卷的名字
- name: nfs-client-root
# 将卷挂载到容器内部的目录/persistentvolumes
mountPath: /persistentvolumes
# 定义了容器的环境变量
env:
# 定义了预配器的名称,这是动态卷预配的关键
- name: PROVISIONER_NAME
value: nfs-name
# NFS_SERVER和NFS_PATH定义了NFS服务器的地址和路径,预配器将从中创建新的NFS持久化
- name: NFS_SERVER
value: 127.0.0.1
- name: NFS_PATH
value: /data/testnfs
# 定义Pod中的挂载卷
volumes:
# 卷的名字,与容器挂载点中的名字相匹配
- name: nfs-client-root
# 定义了NFS卷的类型和配置
nfs:
# server和path分别是NFS服务器的地址和路径,与环境变量中的值相同
server: 127.0.0.1
path: /data/testnfs
StorageClass安装,创建pvc测试是否会自动生成pv

# nfs-storage-class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-data
# 存储分配器的名称
# 对应“nfs-client-provisioner.yaml”文件中env.PROVISIONER_NAME.value
provisioner: nfs-name
# 允许pvc创建后扩容
allowVolumeExpansion: True
parameters:
# 资源删除策略,“true”表示删除PVC时,同时删除绑定的PV
archiveOnDelete: "true"
---
# nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
# 注意,后面Deployment申请资源需要用到此处的名称
name: nfs-pvc
spec:
# 设置资源的访问策略,ReadWriteMany表示该卷可以被多个节点以读写模式挂载;
accessModes:
- ReadWriteMany
# 设置资源的class名称
# 注意,此处的名称必须与“nfs-storage-class.yaml”中的storageClassName相同
storageClassName: nfs-data
# 设置申请的资源大小
resources:
requests:
storage: 100Mi
volumeClaimTemplates pod关联pvc模版有了他甚至pvc都不用手动创建了
# 使用volumeClaimTemplates直接指定pvc,申请pv
apiVersion: v1
kind: Service # 无头Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: registry.cn-hangzhou.aliyuncs.com/lky-deploy/nginx:1.27.5
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates: # 这里不再是volumes,变成了volumeClaimTemplates
- metadata:
name: www # 这个是pvc的名字
spec: # 下面是pvc请求的方式
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
storageClassName: nfs-data #注意需要和StorageClass名字一样不然pvc一直pengding
# volumes:
# - name: test-nfs-pvc
# persistentVolumeClaim:
# claimName: my-test-pvc #使用刚才创建的PVC
创建完StatefulSet自动创建pv和pvc很方便的,而且数据都是独立的
注意点
过程中可能会遇到的问题 ,祝大家都能一次跑通
1 sc的 provisioner: nfs-name 一定要和 provisioner中env.PROVISIONER_NAME.value一样
2 nfs的共享目录要给777权限不然报错 /persistentvolumes 是容器里面的挂载路径
3 waiting for a volume to be created, either by external provisioner “gxf-nfs-storage” or manually created by system administrator
修改/etc/kubernetes/manifests/kube-apiserver.yaml
在 - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key下面添加如下:
- --feature-gates=RemoveSelfLink=false
然后kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
4 The StorageClass "nfs-data" is invalid: provisioner: Forbidden: updates to provisioner are forbidden
sc一旦创建成功,不可以修改文件,然后apply,需要删除后重新apply
5 no persistent volumes available for this claim and no storage class is set
通过volumeClaimTemplates创建pod必须指定sc 需要添加storageClassName: nfs-data,不然pod不知道去那里找pvc
更多推荐




所有评论(0)