这里不在概叙 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
replicas1
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
containerPort80
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
readOnlyfalse
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
replicas1
selector
matchLabels
app ng-deploy-80
template
metadata
labels
app ng-deploy-80
spec
containers
name ng-deploy-80
image nginx
imagePullPolicy IfNotPresent
ports
containerPort80
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 mysql5.6.46
name mysql
env
# Use secret in real usage
name MYSQL_ROOT_PASSWORD
value123456
ports
containerPort3306
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
port3306
protocol TCP
targetPort3306
nodePort43306
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
replicas3
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
containerPort80
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 # 访问成功