K8S 实战系列:通过 ceph 实现 K8S 中数据的持久化

3 通过 ceph 实现 K8S 中数据的持久化

这里不在概叙 ceph 集群的搭建,ceph 搭建:http://39.105.137.222:8089/?p=597

让 K8S 中的 pod 可以访问 ceph 中的 rbd 提供镜像作为存储设备,需要在 ceph 创建 rbd , 并且让 K8S node 节点能够通过 ceph 的认证

有两种认证方式:

  • K8S 在使用 ceph 作为动态存储卷的时候,需要 kube-controller-manager 组件能够访问 ceph ,因此需要在包括 K8S master 以及 node 节点在内的每一个 node 进行同步认证文件

  • 将 ceph 的认证文件放到 K8S 中,通过 secret 的方式来提供认证,将 ceph 中某个用户的 key 拿出来,在 K8S 中创建一个 secret ,然后在进行认证

这里主要是说他的两种类型要给是 ceph 块存储,一个是 ceph nfs,如果是对象存储那就比较简单了,直接让开发使用即可。

块存储和 ceph-nfs 这种使用的话需要挂载,

使用块存储:

  • 如果使用块存储的话,需要创建好块存储,创建好镜像初始化好,然后再 yaml 文件里面去挂载,需要在 K8S 的yaml 文件中指定好挂载的类型是 ceph,然后在指定需要挂载的 ceph 服务器

块存储一般是提供给 mysql 主从或者 zookeeper 集群来使用,他们之间的数据是完全独立的,但是像 nginx 就需要使用 ceph-fs

3.1 ceph rbd 存储块挂载

3.1.1 通过 ceph 配置文件认证做存储

3.1.1.1 创建存储池并启用块存储

首先需要创建用户,然后创建存储池

1.在 ceph-deploy 节点上操作

# 创建存储池
[16:16:26 root@ceph-deploy ceph-cluster]#ceph osd pool create  zgy-rbd-pool1 32 32

# 创建成功
[16:16:41 root@ceph-deploy ceph-cluster]#ceph osd pool ls
zgy-rbd-pool1

2.启用块存储

[16:16:57 root@ceph-deploy ceph-cluster]#ceph osd pool application enable zgy-rbd-pool1 rbd

3.初始化

[16:17:59 root@ceph-deploy ceph-cluster]#rbd pool init -p zgy-rbd-pool1

4.创建 image

[17:24:21 root@ceph-deploy ~]#rbd create zgy-img-img1 --size 3G --pool zgy-rbd-pool1 --image-format 2 --image-feature layering

3.1.1.2 客户端安装 ceph-common

ceph-common 是 ceph 的 token 组件,最好和 ceph 的版本保持一致

1.在所有的 K8S 集群节点配置清华源

# 导入 ceph key
[17:27:23 root@master ~]# wget -q -O- 'http://mirrors.ustc.edu.cn/ceph/keys/release.asc' | sudo apt-key add -
OK
[17:21:29 root@node-1 ~]# wget -q -O- 'http://mirrors.ustc.edu.cn/ceph/keys/release.asc' | sudo apt-key add -
OK

# 配置清华的 ceph 源
[19:42:25 root@master ~]#echo deb http://mirrors.ustc.edu.cn/ceph/debian-pacific/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list

[19:40:05 root@node-1 ~]#echo deb http://mirrors.ustc.edu.cn/ceph/debian-pacific/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list

# 更新镜像源
[19:44:05 root@master ~]#sudo apt update
[19:44:05 root@node-1 ~]#sudo apt update

2.安装 ceph-common

[19:44:05 root@master ~]#apt install ceph-common -y
[19:44:05 root@node-1 ~]#apt install ceph-common -y

3.1.1.3 创建普通用户与授权

因为我们在 K8S 中不推荐通过 admin 用户来为 K8S 做授权

1.创建普通用户授权

# 在 ceph-deploy 节点创建
[19:53:30 root@ceph-deploy ceph-cluster]#ceph auth add client.guiyuan mon 'allow r' osd 'allow * pool=zgy-rbd-pool1'


# 创建普通用户 zgy
# 对 mon 只读,对 osd 所有权限,但是该用户仅限于 zgy-rbd-pool1 存储池

# 获取用户信息
[20:10:23 root@ceph-deploy ~]#ceph auth get client.guiyuan
[client.guiyuan]
    key = AQAvZG1hylo+ORAAEKllFLitM2lzjb8/Z1Z9XQ==
    caps mon = "allow r"
    caps osd = "allow * pool=zgy-rbd-pool1"
exported keyring for client.guiyuan

2.获取用户授权信息

现在就可以将用户信息导出来,放到配置文件中

[20:10:29 root@ceph-deploy ~]#ceph auth get client.guiyuan -o ceph.client.guiyuan.keyring

# 将配置信息同步至 ceph.client.zgy.keyring 文件中

3.1.1.4 将ceph 配置文件与授权文件拷贝至 K8S 节点

1.将 ceph 的配置文件和 ceph 的授权拷贝至 K8S 节点

# 10.0.0.100 K8S master 节点
[20:10:45 root@ceph-deploy ~]#scp /etc/ceph/ceph.conf ceph.client.guiyuan.keyring 10.0.0.100:/etc/ceph

# 10.0.0.101 K8S node 节点
[20:11:01 root@ceph-deploy ~]#scp /etc/ceph/ceph.conf ceph.client.guiyuan.keyring 10.0.0.101:/etc/ceph

2.在 K8S node 节点上验证权限

[19:47:31 root@node-1 ~]#ceph --user guiyuan -s
  cluster:
    id:     eb4e8bf8-28ef-405d-881e-a06ac63a187c
    health: HEALTH_OK
 
  services:
    mon: 1 daemons, quorum ceph-mon (age 21m)
    mgr: ceph-mgr(active, since 20m)
    osd: 12 osds: 12 up (since 21m), 12 in (since 31m)
 
  data:
    pools:   2 pools, 384 pgs
    objects: 4 objects, 35 B
    usage:   86 MiB used, 240 GiB / 240 GiB avail
    pgs:     384 active+clean

3.在 node 节点验证存储池权限,能够拿到镜像信息就表示权限没有问题

[20:11:27 root@node-1 ~]#rbd --id guiyuan ls --pool=zgy-rbd-pool1
zgy-img-img1

3.1.1.5 K8S 节点配置主机名解析

在 ceph.conf 配置文件中包含 ceph 主机的主机名,因此需要在 K8S 的各个 master 和 node 上配置主机名解析

# node 节点配置
[20:11:42 root@node-1 ~]#vim /etc/hosts

127.0.0.1       localhost
127.0.1.1       init.localdomain        init

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
10.0.0.100 master
10.0.0.101 node-1
10.0.0.103 hub.zhangguiyuan.com
10.0.0.201 ceph-deploy.example.local ceph-deploy
10.0.0.202 ceph-mon.example.local ceph-mon
10.0.0.203 ceph-mgr.example.local ceph-mgr
10.0.0.204 ceph-node1.example.local ceph-node1
10.0.0.205 ceph-node2.example.local ceph-node2
10.0.0.206 ceph-node3.example.local ceph-node3

# master 节点配置
[20:11:42 root@master ~]#vim /etc/hosts

127.0.0.1       localhost
127.0.1.1       init.localdomain        init

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
10.0.0.100 master
10.0.0.101 node-1
10.0.0.103 hub.zhangguiyuan.com
10.0.0.201 ceph-deploy.example.local ceph-deploy
10.0.0.202 ceph-mon.example.local ceph-mon
10.0.0.203 ceph-mgr.example.local ceph-mgr
10.0.0.204 ceph-node1.example.local ceph-node1
10.0.0.205 ceph-node2.example.local ceph-node2
10.0.0.206 ceph-node3.example.local ceph-node3

3.1.1.6 通过 keyring 文件挂载 rbd 给 pod 使用

基于 ceph 提供的rbd实现存储卷的动态提供,由两种实现方式,一是通过宿主机的 keyring 文件挂载 rbd ,另外一个是通过将 keyring 中 key 定义为 k8s 中的 secret ,然后 pod 通过 secret 挂载 rbd 。

1.编写 yaml 文件

[20:17:49 root@master cephyaml]#vim case1-busybox-keyring.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - image: busybox
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    name: busybox
    volumeMounts:
    - name: rbd-data1
      mountPath: /data          # 挂载到容器的 /data 目录
  volumes:
    - name: rbd-data1
      rbd:
        monitors:               # ceph mon 节点服务器
        - '10.0.0.202:6789'     # ceph mon 节点 ip:port
        pool: zgy-rbd-pool1     # ceph guiyuan 用户有权限的存储池
        image: zgy-img-img1     # 该 zgy-rbd-pool1 存储池中挂载的镜像
        fsType: ext4            # 文件类型 ext4
        readOnly: false         # 非只读,如果只读的话 pod 无非向容器写入数据
        user: guiyuan           # ceph 授权用户 guiyuan
        keyring: /etc/ceph/ceph.client.guiyuan.keyring  # key 文件路径

2.查看状态

[20:33:22 root@master cephyaml]#kubectl get pod -o wide
NAME                             READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
busybox                          1/1     Running   0          22s   10.200.84.178   node-1              

3.进入 pod 确认是否已经挂载了 rbd

[09:28:07 root@master cephyaml]#kubectl exec -it busybox /bin/sh
/ # df -h | grep rbd
/dev/rbd0                 2.9G      9.0M      2.9G   0% /data

# 并写入数据
/ # echo "test" > /data/test.txt

4.我们可以看到他这个其实是基于宿主机的内核的,先通过宿主机挂载然后在挂载至容器

# 我们来到 pod 所在的 node 节点上通过 grep rbd 验证
[09:30:57 root@node-1 ~]#df | grep rbd
/dev/rbd0                             3030800     9220   3005196   1% /var/lib/kubelet/plugins/kubernetes.io/rbd/mounts/zgy-rbd-pool1-image-zgy-img-img1

3.1.1.7 nginx pod 挂载 rbd 演示

nginx 容器就类似于我们自己打的容器,可以将该容器换成 tomcat 或者 mysql 主从

1.编写 yaml 文件

[09:35:08 root@master cephyaml]#vim case2-nginx-keyring.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels: #rs or deployment
      app: ng-deploy-80
  template:
    metadata:
      labels:
        app: ng-deploy-80
    spec:
      containers:
      - name: ng-deploy-80
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        volumeMounts:
        - name: rbd-data1
          mountPath: /data
      volumes:
        - name: rbd-data1
          rbd:
            monitors:
            - '10.0.0.202:6789'
            pool: zgy-rbd-pool1
            image: zgy-img-img1
            fsType: ext4
            readOnly: false
            user: guiyuan
            keyring: /etc/ceph/ceph.client.guiyuan.keyring

2.运行 pod

[09:34:59 root@master cephyaml]#kubectl apply -f case2-nginx-keyring.yaml 

3.pod 创建成功

[09:35:07 root@master cephyaml]#kubectl get pod 
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-74777df66b-9vlq6   1/1     Running   0          5s

4.验证是否成功挂载

# 进入 pod
[09:35:37 root@master cephyaml]#kubectl exec -it nginx-deployment-74777df66b-9vlq6 /bin/bash

# 过滤 rbd
root@nginx-deployment-74777df66b-9vlq6:/# df -h | grep rbd
/dev/rbd0       2.9G  9.1M  2.9G   1% /data

# 并且在 data 目录中还会有 test.txt 文件,因为他和刚才的 busybox 挂载的是同一个存储镜像
root@nginx-deployment-74777df66b-9vlq6:/# ls /data/
lost+found  test.txt

# 并且也是可以写入
root@nginx-deployment-74777df66b-9vlq6:/# echo "nginx" > /data/nginx.txt
root@nginx-deployment-74777df66b-9vlq6:/# cat /data/nginx.txt 
nginx

5.pod 所在 node 节点验证

# 通过 ceph 存储所在的 node 节点上可以看到有对应的映射关系
[09:31:03 root@node-1 ~]#rbd showmapped
id  pool           namespace  image         snap  device   
0   zgy-rbd-pool1             zgy-img-img1  -     /dev/rbd0

由此得出,ceph 提供的挂载不会因为 pod 的删除而删除,从而实现了数据的持久化

3.1.2 通过 secret 认证并存储

将 ceph 的 key 先定义为 secret ,然后挂载至 pod,每个 K8S node 节点上不在需要保存 keyring 文件。

3.1.2.1 创建 secret

首先创建 secret ,secret 中主要包含 ceph 中被授权用户的 keyring 文件中的 key ,需要将 key 内容通过 base64 编码后即可创建 secret

1.先在 ceph deploy 节点上创建用户拿到 key 信息,并通过 base64 加密

# 我这里由于在刚才上面的演示中已经创建了 guiyuan 用户所以不在创建,而是直接通过 guiyuan 用户进行 base64 加密

# 查看 guiyuan 用户的 key 信息
[20:28:04 root@ceph-deploy ~]#cat ceph.client.guiyuan.keyring 
[client.guiyuan]
    key = AQAvZG1hylo+ORAAEKllFLitM2lzjb8/Z1Z9XQ==
    caps mon = "allow r"
    caps osd = "allow * pool=zgy-rbd-pool1"

# 将 key 信息通过 base64 加密
[09:50:40 root@ceph-deploy ~]#echo AQAvZG1hylo+ORAAEKllFLitM2lzjb8/Z1Z9XQ== | base64 
QVFBdlpHMWh5bG8rT1JBQUVLbGxGTGl0TTJsempiOC9aMVo5WFE9PQo=

2.编写 secret 文件

[09:49:27 root@master cephyaml]#vim case3_secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret-guiyuan     # 该 secret 名称,等会在 pod 中挂载
type: "kubernetes.io/rbd"       # 资源类型
data:
  key: QVFBdlpHMWh5bG8rT1JBQUVLbGxGTGl0TTJsempiOC9aMVo5WFE9PQo= # 加密后的 key

# 创建 secret
[09:55:20 root@master cephyaml]#kubectl apply -f case3_secret.yaml 

# secret 已经创建
[09:55:51 root@master cephyaml]#kubectl get secrets 
NAME                  TYPE                                  DATA   AGE
ceph-secret-guiyuan   kubernetes.io/rbd                     1      40s

3.1.2.2 创建 nginx pod

1.编写 nginx 测试 yaml

[09:56:04 root@master cephyaml]#vim case4-nginx-secret.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ng-deploy-80
  template:
    metadata:
      labels:
        app: ng-deploy-80
    spec:
      containers:
      - name: ng-deploy-80
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        volumeMounts:
        - name: rbd-data1
          mountPath: /data               # 挂载至 pod 的 data 目录下
      volumes:
        - name: rbd-data1
          rbd:
            monitors:
            - '10.0.0.202:6789'          # ceph mon 节点 ip:port
            pool: zgy-rbd-pool1          # ceph 存储池
            image: zgy-img-img1          # ceph 镜像
            fsType: ext4                 # 文件系统类型
            readOnly: false              # 只读为 false
            user: guiyuan                # ceph 授权用户
            secretRef:                   # secret 类型挂载
              name: ceph-secret-guiyuan  # 绑定对应的 secret

2.创建

[10:01:44 root@master cephyaml]#kubectl apply -f case4-nginx-secret.yaml 

# 创建成功
[10:01:46 root@master cephyaml]#kubectl get pod 
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-64dbc989f7-7npq8   1/1     Running   0          19s

3.进入 pod 验证

# 进入容器
[10:03:21 root@master cephyaml]#kubectl exec -it nginx-deployment-64dbc989f7-7npq8 /bin/bash

# 挂载成功
root@nginx-deployment-64dbc989f7-7npq8:/# df -TH | grep rbd
/dev/rbd0      ext4     3.2G  9.5M  3.1G   1% /data

3.1.3 动态创建存储卷

注意一定要是二进制安装 K8S 就不会出现此问题,如果通过 kubeadm 来部署就会出现failed to create rbd image: executable file not found in $PATH, command output:

问题原因

由于kube-controller-manager使用容器方式运行,gcr.io/google_containers/kube-controller-manager-amd64:v1.21.4 而该容器不包含rbd, 因此kube-controller-manager在创建pv时,无法调用rbd,解决办法就是将kube-controller-manager运行在有rbd的环境中, 本次临时将kube-controller-manager从容器提取出来,在master节点服务器上用命令方式运行

这里我采用的 K8S 是通过二进制部署

这个就需要结合 pv pvc 来使用,我以 mysql 为例,mysql 在启动的时候需要使用到 pvc

流程:

  • 先创建 ceph admin 的 secret,用于 master 调 ceph 创建 pv,这个 pv 其实就是一个存储镜像

  • 然后这个被创建的存储镜像会在 K8S 中关联一个 pvc

  • 在将这个 pvc 提供给业务 pod 来使用

  • 数据最终还是会写到 ceph 上

  • 创建 ceph 普通用户的 secret,用于挂载存储卷

  • 先给容器创建存储类

  • 再给容器创建 pvc

3.1.3.1 创建 admin 用户 secret

1.获取到 admin 的 key

[10:21:19 root@ceph-deploy ceph-cluster]#cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
    key = AQDuV21hhQT9CRAArHrvZv/O5iwFZ7yzUcFSJw==
    caps mds = "allow *"
    caps mgr = "allow *"
    caps mon = "allow *"

2.通过 base64 加密

[10:22:42 root@ceph-deploy ceph-cluster]#echo AQDuV21hhQT9CRAArHrvZv/O5iwFZ7yzUcFSJw== | base64 
QVFEdVYyMWhoUVQ5Q1JBQXJIcnZadi9PNWl3Rlo3eXpVY0ZTSnc9PQo=

3.在 K8S master 节点编写 admin 的 secret 文件

[10:20:03 root@master cephyaml]#vim case5-secret-admin.yaml 

apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret-admin
type: "kubernetes.io/rbd"
data:
  key: QVFEdVYyMWhoUVQ5Q1JBQXJIcnZadi9PNWl3Rlo3eXpVY0ZTSnc9PQo=

4.创建 secret

[10:23:39 root@master cephyaml]#kubectl apply -f case5-secret-admin.yaml 

3.1.3.2 创建普通用户 secret

1.编写普通用户 secret 文件

[10:30:10 root@master cephyaml]#cat case3_secret.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret-guiyuan
type: "kubernetes.io/rbd"
data:
  key: QVFBdlpHMWh5bG8rT1JBQUVLbGxGTGl0TTJsempiOC9aMVo5WFE9PQo=

2.创建

[10:30:23 root@master cephyaml]#kubectl apply -f case3_secret.yaml 

3.1.3.2 创建存储类

1.编写存储类模板

[10:24:25 root@master cephyaml]#vim case6-ceph-storage-class.yaml 

apiVersion: storage.k8s.io/v1
kind: StorageClass                   # 类型存储类
metadata:
  name: ceph-storage-class-guiyuan   # 存储类名称
  annotations:                       # 注释信息
    storageclass.kubernetes.io/is-default-class: "true" #设置为默认存储类,以后凡是创建 pv 都会调用 ceph 创建
provisioner: kubernetes.io/rbd       # 存储类型 rbd
parameters:                          # 消息信息
  monitors: 10.0.0.202:6789          # ceph mon 节点和端口
  adminId: admin                     # 授权用户 admin
  adminSecretName: ceph-secret-admin # 绑定刚才创建的 admin secret
  adminSecretNamespace: default      # admin secret 所在的 namespace
  pool: zgy-rbd-pool1                # ceph 存储池
  userId: guiyuan                    # ceph 普通用户 id,用于挂载数据
  userSecretName: ceph-secret-guiyuan # 普通用户的 secret 

2.创建

[10:31:22 root@master cephyaml]#kubectl apply -f case6-ceph-storage-class.yaml 

3.1.3.3 创建业务 pod 对应的 pvc

1.编写 yaml

[10:32:15 root@master cephyaml]#vim case7-mysql-pvc.yaml 

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-data-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: ceph-storage-class-guiyuan      # 绑定存储类创建 pvc,这个时候 K8S 会连接到 ceph 上创建 pvc ,然后把 pv 和 pvc 关联起来
  resources:
    requests:
      storage: '5Gi'

2.创建 pvc

[10:33:46 root@master cephyaml]#kubectl apply -f case7-mysql-pvc.yaml 

3.创建 mysql 业务 pod

root@k8s-master:~/cephyaml# vim case8-mysql.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.6.46 
        name: mysql
        env:
          # Use secret in real usage
        - name: MYSQL_ROOT_PASSWORD
          value: 123456
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql         # 挂载至 /var/lib/mysql    
      volumes:
      - name: mysql-persistent-storage   
        persistentVolumeClaim:              # 挂载的存储类名称
          claimName: mysql-data-pvc         # 绑定的 pvc


---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: mysql-service-label 
  name: mysql-service
spec:
  type: NodePort
  ports:
  - name: http
    port: 3306
    protocol: TCP
    targetPort: 3306
    nodePort: 43306
  selector:
    app: mysql

3.2 ceph FS 存储

像 nginx 这种静态服务,我们一般会使用 cephFS 来实现多主机的同时挂载

3.2.1 部署 MDS

Ceph FS 需要运行 Meta Data Services(MDS)服务,其守护进程为 ceph-mds,ceph-mds 进程管理与 cephFS 上存储的文件相关的元数据,并协调对 ceph 存储集群的访问。

1.这里我们可以将 mds 服务部署在 mon 节点上

root@ceph-mon:~# apt-cache madison ceph-mds 

root@ceph-mon:~# apt install ceph-mds 

2.添加 mds 服务至 ceph-mon节点

root@ceph-deploy:~# cd ceph-cluster/
root@ceph-deploy:~/ceph-cluster# ceph-deploy mds create ceph-mon

3.2.2 在 ceph-deploy 节点创建存储池

1.创建元数据和数据存储池

# 创建元数据存储池
root@ceph-deploy:~# ceph osd pool create cephfs-metadata 32 32

# 创建数据本身存储池
root@ceph-deploy:~# ceph osd pool create cephfs-data 64 64

2.创建 CephFS 并验证

# 创建 mycephfs 的 cephfs,并且指定他的元数据存储池和数据本身存储池
root@ceph-deploy:~# ceph fs new mycephfs cephfs-metadata cephfs-data

# 验证 mycephfs 已经创建
root@ceph-deploy:~#  ceph fs ls
name: mycephfs, metadata pool: cephfs-metadata, data pools: [cephfs-data ]

# 验证当前 cephfs 状态
root@ceph-deploy:~/ceph-cluster#  ceph fs status
mycephfs - 0 clients
========
RANK  STATE     MDS        ACTIVITY     DNS    INOS   DIRS   CAPS  
 0    active  ceph-mon  Reqs:    0 /s    10     13     12      0   
      POOL         TYPE     USED  AVAIL  
cephfs-metadata  metadata  96.0k  75.7G  
  cephfs-data      data       0   75.7G  
MDS version: ceph version 16.2.6 (ee28fb57e47e9f88813e24bbf4c14496ca299d31) pacific (stable)

root@ceph-deploy:~# ceph  mds stat
mycephfs:1 {0=ceph-mgr1=up:active}  # 现在已经转变为活动状态

3.2.3 在 pod 中使用 cephFS

1.在 ceph-deploy 节点上获取 admin 的 key,并转为 base64 编码

root@ceph-deploy:~/ceph-cluster# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
    key = AQDQh25hCqIyFhAA3Lg7LbrwqNFVKstMPLu3kQ==
    caps mds = "allow *"
    caps mgr = "allow *"
    caps mon = "allow *"
    caps osd = "allow *"

# base64 转换
root@ceph-deploy:~/ceph-cluster# echo AQDQh25hCqIyFhAA3Lg7LbrwqNFVKstMPLu3kQ== | base64
QVFEUWgyNWhDcUl5RmhBQTNMZzdMYnJ3cU5GVktzdE1QTHUza1E9PQo=

2.编写 secret

root@k8s-master:~/cephyaml# vim case5-secret-admin.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret-admin
type: "kubernetes.io/rbd"
data:
  key: QVFEUWgyNWhDcUl5RmhBQTNMZzdMYnJ3cU5GVktzdE1QTHUza1E9PQo=
  
  
# 创建 secret 
root@k8s-master:~/cephyaml# kubectl apply -f case5-secret-admin.yaml 

3.将对应用户的 key 文件拷贝至所有的 K8S 节点中

# 这里我是用的 admin 用户,并且拷贝至 K8S 所有的 节点中

root@ceph-deploy:~/ceph-cluster# scp /etc/ceph/ceph.conf /etc/ceph/ceph.client.admin.keyring 10.0.0.132:/etc/ceph

3.编写 yaml 文件

root@k8s-master:~/cephyaml# vim case9-nginx-cephfs.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels: #rs or deployment
      app: ng-deploy-80
  template:
    metadata:
      labels:
        app: ng-deploy-80
    spec:
      containers:
      - name: ng-deploy-80
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: cephfs                  
          mountPath: /usr/share/nginx/html/
      volumes:
        - name: cephfs
          cephfs:                       # 挂载类型 cephfs
            monitors:
            - '10.0.0.135:6789'         # ceph-mon 节点 ip:port
            path: /
            user: admin                 # 使用 ceph admin 认证
            secretRef:                  # 通过 secret 类型
              name: ceph-secret-admin   # 绑定 admin 的 secret

4.创建

root@k8s-master:~/cephyaml# kubectl apply -f case9-nginx-cephfs.yaml 

5.验证

root@k8s-master:~/cephyaml# kubectl get pod 
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-688b78f955-rmfpb   1/1     Running   0          115s
nginx-deployment-688b78f955-s27mh   1/1     Running   0          115s
nginx-deployment-688b78f955-tcb5n   1/1     Running   0          115s

3.2.4 在 pod 中验证

1.进入 pod 验证是否挂载成功

root@k8s-master:~/cephyaml# kubectl exec -it nginx-deployment-688b78f955-rmfpb /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nginx-deployment-688b78f955-rmfpb:/# df       
Filesystem        1K-blocks    Used Available Use% Mounted on
overlay           102685624 6867300  90559164   8% /
tmpfs                 65536       0     65536   0% /dev
tmpfs               2007928       0   2007928   0% /sys/fs/cgroup
/dev/sda1         102685624 6867300  90559164   8% /etc/hosts
shm                   65536       0     65536   0% /dev/shm
10.0.0.135:6789:/  79130624       0  79130624   0% /usr/share/nginx/html    # 挂载成功

2.在挂载目录中创建一个文件

root@nginx-deployment-688b78f955-rmfpb:/# echo "cephfs-test" >> /usr/share/nginx/html/index.html

3.通过 curl 命令验证

root@nginx-deployment-688b78f955-rmfpb:/# curl 127.0.0.1
cephfs-test                             # 访问成功
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇