一、 写作背景
近来工作需要,预将公司现有应用服务 Docker
化,并使用 Kubernetes
进行统一资源编排,现将部署过程记录一下。
Rook 是专用于 Cloud-Native 环境的文件、块、对象存储服务。它实现了一个自动管理的、自动扩容的、自动修复的分布式存储服务。Rook 支持自动部署、启动、配置、分配、扩容/缩容、升级、迁移、灾难恢复、监控以及资源管理。为了实现所有这些功能,Rook 需要依赖底层的容器编排平台,例如 kubernetes、CoreOS 等。Rook 目前支持 Ceph、NFS、Minio Object Store、Edegefs、Cassandra、CockroachDB 存储的搭建,后期会支持更多存储方案。
Ceph 是一个开源的分布式存储系统,包括对象存储、块设备、文件系统。它具有高可靠性、安装方便、管理简便、能够轻松管理海量数据。Ceph 存储集群具备了企业级存储的能力,它通过组织大量节点,节点之间靠相互通讯来复制数据、并动态地重分布数据,从而达到高可用分布式存储功能。
OSD至少3个节点,直接使用裸盘而不使用分区或者文件系统的方式性能最好。
二、 系列文章
- 快速搭建Kubernetes高可用集群一 基础环境初始化
- 快速搭建Kubernetes高可用集群二 Kubeadm 初始化集群
- 快速搭建Kubernetes高可用集群三 Ingress、Dashboard、Metrics-server
- 快速搭建Kubernetes高可用集群四 Rook-Ceph
- 快速搭建Kubernetes高可用集群五 Harbor
- 快速搭建Kubernetes高可用集群六 Prometheus
- 快速搭建Kubernetes高可用集群七 ELK-stack
三、 环境准备
3.1 下载项目文件
3.2 下载 docker image
为加快访问速度,将镜像从 dock.io 等官方网站上同步到阿里云的镜像库,并设置为公开权限。使用命令为:
docker pull rook/ceph:v1.4.2
docker tag rook/ceph:v1.4.2 registry.cn-beijing.aliyuncs.com/fcu3dx/rook-ceph:v1.4.2
docker push registry.cn-beijing.aliyuncs.com/fcu3dx/rook-ceph:v1.4.2
直接执行以下命令,下载所有镜像
docker pull registry.cn-beijing.aliyuncs.com/fcu3dx/rook-ceph:v1.4.2
docker pull registry.cn-beijing.aliyuncs.com/fcu3dx/ceph-ceph:v15.2.4
docker pull registry.cn-beijing.aliyuncs.com/fcu3dx/cephcsi:v3.1.0
docker pull registry.cn-beijing.aliyuncs.com/fcu3dx/csi-node-driver-registrar:v1.2.0
docker pull registry.cn-beijing.aliyuncs.com/fcu3dx/csi-resizer:v0.4.0
docker pull registry.cn-beijing.aliyuncs.com/fcu3dx/csi-provisioner:v1.6.0
docker pull registry.cn-beijing.aliyuncs.com/fcu3dx/csi-snapshotter:v2.1.1
docker pull registry.cn-beijing.aliyuncs.com/fcu3dx/csi-attacher:v2.1.0
docker tag registry.cn-beijing.aliyuncs.com/fcu3dx/rook-ceph:v1.4.2 rook/ceph:v1.4.2
docker tag registry.cn-beijing.aliyuncs.com/fcu3dx/ceph-ceph:v15.2.4 ceph/ceph:v15.2.4
docker tag registry.cn-beijing.aliyuncs.com/fcu3dx/cephcsi:v3.1.0 quay.io/cephcsi/cephcsi:v3.1.0
docker tag registry.cn-beijing.aliyuncs.com/fcu3dx/csi-node-driver-registrar:v1.2.0 quay.io/k8scsi/csi-node-driver-registrar:v1.2.0
docker tag registry.cn-beijing.aliyuncs.com/fcu3dx/csi-resizer:v0.4.0 quay.io/k8scsi/csi-resizer:v0.4.0
docker tag registry.cn-beijing.aliyuncs.com/fcu3dx/csi-provisioner:v1.6.0 quay.io/k8scsi/csi-provisioner:v1.6.0
docker tag registry.cn-beijing.aliyuncs.com/fcu3dx/csi-snapshotter:v2.1.1 quay.io/k8scsi/csi-snapshotter:v2.1.1
docker tag registry.cn-beijing.aliyuncs.com/fcu3dx/csi-attacher:v2.1.0 quay.io/k8scsi/csi-attacher:v2.1.0
docker rmi registry.cn-beijing.aliyuncs.com/fcu3dx/rook-ceph:v1.4.2
docker rmi registry.cn-beijing.aliyuncs.com/fcu3dx/ceph-ceph:v15.2.4
docker rmi registry.cn-beijing.aliyuncs.com/fcu3dx/cephcsi:v3.1.0
docker rmi registry.cn-beijing.aliyuncs.com/fcu3dx/csi-node-driver-registrar:v1.2.0
docker rmi registry.cn-beijing.aliyuncs.com/fcu3dx/csi-resizer:v0.4.0
docker rmi registry.cn-beijing.aliyuncs.com/fcu3dx/csi-provisioner:v1.6.0
docker rmi registry.cn-beijing.aliyuncs.com/fcu3dx/csi-snapshotter:v2.1.1
docker rmi registry.cn-beijing.aliyuncs.com/fcu3dx/csi-attacher:v2.1.0
3.3 添加新硬盘并识别
在集群中至少有三个节点可用,满足ceph高可用要求,我这里是3Master+6Works
节点,使用6W
节点即可满足使用,在这6
个Workers
节点上和添加一块容量相同的磁盘(我的是虚拟机,添加的是虚拟磁盘),挂载到/dev/sdb
,作为 OSD 盘,提供存储空间,添加完成后扫描磁盘,确保主机能识别到。
在虚拟机中,直接添加磁盘,不重启系统,使用 lsblk 没有发现新添加的磁盘,需要重新扫描一下磁盘。
# 扫描磁盘
for host in `ls /sys/class/scsi_host/`;do echo "- - - " > /sys/class/scsi_host/$host/scan; done
# 重新扫描磁盘
for scsi_device in `ls /sys/class/scsi_device/`; do echo 1 > /sys/class/scsi_device/$scsi_device/device/rescan; done
# 查看磁盘
lsblk
3.4 修改配置文件
对 cluster.yml 文件进行修改,启用一些服务
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
name: rook-ceph
namespace: rook-ceph
spec:
cephVersion:
image: ceph/ceph:v15.2.4
allowUnsupported: false
dataDirHostPath: /var/lib/rook
skipUpgradeChecks: false
continueUpgradeAfterChecksEvenIfNotHealthy: false
mon:
count: 6
allowMultiplePerNode: false
mgr:
modules:
- name: pg_autoscaler
enabled: true
dashboard:
enabled: true
ssl: true
monitoring:
enabled: true
rulesNamespace: rook-ceph
network:
crashCollector:
disable: true
cleanupPolicy:
confirmation: ""
sanitizeDisks:
method: quick
dataSource: zero
iteration: 1
annotations:
labels:
resources:
removeOSDsIfOutAndSafeToRemove: false
useAllNodes: true
useAllDevices: true
config:
disruptionManagement:
managePodBudgets: false
osdMaintenanceTimeout: 30
manageMachineDisruptionBudgets: false
machineDisruptionBudgetNamespace: openshift-machine-api
四、 服务部署
切换项目到指定版本(因不同版本需要的镜像不同,Master 版本使用的镜像是 ceph/ceph:master,会经常变化)
git checkout -b v1.4.2
依次执行项目部署文件
# 初始化项目
kubectl apply -f /etc/kubernetes/gitlab/rook/cluster/examples/kubernetes/ceph/crds.yaml
kubectl apply -f /etc/kubernetes/gitlab/rook/cluster/examples/kubernetes/ceph/common.yaml
# 搭建操作台
kubectl apply -f /etc/kubernetes/gitlab/rook/cluster/examples/kubernetes/ceph/operator.yaml
# 搭建集群
kubectl apply -f /etc/kubernetes/gitlab/rook/cluster/examples/kubernetes/ceph/cluster.yaml
到 worker 节点查看磁盘状态,状态如图所示,则部署成功。
五、 部署 Rook toolbox 并测试
部署工具rook-ceph-tools
kubectl apply -f /etc/kubernetes/gitlab/rook/cluster/examples/kubernetes/ceph/toolbox.yaml
部署成功后,则可以操作 rook-ceph 集群
kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') bash
六 使用 dashboard
Dashboard 已经在部署集群时部署成功了,现在需要对外暴露服务,可以使用 external
、 loadbalancer
、 ingress
等方式。
前面已经搭建好 Ingress 故在此使用 Ingress 方式。
6.1 创建证书及 secret
- 证书使用
cfssl
方式创建,详见快速搭建Kubernetes高可用集群三 Ingress、Dashboard、Metrics-server的** 4.3.2 创建证书** 小节,我在之前创建证书时使用了 *.kube.uat,所以所有以 kube.uat 为后缀的域名均可使用该证书。 - 使用证书创建 secret
# 进入证书文件目录
cd /etc/kubernetes/pki/
# 创建证书,指定命名空间为 rook-ceph
kubectl -n rook-ceph create secret tls ceph-kube-uat-certs --key kube-uat-key.pem --cert kube-uat.pem
6.2 修改 ingress 配置文件
将 spec 部分的 host 名更改为你的域名,将 secretName 更改为上面创建的 secret
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: rook-ceph-mgr-dashboard
namespace: rook-ceph
annotations:
kubernetes.io/ingress.class: "nginx"
kubernetes.io/tls-acme: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/server-snippet: |
proxy_ssl_verify off;
spec:
tls:
- hosts:
- ceph.kube.uat
secretName: ceph-kube-uat-certs
rules:
- host: ceph.kube.uat
http:
paths:
- path: /
backend:
serviceName: rook-ceph-mgr-dashboard
servicePort: https-dashboard
6.3 创建 Ingress
kubectl apply -f /etc/kubernetes/gitlab/rook/cluster/examples/kubernetes/ceph/dashboard-ingress-https.yaml
6.4 登录 ceph dashboard
账号为 admin,需要使用命令获取登录密码,或者在 k8s 的 dashboard 里找到 rook-ceph-dashboard-password 这个证书,并查看是明码。
kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath='{.data.password}' | base64 --decode
七、 文章引用
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 long@longger.xin