如何将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
我不太了解如何动态地完成所有这些工作?
您能推荐一种更好的方法来达到预期效果吗?
答案 0 :(得分:1)
我会考虑使用DaemonSet。这将使您的pod只能在每个节点上运行,因此ReadWriteOnce将生效。约束将是,您不能将应用程序扩展到超过您拥有的节点数量。
答案 1 :(得分:1)
您应使用StatefulSet
和volumeClaimTemplates
配置,如下所示:
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