有没有办法将PVC附加到Kubernetes中现有的正在运行的Pod?

问题描述 投票:0回答:1

我正在使用 Bitnami Postgresql-HA Helm 图表 在 Kubernetes 中运行 Postgresql 集群。我还有一个 PersistentVolumeClaim (PVC),其中充满了不会进入数据库的数据。我想将此 PVC 安装在我的 Postgres pod 中,以便数据库可以读取和引用该数据。

我尝试编辑Helm图表的values.yaml中的

postgresql.extraVolumes
postgresql.extraVolumeMounts
参数,但它返回了:

StatefulSet.apps "app" is invalid: spec: Forbidden: updates to stateful set spec for fields other than 'replicas', 'template', 'updateStrategy', and 'minReadySeconds' are forbidden

我还尝试直接使用

kubectl edit
编辑 Pod,并在
spec.volumes
spec.containers.volumeMounts
下添加卷,但这又回来了

spec: Forbidden: pod updates may not change fields other than 'spec.containers[*].image', 'spec.initContainers[*].image', 'spec.activeDeadlineSeconds', 'spec.tolerations' (only additions to existing tolerations), 'spec.terminationGracePeriodSeconds' (allow it to be set to 1 if it was previously negative)

上述内容让我认为我的问题的答案是直接的“否”,但我还没有从我的研究中得出明确的“否”答案,所以我还是要问这个问题。

我知道我可以删除正在运行的所有内容并使用 Helm 重新安装,但我不想这样做,因为数据库中有我不想丢失的架构和用户。

谢谢您的帮助!

postgresql kubernetes kubernetes-helm kubectl bitnami
1个回答
0
投票

您无法更改现有正在运行的 Pod 的大部分字段。 对于大多数设置,如果需要更改它们,则需要删除并重新创建 Pod。 像 Deployments 和 StatefulSets 这样的更高级别的控制器的存在部分是为了管理这个。

Kubernetes API 文档包括 Pod 的定义 及其中的字段。 例如,您试图更改

containers: [{ volumeMounts: }]
,但是
containers:
的顶级定义注意到(强调我的)

属于 pod 的容器列表。目前无法添加或删除容器。一个 Pod 中必须至少有一个容器。 无法更新。

也就是说:一旦 Pod 存在,您就无法向其添加更多卷挂载,因为这需要更改容器定义,而这些定义是无法更改的。

StatefulSets 的规则略有不同,因为有一个标准机制,用于在 Pod 模板发生更改时删除和重新创建由 StatefulSet 管理的 Pod。 该 API 文档没有指出错误消息显示的特定更新约束,但错误消息很清楚,您无法将新的顶级 PVC 模板添加到现有 StatefulSet。

对于您的高级用例,我可能会满足于将数据存储在其他地方。 在大多数情况下,数据库服务器不会访问本地文件(通过 SQL

COPY FROM
为数据库播种是最显着的例外)。 如果您将文件路径存储在数据库列的某些存储中,则应用程序需要访问数据库和存储,但这两个部分不需要直接相互通信。

© www.soinside.com 2019 - 2024. All rights reserved.