• 正常运行的多节点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-
  • 下载Rook安装文件(官网)
git clone --single-branch --branch v1.8.3 https://github.com/rook/rook.git
cd rook/deploy/examples
#我的已经修改好的镜像
 https://gitee.com/jbjb123/rook-ceph.git

  • 修改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
  • 开启 配置ceph dashboard
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
  • 创建sc
[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--')

在这里插入图片描述
所有已修改的配置 直接拉取即可使用

 https://gitee.com/jbjb123/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

个人觉得使用官网推荐的自动扫描添加的方式比较好

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐