内容简介:Kubernetes 使用 Ceph 存储
本文主要记录一下 Kubernetes 使用 Ceph 存储的相关配置过程,Kubernetes 集群环境采用的 kargo 部署方式,并且所有组件以容器化运行
一、基础环境准备
Kubernetes 集群总共有 5 台,部署方式为 kargo 容器化部署,
采用 kargo 部署时确保配置中开启内核模块加载( kubelet_load_modules: true
)
;Kubernetes 版本为 1.6.4,Ceph 采用最新的稳定版 Jewel
| 节点 | IP | 部署 |
|---|---|---|
| docker1 | 192.168.1.11 | master、monitor、osd |
| docker2 | 192.168.1.12 | master、monitor、osd |
| docker3 | 192.168.1.13 | node、monitor、osd |
| docker4 | 192.168.1.14 | node、osd |
| docker5 | 192.168.1.15 | node、osd |
二、部署 Ceph 集群
具体安装请参考Ceph 笔记(一)、Ceph 笔记(二),以下直接上命令
2.1、部署集群
# 创建集群配置目录 mkdir ceph-cluster && cd ceph-cluster # 创建 monitor-node ceph-deploy new docker1 docker 2 docker3 # 追加 OSD 副本数量 echo "osd pool default size = 5" >> ceph.conf # 安装 ceph ceph-deploy install docker1 docker2 docker3 docker4 docker5 # init monitor node ceph-deploy mon create-initial # 初始化 ods ceph-deploy osd prepare docker1:/dev/sda docker2:/dev/sda docker3:/dev/sda docker4:/dev/sda docker5:/dev/sda # 激活 osd ceph-deploy osd activate docker1:/dev/sda1:/dev/sda2 docker2:/dev/sda1:/dev/sda2 docker3:/dev/sda1:/dev/sda2 docker4:/dev/sda1:/dev/sda2 docker5:/dev/sda1:/dev/sda2 # 部署 ceph cli 工具和秘钥文件 ceph-deploy admin docker1 docker2 docker3 docker4 docker5 # 确保秘钥有读取权限 chmod +r /etc/ceph/ceph.client.admin.keyring # 检测集群状态 ceph health
2.2、创建块设备
# 创建存储池 rados mkpool data # 创建 image rbd create data --size 10240 -p data # 关闭不支持特性 rbd feature disable data exclusive-lock, object-map, fast-diff, deep-flatten -p data # 映射(每个节点都要映射) rbd map data --name client.admin -p data # 格式化块设备(单节点即可) mkfs.xfs /dev/rbd0
三、kubernetes 使用 Ceph
3.1、PV & PVC 方式
传统的使用分布式存储的方案一般为 PV & PVC
方式,也就是说管理员预先创建好相关 PV 和 PVC,然后对应的 deployment 或者 replication 挂载 PVC 来使用
创建 Secret
# 获取管理 key 并进行 base64 编码 ceph auth get-key client.admin | base64 # 创建一个 secret 配置(key 为上条命令生成的) cat << EOF >> ceph-secret.yml apiVersion: v1 kind: Secret metadata: name: ceph-secret data: key: QVFDaWtERlpzODcwQWhBQTdxMWRGODBWOFZxMWNGNnZtNmJHVGc9PQo= EOF kubectl create -f ceph-secret.yml
创建 PV
# monitor 需要多个,pool 和 image 填写上面创建的
cat << EOF >> test.pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-pv
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
rbd:
monitors:
- 192.168.1.11:6789
- 192.168.1.12:6789
- 192.168.1.13:6789
pool: data
image: data
user: admin
secretRef:
name: ceph-secret
fsType: xfs
readOnly: false
persistentVolumeReclaimPolicy: Recycle
EOF
kubectl create -f test.pv.yml
创建 PVC
cat << EOF >> test.pvc.yml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
EOF
kubectl create -f test.pvc.yml
创建 Deployment并挂载
cat << EOF >> test.deploy.yml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: demo
spec:
replicas: 3
template:
metadata:
labels:
app: demo
spec:
containers:
- name: demo
image: mritd/demo
ports:
- containerPort: 80
volumeMounts:
- mountPath: "/data"
name: data
volumes:
- name: data
persistentVolumeClaim:
claimName: test-pvc
EOF
kubectl create -f test.deploy.yml
3.2、StoragaClass 方式
在 1.4 以后,kubernetes 提供了一种更加方便的动态创建 PV 的方式;也就是说使用 StoragaClass 时无需预先创建固定大小的 PV,等待使用者创建 PVC 来使用;而是直接创建 PVC 即可分配使用
创建系统级 Secret
注意: 由于 StorageClass 要求 Ceph 的 Secret type 必须为 kubernetes.io/rbd
,所以上一步创建的 ceph-secret
需要先被删除,然后使用如下命令重新创建;此时的 key 并没有经过 base64
# 这个 secret type 必须为 kubernetes.io/rbd,否则会造成 PVC 无法使用 kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" --from-literal=key='AQCikDFZs870AhAA7q1dF80V8Vq1cF6vm6bGTg==' --namespace=kube-system kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" --from-literal=key='AQCikDFZs870AhAA7q1dF80V8Vq1cF6vm6bGTg==' --namespace=default
创建 StorageClass
cat << EOF >> test.storageclass.yml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: test-storageclass provisioner: kubernetes.io/rbd parameters: monitors: 192.168.1.11:6789,192.168.1.12:6789,192.168.1.13:6789 # Ceph 客户端用户 ID(非 k8s 的) adminId: admin adminSecretName: ceph-secret adminSecretNamespace: kube-system pool: data userId: admin userSecretName: ceph-secret EOF kubectl create -f test.storageclass.yml
关于上面的 adminId 等字段具体含义请参考这里 Ceph RBD
创建 PVC
cat << EOF >> test.sc.pvc.yml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-sc-pvc
annotations:
volume.beta.kubernetes.io/storage-class: test-storageclass
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
EOF
kubectl create -f test.sc.pvc.yml
创建 Deployment
cat << EOF >> test.sc.deploy.yml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: demo-sc
spec:
replicas: 3
template:
metadata:
labels:
app: demo-sc
spec:
containers:
- name: demo-sc
image: mritd/demo
ports:
- containerPort: 80
volumeMounts:
- mountPath: "/data"
name: data
volumes:
- name: data
persistentVolumeClaim:
claimName: test-sc-pvc
EOF
kubectl create -f test.sc.deploy.yml
到此完成,检测是否成功最简单的方式就是看相关 pod 是否正常运行
转载请注明出处,本文采用 CC4.0 协议授权
以上所述就是小编给大家介绍的《Kubernetes 使用 Ceph 存储》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Redis 内存使用优化与存储
- 使用Elasticsearch作为主数据存储
- 如何使用MongoDB存储Docker日志!
- 使用Azure托管磁盘简化云存储管理
- [译] 使用 Jetpack DataStore 进行数据存储
- 配置Hive使用MySql存储元数据
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Python网络编程基础
John Goerzen / 莫迟 等 / 电子工业出版社 / 2007 / 68.00元
《Python网络编程基础》可以作为各层次Python、Web和网络程序的开发人员的参考书,在实际工作中使用书中的技术,效果更佳。一起来看看 《Python网络编程基础》 这本书的介绍吧!