在Kubernetes(GKE)中的一个节点上组合多个本地SSD

在Kubernetes(GKE)中的一个节点上组合多个本地SSD,kubernetes,google-kubernetes-engine,Kubernetes,Google Kubernetes Engine,我的容器所需的数据太大,无法安装在一个本地SSD上。我还需要从容器中作为一个文件系统访问SSD。所以我需要附加多个。如何组合它们(单分区、RAID0等),并使它们作为容器中的一个卷装载进行访问 此链接共享如何将SSD装载到装载路径。我不知道你将如何合并多个 编辑 问题是如何在GKE中的单个节点上“组合”多个单独安装的SSD设备 您可以使用yaml文件部署pod,该pod将在启动时运行,前提是已经创建了一个带有2个本地SSD的集群(该pod将负责创建Raid0磁盘) 在上面的示例中,可以访问磁盘阵

我的容器所需的数据太大,无法安装在一个本地SSD上。我还需要从容器中作为一个文件系统访问SSD。所以我需要附加多个。如何组合它们(单分区、RAID0等),并使它们作为容器中的一个卷装载进行访问

此链接共享如何将SSD装载到装载路径。我不知道你将如何合并多个

编辑

问题是如何在GKE中的单个节点上“组合”多个单独安装的SSD设备

您可以使用yaml文件部署pod,该pod将在启动时运行,前提是已经创建了一个带有2个本地SSD的集群(该pod将负责创建Raid0磁盘)

在上面的示例中,可以访问磁盘阵列的pod是“/mnt/disks/ssd array”

apiVersion: v1
kind: Pod
metadata:
 name: test-pod
spec:
 containers:
- name: test-container
  image: ubuntu
  volumeMounts:
  - mountPath: /mnt/disks/ssd-array
   name: ssd-array
  args:
  - sleep
  - "1000"
nodeSelector:
 cloud.google.com/gke-local-ssd: "true"
tolerations:
- key: "local-ssd"
 operator: "Exists"
 effect: "NoSchedule"
volumes:
- name: ssd-array
  hostPath:
   path: /mnt/disks/ssd-array
部署测试pod后,从云shell或任何实例将SSH连接到pod

然后运行:

  kubectl exec -it test-pod -- /bin/bash
之后,您应该能够在ssd阵列磁盘中看到创建的文件

cat test-file.txt
您可以使用yaml文件部署pod,该pod将在启动时运行,前提是已经创建了一个带有2个本地SSD的集群(该pod将负责创建Raid0磁盘)

在上面的示例中,可以访问磁盘阵列的pod是“/mnt/disks/ssd array”

apiVersion: v1
kind: Pod
metadata:
 name: test-pod
spec:
 containers:
- name: test-container
  image: ubuntu
  volumeMounts:
  - mountPath: /mnt/disks/ssd-array
   name: ssd-array
  args:
  - sleep
  - "1000"
nodeSelector:
 cloud.google.com/gke-local-ssd: "true"
tolerations:
- key: "local-ssd"
 operator: "Exists"
 effect: "NoSchedule"
volumes:
- name: ssd-array
  hostPath:
   path: /mnt/disks/ssd-array
部署测试pod后,从云shell或任何实例将SSH连接到pod

然后运行:

  kubectl exec -it test-pod -- /bin/bash
之后,您应该能够在ssd阵列磁盘中看到创建的文件

cat test-file.txt
警告 这是实验性的,不打算在没有 知道自己在做什么,并且只在gke版本1.16.x上进行了测试

该方法包括一个
守护程序集
,使用
配置映射
对主机命名空间和特权访问使用
nsenter
(带有等待技巧),以便您可以管理设备。特别是对于GKE本地SSD,我们可以卸载这些设备,然后对其进行raid0。InitContainer用于脏工作,因为这种类型的任务似乎最明显,您需要标记为完成,然后终止特权容器访问(甚至Pod)。这是如何做到的

本例假设16个SSD,但是,您需要根据需要调整硬编码值。另外,请确保您的操作系统映像要求,我使用Ubuntu。还要确保您使用的GKE版本在sd[b]处启动本地ssd

ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: local-ssds-setup
  namespace: search
data:
    setup.sh: |
        #!/bin/bash
        # returns exit codes: 0 = found, 1 = not found
        isMounted() { findmnt -rno SOURCE,TARGET "$1" >/dev/null;} #path or device

        # existing disks & mounts
        SSDS=(/dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk /dev/sdl /dev/sdm /dev/sdn /dev/sdo /dev/sdp /dev/sdq)

        # install mdadm utility
        apt-get -y update && apt-get -y install mdadm --no-install-recommends
        apt-get autoremove

        # OPTIONAL: determine what to do with existing, I wipe it here
        if [ -b "/dev/md0" ]
            then
            echo "raid array already created"

            if isMounted "/dev/md0"; then
                echo "already mounted - unmounting"
                umount /dev/md0 &> /dev/null || echo "soft error - assumed device was mounted"
            fi

            mdadm --stop /dev/md0
            mdadm --zero-superblock "${SSDS[@]}"                
        fi

        # unmount disks from host filesystem
        for i in {0..15}
        do 
            umount "${SSDS[i]}" &> /dev/null || echo "${SSDS[i]} already unmounted"
        done

        if isMounted "/dev/sdb";
            then 
            echo ""
            echo "unmount failure - prevent raid0" 1>&2
            exit 1
        fi

        # raid0 array
        yes | mdadm --create /dev/md0 --force --level=0 --raid-devices=16 "${SSDS[@]}"

        echo "raid array created"

        # format 
        mkfs.ext4 -F /dev/md0

        # mount, change /mnt/ssd-array to whatever
        mkdir -p /mnt/ssd-array
        mount /dev/md0 /mnt/ssd-array
        chmod a+w /mnt/ssd-array

    wait.sh: |
        #!/bin/bash
        while sudo fuser /var/{lib/{dpkg,apt/lists},cache/apt/archives}/lock >/dev/null 2>&1; do sleep 1; done
执事吊舱规格

spec:
      hostPID: true
      nodeSelector:
        cloud.google.com/gke-local-ssd: "true"
      volumes:
      - name: setup-script
        configMap:
          name: local-ssds-setup
      - name: host-mount
        hostPath:
          path: /tmp/setup
      initContainers:
      - name: local-ssds-init
        image: marketplace.gcr.io/google/ubuntu1804
        securityContext:
          privileged: true
        volumeMounts:
        - name: setup-script
          mountPath: /tmp
        - name: host-mount
          mountPath: /host
        command:
          - /bin/bash
          - -c
          - |
            set -e
            set -x

            # Copy setup script to the host
            cp /tmp/setup.sh /host

            # Copy wait script to the host 
            cp /tmp/wait.sh /host

            # Wait for updates to complete
            /usr/bin/nsenter -m/proc/1/ns/mnt -- chmod u+x /tmp/setup/wait.sh

            # Give execute priv to script
            /usr/bin/nsenter -m/proc/1/ns/mnt -- chmod u+x /tmp/setup/setup.sh

            # Wait for Node updates to complete
            /usr/bin/nsenter -m/proc/1/ns/mnt /tmp/setup/wait.sh

            # If the /tmp folder is mounted on the host then it can run the script
            /usr/bin/nsenter -m/proc/1/ns/mnt /tmp/setup/setup.sh
      containers:
      - image: "gcr.io/google-containers/pause:2.0"
        name: pause
警告 这是实验性的,不打算在没有 知道自己在做什么,并且只在gke版本1.16.x上进行了测试

该方法包括一个
守护程序集
,使用
配置映射
对主机命名空间和特权访问使用
nsenter
(带有等待技巧),以便您可以管理设备。特别是对于GKE本地SSD,我们可以卸载这些设备,然后对其进行raid0。InitContainer用于脏工作,因为这种类型的任务似乎最明显,您需要标记为完成,然后终止特权容器访问(甚至Pod)。这是如何做到的

本例假设16个SSD,但是,您需要根据需要调整硬编码值。另外,请确保您的操作系统映像要求,我使用Ubuntu。还要确保您使用的GKE版本在sd[b]处启动本地ssd

ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: local-ssds-setup
  namespace: search
data:
    setup.sh: |
        #!/bin/bash
        # returns exit codes: 0 = found, 1 = not found
        isMounted() { findmnt -rno SOURCE,TARGET "$1" >/dev/null;} #path or device

        # existing disks & mounts
        SSDS=(/dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk /dev/sdl /dev/sdm /dev/sdn /dev/sdo /dev/sdp /dev/sdq)

        # install mdadm utility
        apt-get -y update && apt-get -y install mdadm --no-install-recommends
        apt-get autoremove

        # OPTIONAL: determine what to do with existing, I wipe it here
        if [ -b "/dev/md0" ]
            then
            echo "raid array already created"

            if isMounted "/dev/md0"; then
                echo "already mounted - unmounting"
                umount /dev/md0 &> /dev/null || echo "soft error - assumed device was mounted"
            fi

            mdadm --stop /dev/md0
            mdadm --zero-superblock "${SSDS[@]}"                
        fi

        # unmount disks from host filesystem
        for i in {0..15}
        do 
            umount "${SSDS[i]}" &> /dev/null || echo "${SSDS[i]} already unmounted"
        done

        if isMounted "/dev/sdb";
            then 
            echo ""
            echo "unmount failure - prevent raid0" 1>&2
            exit 1
        fi

        # raid0 array
        yes | mdadm --create /dev/md0 --force --level=0 --raid-devices=16 "${SSDS[@]}"

        echo "raid array created"

        # format 
        mkfs.ext4 -F /dev/md0

        # mount, change /mnt/ssd-array to whatever
        mkdir -p /mnt/ssd-array
        mount /dev/md0 /mnt/ssd-array
        chmod a+w /mnt/ssd-array

    wait.sh: |
        #!/bin/bash
        while sudo fuser /var/{lib/{dpkg,apt/lists},cache/apt/archives}/lock >/dev/null 2>&1; do sleep 1; done
执事吊舱规格

spec:
      hostPID: true
      nodeSelector:
        cloud.google.com/gke-local-ssd: "true"
      volumes:
      - name: setup-script
        configMap:
          name: local-ssds-setup
      - name: host-mount
        hostPath:
          path: /tmp/setup
      initContainers:
      - name: local-ssds-init
        image: marketplace.gcr.io/google/ubuntu1804
        securityContext:
          privileged: true
        volumeMounts:
        - name: setup-script
          mountPath: /tmp
        - name: host-mount
          mountPath: /host
        command:
          - /bin/bash
          - -c
          - |
            set -e
            set -x

            # Copy setup script to the host
            cp /tmp/setup.sh /host

            # Copy wait script to the host 
            cp /tmp/wait.sh /host

            # Wait for updates to complete
            /usr/bin/nsenter -m/proc/1/ns/mnt -- chmod u+x /tmp/setup/wait.sh

            # Give execute priv to script
            /usr/bin/nsenter -m/proc/1/ns/mnt -- chmod u+x /tmp/setup/setup.sh

            # Wait for Node updates to complete
            /usr/bin/nsenter -m/proc/1/ns/mnt /tmp/setup/wait.sh

            # If the /tmp folder is mounted on the host then it can run the script
            /usr/bin/nsenter -m/proc/1/ns/mnt /tmp/setup/setup.sh
      containers:
      - image: "gcr.io/google-containers/pause:2.0"
        name: pause

对于高性能用例,使用GKE特性。所有本地SSD将配置为(条带化)raid0阵列并装入pod

快速总结:

  • 使用以下选项创建节点池或群集:--临时存储本地ssd计数=X
  • 计划使用cloud.google.com/gke临时存储本地ssd的节点
  • 添加一个emptyDir
  • 使用volumeMounts安装它
  • 下面是我如何将其用于守护程序:

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: myapp
      labels:
        app: myapp
    spec:
      selector:
        matchLabels:
          app: myapp
      template:
        metadata:
          labels:
            app: myapp
        spec:
          nodeSelector:
            cloud.google.com/gke-ephemeral-storage-local-ssd: "true"
          volumes:
          - name: localssd
            emptyDir: {}
          containers:
            - name: myapp
              image: <IMAGE>
              volumeMounts:
                - mountPath: /scratch
                  name: localssd
    
    apiVersion:apps/v1 种类:守护进程 元数据: 名称:myapp 标签: 应用程序:myapp 规格: 选择器: 火柴标签: 应用程序:myapp 模板: 元数据: 标签: 应用程序:myapp 规格: 节点选择器: cloud.google.com/gke-ephemeral-storage-local-ssd:“true” 卷数: -名称:localssd emptyDir:{} 容器: -名称:myapp 图片: 体积数量: -安装路径:/scratch 名称:localssd
    对于高性能用例,请使用GKE功能。所有本地SSD将配置为(条带化)raid0阵列并装入pod

    快速总结:

  • 使用以下选项创建节点池或群集:--临时存储本地ssd计数=X
  • 计划使用cloud.google.com/gke临时存储本地ssd的节点
  • 添加一个emptyDir
  • 使用volumeMounts安装它
  • 下面是我如何将其用于守护程序:

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: myapp
      labels:
        app: myapp
    spec:
      selector:
        matchLabels:
          app: myapp
      template:
        metadata:
          labels:
            app: myapp
        spec:
          nodeSelector:
            cloud.google.com/gke-ephemeral-storage-local-ssd: "true"
          volumes:
          - name: localssd
            emptyDir: {}
          containers:
            - name: myapp
              image: <IMAGE>
              volumeMounts:
                - mountPath: /scratch
                  name: localssd
    
    apiVersion:apps/v1 种类:守护进程 元数据: 名称:myapp 标签: 应用程序:myapp 规格: 选择器: 火柴标签: 应用程序:myapp 模板: 元数据: 标签: 应用程序:myapp 规格: 节点选择器: cloud.google.com/gke-ephemeral-storage-local-ssd:“true” 卷数: -名称:localssd emptyDir:{} 容器: -名称:myapp 图片: 体积数量: -安装路径:/scratch 名称:localssd
    请阅读本页,因为除非您准备接受“是”作为答案,否则这是一个可怕的问题。请解释您遵循的程序?您的具体计划是什么?或者您是否收到任何错误消息?提供更多信息可以帮助我们找出问题所在,然后社区可以为您提供最佳答案。对此表示抱歉。编辑了描述。希望对你有所帮助。请阅读本页,因为联合国