k8s指定ceph,实现动态持久化存储

2023-05-16

一、使用持久化存储StorageClass(ceph挂载)

一、准备好ceph服务器,和创建k8s secret(第三步用到)


# 在k8s集群中所有节点安装 ceph-common # 需要使用kubelet使用rdb命令map附加rbd创建的image
yum install -y ceph-common
 
# 创建 osd pool 在ceph的mon或者admin节点
[root@bd-server-2 ~]# ceph osd pool create kube 128
pool 'ceph_rbd' created
[root@bd-server-2 ~]# rbd pool init kube
[root@bd-server-2 ~]# ceph osd pool application enable kube rbd #启动kube作为rdb存储池

# 创建k8s访问ceph的用户 在ceph的mon或者admin节点
ceph auth get-or-create client.kube mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=kube' -o ceph.client.kube.keyring
 
# 查看key 在ceph的mon或者admin节点
ceph auth get-key client.admin
ceph auth get-key client.kube
 
# 创建 admin secret # CEPH_ADMIN_SECRET 替换为 client.admin 获取到的key export CEPH_ADMIN_SECRET='AQBBAnRbSiSOFxAAEZXNMzYV6hsceccYLhzdWw=='
kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" \
--from-literal=key=$CEPH_ADMIN_SECRET \
--namespace=kube-system
 
# 在 dev 命名空间创建pvc用于访问ceph的 secret # CEPH_KUBE_SECRET 替换为 client.kube 获取到的key export CEPH_KUBE_SECRET='AQBZK3VbTN/QOBAAIYi6CRLQcVevW5HM8lunOg=='
kubectl create secret generic ceph-user-secret --type="kubernetes.io/rbd" \
--from-literal=key=$CEPH_KUBE_SECRET \
--namespace=dev   #和pvc同一个命名空间
 
# 查看 secret
kubectl get secret ceph-user-secret -o yaml -n dev
kubectl get secret ceph-secret -o yaml -n kube-system

二、开启rbac权限

RBAC基于角色的访问控制–全拼Role-Based Access Control
根据rbac.yaml 文件创建Service Account

apiVersion: v1
kind: ServiceAccount  #创建一个账户,主要用来管理ceph provisioner在k8s集群中运行的权
metadata:
  name: rbd-provisioner
  namespace: kube-system
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: rbd-provisioner
rules:
 - apiGroups: [""]
   resources: ["persistentvolumes"]
   verbs: ["get", "list", "watch", "create", "delete"]
 - apiGroups: [""]
   resources: ["persistentvolumeclaims"]
   verbs: ["get", "list", "watch", "update"]
 - apiGroups: ["storage.k8s.io"]
   resources: ["storageclasses"]
   verbs: ["get", "list", "watch"]
 - apiGroups: [""]
   resources: ["events"]
   verbs: ["create", "update", "patch"]
 - apiGroups: [""]
   resources: ["endpoints"]
   verbs: ["get", "list", "watch", "create", "update", "patch"]
 - apiGroups: [""]
   resources: ["services"]
   resourceNames: ["kube-dns"]
   verbs: ["list", "get"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: rbd-provisioner
subjects:
- kind: ServiceAccount
  name: rbd-provisioner
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: rbd-provisioner
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: rbd-provisioner
  namespace: kube-system
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: rbd-provisioner
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: rbd-provisioner
subjects:
- kind: ServiceAccount
  name: rbd-provisioner
  namespace: kube-system

这个文件是创建授权账户。为什么要授权?在K8S中,我们知道有 ApiServer 组件,它可以管理我们创建的 deployment, pod,service等资源,但是有些资源它是管不到的,比如说 K8S本身运行需要的组件等等,同样StorageClass这种资源它也管不到,所以,需要授权账户。

我们在master节点执行

[root@k8s-master1 static]# kubectl apply -f rbac.yaml 
serviceaccount/rbd-provisioner created
clusterrole.rbac.authorization.k8s.io/rbd-provisioner created
clusterrolebinding.rbac.authorization.k8s.io/rbd-provisioner created
role.rbac.authorization.k8s.io/rbd-provisioner created
rolebinding.rbac.authorization.k8s.io/rbd-provisioner created

三、 创建StorageClass,指定provisioner

ceph-provisioner镜像包下载链接:
https://pan.baidu.com/s/1iSdea0TpdlyPUAYoaqjgsQ?pwd=u50u
提取码:u50u

创建ceph-sc-provisioner.yaml 文件

[root@k8s-master1 static]# cat ceph-sc-provisioner.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: rbd-provisioner
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: rbd-provisioner
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: rbd-provisioner
    spec:
      containers:
      - name: rbd-provisioner
        image: "quay.io/external_storage/rbd-provisioner:latest"
        env:
        - name: PROVISIONER_NAME
          value: ceph.com/rbd
      serviceAccount: rbd-provisioner


---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ceph-rbd
provisioner: ceph.com/rbd
parameters:
  monitors: 10.0.19.127:6789,10.0.19.129:6789,10.0.19.130:6789
  adminId: admin   #k8s访问ceph的用户
  adminSecretName: ceph-secret        #secret名字
  adminSecretNamespace: kube-system   #secret加命名空间
  pool: kube      #ceph的rbd进程池
  userId: kube     #k8s访问ceph的用户
  userSecretName: ceph-user-secret    #secret名字,不需要加命名空间
  fsType: ext4
  imageFormat: "2"
  imageFeatures: "layering"
reclaimPolicy: Retain

PS:nfs-client-provisioner这个镜像的作用,它通过k8s集群内置的ceph驱动,挂载远端的ceph服务器到本地目录,然后将自身作为storageprovisioner,然后关联到storageclass资源。

在master上创建

[root@k8s-master1 static]# kubectl apply -f ceph-sc-provisioner.yaml 
deployment.apps/rbd-provisioner created
storageclass.storage.k8s.io/ceph-rbd created

四、基于StorageClass创建一个pvc,看看动态生成的pv是什么效果:

[root@k8s-master1 ~]# cat pvc-sc.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: ceph-sc-claim
  namespace: dev
spec:
  storageClassName: ceph-rbd
  accessModes:
    - ReadWriteOnce
    - ReadOnlyMany
  resources:
    requests:
      storage: 500Mi
[root@k8s-master1 ~]# kubectl apply -f pvc-sc.yaml 
persistentvolumeclaim/nginx created
[root@k8s-master1 static]# kubectl get pvc -n dev
NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
ceph-sc-claim   Bound    pvc-751e4b5d-7a29-4da8-ba40-b7dfb6e86320   500Mi      RWO,ROX        ceph-rbd       9m40s
[root@k8s-master1 static]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
pvc-751e4b5d-7a29-4da8-ba40-b7dfb6e86320   500Mi      RWO,ROX        Delete           Bound    dev/ceph-sc-claim   ceph-rbd                5m58s

五、创建pod测试

创建pod,申明PVC进行测试

[root@k8s-master1 ~]# cat nginx.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: dev
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:    # 我们这里将nginx容器默认的页面目录挂载
          - name: html-files
            mountPath: "/usr/share/nginx/html"
      volumes:
        - name: html-files
          persistentVolumeClaim:
            claimName: ceph-sc-claim  #pvc的name
            

清空前面实验的pvc,由于pvc绑定了pv,直接删除pv删除不掉:kubectl delete pvc --all 先删pvc再删pv
如果有pod绑定,则需要先删除pod然后删除pvc,再删除pv,如果还需要清理后端存储,则最后根据情况删除后端存储数据
测试
在master上创建

[root@k8s-master1 ~]# kubectl apply -f nginx.yaml 
deployment.apps/nginx unchanged
[root@k8s-master1 static]# kubectl get pod -o wide -n dev
NAME                     READY   STATUS    RESTARTS   AGE    IP             NODE        NOMINATED NODE   READINESS GATES
nginx-5767cf6c4d-9vqt8   1/1     Running   0          112s   10.244.0.239   k8s-node1   <none>           <none>
[root@k8s-node1 ~]# lsblk -l|grep rbd0
rbd0             252:0    0  500M  0 disk /var/lib/kubelet/pods/45ac8ba0-5cc3-4c34-99c6
[root@k8s-node1 ~]# echo 'hellow'>/var/lib/kubelet/pods/45ac8ba0-5cc3-4c34-99c6-2e2abb4a1a33/volumes/kubernetes.io~rbd/pvc-828c6a80-9b81-4c49-9ebb-5167b7653c99/index.html
[root@k8s-node1 ~]# curl 10.244.0.239
hellow
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k8s指定ceph,实现动态持久化存储 的相关文章

  • namenode和secondary namenode之间的联系和区别

    1 namenode是存储客户端想hdfs发送增删改查的要求的元数据的 2 secondary namenode是存储namenode的元数据的 xff0c 防止namenode宕机产生的数据丢失 3 一条元数据打大小是150byte xf
  • Hive读取文件

    hive读取文件 教会hive怎么读文本数据 这样直接读数据就是将文本文件上传到该数据表所在的hdfs的文件夹中 hadoop fs span class hljs built in put span studen dat user hiv
  • Flume实战

    前言 在一个完整的大数据处理系统中 xff0c 除了hdfs 43 mapreduce 43 hive组成分析系统的核心之外 xff0c 还需要数据采集 结果数据导出 任务调度等不可或缺的辅助系统 xff0c 而这些辅助工具在hadoop生
  • sqoop安装

    sqoop安装 作为大数据协作框架之一 xff0c Sqoop是一款用于Hadoop和关系型数据库之间进行相互的数据导入和导出的工具 安装sqoop的前提是已经具备java和hadoop的环境 1 下载并解压 最新版下载地址http ftp
  • 利用视图进行多表关联

    疑问 在Maxcompute中我们关联的码表大于8个 xff0c 然后数据存储量大于500W xff0c 那么在进行sql清洗的时候极有可能会被卡死 可是我们就是要在一张表上关联10多个表 xff0c 比如一张表中的很多字段都要关联码表 x
  • CM&CDH安装

    笔者当时自己装CM amp CDH看了不下10篇博客 xff0c 重装集群不下3次 xff0c 后来快照这个功能深深的刻在了我的心里 这篇博客笔者呕心沥血啊 不过还是会有同学会挂掉 xff0c 所以希望大家做到那里一步记得快照 发一下牢骚
  • jvm复习:主动产生fullGC

    一 jdk8参数 Xms100m Xmx100m Xmn30m XX 43 PrintGCDetails 二 代码 xff1a package cn edu tju test public class GcTest01 public sta
  • Zookeeper机制和应用场景

    Zookeeper简介 Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目 xff0c 它主要是用来解决分布式应用中经常遇到的一些数据管理问题 xff0c 如 xff1a 统一命名服务 状态同步服务 集群管理 分
  • crontab定时器

    crontab定时器 linux下的定时任务 1 编辑使用crontab e 一共6列 xff0c 分别是 xff1a 分 时 日 月 周 命令 2 查看使用crontab l 3 删除任务crontab r 4 查看crontab执行日志
  • Linux后台运行程序

    在我们平常的时候运行程序的时候会产生很多的信息 xff0c 这些信息有时候有用 xff0c 有时候没用 xff0c 不过这些数据都会在该程序的log中保存 xff0c 所以把这些信息放在前台就不是很好 我们可以将脚本放在后台运行 xff0c
  • vnc的两种配置方法及解决vnc连不上的情况

    1 vnc连不上的现象 xff1a Timed out waiting for a response from the computer 解决方法 xff1a sudo sbin iptables I INPUT 1 p TCP dport
  • 【随写笔记】TouchGFX

    https www cnblogs com firege p 5805823 html https blog csdn net u013766436 article details 50805808 LTDC STM32F429系列芯片内部
  • BGP路由协议

    特点 BGP是一种外部网关协议 xff08 EGP xff09 xff0c 不擅长路由计算 xff0c 擅长路由控制 OSPF ISIS等内部网关协议 xff08 IGP xff09 xff0c 擅长路由计算 xff0c 不擅长路由控制 B
  • sed命令的使用(合并行)

    1 把所有不以句号结尾的行 xff0c 和下一行合并 span class token function sed span i span class token string 39 N s n 39 span abc txt 2 把两行合并
  • Mybatis常见面试题及答案

    文章目录 1 什么是Mybatis xff1f 2 Mybaits的优缺点 xff1a 3 和 的区别是什么 xff1f 4 通常一个mapper xml文件 xff0c 都会对应一个Dao接口 xff0c 这个Dao接口的工作原理是什么
  • HDFS排查路径

    遇到HDFS的问题 xff0c 首先需要排除可用类问题 可用类问题按影响 紧急程度不同 xff0c 可继续分为HDFS功能性受损 lt 61 HDFS高可靠性 高可用性受损 按照以下步骤进行排查 xff0c 以下任意一项有异常 xff0c
  • Docker复习: jar包打成docker

    FROM openjdk 8 ARG JAR FILE COPY springbootmybatis 1 0 SNAPSHOT jar app jar EXPOSE 9012 ENTRYPOINT 34 sh 34 34 c 34 34 j
  • iscsi磁盘挂载并设置为开机自动挂载

    前提准备 xff1a 安装iscsi客户端软件 yum y install iscsi initiator utils 第一步 xff1a 发现ISCSI设备 root 64 sdw4 iscsiadm m discovery t st p
  • 关于华为AC6507S能ping通web和ssh却登录不上排障记录(管理面隔离)

    一 客户描述PC和服务器能ping通AC但是web却登录不上 测试 xff1a 设置服务器地址为192 168 0 100 24 AC地址192 168 0 2 24 用0 100去ping0 2可以ping通 xff0c web登录连接失
  • tensor 和 numpy 的互相转换

    为什么要相互转换 xff1a 简单一句话 numpy操作多样 简单 但网络前向只能是tensor类型 各有优势 所以需要相互转换补充 convert Tensor x of torch to array y of numpy y 61 x

随机推荐