簡體   English   中英

Kubernetes Pod 中已安裝卷的所有權問題

[英]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用戶運行的地步(這是在我的自定義圖像所基於的DockerfileUSER指令中定義的)。 當我直接運行圖像( 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的位置(與containersvolumes相同的級別)是否可能是錯誤的。 有人可以就此事提出建議嗎?

fsGroup需要存儲的支持。

正如您所確認的,您正在使用hostPath卷。
在這種情況下fsGroup不應該工作。
出於安全原因,它因hostPath而被禁用。

所以是的,通常 init 容器(在 root 用戶下運行)是hostPath的唯一可行選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM