上云无忧 > 文档中心 > 百度智能云容器引擎服务 CCE 使用文件存储CFS
容器引擎服务CCE
百度智能云容器引擎服务 CCE 使用文件存储CFS

文档简介:
准备工作: 用户做好以下准备,才能在容器中挂载CFS实例。 注册百度账号,并完成实名认证。 创建一个可用的容器集群。 开通CFS服务。 创建CFS实例和挂载点。 创建容器集群: 创建一个容器集群,操作步骤参考创建集群。 下载命令行客户端kubectl,并连接集群,操作步骤参考通过kubectl连接Kubernetes集群。
*此产品及展示信息均由百度智能云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

准备工作

用户做好以下准备,才能在容器中挂载CFS实例。

  • 注册百度账号,并完成实名认证。
  • 创建一个可用的容器集群。
  • 开通CFS服务。
  • 创建CFS实例和挂载点。

创建容器集群

  1. 创建一个容器集群,操作步骤参考创建集群。
  2. 下载命令行客户端kubectl,并连接集群,操作步骤参考通过kubectl连接Kubernetes集群

创建CFS实例和挂载点

  1. 创建CFS实例,操作步骤请参考创建文件系统
  2. 添加CFS挂载点,操作步骤请参考添加挂载点

注意: 创建的cfs实例和挂载点须和集群节点在同一vpc内。

  1. 获取CFS挂载地址,操作步骤请参考获取挂载地址

本操作假设CFS挂载点地址为 cfs-test.baidubce.com

操作指南

静态PV/PVC方式挂载CFS

1.在集群中创建PV和PVC资源

使用kubectl,执行 kubectl create -f pv-cfs.yaml 完成PV的创建

对应的pv-cfs.yaml文件如下所示:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-cfs
spec:
  capacity:
    storage: 8Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  mountOptions:
    - hard
    - nfsvers=4.1
    - nordirplus
  nfs:
    path: /
    server: cfs-test.baidubce.com

注意: yaml中server字段对应的是CFS挂载点地址

注意: yaml中path字段对应的是CFS挂载目录,该目录需要在挂载前预先存在

创建PV后,输入kubectl get pv可以看见一个available状态的PV,如下所示:

$ kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
pv-cfs    8Gi        RWX            Retain           Available                                      3s

建立一个能够与该PV绑定的PVC

使用kubectl,执行 kubectl create -f pvc-cfs.yaml完成PVC的创建

对应的pvc-cfs.yaml文件如下所示:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc-cfs
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 8Gi

绑定前,PVC为pending状态

$ kubectl get pvc
NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-cfs   Pending                                                 2s                                                  2s

绑定后,PV和PVC状态变为Bound

$ kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM             STORAGECLASS   REASON    AGE
pv-cfs    8Gi        RWX            Retain           Bound     default/pvc-cfs                            36s
$ kubectl get pvc
NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-cfs   Bound     pv-cfs    8Gi        RWX                           1m

有关PV和PVC的更多设置和字段说明,见k8s官方文档

2.在Pod内挂载PVC

在Pod spec内指定相应的PVC名称即可,使用kubectl,执行 kubectl create -f demo-cfs-pod.yaml 完成Pod的创建

对应的demo-cfs-pod.yaml文件如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: demo-cfs-pod
  labels:
    app: demo-cfs-pod
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
      - name: cfs-pvc
        mountPath: "/cfs-volume"
  volumes:
    - name: cfs-pvc
      persistentVolumeClaim:
        claimName: pvc-cfs

Pod创建后,可以读写容器内的/cfs-volume路径来访问相应的CFS存储上的内容。

由于创建PV和PVC时指定了accessModes为ReadWriteMany,该PVC可以被多节点上的Pod挂载读写。

3.释放PV和PVC资源

完成存储资源的使用后,可以释放PVC和PV资源。在释放PVC和PV之前,需要先删除挂载了对应PVC的所有Pod。

使用以下命令可以释放PVC

$ kubectl delete -f  pvc-cfs.yaml

释放PVC后,原来与之绑定的PV状态会变为Release,如下所示:

NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM             STORAGECLASS   REASON    AGE
pv-cfs    8Gi        RWX            Retain           Released   default/pvc-cfs                            16m

输入以下指令释放PV资源

$ kubectl delete -f  pv-cfs.yaml

动态PV/PVC方式挂载CFS

1.创建StorageClass和Provisioner

dynamic-cfs-template.yaml是一个yaml文件模板,包含了需要创建的集群资源信息。

dynamic-cfs-template.yaml文件内容如下:

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-runner
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"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    namespace: kube-system
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  namespace: kube-system
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  namespace: kube-system
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: kube-system
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  namespace: kube-system
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-cfs
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  mountOptions:
    - hard
    - nfsvers=4.1
    - nordirplus
  nfs:
    path: {{NFS_PATH}}
    server: {{NFS_SERVER}}
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc-cfs
  namespace: kube-system
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-client-provisioner
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app: nfs-client-provisioner
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: registry.baidubce.com/cce-plugin-pro/nfs-client-provisioner:latest
          imagePullPolicy: Always
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: {{PROVISIONER_NAME}}
            - name: NFS_SERVER
              value: {{NFS_SERVER}}
            - name: NFS_PATH
              value: {{NFS_PATH}}
      volumes:
        - name: nfs-client-root
          persistentVolumeClaim:
            claimName: pvc-cfs

---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: {{STORAGE_CLASS_NAME}}
provisioner: {{PROVISIONER_NAME}}
parameters:
  archiveOnDelete: "{{ARCHIVE_ON_DELETE}}"
  sharePath: "{{SHARE_PATH}}"
mountOptions:
  - hard
  - nfsvers=4.1
  - nordirplus

dynamic-cfs-template.yaml模板文件中可自定义的选项如下:

  • NFS_SERVER: CFS挂载点地址。
  • NFS_PATH: CFS远程挂载目录,注意该目录在使用前需要预先存在,如果目录不存在会导致provisioner插件启动失败。
  • SHARE_PATH: 不同PVC的CFS挂载目录是否隔离,true-不隔离,false-隔离。若指定隔离,则会在CFS挂载目录下为每个PVC创建一个子目录,对应PVC使用该子目录作为挂载目录;否则所有PVC共享挂载目录。
  • ARCHIVE_ON_DELETE: 删除PVC后是否保留对应数据,仅当PVC挂载目录隔离时生效,true-保留,false-不保留;PVC挂载目录共享时,删除PVC不会删除任何数据。设置为不保留则直接删除对应PVC的子目录,否则仅将原子目录名加上archive-前缀后保留。
  • STORAGE_CLASS_NAME: 创建的StorageClass名称。
  • PROVISIONER_NAME: Provisioner名称。

支持shell的系统中,可以直接使用下面的replace.sh脚本进行yaml模板中模板变量的替换操作。

#!/bin/sh
# user defined vars

NFS_SERVER="cfs-test.baidubce.com"
NFS_PATH="/cce/shared"
SHARE_PATH="true" # 不同PVC的挂载目录是否隔离,true-不隔离,false-隔离
ARCHIVE_ON_DELETE="false" # 删除PVC是否保留对应数据,仅当PVC挂载目录隔离时生效,true-保留,false-不保留
STORAGE_CLASS_NAME="sharedcfs" # StorageClass名称
PROVISIONER_NAME="baidubce/cfs-provisioner" # provisioner名称

YAML_FILE="./dynamic-cfs-template.yaml"

# replace template vars in yaml file

sed -i "s#{{SHARE_PATH}}#$SHARE_PATH#" $YAML_FILE
sed -i "s#{{ARCHIVE_ON_DELETE}}#$ARCHIVE_ON_DELETE#" $YAML_FILE
sed -i "s#{{STORAGE_CLASS_NAME}}#$STORAGE_CLASS_NAME#" $YAML_FILE
sed -i "s#{{PROVISIONER_NAME}}#$PROVISIONER_NAME#" $YAML_FILE
sed -i "s#{{NFS_SERVER}}#$NFS_SERVER#" $YAML_FILE
sed -i "s#{{NFS_PATH}}#$NFS_PATH#" $YAML_FILE

将脚本中前半段中的shell变量替换为期望值,将replace.sh脚本和dynamic-cfs-template.yaml文件放置在同一个目录下,执行sh replace.sh即可。

或者采用其他方式,将模板yaml文件中的模板变量替换为期望值。

最后,使用kubectl工具,执行 kubectl create -f dynamic-cfs-template.yaml 完成StorageClass和Provisioner的创建。

$ kubectl create -f dynamic-cfs-template.yaml
clusterrole "nfs-client-provisioner-runner" created
clusterrolebinding "run-nfs-client-provisioner" created
role "leader-locking-nfs-client-provisioner" created
rolebinding "leader-locking-nfs-client-provisioner" created
serviceaccount "nfs-client-provisioner" created
persistentvolume "pv-cfs" created
persistentvolumeclaim "pvc-cfs" created
deployment "nfs-client-provisioner" created
storageclass "sharedcfs" created
$ kubectl get pod --namespace kube-system  | grep provisioner
nfs-client-provisioner-c94494f6d-dlxmj   1/1       Running   0          26s

如果相应的Pod进入Running状态,则动态绑定PV所需的资源已经建立成功。

2.创建PVC时动态生成PV并绑定

在PVC Spec中指定上面创建的StorageClass名称,则在创建PVC时,会自动调用相应StorageClass绑定的的Provisioner生成相应的PV进行绑定。

使用kubectl,执行 kubectl create -f dynamic-pvc-cfs.yaml 完成PVC的创建。

假设创建的StorageClass名称为sharedcfs,对应的 dynamic-pvc-cfs.yaml 文件如下所示

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: dynamic-pvc-cfs
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: sharedcfs
  resources:
    requests:
      storage: 5Gi

创建PVC后,可以看见相应的PV自动创建,PVC状态变为Bound,即PVC已经与新创建的PV绑定。

$ kubectl create -f dynamic-pvc-cfs.yaml
persistentvolumeclaim "dynamic-pvc-cfs" created
$ kubectl get pvc
NAME              STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
dynamic-pvc-cfs   Bound     pvc-6dbf3265-bbe0-11e8-bc54-fa163e08135d   5Gi        RWX            sharedcfs      4s
$ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM                 
    STORAGECLASS   REASON    AGE
pv-cfs                                     5Gi        RWX            Retain           Bound     kube-system/pvc-cfs                                21m
pvc-6dbf3265-bbe0-11e8-bc54-fa163e08135d   5Gi        RWX            Delete           Bound     default/dynamic-pvc-cfs  
 sharedcfs                7s

3.在Pod内挂载PVC

在Pod spec内指定相应的PVC名称即可,使用kubectl,执行 kubectl create -f dynamic-cfs-pod.yaml 完成资源的创建。

对应的dynamic-cfs-pod.yaml文件如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: test-pvc-pod
  labels:
    app: test-pvc-pod
spec:
  containers:
  - name: test-pvc-pod
    image: nginx
    volumeMounts:
      - name: cfs-pvc
        mountPath: "/cfs-volume"
  volumes:
    - name: cfs-pvc
      persistentVolumeClaim:
        claimName: dynamic-pvc-cfs

Pod创建后,可以读写容器内的/cfs-volume路径来访问相应的CFS存储上的内容。

4.释放PVC时动态销毁绑定PV

删除PVC时,与之绑定的动态PV会被一同删除,其中的数据则根据用户定义的SHARE_PATH和ARCHIVE_ON_DELETE选项进行相应的保留或删除处理。

$ kubectl get pvc
NAME              STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
dynamic-pvc-cfs   Bound     pvc-6dbf3265-bbe0-11e8-bc54-fa163e08135d   5Gi        RWX            sharedcfs      9m
$ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM             
        STORAGECLASS   REASON    AGE
pv-cfs                                     5Gi        RWX            Retain           Bound     kube-system/pvc-cfs 
                               31m
pvc-6dbf3265-bbe0-11e8-bc54-fa163e08135d   5Gi        RWX            Delete           Bound     default/dynamic-pvc-cfs   sharedcfs   
             9m
$ kubectl delete -f dynamic-pvc-cfs.yaml
persistentvolumeclaim "dynamic-pvc-cfs" deleted
$ kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM                 STORAGECLASS   REASON    AGE
pv-cfs    5Gi        RWX            Retain           Bound     kube-system/pvc-cfs                            31m
$ kubectl get pvc
No resources found.

相似文档
  • 准备工作: 用户做好以下准备,才能在容器中挂载BOS实例。 注册百度账号,并完成实名认证。 进入BOS页面创建bucket。 创建一个可用的容器集群。 创建Bucket: 创建BOS Bucket,操作步骤请参考创建bucket。 注意: 请注意创建的BOS Bucket所处地域。如果创建的BOS Bucket与容器集群分属不同地域,要求挂载点所在BCC/BBC开放公网访问,同地域则可以通过内网读写。
  • 目前 CCE 的容器监控是由一系列的开源组件构成,用户可以在页面上自定义部署各个组件,并设置其公网开放策略、持久化配置等。全部部署后,用户将获得如下的监控能力: 基于开源的 prometheus + grafana + node-exporter + kube-state-metrics 的采集、存储、展示方案。
  • CCE 基于 Prometheus + Alertmanager 的方案为用户提供快速可视化的报警配置,用户可根据需求配置节点,应用等维度的报警规则,告警将以邮件或短信发送给指定用户或用户组。
  • K8S Events 可以通过 kubectl describe 进行查看,用户通过获取 K8S Events 能够及时的诊断集群或服务异常。K8S 默认只提供 1 小时的 Events 信息,用户可通过在 CCE 开启 Event 持久化,查询最长 7 天之内的数据。
  • CCE 日志管理功能帮助用户对 kubernetes 集群中的业务日志和容器日志进行管理。用户通过日志管理可以将集群中的日志输出到外部的 Elasticsearch 服务或者百度云自己的 BOS 存储中,从而对日志进行分析或者长期保存。
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部