首页 > 其他分享 >K8s使用cephfs(静态和动态两种)

K8s使用cephfs(静态和动态两种)

时间:2024-09-03 11:15:17浏览次数:12  
标签:k8s name 静态 mysql test cephfs root K8s

一、K8s节点安装 ceph-common

CephFSCeph 中基于RADOS(可扩展分布式对象存储)构建,通过将文件数据划分为对象并分布到集群中的多个存储节点上来实现高可用性和可扩展性。

首先所有 k8s 节点都需要安装 ceph-common 工具:

yum -y install epel-release ceph-common

二、静态供给方式

参考链接: K8s 使用 CephFS 作为后端存储(静态供给、动态供给)

静态供给方式需要提前创建好 CephFS 给到 K8s 使用。

2.1 在 Ceph 中创建 FS 和 授权用户

创建存储池:

# 数据存储池
[root@k8s-master31 ~]# ceph osd pool create cephfs_data_pool 16

# 元数据存储池
[root@k8s-master31 ~]# ceph osd pool create ceph_metadata_pool 8

创建 FS

[root@k8s-master31 ~]# ceph fs new k8s-cephfs cephfs_data_pool ceph_metadata_pool

[root@k8s-master31 ~]# ceph orch apply mds cephfs --placement="3 k8s-master31 k8s-node34 k8s-node35"
Scheduled mds.cephfs update...

--placement="3 k8s-master31 k8s-node34 k8s-node35":这部分指定了 MDS 服务的部署位置。具体解释如下:
3 表示你希望部署 3 个 MDS 实例。
k8s-master31 k8s-node34 k8s-node35 是你指定的节点,表示这 3 个 MDS 实例将分别部署在 k8s-master31, k8s-node34, 和 k8s-node35 这三台服务器上。

创建用户 fs-user 并授权存储池 cephfs_data_pool

查看 admin 用户秘钥:

[root@k8s-master31 ~]# ceph auth get-key client.admin

在这里插入图片描述

2.2 在 k8s 中创建 secret

[root@k8s-master31 cephfs]# ceph auth get-key client.admin
AQAeg9FmYRqZGxAACbp761MR8Uf+D3VQTu0nwQ==
[root@k8s-master31 cephfs]# export ADMIN_USER_SECRET='AQAeg9FmYRqZGxAACbp761MR8Uf+D3VQTu0nwQ=='
[root@k8s-master31 cephfs]# kubectl create secret generic ceph-admin-default-secret --type="kubernetes.io/rbd" \
--from-literal=key=$ADMIN_USER_SECRET \
--namespace=default

在这里插入图片描述

2.3 pod 直接使用 CephFS 存储

vi cephfs-test-pod.yml
apiVersion: v1
kind: Pod
metadata:
  name: cephfs-test-pod
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: data-volume
      mountPath: /usr/share/nginx/html/
  volumes:
  - name: data-volume
    cephfs:
      monitors:
      - 10.0.0.31:6789
      - 10.0.0.34:6789
      - 10.0.0.35:6789
      path: /
      user: admin
      secretRef:
        name: ceph-admin-default-secret
kubectl apply -f cephfs-test-pod.yml

查看 pod

kubectl get pods

在这里插入图片描述

可以进到 pod 中查看分区情况:

kubectl exec -it cephfs-test-pod -- /bin/bash

df -hl

PS: 无法创建文件

在这里插入图片描述

2.4 创建 PV 使用 CephFS 存储

vi cephfs-test-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: cephfs-test-pv
spec:
  accessModes: ["ReadWriteOnce"]
  capacity:
    storage: 2Gi
  persistentVolumeReclaimPolicy: Retain
  cephfs:
    monitors:
      - 10.0.0.31:6789
      - 10.0.0.34:6789
      - 10.0.0.35:6789
    path: /
    user: admin
    secretRef:
      name: ceph-admin-default-secret
[root@k8s-master31 cephfs]# kubectl apply -f cephfs-test-pv.yml
Warning: spec.cephfs: deprecated in v1.28, non-functional in v1.31+
persistentvolume/cephfs-test-pv created

Deprecated in v1.28: 从 Kubernetes 1.28 版本开始,spec.cephfs 配置项已被标记为不推荐使用,这意味着它将在未来的版本中被移除或替换。
Non-functional in v1.31+: 从 Kubernetes 1.31 版本起,这个配置将不再有效。

在这里插入图片描述

创建 PVC 绑定 PV

vi cephfs-test-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: cephfs-test-pvc
spec:
  accessModes: ["ReadWriteOnce"]
  resources:
    requests:
      storage: 2Gi
kubectl apply -f cephfs-test-pvc.yml

查看 pvcpv

kubectl get pvc

kubectl get pv

在这里插入图片描述

测试 pod 挂载 pvc

vi cephfs-test-pod1.yml
apiVersion: v1
kind: Pod
metadata:
  name: cephfs-test-pod1
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: data-volume
      mountPath: /usr/share/nginx/html/
  volumes:
  - name: data-volume
    persistentVolumeClaim:
      claimName: cephfs-test-pvc
      readOnly: false
kubectl apply -f cephfs-test-pod1.yml

查看 pod

kubectl get pods

在这里插入图片描述

进入pod创建文件

[root@k8s-master31 cephfs]# kubectl exec -it cephfs-test-pod1 -- bash
root@cephfs-test-pod1:/usr/share/nginx/html# df -hl /usr/share/nginx/html
Filesystem      Size  Used Avail Use% Mounted on
ceph-fuse       973G     0  973G   0% /usr/share/nginx/html
root@cephfs-test-pod1:/# cd /usr/share/nginx/html/
root@cephfs-test-pod1:/usr/share/nginx/html# echo www > rm.txt
root@cephfs-test-pod1:/usr/share/nginx/html# cat rm.txt
www
root@cephfs-test-pod1:/usr/share/nginx/html# ls -l rm.txt
-rw-r--r-- 1 root root 4 Sep  3 01:39 rm.txt

三、动态供给方式

参考链接: 带有 CSI 驱动程序的 Kubernetes CephFS 卷

首先我们需要为存储提供者创建一个命名空间:

kubectl create ns ceph-csi-cephfs

登录CEPH集群并获取配置:

[root@k8s-master31 ~]# ceph config generate-minimal-conf
# minimal ceph.conf for e3df76f6-66a9-11ef-b055-000c29e945c2
[global]
        fsid = e3df76f6-66a9-11ef-b055-000c29e945c2
        mon_host = [v2:10.0.0.31:3300/0,v1:10.0.0.31:6789/0] [v2:10.0.0.34:3300/0,v1:10.0.0.34:6789/0] [v2:10.0.0.35:3300/0,v1:10.0.0.35:6789/0]


[root@k8s-master31 ~]# ceph auth get-key client.admin
AQAeg9FmYRqZGxAACbp761MR8Uf+D3VQTu0nwQ==

创建子卷组

[root@k8s-master31 ~]# ceph fs subvolumegroup create cephfs csi
[root@k8s-master31 ~]# ceph fs subvolumegroup ls cephfs
[
    {
        "name": "csi"
    }
]

添加helm仓库

helm repo add ceph-csi https://ceph.github.io/csi-charts
helm show values ceph-csi/ceph-csi-cephfs > defaultValues.yaml

编辑 values

vi values.yaml
---
csiConfig:
  - clusterID: e3df76f6-66a9-11ef-b055-000c29e945c2 #集群ID
    monitors:
      - 10.0.0.31:6789
      - 10.0.0.34:6789
      - 10.0.0.35:6789
    cephFS:
      subvolumeGroup: "csi"
secret:
  name: csi-cephfs-secret
  adminID: admin  #用户
  adminKey: AQAeg9FmYRqZGxAACbp761MR8Uf+D3VQTu0nwQ== #密钥
  create: true
storageClass:
  create: true
  name: csi-cephfs-sc
  clusterID: e3df76f6-66a9-11ef-b055-000c29e945c2 #集群ID
  #(必选)创建卷的CephFS文件系统名称
  fsName: cephfs
  reclaimPolicy: Delete
  allowVolumeExpansion: true
  volumeNamePrefix: "poc-k8s-"
  provisionerSecret: csi-cephfs-secret
  controllerExpandSecret: csi-cephfs-secret
  nodeStageSecret: csi-cephfs-secret

helm安装

helm upgrade --install ceph-csi-cephfs ceph-csi/ceph-csi-cephfs --values ./values.yaml

部署pvc测试

vi pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: csi-cephfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: csi-cephfs-sc

创建pvc查看

kubectl apply -f pvc.yaml

[root@k8s-master31 ~]# kubectl get pvc
NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS    AGE
csi-cephfs-pvc   Bound    pvc-ac8b431f-e807-4e7f-91ec-70dc55270e05   1Gi        RWX            csi-cephfs-sc   7m37s

部署两个pod挂载pvc测试

创建两个pod
cat <<'EOF'> pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cephfs-test-pod1
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: data-volume
      mountPath: /usr/share/nginx/html/
  volumes:
  - name: data-volume
    persistentVolumeClaim:
      claimName: csi-cephfs-pvc
      readOnly: false
---
apiVersion: v1
kind: Pod
metadata:
  name: cephfs-test-pod2
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: data-volume
      mountPath: /usr/share/nginx/html/
  volumes:
  - name: data-volume
    persistentVolumeClaim:
      claimName: csi-cephfs-pvc
      readOnly: false
EOF
kubectl apply -f pod.yaml
pod2创建文件
[root@k8s-master31 ~]# kubectl exec -it cephfs-test-pod2 -- bash
root@cephfs-test-pod2:/# cd /usr/share/nginx/html/
root@cephfs-test-pod2:/usr/share/nginx/html# ls
root@cephfs-test-pod2:/usr/share/nginx/html# touch 1{1..5}.txt
root@cephfs-test-pod2:/usr/share/nginx/html# ls
11.txt  12.txt  13.txt  14.txt  15.txt
pod1查看
[root@k8s-master31 ~]# kubectl exec -it cephfs-test-pod1 -- bash
root@cephfs-test-pod1:/#  cd /usr/share/nginx/html/
root@cephfs-test-pod1:/usr/share/nginx/html# ls
11.txt  12.txt  13.txt  14.txt  15.txt
root@cephfs-test-pod1:/usr/share/nginx/html#

测试使用 volumeClaimTemplates 动态创建 pv 和 pvc

vi mysql.yml
# headless service
apiVersion: v1
kind: Service
metadata:
  name: mysql-hl
  labels:
    app: mysql-hl
spec:
  clusterIP: None
  ports:
  - name: mysql-port
    port: 3306
  selector:
    app: mysql

---
# NodePort service
apiVersion: v1
kind: Service
metadata:
  name: mysql-np
  labels:
    app: mysql-np
spec:
  clusterIP:
  ports:
  - name: master-port
    port: 3306
    nodePort: 31306
    targetPort: 3306
  selector:
    app: mysql
  type: NodePort
  externalTrafficPolicy: Cluster

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: "mysql-hl"
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0.20
        ports:
        - containerPort: 3306
          name: master-port
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "root"
        - name: TZ
          value: "Asia/Shanghai"
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
  volumeClaimTemplates:
    - metadata:
        name: mysql-data
      spec:
        accessModes: ["ReadWriteOnce"]
        storageClassName: csi-cephfs-sc
        resources:
          requests:
            storage: 2Gi
kubectl apply -f mysql.yaml
查看
[root@k8s-master31 ~]# kubectl get pod mysql-0 -o wide
NAME      READY   STATUS    RESTARTS   AGE     IP              NODE         NOMINATED NODE   READINESS GATES
mysql-0   1/1     Running   0          3m32s   172.16.192.11   k8s-node35   <none>           <none>
[root@k8s-master31 ~]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                        STORAGECLASS    REASON   AGE      csi-cephfs-sc            28m
pvc-cf0ea7e3-e320-4482-844e-c866190d1a2a   2Gi        RWO            Delete           Bound    default/mysql-data-mysql-0   csi-cephfs-sc            4m29s
[root@k8s-master31 ~]# kubectl get pvc
NAME                 STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS    AGE
mysql-data-mysql-0   Bound    pvc-cf0ea7e3-e320-4482-844e-c866190d1a2a   2Gi        RWO            csi-cephfs-sc   4m33s
登入mysql
[root@k8s-master31 ~]#  kubectl exec -it mysql-0 -- bash
root@mysql-0:/# mysql -u root -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.20 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)
# 查看库占用磁盘大小
mysql> SELECT table_schema AS "Database",
    ->        ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS "Size (MB)"
    -> FROM information_schema.tables
    -> GROUP BY table_schema;
+--------------------+-----------+
| Database           | Size (MB) |
+--------------------+-----------+
| information_schema |      0.00 |
| mysql              |      7.69 |
| performance_schema |      0.00 |
| sys                |      0.02 |
+--------------------+-----------+
4 rows in set (0.27 sec)

标签:k8s,name,静态,mysql,test,cephfs,root,K8s
From: https://www.cnblogs.com/boradviews/p/18394180

相关文章

  • k8s核心组件etcd备份与恢复
    etcd在k8s集群中的身份以及重要性介绍在Kubernetes(K8s)集群中,etcd扮演着至关重要的角色,它是集群状态存储的核心组件。以下是etcd在K8s集群中的角色、作用及其重要性的详细说明:角色:etcd是K8s集群的“大脑”,存储和管理了整个集群的状态信息。重要性:etcd是K8s集群中不可或缺......
  • 复旦大学王龑团队发布《静态与动态情感的面部表情识别》综述
    论文链接:https://arxiv.org/pdf/2408.15777复旦大学,王龑博士后领衔,发布《静态与动态情感的面部表情识别》(ASurveyonFacialExpressionRecognitionofStaticandDynamicEmotions)综述,对基于图像的静态面部表情识别(SFER)和基于视频的动态面部表情识别(DFER)方法进行了全面综述,......
  • VBA字典与数组第十八讲:VBA中静态数组的定义及创建
    《VBA数组与字典方案》教程(10144533)是我推出的第三套教程,目前已经是第二版修订了。这套教程定位于中级,字典是VBA的精华,我要求学员必学。7.1.3.9教程和手册掌握后,可以解决大多数工作中遇到的实际问题。这套字典教程共两册,一共八十四讲,今后一段时间会给大家陆续推出修订后的教程内容......
  • 大学生WEB前端HTML网页期末作业,动漫资讯静态html网站—动漫网站模板
    网站简介网站主题动漫新闻资讯html网站,一共6个页面,分别首页、动漫资讯、新闻资讯、联系我们、登录注册页面网站使用div+css布局页面,网站使用div,ul,li,a,p,h1,h2,h3,h4,form,input,button等标签,css使用margin,border,padding,font-weight,font-family,color,width,line-height,overf......
  • 47. 继承中的同名静态成员处理
    继承中的同名静态成员处理结论和非静态成员一致只不过调用方式有两种通过对象通过类名通过类名的方式访问父类作用域下的m_A静态成员变量Son::Base::m_A#define_CRT_SECURE_NO_WARNINGS#include<iostream>usingnamespacestd;classBase{public: staticvoidfu......
  • 49. 静态联编动态联编及多态原理
    静态联编动态联编静态多态(就是函数重载)和动态多态静态多态:函数重载,运算符重载动态多态://先有继承关系//父类中有虚函数,子类重写父类中的虚函数//父类的指针或引用指向子类的对象静态多态在编译阶段绑定地址,地址早绑定,静态联编动态多次在运行阶段绑定地址,地址晚绑定,动态联......
  • 【Java学习】静态static&继承
    一、静态static(一)定义static是静态的意思,static可以修饰成员变量或者修饰方法。static关键字的使用,它可以用来修饰的成员变量和成员方法,被static修饰的成员是属于类的,放在静态区中,没有static修饰的成员变量和方法则是属于对象的。static关键字在Java开发非常的重要,对于理......
  • k8s 配置管理中心Configmap 和 Secret 实现微服务配置管理
    一、Configmap1.1关于ConfigmapConfigmap是k8s中的资源对象,用于保存非机密性的配置的,数据可以用key/value键值对的形式保存,也可以使用文件的形式保存。 k8s中的pod(服务)都有自己的配置文件,如果需要扩容时,为保证服务的一致性,可以将Configmap做成volume,并挂载到新扩容的服务上。1.2......
  • 【K8s】专题十二(4):Kubernetes 存储之 StorageClass
    本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发、订阅专栏!专栏订阅入口Linux专栏 | Docker专栏 | Kubernetes专栏往期精彩文章【Docker】(全网首发)KylinV10下MySQL容器内存占用异常的解决方法【Docker】(全网首发)Kyli......
  • k8s中pod获取宿主机IP地址
    在Pod内部的Java环境中,你可以通过KubernetesAPI或KubernetesDownwardAPI来获取节点的IP地址。以下是几种方法来实现这一点:个人使用的第一种方法1:使用KubernetesDownwardAPI如果你已经在Pod配置中使用了DownwardAPI,将节点的IP地址注入到环境变量中,你可......