kubernetes通过ceph实现storage
目录:
安装ceph
yum源配置
# 安装epel源
yum install -y epel-release
# 添加ceph源
cat << EOF >> /etc/yum.repos.d/ceph.repo
[ceph-noarch]
name=Ceph noarch packages
baseurl=https://download.ceph.com/rpm-jewel/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
EOF
时间同步
# 安装 ntp 工具
yum install ntp ntpdate ntp-doc -y
# 校对系统时钟
ntpdate 0.cn.pool.ntp.org
安装部署工具
ceph-deploy工具需要使用ssh来自动化部署Ceph各个组件,因此需要保证部署节点能够免密码登录待部署节点
# 安装部署工具
yum update -y && yum install ceph-deploy -y
创建集群配置
# 创建集群配置目录
mkdir ceph-cluster && cd ceph-cluster
# 创建 monitor-node
ceph-deploy new why-01
# 追加 OSD 副本数量(测试虚拟机总共有3台)
echo "osd pool default size = 3" >> ceph.conf
ceph.conf为ceph-deploy工具需要创建一些集群配置信息保存在ceph.conf文件中,每个配置会被复制到每个节点的/etc/ceph/ceph.conf
创建集群
# 安装 ceph
ceph-deploy install why-01 why-02 why-03
# 初始化 monitor node 和 秘钥文件
ceph-deploy mon create-initial
# 在每个个osd节点创建一个目录作为osd存储
mkdir /data
chown -R ceph:ceph /data
# 初始化osd
ceph-deploy osd prepare why-01:/data why-02:/data why-03:/data
# 激活osd
ceph-deploy osd activate why-01:/data why-02:/data why-03:/data
# 部署ceph cli工具和秘钥文件
ceph-deploy admin why-01 why-02 why-03
# 确保秘钥有读取权限
chmod +r /etc/ceph/ceph.client.admin.keyring
# 检测集群状态
ceph health
执行ceph health
的时候可以看到HEALTH_OK
如果需要重新部署可以,更多参考官方文档
ceph-deploy purge {ceph-node} [{ceph-node}]
ceph-deploy purgedata {ceph-node} [{ceph-node}]
ceph-deploy forgetkeys
如果遇到以下报错
[ceph_deploy][ERROR ] RuntimeError: Failed to execute command: rpm -Uvh --replacepkgs http://ceph.com/rpm-hammer/el7/noarch/ceph-release-1-0.el7.noarch.rpm
我看了一下是url不存在导致的,url应该为download.ceph.com
看了一下/usr/bin/ceph-deploy
#!/usr/bin/python2
# EASY-INSTALL-ENTRY-SCRIPT: 'ceph-deploy==1.5.25','console_scripts','ceph-deploy'
__requires__ = 'ceph-deploy==1.5.25'
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.exit(
load_entry_point('ceph-deploy==1.5.25', 'console_scripts', 'ceph-deploy')()
)
使用的python的lib,这边直接修改对应文件/usr/lib/python2.7/site-packages/ceph_deploy/hosts/centos/install.py
70~76行为以下配置
if version_kind == 'stable':
url = 'http://download.ceph.com/rpm-{version}/{repo}/'.format(
version=version,
repo=repo_part,
)
elif version_kind == 'testing':
url = 'http://download.ceph.com/rpm-testing/{repo}/'.format(repo=repo_part)
其他组件创建
# 创建 MDS
ceph-deploy mds create docker1
# 创建 RGW
ceph-deploy rgw create docker1
# 增加 monitor
echo "public network = 192.168.1.0/24" >> ceph.conf
ceph-deploy --overwrite-conf mon create docker2 docker3
# 查看仲裁信息
ceph quorum_status --format json-pretty
创建块设备
# 创建存储池
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
PV&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 apply -f ceph-secret.yml
创建PV
cat << EOF >> test.pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-pv
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteOnce
rbd:
monitors:
- 172.19.0.8:6789
- 172.19.0.9:6789
- 172.19.0.4:6789
pool: data
image: data
user: admin
secretRef:
name: ceph-secret
fsType: xfs
readOnly: false
persistentVolumeReclaimPolicy: Recycle
EOF
kubectl apply -f test.pv.yml
查看一下创建的PV
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
test-pv 2Gi RWO Recycle Available 3m37s
创建PVC
cat << EOF >> test.pvc.yml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
EOF
kubectl create -f test.pvc.yml
查看一下创建的PVC
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
my-mysql Pending 4d1h
test-pvc Bound test-pv 2Gi RWO 2m5s
StoragaClass方式
动态创建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='AQD+fhNcEAQEHBAADjrcc+sNEUkeeknQJj5NVQ==' --namespace=kube-system
kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" --from-literal=key='AQD+fhNcEAQEHBAADjrcc+sNEUkeeknQJj5NVQ==' --namespace=default
创建storage
cat << EOF >> test.storageclass.yml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: test-storageclass
provisioner: kubernetes.io/rbd
parameters:
monitors: 172.19.0.8:6789,172.19.0.9:6789,172.19.0.4: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
更多可以参考官方文档
查看一下创建的storageclasses
$ kubectl get storageclasses
NAME PROVISIONER AGE
test-storageclass kubernetes.io/rbd 17s
创建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:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
EOF
kubectl create -f test.sc.pvc.yml
查看直接创建的PVC
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
my-mysql Pending 4d2h
test-sc-pvc Pending test-storageclass 7s2