本文通过对比runC容器和安全沙箱(runV)容器的性能和创建方式,让您了解安全沙箱容器的优势以便更好地使用安全沙箱容器。

runC容器和安全沙箱(runV)容器方案对比

配置 runC容器 安全沙箱(runV)容器
容器引擎 Docker、Containerd Containerd
容器所在节点型号 ECS、EBM EBM
容器内核 与宿主机共享内核 独占内核
容器隔离方式 Cgroups和Namespace 轻量虚拟机
Rootfs Graph Driver OverlayFS DeviceMapper
Rootfs IO限速 Cgroups DeviceMapper Block IO Limit
NAS直挂
云盘直挂
容器日志文件采集 logtail直接从宿主机侧采集容器内的日志。 logtail sidecar,详情请参见通过Sidecar-CRD方式采集容器日志
Pod Overhead Memory:512Mi。Pod Overhead为沙箱本身资源占用。比如Pod申请的limits.memory = 512Mi,那么该Pod最终会申请1024Mi的内存。

runC Pod和安全沙箱(runV)Pod的创建方式对比

您可以通过kubectl命令行工具连接容器服务Kubernetes版(ACK)集群,请参见通过kubectl连接Kubernetes集群

  • 创建runC Pod
    1. 通过runtimeClassName: runc指定使用runC容器运行时。
      说明 您也可以不配置,Pod会用默认的容器运行时runC。
    2. 执行以下命令创建runC Pod。
      cat <<EOF | kubectl create -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: busybox-runc
        labels:
          app: busybox-runc
      spec:
        containers:
        - name: busybox
          image: registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2
          command:
          - tail
          - -f
          - /dev/null 
          resources:
            limits:
              cpu: 1000m
              memory: 512Mi
            requests:
              cpu: 1000m
              memory: 512Mi
      EOF
  • 创建安全沙箱容器(runV)
    1. 通过runtimeClassName: runv指定使用安全沙箱容器运行时。
    2. 执行以下命令查看集群中已经存在的runv这个RuntimeClass对象。
      kubectl get runtimeclass runv -o yaml
      说明 安全沙箱容器集群中默认创建了RuntimeClass对象runv
    3. 执行以下命令创建安全沙箱Pod。
      cat <<EOF | kubectl create -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: busybox-runv
        labels:
          app: busybox-runv
      spec:
        runtimeClassName: runv
        nodeSelector:
          alibabacloud.com/container-runtime: Sandboxed-Container.runv
        containers:
        - name: busybox
          image: registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2
          command:
          - tail
          - -f
          - /dev/null
          resources:
            limits:
              cpu: 1000m
              memory: 512Mi
            requests:
              cpu: 1000m
              memory: 512Mi
      EOF
      注意 如果您的Kubernetes版本小于 1.16(不包括1.16),需添加以下nodeSelector配置;如果您的Kubernetes版本在1.16 (包括1.16)以上则不需要添加。
      nodeSelector:
          alibabacloud.com/container-runtime: Sandboxed-Container.runv
    4. 执行以下命令查看创建的Pod。如果输出结果为runv,则表示Pod已经运行在安全沙箱内了。
      kubectl get pod busybox-runv -o jsonpath={.spec.runtimeClassName}
    5. 执行以下命令登录容器查看CPU和内存规格。
      kubectl exec -ti pod busybox-runv /bin/sh
      / # cat /proc/meminfo | head -n1
      MemTotal:        1130692 kB
      / # cat /proc/cpuinfo | grep processor
      processor    : 0

      通过以上命令返回的结果,可以看出CPU核数并非宿主机CPU核数,内存总大小为Pod内存与Overhead内存之和(系统会消耗一些内存,所以看到的内存会少一些)。