为什么在kubernetes pod中安装GCE卷导致延迟?

时间:2016-01-18 12:10:07

标签: google-cloud-storage google-compute-engine kubernetes persistent-storage

我有一个kubernetes pod,我使用持久性卷声明附加了GCE持久卷。 (对于没有批量声明的更糟糕的问题,请参阅:Mounting a gcePersistentDisk kubernetes volume is very slow

当没有附加音量时,pod会立即启动(最多2秒)。但是当pod具有GCE持久性卷安装时,Running状态达到20到60秒之间。我正在测试不同的磁盘大小(10,200,500 GiB)和多个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"
        }
    }
}

另外

1 个答案:

答案 0 :(得分:1)

GCE(以及AWS和OpenStack)必须首先将磁盘/卷附加到节点,然后才能将其装入并暴露给您的Pod。附件所需的时间取决于云提供商。

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

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