Kubernetes AKS对多个节点的永久卷磁盘声明

时间:2018-07-13 14:33:25

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

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

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

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

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

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

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

我当时在想,如果可以将持久卷附加到每个节点,则可以增加可用磁盘空间以及IOPS,而不必使用较高的vCPU / RAM VM配置(即DS14_v2)。与CPU相比,我们的程序需要更多的I / O操作。

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

我已按照文档创建了StorageClass,持久卷声明和持久卷,并针对1个POD运行了该操作。 https://docs.microsoft.com/en-us/azure/aks/azure-disks-dynamic-pv

但是,当我创建一个Deployment并将Pod的数量从1缩放到2时,我会收到错误消息(在生产中,我们将缩放到尽可能多的节点,数量约100个)

  

音量多次错误   “ pvc-784496e4-869d-11e8-8984-0a58ac1f1e06”卷已由   pod(s)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等,在每个部署中,我都必须对每个命名的Volume Claim提出索赔

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

我不太了解如何动态地完成所有这些工作?

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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