kubernetes通过ceph实现storage

时间:Dec. 16, 2018 分类:

目录:

安装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.py70~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