【问题标题】:Kubernetes AKS Persistent Volume Disk Claims To Multiple NodesKubernetes AKS 持久卷磁盘声明到多个节点
【发布时间】:2018-12-21 23:26:46
【问题描述】:

如何将 100GB 持久卷磁盘附加到 AKS Kubernetes 集群中的每个节点?

我们正在使用 AKS 在 Azure 上使用 Kubernetes。

我们有一个场景,我们需要将持久卷附加到 AKS 群集中的每个节点。我们在集群中的每个节点上运行 1 个 Docker 容器。

动态附加卷的原因是为了增加每个 Docker 容器完成其工作所需的可用 IOPS 和可用存储量。

在每个 Docker 容器内运行的程序处理非常大的输入数据文件 (10GB) 并写出更大的输出文件 (50GB)。

我们可以挂载 Azure 文件共享,但 Azure 文件共享被限制为 60MB/ps,这对于我们移动这么多原始数据来说太慢了。在 Docker 映像中运行的程序完成后,会将输出文件 (50GB) 移动到 Blob 存储。所有容器的所有输出文件的总和可能超过 1TB。

我在想,如果我们可以将持久卷附加到每个节点,我们就可以增加可用磁盘空间以及 IOPS,而无需使用高 vCPU/RAM 虚拟机配置(即 DS14_v2)。与 CPU 相比,我们的程序的 I/O 密集度更高。

在 Pod 中运行的所有 Docker 映像都完全相同,它们从队列中读取消息,告诉它要处理的特定输入文件。

我按照文档创建了一个 StorageClass、Persistent Volume Claims 和 Persistent Volume,并针对 1 个 POD 运行它。 https://docs.microsoft.com/en-us/azure/aks/azure-disks-dynamic-pv

但是,当我创建部署并将 Pod 数量从 1 扩展到 2 时,我收到错误消息(在生产中,我们会根据需要扩展到尽可能多的节点 ~100)

卷的多重附加错误 “pvc-784496e4-869d-11e8-8984-0a58ac1f1e06”卷已被 吊舱 pv-deployment-67fd8b7b95-fjn2n

我意识到 Azure 磁盘只能附加到 SingleNode (ReadWriteOnce),但是在我们加载 Kubernetes 集群并开始工作时,我不确定如何创建多个磁盘并将它们附加到每个节点。

持久卷声明:

apiVersion: v1
kind: PersistentVolumeClaim
    metadata:
    name: azure-managed-disk
spec:
    accessModes:
    - ReadWriteOnce
    storageClassName: managed-premium
    resources:
    requests:
    storage: 100Gi

这是我的部署:

apiVersion: apps/v1
kind: Deployment
    metadata:
    name: pv-deployment
    labels:
    app: nginx
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
        app: nginx
    spec:
      containers:
        - name: myfrontend
        image: nginx
        volumeMounts:
        - name: volume
        mountPath: /mnt/azure
        resources: 
          limits:
            cpu: ".7"
            memory: "2.5G"
          requests:
            cpu: ".7"
            memory: "2.5G"      
         volumes:
         - name: volume
         persistentVolumeClaim:
          claimName: azure-managed-disk

如果我知道我要扩展到 100 个节点,我是否必须创建一个包含 100 个部署的 .yaml 文件并明确每个部署以使用特定的卷声明?

例如,在我的卷声明中,我有 azure-claim-01、azure-claim-02 等,在每个部署中,我必须对每个命名的卷声明进行声明

volumes:
    - name: volume
      persistentVolumeClaim:
        claimName: azure-claim-01

我无法完全理解如何动态地完成这一切?

您能推荐一种更好的方法来达到预期的效果吗?

【问题讨论】:

  • 使用 Azure 文件而不是 Azure 磁盘怎么样?那可以解决你的问题。您可以将 ReadWriteMany 与他们一起使用,这是您提出的主要问题。
  • 感谢@aurelius 的评论。我使用过 AzureFiles,但是当我有大量应用程序都在文件共享中复制文件时,它变得非常慢。

标签: azure kubernetes persistent-volumes persistent-volume-claims


【解决方案1】:

您应该使用StatefulSetvolumeClaimTemplates 配置,如下所示:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 4
  updateStrategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: k8s.gcr.io/nginx-slim:0.8
          ports:
           - containerPort: 80
          volumeMounts:
            - name: persistent-storage
              mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: persistent-storage
      annotations:
        volume.beta.kubernetes.io/storage-class: hdd
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 2Gi
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: hdd
provisioner: kubernetes.io/azure-disk
parameters:
  skuname: Standard_LRS
  kind: managed
  cachingMode: ReadOnly

您将获得每个节点的持久卷:

kubectl get pv

NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM                              STORAGECLASS   REASON
  AGE
pvc-0e651011-7647-11e9-bbf5-c6ab19063099   2Gi        RWO            Delete           Bound     default/persistent-storage-web-0   hdd
  51m
pvc-17181607-7648-11e9-bbf5-c6ab19063099   2Gi        RWO            Delete           Bound     default/persistent-storage-web-1   hdd
  49m
pvc-4d488893-7648-11e9-bbf5-c6ab19063099   2Gi        RWO            Delete           Bound     default/persistent-storage-web-2   hdd
  48m
pvc-6aff2a4d-7648-11e9-bbf5-c6ab19063099   2Gi        RWO            Delete           Bound     default/persistent-storage-web-3   hdd
  47m

每个节点都会创建专用的持久卷声明:

kubectl get pvc

NAME                       STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistent-storage-web-0   Bound     pvc-0e651011-7647-11e9-bbf5-c6ab19063099   2Gi        RWO            hdd            55m
persistent-storage-web-1   Bound     pvc-17181607-7648-11e9-bbf5-c6ab19063099   2Gi        RWO            hdd            48m
persistent-storage-web-2   Bound     pvc-4d488893-7648-11e9-bbf5-c6ab19063099   2Gi        RWO            hdd            46m
persistent-storage-web-3   Bound     pvc-6aff2a4d-7648-11e9-bbf5-c6ab19063099   2Gi        RWO            hdd            45m

【讨论】:

    【解决方案2】:

    我会考虑使用 DaemonSet。这将允许您的 pod 仅在每个节点上运行,因此 ReadWriteOnce 将生效。约束条件是,您的应用程序扩展规模不能超过您拥有的节点数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2021-03-28
      • 2017-06-05
      • 1970-01-01
      相关资源
      最近更新 更多