【发布时间】:2022-02-04 04:51:25
【问题描述】:
我正在尝试在 tanzu k8s 集群中运行有状态的 PostgreSQL ...
~> kubectl version
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.8", GitCommit:"5575935422cc1cf5169dfc8847cb587aa47bac5a", GitTreeState:"clean", BuildDate:"2021-06-16T13:00:45Z", GoVersion:"go1.15.13", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.8+vmware.1", GitCommit:"3e397df2f5dadadfa35958ec45c14b0e81abc25f", GitTreeState:"clean", BuildDate:"2021-06-21T16:59:40Z", GoVersion:"go1.15.13", Compiler:"gc", Platform:"linux/amd64"}
并且遇到了一些麻烦。
我使用 自定义映像,其中 postgres 作为 postgres 用户 运行,并且应该安装 3 个卷。现在看来 k8s 将这些卷挂载为 root:root,因此 pod 永远不会出现此错误消息。
> kcl logs statefulset.apps/postgres-stateful
starting up postgres docker image:
postgres -D /opt/db/data/postgres/data
+ echo 'starting up postgres docker image:'
+ echo postgres -D /opt/db/data/postgres/data
+ '[' '!' -d /opt/db/data/postgres/data ']'
+ '[' '!' -O /opt/db/data/postgres/data ']'
+ mkdir -p /opt/db/data/postgres/data
+ chmod 700 /opt/db/data/postgres/data
chmod: changing permissions of '/opt/db/data/postgres/data': Operation not permitted
这与创建时在容器内运行的docker-entrypoint.sh 有关。现在我已经到了看起来我必须确保容器由postgres 用户运行的地步(这是在Dockerfile 我的自定义图像所基于的USER 指令中定义的)。当我直接运行图像时(podman run ... 或 kubectl run ...)一切正常。
我在这个问题上找到了this thread,这意味着这是一个解决方案
apiVersion: v1
kind: Pod
metadata:
name: hello-world
spec:
containers:
# specification of the pod's containers
# ...
securityContext:
fsGroup: 1234
我已将这种模式应用于我正在使用的 statefulSet,但似乎无法使其工作。
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres-stateful
labels:
app: postgres
spec:
serviceName: "postgres"
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: docker-dev-local.intern.net/ina/postgresql:14.1-scm-debian-bullseye-build-74-4
envFrom:
- configMapRef:
name: postgres-configuration
ports:
- containerPort: 5432
name: postgresdb
volumeMounts:
- name: pv-data
mountPath: /opt/db/data/postgres/data
- name: pv-backup
mountPath: /opt/db/backup/postgres
- name: pv-arch
mountPath: /opt/db/backup/postgres/arch
securityContext:
runAsUser: 1000 # postgres UID
runAsGroup: 1000
fsGroup: 1000
volumes:
- name: pv-data
persistentVolumeClaim:
claimName: pgdata33-pvc
- name: pv-backup
persistentVolumeClaim:
claimName: pgbackup33-pvc
- name: pv-arch
persistentVolumeClaim:
claimName: pgarch33-pvc
现在我想知道securityContext(与containers 和volumes 相同级别)的位置是否可能是错误的。有人可以就此事提出建议吗?
【问题讨论】:
-
您使用的是什么类型的 PV?
-
this 是本主题所基于的
storage.yml。不过从昨天开始我已经改变了我的策略,所以我不能 100% 确定这个话题是否仍然有效。根据同事的建议,我正在尝试使用initContainer来设置访问权限。在启动实际的 postegres 容器之前。仍然无法真正运行。我想我仍然保留这个话题,一旦找到我会发布我的解决方案。
标签: postgresql kubernetes