[英]issue with ownership on mounted volumes in a Kubernetes Pod
我正在嘗試在 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...
)時,一切正常。
我在這個問題上找到了這個線程,這意味着這是一個解決方案
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
相同的級別)是否可能是錯誤的。 有人可以就此事提出建議嗎?
fsGroup
需要存儲的支持。
正如您所確認的,您正在使用hostPath
卷。
在這種情況下fsGroup
不應該工作。
出於安全原因,它因hostPath
而被禁用。
所以是的,通常 init 容器(在 root 用戶下運行)是hostPath
的唯一可行選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.