我正在使用 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 重新安装,但我不想这样做,因为数据库中有我不想丢失的架构和用户。
谢谢您的帮助!
您无法更改现有正在运行的 Pod 的大部分字段。 对于大多数设置,如果需要更改它们,则需要删除并重新创建 Pod。 像 Deployments 和 StatefulSets 这样的更高级别的控制器的存在部分是为了管理这个。
Kubernetes API 文档包括 Pod 的定义 及其中的字段。 例如,您试图更改
containers: [{ volumeMounts: }]
,但是 containers:
的顶级定义注意到(强调我的)
属于 pod 的容器列表。目前无法添加或删除容器。一个 Pod 中必须至少有一个容器。 无法更新。
也就是说:一旦 Pod 存在,您就无法向其添加更多卷挂载,因为这需要更改容器定义,而这些定义是无法更改的。
StatefulSets 的规则略有不同,因为有一个标准机制,用于在 Pod 模板发生更改时删除和重新创建由 StatefulSet 管理的 Pod。 该 API 文档没有指出错误消息显示的特定更新约束,但错误消息很清楚,您无法将新的顶级 PVC 模板添加到现有 StatefulSet。
对于您的高级用例,我可能会满足于将数据存储在其他地方。 在大多数情况下,数据库服务器不会访问本地文件(通过 SQL
COPY FROM
为数据库播种是最显着的例外)。 如果您将文件路径存储在数据库列的某些存储中,则应用程序需要访问数据库和存储,但这两个部分不需要直接相互通信。