挂载目录的所有权错误



我有以下kubernetes yaml文件:

1   apiVersion: apps/v1
1 kind: Deployment
2 metadata:
3   name: postgres-deployment
4 spec:
5   replicas: 1
6   selector:
7     matchLabels:
8       component: postgres
9   template:
10     metadata:
11       labels:
12         component: postgres
13     spec:
14       securityContext:
15           runAsUser: 999
16           runAsGroup: 999
17           fsGroup: 999
18       volumes:
19         - name: postgres-storage
20           persistentVolumeClaim:
21             claimName: postgres-persistent-volume-claim
22       containers:
23         - name: postgres
24           image: prikshet/postgres
25           ports:
26             - containerPort: 5432
27           volumeMounts:
28             - name: postgres-storage
29               mountPath: /var/lib/postgresql/data
30               subPath: postgres
31           imagePullPolicy: Always

但是pod给出了以下日志:

2021-08-11 06:06:15.749 GMT [8] LOG:  skipping missing configuration file "/var/lib/postgresql/data/postgresql.auto.conf"
2021-08-11 06:06:15.750 UTC [8] FATAL:  data directory "/var/lib/postgresql/data" has wrong ownership
2021-08-11 06:06:15.750 UTC [8] HINT:  The server must be started by the user that owns the data directory.

而显然我有fsGroup, runAsUser和runAsGroup指定。是什么导致了这个错误?

这里的问题是,您可能有许多可用的本地存储支持的PersistentVolumes,并且postgres pod随机分配给其中一个,但是您只更改了一个PV的所有权为正确的值。因此,如果您的pod被分配到任何其他pv,它将崩溃。

特别是,这可能发生在下一次重新部署时,即使第一次部署运行正常。这是因为Kubernetes有一个错误,即删除的PersistentVolumeClaims将PersistentVolumes保留在"已发布"中;状态永久保存(至少对于本地存储类)。所以你的pod永远不会被分配到"固定的"挂载点,它将卡在Pending状态,或者被分配给另一个本地PV,该PV在其挂载点上有错误的权限。

您需要使用kubectl get pv之类的东西来识别pod正在使用的PersistentVolume,然后在它们的挂载点内,将所有本地可用卷的所有者和组更改为999:999

从Bitnami的Helm图表中安装的一些Postgres实例也会引发此错误,但这些权限必须在所有可用的挂载点上更改为1001:1001。绑定的挂载点不需要更改。

我会使用initContainer: chmod就像你和这个答案可能会帮助你。init容器和安全上下文

相关内容

  • 没有找到相关文章

最新更新