Google cloud storage 为什么在kubernetes吊舱中装载GCE卷会导致延迟?

Google cloud storage 为什么在kubernetes吊舱中装载GCE卷会导致延迟?,google-cloud-storage,google-compute-engine,kubernetes,persistent-storage,Google Cloud Storage,Google Compute Engine,Kubernetes,Persistent Storage,我有一个kubernetes吊舱,我使用持久性卷声明将GCE持久性卷附加到该吊舱上。(对于没有批量索赔的更糟糕问题,请参见:) 当没有连接卷时,pod立即启动(最多2秒)。但是当pod具有GCE持久卷装载时,将在20到60秒之间达到Running状态。我测试了不同大小的磁盘(10200500Gib)和多个pod创建,并且大小似乎与延迟无关 而且这种延迟不仅发生在开始时,而且也发生在使用复制控制器执行滚动更新时,或者在运行时代码崩溃时 以下是kubernetes规范: 复制控制器 { "a

我有一个kubernetes吊舱,我使用持久性卷声明将GCE持久性卷附加到该吊舱上。(对于没有批量索赔的更糟糕问题,请参见:)

当没有连接卷时,pod立即启动(最多2秒)。但是当pod具有GCE持久卷装载时,将在20到60秒之间达到
Running
状态。我测试了不同大小的磁盘(10200500Gib)和多个pod创建,并且大小似乎与延迟无关

而且这种延迟不仅发生在开始时,而且也发生在使用复制控制器执行滚动更新时,或者在运行时代码崩溃时

以下是kubernetes规范:

复制控制器

{
    "apiVersion": "v1",
    "kind": "ReplicationController",
    "metadata": {
        "name": "a1"
    },
    "spec": {
        "replicas": 1,
        "template": {
            "metadata": {
                "labels": {
                    "app": "a1"
                }
            },
            "spec": {
                "containers": [
                    {
                        "name": "a1-setup",
                        "image": "nginx",
                        "ports": [
                            {
                                "containerPort": 80
                            },
                            {
                                "containerPort": 443
                            }
                        ]
                    }
                ]
            }
        }
    }
}
批量索赔

{
    "apiVersion": "v1",
    "kind": "PersistentVolumeClaim",
    "metadata": {
        "name": "myclaim"
    },
    "spec": {
        "accessModes": [
            "ReadWriteOnce"
        ],
        "resources": {
            "requests": {
                "storage": "10Gi"
            }
        }
    }
}
那音量呢

{
    "apiVersion": "v1",
    "kind": "PersistentVolume",
    "metadata": {
        "name": "mydisk",
        "labels": {
             "name": "mydisk"
        }
    },
    "spec": {
        "capacity": {
            "storage": "10Gi"
        },
        "accessModes": [
            "ReadWriteOnce"
        ],
        "gcePersistentDisk": {
            "pdName": "a1-drive",
            "fsType": "ext4"
        }
    }
}
此外,GCE(以及AWS和OpenStack)必须先将磁盘/卷连接到节点,然后才能将其装入并暴露到pod中。连接所需的时间取决于云提供商

对于由ReplicationController创建的POD,必须执行额外的分离操作。同一磁盘不能连接到多个节点(至少不能处于读/写模式)。分离和pod清理发生在与连接不同的线程中。具体而言,节点上运行的Kubelet必须将其当前拥有的POD(及其卷的总和)与节点上当前存在的卷进行协调。孤立卷将被卸载和分离。如果您的pod安排在不同的节点上,则必须等待原始节点分离卷


集群最终会达到正确的状态,但每个组件可能需要时间才能到达。这是您的等待时间。

不仅如此,如果您重新启动pod或删除并重新创建,存储可能要到稍后才能卸载,然后尝试装载存储的pod将无法卸载,因为存储已装载到其他位置。。。因此,它将等待存储卸载后才能重新装载。我已经看到了几分钟的延迟,它与我在GKE节点日志中看到的静音错误相匹配。