Hazx小屋 Hazx小屋

Kubernetes(K8s)接入CephFS文件存储(动态PV)

in 服务器相关 阅读: 1663 文章转载请注明来源!


  本篇笔记也是由于本人工作原因在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
WeChat Pay

微信打赏

Alipay

支付宝打赏

文章二维码

扫描二维码,在手机上阅读!

服务器相关
最后由Hazx修改于2018-12-07 15:49
发表新评论
博客系统已萌萌哒运行了
© 2019 Hazx. Theme by Jrotty.
前篇 后篇
雷姆
拉姆