我有以下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容器和安全上下文