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 
 

 
 
