您可以通过安全沙箱的云盘直挂功能,有效地解决IO性能问题。本文介绍安全沙箱云盘直挂的实现原理,并通过示例说明如何使用安全沙箱的云盘直挂功能。

背景信息

virtio-fs是一个共享的文件系统。容器服务Kubernetes版(ACK)安全沙箱使用virtio-fs可以把Volume、Secret、ConfigMap等共享到虚拟机GuestOS内,从而可以用原生的方式通过Volume挂载云盘。但这种方式下,云盘是挂载到主机上的,在容器内要经过virtio-fs才能读写主机上的云盘,由此会带来一些性能损耗。

安全容器提供了安全沙箱云盘直挂的功能。该功能会先卸载主机上的云盘挂载点,然后在GuestOS内挂载云盘,最后把云盘bind mount到容器内,从而能够在容器内直接读写云盘,达到接近原生的性能。

直挂方案

实现原理

实现原理

实现安全沙箱的云盘直挂沙箱功能的流程说明如下。

步骤序号 说明
Kubelet请求CSI-Plugin挂载云盘。
CSI-Plugin格式化云盘,然后在主机上挂载云盘。
Kubelet请求Kangaroo-Runtime创建容器。
Kangaroo-Runtime解析云盘挂载信息并传给GuetOS,同时卸载主机上的云盘。
Kangaroo-Runtime请求Agent创建容器。
Agent把云盘挂载到GuestOS内。
Agent把GuestOS上的云盘bind mount到容器内。

示例

以下通过使用YAML模板创建资源对象举例说明如何在沙箱容器中挂载云盘。

  1. 执行以下命令,使用模板创建资源对象。
    cat <<EOF | kubectl create -f -
    allowVolumeExpansion: true
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alicloud-disk-ssd
    parameters:
      type: cloud_ssd
    provisioner: diskplugin.csi.alibabacloud.com
    reclaimPolicy: Delete
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: disk-pvc-01
      namespace: default
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 25Gi
      storageClassName: alicloud-disk-ssd
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: busybox
      name: busybox
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: busybox
      template:
        metadata:
          labels:
            app: busybox
          annotations:
            storage.alibabacloud.com/enable_ebs_passthrough: "true"
        spec:
          containers:
            - name: busybox
              image: registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2
              command:
              - tail
              - -f
              - /dev/null
              volumeMounts:
                - mountPath: "/data"
                  name: disk-pvc
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          runtimeClassName: runv
          volumes:
            - name: disk-pvc
              persistentVolumeClaim:
                claimName: disk-pvc-01
    EOF
    说明
    默认Pod不启用云盘直挂功能,您需要在模板中通过Annotation开启云盘直通功能。
    annotations:
            storage.alibabacloud.com/enable_ebs_passthrough: "true"
  2. 执行以下命令,进入Pod内验证挂载点文件系统类型。
    kubectl get pods
    kubectl exec -it ${podid} sh
    mount | grep /data | grep -vi virtio_fs
    如果挂载类型不是virtio-fs,说明成功实现云盘直挂功能。