k8s pv配置教程

在Kubernetes官网的学习教程:wordpress中,我尝试了手动创建pv并绑定pvc,但是每次申请pvc都要手动添加pv并绑定是一件很麻烦且很容易出错的事情,官方也早就意识到这个问题,提出了动态存储分配,只需要通过storageclass即可实现

本文使用了nfs作为集群存储用于实践,线上建议考虑使用ceph等分布式文件存储系统,nfs搭建教程参考:How to Install NFS Server and Client on Ubuntu 22.04

安装nfs provisioner

  1. 确认nfs服务器在集群节点中可以正常访问
1
2
3
4
# 安装客户端
sudo apt install nfs-common
# 执行命令挂载,确认可正常使用
sudo mount 192.168.0.105:/mnt/nfs_share /mnt/nfs_clientshare
  1. 新建一个目录如nfs-example,创建kustomization.yaml文件

鉴于gfw的影响,建议下载github.com/kubernetes-sigs/nfs-subdir-external-provisioner仓库,并将deploy文件夹提取出来,里面主要是账户创建、角色绑定、命名空间、deployment等配置

1
2
3
4
5
# kustomization.yaml
namespace: nfs-provisioner
resources:
# - github.com/kubernetes-sigs/nfs-subdir-external-provisioner//deploy
- ./deploy
  1. 创建命名空间nfs-provisioner
1
2
3
4
5
# namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: nfs-provisioner
  1. 创建nfs deployment的patch,主要修改image地址、nfs信息,用于后续的合并
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# patch_nfs_details.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nfs-client-provisioner
name: nfs-client-provisioner
spec:
template:
spec:
containers:
- name: nfs-client-provisioner
image: registry.noname.io:5000/sig-storage/nfs-subdir-external-provisioner:v4.0.2
env:
- name: NFS_SERVER
value: <YOUR_NFS_SERVER_IP>
- name: NFS_PATH
value: <YOUR_NFS_SERVER_SHARE>
volumes:
- name: nfs-client-root
nfs:
server: <YOUR_NFS_SERVER_IP>
path: <YOUR_NFS_SERVER_SHARE>
  1. 添加资源并发布

汇总后的kustomization.yaml内容如下所示

1
2
3
4
5
6
7
8
9
10
# kustomization.yaml
namespace: nfs-provisioner
resources:
- ./deploy
- namespace.yaml
patches:
- path: patch_nfs_details.yaml
target:
kind: Deployment
labelSelector: app=nfs-client-provisioner

执行命令

1
2
3
4
# 发布到集群中
kubectl apply -k .
# 查看pod nfs-client-provisioner是否正常运行
kubectl get pods -n nfs-provisioner

到这里,基于nfs的动态存储分配基本可用

wordpress实践

从教程:wordpress下载相关yaml配置

修改wordpress-deployment.yaml以及mysql-deployment.yaml的pvc配置,在spec下添加storageClassName: nfs-client

当然,如果不添加上述命令,可以将storageclass:nfs-client设置成默认,这样一来就不需要改任何配置了

修改nfs-client为默认

  1. 通过patch修改
1
kubectl patch storageclass nfs-client -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
  1. 修改storageclass的配置文件
1
2
3
4
5
...
metadata:
annotations:
storageclass.kubernetes.io/is-default-class: "true"
...

其他操作不再赘述,到这里就结束了

错误处理

  1. chown: changing ownership of ‘/var/lib/mysql/‘: Operation not permitted

这是因为nfs需要添加no_root_squash权限,修改/etc/exports添加,这个权限太大,不适合线上使用

  1. mount: /mnt/nfs_clientshare: bad option; for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount. helper program.

节点没有安装nfs客户端导致的,安装nfs-common即可

参考文档

nfs-subdir-external-provisioner