【问题标题】:Why does a GCE volume mount in a kubernetes pod cause a delay?为什么在 kubernetes pod 中挂载 GCE 卷会导致延迟?
【发布时间】:2016-01-18 12:10:07
【问题描述】:

我有一个 kubernetes pod,我使用持久卷声明将 GCE 持久卷附加到该 pod。 (对于没有数量声明的更糟糕的问题,请参阅: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"
        }
    }
}

还有

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 不仅如此,如果你重新启动一个 pod 或者删除并重新创建,存储可能要过一段时间才能卸载,然后尝试挂载存储的 pod 将无法卸载,因为存储已经安装在其他地方......因此它会等到卸载存储才能重新安装。我看到了几分钟的延迟,它与我在 GKE 节点日志中看到的静音错误相匹配。
    猜你喜欢
    • 2019-08-24
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2019-10-19
    相关资源
    最近更新 更多