转载:k8s(十一)、分布式存储Cephfs使用

前言:

首先解释一下pv/pvc的相关概念:

PV【persistentVolume】:是k8s抽象化的存储资源,主要包括存储能力、访问模式、存储类型、回收策略等关键信息.PV是k8s实际对接存储后端的真正入口

PVC【PersistentVolumeClaims】:是对PV资源的一种声明,pvc绑定实体资源pv后,pod通过绑定pvc来使用pv资源.PVC是k8s的一种抽象化的声明式绑定存储资源的管理模式的中间层,pod无法直接通过pv使用存储资源,必须经过pvc,而pvc必须要绑定pv实体后,才可被pod使用.

PVCP【persistentVolumeReclaimPolicy】: PV的回收策略:Retain(保留)- 保留数据,不会再分配给pvc,需要管理员手工清理数据Recycle(回收)- 清除 PV 中的数据,保留pv资源,可以留供其他pvc使用Delete(删除)- 删除整个pv资源及内部的数据。

安装:

每个K8S node需要安装ceph-common包,才能正常使用cephfs:

apt-get install ceph-common

创建:

1. 创建k8s 的 secret:

在创建k8s pv前,由于ceph 集群是开启了cephx认证的,于是首先需要k8s 创建secret资源,k8s的secret资源采用的是base64加密。用下列命令在ceph monitor上提取key:

# ceph auth get-key client.admin |base64
QVFCL3E1ZGIvWFdxS1JBQTUyV0ZCUkxldnRjQzNidTFHZXlVYnc9PQ==

创建k8s secret资源:

# vim ceph-secret.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret
data:
  key: QVFCL3E1ZGIvWFdxS1JBQTUyV0ZCUkxldnRjQzNidTFHZXlVYnc9PQ==
  
~/ceph# kubectl apply -f ceph-secret.yaml 

2. 创建k8s 测试的 PV:

 创建yaml文件,spec:cephfs:monitors指定了了cephfs集群的IP,spec:cephfs:user指定了admin用户,spec:cephfs:secretRef指定了前面创建的ceph-secret.yaml资源。

# vim cephfs-pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: cephfs-pv
  labels:
    pv: cephfs-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  cephfs:
    monitors:
      - 192.168.20.112:6789
      - 192.168.20.113:6789
      - 192.168.20.114:6789
    user: admin
    secretRef:
      name: ceph-secret
    readOnly: false
  persistentVolumeReclaimPolicy: Delete

创建及查看 PV 资源

~/ceph# kubectl apply -f cephfs-pv.yaml 
# kubectl get pv
NAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON     AGE
cephfs-pv      1Gi        RWX            Delete        Available                                       6s

3. 创建k8s 测试的 PVC:

创建PVC的yaml文件,用spec:selector指定cephfs-pv:

# vim cephfs-pvc.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: cephfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
 selector:
    matchLabels:
      pv: cephfs-pv

创建及查看 PVC  

#kubectl apply -f cephfs-pvc.yaml
#kubectl get pvc
NAME         STATUS    VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   AGE
cephfs-pvc   Bound     cephfs-pv   1Gi        RWX                           24s

# kubectl get pv
NAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM                STORAGECLASS   REASON    AGE
cephfs-pv   1Gi        RWX            Delete           Bound     default/cephfs-pvc                            8m

可以看到pv和pvc都已经自动变为Bound状态,但是我们这里没有使用任何关联标签,使它们两者进行关联,pvc是怎么自动绑定到pv的呢?其实pvc在创建伊始就会主动去寻找符合requets条件的pv资源,如果寻找到了,便会自动进行绑定,无需做标签匹配.

小Tips:

  • 当pv的容量大于pvc的需求时,pvc可以成功自动绑定pv;
  • 当pv的容量小于pvc的需求时,pvc无法绑定该pv;
  • pv和pvc的绑定关系是一一对应的.
  • pv/pvc的创建顺序是:pv -> pvc -> pod
  • pv/pvc的销毁顺序是:pod -> pvc -> pv,顺序一定不要错

例如:
2G的pv可以被1G的pvc绑定,并且绑定成功后,pvc的实际空间也是2G而不是1G;
1G的pv无法被2G的pvc绑定

4. 创建k8s 测试的 pod实例:

创建yaml文件,yaml文件将创建 pod,并将pod调度到某一个node上,挂载pvc。spec:spec:volumes:persistentVolumeClaim指定PVC

# vim testpod1-deploy.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: testpod1
  name: testpod1
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: testpod1
  template:
    metadata:
      labels:
        app: testpod1
    spec:
      containers:
      - args:
        - /bin/bash
        - -c
        - /run.sh
        image: registry.youkeshu.com:5000/nginx:php7.1v1
        imagePullPolicy: Always
        name: testpod1
        ports:
        - containerPort: 80
          protocol: TCP
        terminationMessagePath: /dev/termination-log
        volumeMounts:
        - mountPath: /var/www
          name: cephfs-testpod1
      dnsPolicy: ClusterFirst
      nodeSelector:
        DEVNODE: ""
      restartPolicy: Always
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - name: cephfs-testpod1
        persistentVolumeClaim:
          claimName: cephfs-pvc

创建和查看pod:

~# kubectl apply -f testpod1-deploy.yaml 
~# kubectl get pods  | grep testpod1
testpod1-7847858587-2rbsq                         1/1       Running            0          10s

到这里就已经把k8s的 secret,pv,pvc及pod都创建好了,下面开始使用cephfs测试一下。

使用:

1. 单pod使用

进入pod并给nginx添加一个主页index.html:

~# kubectl exec -it testpod1-7847858587-2rbsq bash
~# echo "Just for pv/pvc test"  > /var/www/index.html

获取pod ip打开浏览器测试:

到这里,文件系统挂载已经测试完毕,但选用cephfsk8s分布式文件系统的最大优势是因为其支持ReadWriteMany多节点挂载的灵活性,非常符合k8s像管理牲口一样管理你的容器的理念,下面开始跨节点测试。
2. 两 pod 跨节点使用

再创建一个部署文件,让其在另外的node上运行,与上方pod共用一个pvc:

~/ceph# cat testpod2-deploy.yaml 

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: testpod2
  name: testpod2
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: testpod2
  template:
    metadata:
      labels:
        app: testpod2
    spec:
      containers:
      - args:
        - /bin/bash
        - -c
        - /run.sh
        image: registry.youkeshu.com:5000/nginx:php7.1v1
        imagePullPolicy: Always
        name: testpod2
        ports:
        - containerPort: 80
          protocol: TCP
        terminationMessagePath: /dev/termination-log
        volumeMounts:
        - mountPath: /var/www
          name: cephfs-testpod2
      dnsPolicy: ClusterFirst
      nodeSelector:
        PRODNODE: ""
      restartPolicy: Always
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - name: cephfs-testpod2
        persistentVolumeClaim:
          claimName: cephfs-pvc

创建及查看新的pod: 

# kubectl apply -f testpod2-deploy.yaml 
# kubectl get pods -o wide | grep testpod
testpod1-7847858587-2rbsq                         1/1       Running            0          17m       172.26.2.172   h009029
testpod2-6d4b8d5db9-wkpx6                         1/1       Running            0          9s        172.26.0.52    h009028

浏览器打开testpod2主页: 

这里写图片描述

结论:   

cephfs可以很好的实现k8s多节点调度容器时对持久化文件的挂载支持,但是cefs的性能却不如ceph rbd。后续会讲k8s怎么使用rbd及它们之间性能的比较。

 

 

 

 

 

 

 

 

 

 

2

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐