Kubernetes(K8s)接入CephFS文件存储(动态PV)
本篇笔记也是由于本人工作原因在K8s和Ceph方面有所收货而写。CephFS是Ceph的一个文件系统,相对于Ceph RBD,能给K8s提供更高的性能和更可靠的支持。由于是文件系统,所以在维护方面也会非常便利——可以直接在任意安装了
ceph-common
的主机中挂载文件系统、操作里面的文件。学习本篇笔记时需要注意的几点:
- 本篇笔记基于CentOS7、K8s v1.12.3、Ceph 13.2.2 mimic实验环境验证和编写
- 一个Ceph集群仅支持一个CephFS
- 无需担心将ceph的admin权限给K8s,K8s会自动通过admin账户创建独立的新账户给PV,从而隔离每个账户和PV的目录权限;删除PVC时也会自动删除账户
- 笔记中创建和使用了“cephfs”命名空间,秘钥保存在“kube-system”命名空间
Ceph操作部分
此节所有操作需要在【Ceph节点】中进行。
确认MDS节点
使用CephFS必须保证至少有一个节点提供mds服务,可以使用 ceph -s
查看。
若没有MDS节点,请创建至少一个。(方法请暂时自行百度/谷歌吧... 非常抱歉.. 我计划近期写一篇单独的Ceph部署方案,在这里单独一条命令不好解释..)
创建资源池
ceph osd pool create cephfs_data 128
ceph osd pool create cephfs_metadata 128
文件系统需要两个资源池,一个用于存储数据本体,一个用于存放索引信息及其他数据相关信息。
创建文件系统
ceph fs new cephfs cephfs_metadata cephfs_data
获取admin秘钥
ceph auth get-key client.admin | base64
这里输出的结果是直接进行base64加密的,方便后面直接使用。请记下这串字符。
K8s操作部分
安装依赖组件
此操作需要在所有的【K8s节点】中进行,包括【K8s控制节点】。
yum install ceph-common
创建 ceph secret
apiVersion: v1
kind: Secret
metadata:
name: ceph-admin-secret
namespace: kube-system
data:
key: "xxxxxxxxxxxxxx"
这里的Key部分填写上面【获取admin秘钥】部分输出的字符串,带引号。
这里的代码是YAML,你可以直接把它复制到Dashboard的【创建】中执行。
你也可以将代码保存成xxx.yaml文件,然后在控制节点上执行命令 kubectl create -f xxx.yaml
。往下的内容也是如此。
部署 cephfs-provisoner
创建命名空间
apiVersion: v1
kind: Namespace
metadata:
name: cephfs
labels:
name: cephfs
创建服务账户
apiVersion: v1
kind: ServiceAccount
metadata:
name: cephfs-provisioner
namespace: cephfs
创建角色
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: cephfs-provisioner
namespace: cephfs
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["create", "get", "delete"]
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
创建集群角色
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: cephfs-provisioner
namespace: cephfs
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: ["services"]
resourceNames: ["kube-dns","coredns"]
verbs: ["list", "get"]
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "create", "delete"]
- apiGroups: ["policy"]
resourceNames: ["cephfs-provisioner"]
resources: ["podsecuritypolicies"]
verbs: ["use"]
绑定角色
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: cephfs-provisioner
namespace: cephfs
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: cephfs-provisioner
subjects:
- kind: ServiceAccount
name: cephfs-provisioner
绑定集群角色
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: cephfs-provisioner
subjects:
- kind: ServiceAccount
name: cephfs-provisioner
namespace: cephfs
roleRef:
kind: ClusterRole
name: cephfs-provisioner
apiGroup: rbac.authorization.k8s.io
部署cephfs-provisioner
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: cephfs-provisioner
namespace: cephfs
spec:
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: cephfs-provisioner
spec:
containers:
- name: cephfs-provisioner
image: "quay.io/external_storage/cephfs-provisioner:latest"
env:
- name: PROVISIONER_NAME
value: ceph.com/cephfs
command:
- "/usr/local/bin/cephfs-provisioner"
args:
- "-id=cephfs-provisioner-1"
- "-disable-ceph-namespace-isolation=true"
serviceAccount: cephfs-provisioner
创建存储类
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: cephfs
provisioner: ceph.com/cephfs
parameters:
monitors: 192.168.10.101:6789,192.168.10.102:6789,192.168.10.103:6789
adminId: admin
adminSecretName: ceph-admin-secret
adminSecretNamespace: "kube-system"
claimRoot: /volumes/kubernetes
- 如果你只有一个MON,“monitors”这一项就填一个,末尾没有逗号。
- “claimRoot”用来设定PV创建在Ceph文件系统中的目录。
测试
创建PVC
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc-test
annotations:
volume.beta.kubernetes.io/storage-class: cephfs
volume.beta.kubernetes.io/storage-provisioner: ceph.com/cephfs
spec:
storageClassName: cephfs
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
测试POD
kind: Pod
apiVersion: v1
metadata:
name: pod-test
spec:
containers:
- name: test-pod
image: centos
command:
- "/bin/sh"
args:
- "-c"
- "ping 127.0.0.1"
volumeMounts:
- name: pvc
mountPath: "/mnt"
restartPolicy: "Always"
imagePullPolicy: IfNotPresent
volumes:
- name: pvc
persistentVolumeClaim:
claimName: pvc-test
扫描二维码,在手机上阅读!
最后由Hazx修改于2021-10-20 12:25