这是我参与更文挑战的第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状态变化,一般得耗时几秒钟
# 如上图,可看到pvc成功扩展,describe pvc可查看到pvc resize
# 也可进入pod里查看,挂载点是否已扩容生效