PVC扩容

导读

1
本文介绍k8s中部署ceph-csi,并实现动态扩容pvc的操作

环境版本

1
2
3
4
5
6
7
8
[root@master kubernetes]# kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready master 40d v1.18.0
node1 Ready node 40d v1.18.0
node2 Ready node 40d v1.18.0

[root@master kubernetes]# ceph version
ceph version 10.2.11 (e4b061b47f07f583c92a050d9e84b1813a35671e)

配置ceph-csi

  • 创建新存储池
1
2
3
4
5
6
7
ceph osd pool create kube

# 查看所有pool
[root@master kubernetes]# ceph osd pool ls
rbd
kube
# 或者使用 ceph osd lspools
  • 新建用户
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 为kube和ceph-csi创建用户
ceph auth get-or-create client.kube mon 'profile rbd' osd 'profile rbd pool=kube' mgr 'profile rbd pool=kube'

[client.kube]
key = AQBnz11fclr********zmr8ifftAHQbTw==

# 后面配置参数中用到的key获取
ceph auth get client.kube
[root@master kubernetes]# ceph auth get client.kube
exported keyring for client.kube
[client.kube]
key = AQB/8jlfbtSk*******04A/Xp/eWOEx67pw==
caps mon = "allow r"
caps osd = "allow class-read object_prefix rbd_children, allow rwx pool=kube"
  • 获取ceph集群信息
1
2
3
4
5
6
7
8
9
[root@master kubernetes]# ceph mon dump
dumped monmap epoch 1
epoch 1
fsid 98564ee8-31bc-4ed6-9c31-cee****a8c
last_changed 2020-08-16 22:11:42.371294
created 2020-08-16 22:11:42.371294
0: 192.168.100.11:6789/0 mon.master

# 需要用到fsid:ceph集群的ID,监控阶段信息, 192.168.100.11:6789
  • 拉取ceph-csi
1
git clone https://github.com/ceph/ceph-csi
  • 修改cm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cd ceph-csi/deploy/rbd/kubernetes

[root@master kubernetes]# cat csi-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
config.json: |-
[
{
"clusterID": "98564ee8-31bc-4ed6-9c31-cee***ca8c",
"monitors": [
"192.168.100.11:6789"
]
}
]
metadata:
name: ceph-csi-config

# 根据自身需要是否需要单独创建ns,本例全是默认ns下
kubectl apply -f csi-config-map.yaml
  • 新建secret
1
2
3
4
5
6
7
8
9
10
11
# 创建csi-rbd-secret.yaml
[root@master kubernetes]# cat csi-rbd-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
stringData:
userID: kube
userKey: AQB/8jlfbtSkIxAAb*******/Xp/eWOEx67pw==

# kubectl apply -f csi-rbd-secret.yaml
  • RBAC授权
1
2
3
4
# 如果有自定义ns,则在此修改
$ sed -i "s/namespace: default/namespace: ceph-csi/g" $(grep -rl "namespace: default" ./)
$ sed -i -e "/^kind: ServiceAccount/{N;N;a\ namespace: ceph-csi # 输入到这里的时候需要按一下回车键,在下一行继续输入
}" $(egrep -rl "^kind: ServiceAccount" ./)
1
2
3
# 创建必须的 ServiceAccount 和 RBAC ClusterRole/ClusterRoleBinding 资源对象
$ kubectl create -f csi-provisioner-rbac.yaml
$ kubectl create -f csi-nodeplugin-rbac.yaml
1
2
3
# 创建 PodSecurityPolicy
$ kubectl create -f csi-provisioner-psp.yaml
$ kubectl create -f csi-nodeplugin-psp.yaml

部署CSI sidecar

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 将 csi-rbdplugin-provisioner.yaml 和 csi-rbdplugin.yaml 中的 kms 部分配置注释

1、csi-rbdplugin-provisioner.yaml注释如下:
137 #- name: ceph-csi-encryption-kms-config
138 # mountPath: /etc/ceph-csi-encryption-kms-config/

178 #- name: ceph-csi-encryption-kms-config
179 # configMap:
180 # name: ceph-csi-encryption-kms-config

2、csi-rbdplugin.yaml注释如下:
89 #- name: ceph-csi-encryption-kms-config
90 # mountPath: /etc/ceph-csi-encryption-kms-config/

153 #- name: ceph-csi-encryption-kms-config
154 # configMap:
155 # name: ceph-csi-encryption-kms-config
  • 部署csi-rbdplugin-provisioner
1
2
kubectl create -f csi-rbdplugin-provisioner.yaml
# 这里面包含了 6 个 Sidecar 容器: 包括 external-provisioner、external-attacher、csi-resizer、 和 csi-rbdplugin 。
  • 部署rbd csi driver
1
2
kubectl ceph-csi create -f csi-rbdplugin.yaml
# Pod 中包含两个容器:CSI node-driver-registrar 和CSI RBD Driver
1
2
3
4
5
6
[root@master kubernetes]# kubectl get pod |grep csi-rbdplugin
csi-rbdplugin-c28gp 3/3 Running 0 8h
csi-rbdplugin-provisioner-7dfbc5fc7d-frwxz 6/6 Running 0 8h
csi-rbdplugin-provisioner-7dfbc5fc7d-q5ljg 6/6 Running 0 8h
csi-rbdplugin-provisioner-7dfbc5fc7d-v8v49 6/6 Running 0 8h
csi-rbdplugin-x5rkk 3/3 Running 0 8h
  • 创建Storageclass
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@master kubernetes]# cat storageclass.yaml 
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
clusterID: 98564ee8-31bc-4ed6-9c31-cee1e15eca8c
pool: kube
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
csi.storage.k8s.io/provisioner-secret-namespace: default
csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
csi.storage.k8s.io/controller-expand-secret-namespace: default
csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
csi.storage.k8s.io/node-stage-secret-namespace: default
csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- discard

# 这里的clusterID对应上面查询的fsid
# imageFeatures用来确定创建的image特性,如不指定就会使用RBD内核中的特征列表,但linux不一定支持所有特征所以这里需要限制下。
kubectl apply -f storgeclass.yaml
[root@master kubernetes]# kubectl get sc |grep csi
csi-rbd-sc rbd.csi.ceph.com Delete Immediate true 8h

试用ceph-csi

Kubernetes通过persistentVolume子系统为用户和管理员提供了一组 API,将存储如何供应的细节从其如何被使用中抽象出来,其中PV(PersistentVolume)是实际的存储,pvc(PersistentVolumeClaim) 是用户对存储的请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 试用ceph-csi仓库自带的示例来演示
cd ceph-csi/examples/rbd
# 创建pvc,自动申请对应pv
kubectl apply -f pvc.yaml
[root@master rbd]# cat pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc

# 创建pod
kubectl apply -f pod.yaml
[root@master rbd]# cat pod.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: csi-rbd-demo-pod
spec:
containers:
- name: web-server
image: nginx
volumeMounts:
- name: mypvc
mountPath: /var/lib/www/html
volumes:
- name: mypvc
persistentVolumeClaim:
claimName: rbd-pvc
readOnly: false
1
2
# 查看pvc和申请成功的pv
kubectl get pvc,pv
  • pod测试
1
2
3
4
5
6
7
8
kubectl exec -it csi-rbd-demo-pod bash
root@csi-rbd-demo-pod:/# cd /var/lib/www/
root@csi-rbd-demo-pod:/var/lib/www# ls -l
total 4
drwxrwxrwx 3 root root 4096 Sep 14 09:09 html
root@csi-rbd-demo-pod:/var/lib/www# echo "https://fuckcloudnative.io" > sealos.txt
root@csi-rbd-demo-pod:/var/lib/www# cat sealos.txt
https://fuckcloudnative.io
  • 查看ceph pool中的rbd images
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@master rbd]# rbd ls -p kube
csi-vol-60e0cf1b-fd5d-11ea-82ec-c2a930d7d7e0
csi-vol-928bae1f-fd5e-11ea-82ec-c2a930d7d7e0
# 2个的原因是之前扩容占用了个

[root@master rbd]# rbd info csi-vol-60e0cf1b-fd5d-11ea-82ec-c2a930d7d7e0 -p kube
rbd image 'csi-vol-60e0cf1b-fd5d-11ea-82ec-c2a930d7d7e0':
size 2048 MB in 512 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.25a0fa6552204
format: 2
features: layering
flags:
[root@master rbd]# rbd info csi-vol-928bae1f-fd5e-11ea-82ec-c2a930d7d7e0 -p kube
rbd image 'csi-vol-928bae1f-fd5e-11ea-82ec-c2a930d7d7e0':
size 3072 MB in 768 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.25a0fb1419ae9
format: 2
features: layering
flags:

# 可以看到对 image 的特征限制生效了,这里只有layering。
# 一个2G,一个3G
# 实际上这个 image 会被挂载到 node 中作为一个块设备,可以通过 rbd 命令查看映射信息:
[root@node1 ~]# rbd showmapped
id pool image snap device
0 kube csi-vol-928bae1f-fd5e-11ea-82ec-c2a930d7d7e0 - /dev/rbd0
[root@node1 ~]# lsblk -l |grep rbd
rbd0 253:0 0 3G 0 disk /var/lib/kubelet/pods/a6d918de-526b-43c0-ae2e-1a271dd4d471/volumes/kubernetes.io~csi/pvc-ca05d200-f7f7-4b1a-ac05-7be3eb71bd6f/mount

扩容pvc

  • 扩展pvc
1
2
# 直接修改yaml文件,将存储大小数字修改后apply
# 或者kubectl edit pvc csi-rbd-pvc,编辑pvc.spec.resource.requests.storage,修改完保存退出。
  • 扩容生效
1
# csi driver会自动在存储端进行扩容,观察pvc状态变化,一般得耗时几秒钟

mark

1
2
# 如上图,可看到pvc成功扩展,describe pvc可查看到pvc resize
# 也可进入pod里查看,挂载点是否已扩容生效
-------------本文结束感谢您的阅读-------------
原创技术分享,感谢您的支持。