-
正常运行的多节点k8s集群,两个子节点及以上 -
要使用单独的裸盘进行创建,也就是创建一个新的磁盘,挂载到宿主机,不进行格式化,直接使用即可。检查步骤: -
FSTYPE为空的磁盘为可用磁盘,该磁盘需要清除数据(不能格式化)。 -
做这个实验需要高配置,每个子节点配置不能低于2核4G,主节点不低于4核8G -
简单介绍一rook是啥逼 -
Rook本身并不是一个分布式存储系统,而是利用 Kubernetes 平台的强大功能,通过 Kubernetes Operator 为每个存储提供商提供服务。它是一个存储“编排器”,可以使用不同的后端(例如 Ceph、EdgeFS 等)执行繁重的管理存储工作,从而抽象出很多复杂性。 -
Rook 将分布式存储系统转变为自我管理、自我扩展、自我修复的存储服务。它自动执行存储管理员的任务:部署、引导、配置、供应、扩展、升级、迁移、灾难恢复、监控和资源管理 -
Rook 编排了多个存储解决方案,每个解决方案都有一个专门的 Kubernetes Operator 来实现自动化管理。目前支持Ceph、Cassandra、NFS。 -
目前主流使用的后端是Ceph ,Ceph 提供的不仅仅是块存储;它还提供与 S3/Swift 兼容的对象存储和分布式文件系统。Ceph 可以将一个卷的数据分布在多个磁盘上,因此可以让一个卷实际使用比单个磁盘更多的磁盘空间,这很方便。当向集群添加更多磁盘时,它会自动在磁盘之间重新平衡/重新分配数据。 -
ceph-rook 与k8s集成方式 -
Rook 是一个开源的cloud-native storage编排, 提供平台和框架;为各种存储解决方案提供平台、框架和支持,以便与云原生环境本地集成。 -
Rook 将存储软件转变为自我管理、自我扩展和自我修复的存储服务,它通过自动化部署、引导、配置、置备、扩展、升级、迁移、灾难恢复、监控和资源管理来实现此目的。 -
Rook 使用底层云本机容器管理、调度和编排平台提供的工具来实现它自身的功能。 -
Rook 目前支持Ceph、NFS、Minio Object Store和CockroachDB。 -
Rook使用Kubernetes原语使Ceph存储系统能够在Kubernetes上运行 -
安装前准备
#确认安装lvm2
yum install lvm2 -y
#启用rbd模块
modprobe rbd
cat > /etc/rc.sysinit << EOF
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules
do
[ -x \$file ] && \$file
done
EOF
cat > /etc/sysconfig/modules/rbd.modules << EOF
modprobe rbd
EOF
chmod 755 /etc/sysconfig/modules/rbd.modules
lsmod |grep rbd
-
Ceph集群需要3个节点,当前的K8S集群为3节点集群,因此需要在master节点上创建pod -
如果像我一样穷,修改master,加入工作节点(只限测试环境使用哦)
#master去污吧,加入工作节点
kubectl get no -o yaml | grep taint -A 5
kubectl taint nodes --all node-role.kubernetes.io/master-
git clone --single-branch --branch v1.8.3 https://github.com/rook/rook.git
cd rook/deploy/examples
- 修改Rook CSI镜像地址,原本的地址可能是gcr的镜像,但是gcr的镜像无法被国内访问,所以需要同步gcr的镜像到阿里云镜像仓库,本文档已经为大家完成同步,可以直接修改如下
- vim operator.yaml
- 如下:
ROOK_CSI_CEPH_IMAGE: "registry.cn-shenzhen.aliyuncs.com/jbjb/csi:cephcsi"
ROOK_CSI_REGISTRAR_IMAGE: "registry.cn-shenzhen.aliyuncs.com/jbjb/csi:csi-node-driver-registrar240"
ROOK_CSI_RESIZER_IMAGE: "registry.cn-shenzhen.aliyuncs.com/jbjb/csi:csi-resizer13"
ROOK_CSI_PROVISIONER_IMAGE: "registry.cn-shenzhen.aliyuncs.com/jbjb/csi:csi-provisioner31"
ROOK_CSI_SNAPSHOTTER_IMAGE: "registry.cn-shenzhen.aliyuncs.com/jbjb/csi:csi-snapshotter42"
ROOK_CSI_ATTACHER_IMAGE: "registry.cn-shenzhen.aliyuncs.com/jbjb/csi:csi-attacher34"
- 还需要修改operator文件,新版本rook默认关闭了自动发现容器的部署,可以找到ROOK_ENABLE_DISCOVERY_DAEMON改成true即可:
-
开始部署ROOK
kubectl create -f crds.yaml -f common.yaml -f operator.yaml
kubectl -n rook-ceph get pod
创建ceph集群
kubectl create -f cluster.yaml
- 其中osd-0、osd-1、osd-2容器必须是存在且正常的,如果上述pod均正常运行成功,则视为集群安装成功。
-
安装ceph 客户端工具
kubectl create -f toolbox.yaml -n rook-ceph
常用命令:(不在演示)
ceph status
ceph osd status
ceph df
rados df
tee dashboard-https.yaml <<-'EOF'
apiVersion: v1
kind: Service
metadata:
name: rook-ceph-mgr-dashboard-external-https
namespace: rook-ceph
labels:
app: rook-ceph-mgr
rook_cluster: rook-ceph
spec:
ports:
- name: dashboard
port: 8443
protocol: TCP
targetPort: 8443
selector:
app: rook-ceph-mgr
rook_cluster: rook-ceph
sessionAffinity: None
type: NodePort
EOF
kubectl apply -f dashboard-https.yaml
获取临时密码
kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}"|base64 --decode && ech
接下来 创建块存储以供 Pod (RWO) 使用
tee storageClass.yaml <<-'EOF'
apiVersion: ceph.rook.io/v1
kind: CephBlockPool
metadata:
name: replicapool
namespace: rook-ceph
spec:
failureDomain: host
replicated:
size: 3
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rook-ceph-block
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
clusterID: rook-ceph
pool: replicapool
imageFormat: "2"
imageFeatures: layering
# The secrets contain Ceph admin credentials.
csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
csi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisioner
csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph
csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
csi.storage.k8s.io/fstype: ext4
#将默认设置为“ext4”。 xfs格式的ceph技术还不够成熟官网暂时不推荐
# Delete the rbd volume when a PVC is deleted
EOF
官网参考
https://rook.io/docs/rook/v1.8/ceph-block.html
[root@node66 yaml]# kubectl get sc | grep rook
rook-ceph-block rook-ceph.rbd.csi.ceph.com Delete Immediate true 90m
创建一个 redis集群试试 redi.conf 配置
kubectl create configmap redis-conf --from-file=redis.conf
tee redis.yaml <<-'EOF'
apiVersion: v1
kind: Service
metadata:
name: redis-service
labels:
app: redis
spec:
ports:
- port: 6379
targetPort: 6379
name: redis-port
clusterIP: None
selector:
app: redis
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
selector:
matchLabels:
app: redis
serviceName: "redis-service"
replicas: 6
template:
metadata:
labels:
app: redis
spec:
terminationGracePeriodSeconds: 20
containers:
- name: redis
image: redis:6.2.6-alpine
imagePullPolicy: IfNotPresent
command:
- "redis-server" #redis启动命令
args:
- "/etc/redis/redis.conf" #redis-server后面跟的参数,换行代表空格
- "--protected-mode" #允许外网访问
- "no"
# command: redis-server /etc/redis/redis.conf --protected-mode no
resources: #资源
requests: #请求的资源
cpu: "100m" #m代表千分之,相当于0.1 个cpu资源
memory: "100Mi" #内存100m大小
ports:
- name: redis
containerPort: 6379
protocol: "TCP"
- name: cluster
containerPort: 16379
protocol: "TCP"
volumeMounts:
- name: "redis-conf" #挂载configmap生成的文件
mountPath: "/etc/redis" #挂载到哪个路径下
- name: "redis-data" #挂载持久卷的路径
mountPath: "/var/lib/redis"
volumes:
- name: "redis-conf" #引用configMap卷
configMap:
name: "redis-conf"
items:
- key: "redis.conf" #创建configMap指定的名称
path: "redis.conf" #里面的那个文件--from-file参数后面的文件
volumeClaimTemplates:
- metadata:
name: "redis-data"
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "rook-ceph-block"
resources:
requests:
storage: 1Gi
EOF
创建集群
kubectl exec -it redis-0 -- redis-cli --cluster create --cluster-replicas 1 $(kubectl get pods -l app=redis -o jsonpath='{range.items[*]}{.status.podIP}:6379 ' | awk 'NF--')
所有已修改的配置 直接拉取即可使用
git clone http://git.rapha.top/jbjb/rook-ceph.git
不在演示了
还有一个注意的是cluster.yaml 文件
关闭所有节点和所有设备选择,手动指定节点和设备
sed -i 's|useAllNodes: true|useAllNodes: false|g' cluster.yaml
sed -i 's|useAllDevices: true|useAllDevices: false|g' cluster.yaml
# useAllNodes: true
# useAllDevices: true
# 在storage标签的config:下添加配置
metadataDevice:
databaseSizeMB: "1024"
journalSizeMB: "1024"
nodes:
- name: "master"
devices:
- name: "sdb"
config:
storeType: bluestore
- name: "node01"
devices:
- name: "sdb"
config:
storeType: bluestore
- name: "node02"
devices:
- name: "sdb"
config:
storeType: bluestore
# 注意,name不能够配置为IP,而应该是标签 kubernetes.io/hostname 的内容
kubectl get node
kubectl describe node master |grep kubernetes.io/hostname
# 添加后的配置文件参见下图
# 集群创建
kubectl apply -f cluster.yaml
kubectl -n rook-ceph get pod
个人觉得使用官网推荐的自动扫描添加的方式比较好
|