K8s PVC动态扩容

1,304 阅读5分钟

这是我参与更文挑战的第7天,活动详情查看: 更文挑战

导读

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

环境版本

[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

  • 创建新存储池
ceph osd pool create kube

# 查看所有pool
[root@master kubernetes]# ceph osd pool ls
rbd
kube
# 或者使用 ceph osd lspools
  • 新建用户
# 为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集群信息
[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
git clone https://github.com/ceph/ceph-csi
  • 修改cm
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
# 创建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授权
# 如果有自定义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" ./)
# 创建必须的 ServiceAccount 和 RBAC ClusterRole/ClusterRoleBinding 资源对象
$ kubectl create -f csi-provisioner-rbac.yaml
$ kubectl create -f csi-nodeplugin-rbac.yaml
# 创建 PodSecurityPolicy
$ kubectl create -f csi-provisioner-psp.yaml
$ kubectl create -f csi-nodeplugin-psp.yaml

部署CSI sidecar

# 将 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
kubectl create -f csi-rbdplugin-provisioner.yaml
# 这里面包含了 6 个 Sidecar 容器: 包括 external-provisioner、external-attacher、csi-resizer、 和 csi-rbdplugin 。
  • 部署rbd csi driver
kubectl ceph-csi create -f csi-rbdplugin.yaml
# Pod 中包含两个容器:CSI node-driver-registrar 和CSI RBD Driver
[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
[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) 是用户对存储的请求。

# 试用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
# 查看pvc和申请成功的pv
kubectl get pvc,pv
  • pod测试
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
[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
# 直接修改yaml文件,将存储大小数字修改后apply
# 或者kubectl edit pvc csi-rbd-pvc,编辑pvc.spec.resource.requests.storage,修改完保存退出。
  • 扩容生效
# csi driver会自动在存储端进行扩容,观察pvc状态变化,一般得耗时几秒钟

mark

# 如上图,可看到pvc成功扩展,describe pvc可查看到pvc resize
# 也可进入pod里查看,挂载点是否已扩容生效