1 环境
k8s集群基于kubeadm工具部署,过程参考《kubernetes学习二-kubeadm安装kubernetes集群-单master》
kubernetes版本:1.23.3
主机 | IP | 角色 |
---|---|---|
node1 | 192.168.1.201 | master |
node2 | 192.168.1.202 | node |
node3 | 192.168.1.203 | nfs server |
2 介绍
PV说明:
- 由集群管理员创建和管理
- 设置底层存储,比如使用NFS
- 设置存储容量大小
- 设置访问模式(Access mode)
- 指定Reclaim Policy
- PV不属于任何命名空间,是节点层面的资源
- PV的状态:Available -可用,未绑定PVC;Bound - 已绑定PVC;Terminating -删除中;
PVC说明:
- 由开发团队创建和管理
- 不需要知道底层存储的实现细节
- 指定所需的最低存储容量
- 指定访问模式
- 可选指定PV名称
volumeName
,不指定时自动由kuberntes自动匹配(根据存储容量和访问模式) - PVC和PV的关系是一对一,只能将一个PVC绑定到一个PV上
- PVC属于某个命名空间
- PVC状态:Pending - 待绑定;Bound- 已绑定PVC;Terminatinig-删除中
3 准备NFS服务器
1 | yum -y install nfs-utils rpcbind |
所有kubernetes集群节点安装nfs-utils
1 | yum install -y nfs-utils |
kubernetes集群节点验证nfs服务器挂载点
1 | [root@node1 nfs]# showmount -e 192.168.1.203 |
4 NFS静态供给(Static Provision)
我们提前创建PV,然后通过PVC申请PV并在pod中使用,这种方式叫做静态供给(Static Provision)。
4.1 首先创建PV(PersistentVolume)
1 | apiVersion: v1 |
name
: 定义PV的名称。capacity
: 指定存储的容量accessModes
: 指定访问模式,支持三种模式。ReadWriteOnce标识PV能以read-write模式mount到单个节点,ReadOnlyMany表示PV能以read-only模式mount到多个节点,ReadWriteMany表示PV能以read-write模式mount到多个节点。persistentVolumeReclaimPolicy
: 指定回收策略。Retain
表示需要管理员手工回收即手动删除文件;Recycle
表示清除PV中的数据即删除PVC时直接删除PV中的数据;Delete
表示删除Storage Provider上的对应存储资源,例如 Aws、 EBS、 GCE PD、Azure Disk、OpenStack Cinder Volume等storageClassName
: 指定PV的class为nfs,相当于设置PV的分类。PVC可以指定class申请相应class的PV。nfs
: 指定PV在NFS服务器上的路径
1 | # 创建PV |
4.2 创建PVC(PersistentVolumeClaim)
PVC创建就很简单,只需要指定PV的容量、访问模式、class即可。
1 | apiVersion: v1 |
1 | # 创建PVC |
4.3 POD挂载
1 | apiVersion: apps/v1 |
1 | # 创建Deployment |
2 NFS动态供给(Static Provision)
参考:https://www.cnblogs.com/zhangb8042/p/14252294.html
动态供给,即如果没有满足PVC条件的PV,会动态创建PV。相比静态供给,动态供给由明显的优势:不需要提前创建按PV,减少了管理员的工作量,效率高。
动态供给是通过StorageClass实现的,StorageClass定义了如何创建PV,下面给出NFS实现动态供给的例子。
github地址: https://github.com/kubernetes-retired/external-storage
2.1 下载yaml配置
https://github.com/kubernetes-retired/external-storage/tree/master/nfs
1 | wget https://raw.githubusercontent.com/kubernetes-retired/external-storage/master/nfs-client/deploy/rbac.yaml |
2.2 创建StorageClass
1 | kubectl apply -f class.yaml |
1 | # class.yaml |
2.3 创建 ClusterRole
创建ClusterRole
、ClusterRoleBinding
,Role
和RoleBinding
(如果您在集群上使用 RBAC 授权,这是必需的,这是较新 kubernetes 版本的默认设置)
1 | # rbac.yaml |
2.4 创建Deployment
1 | # deployment.yaml |
1 | # 创建Deployment |
2.5 设置默认存储
设置managed-nfs-storage为kubernetes的默认存储后端
- 我们可以用kubectl patch命令来更新
1 | # 设置managed-nfs-storage为默认存储 |
- 也可以修改class.yaml文件
增加如下2行,设置为默认存储类
1 | apiVersion: storage.k8s.io/v1 |
验证
1 | [root@node1 nfs]# kubectl get sc |
2.6 修改api-server的配置
修改/etc/kubernetes/manifests/kube-apiserver.yaml 文件
添加添加- –feature-gates=RemoveSelfLink=false
1 | [root@master ~]# grep -B 5 'feature-gates' /etc/kubernetes/manifests/kube-apiserver.yaml |
修改后 apiserver会自动重启。
2.7 测试
1 | # test-pvc.yaml |
1 | # 创建PVC |
3 问题汇总
3.1 pvc一直Pengding
现象:
1 | # pvc状态 |
原因:
需修改api-server.yaml配置,添加- –feature-gates=RemoveSelfLink=false
nfs挂载目录需要有权限
- nfs存储类没有配置正确。(我遇到的问题是nfs的depoyment无法正常连接api-server,原因是集群初始化时候flannel的网络配置和默认网络不一致。)
解决办法:
参考 3.2 nfs的deployment异常
3.2 nfs的deployment异常
参考: Kubeadm 部署 使用flannel无法连接service/kubernetes
现象:deployment创建的pod总是异常挂掉或无法正常启动。
1 | # nfs deploy状态 |
1 | # 查看各节点flannel网络配置 |
原因:flanenl网络地址端配置不正确,FLANNEL_NETWORK
和FLANNEL_SUBNET
需要在一个网段。
解决办法:
flannel网络的FLANNEL_NETWORK
和FLANNEL_SUBNET
需要在一个网段,使flannel的默认网段和集群初始化的cni网络在一个网段。重新安装kubernetes 使用默认–pod-network-cidr=10.244.0.0/16 (下面示例均使用101.100.0.0/16)
1 | # 查看flannel.yaml,发现flannel默认网络是10.244.0.0/16 |