【问题标题】:issue with ownership on mounted volumes in a Kubernetes PodKubernetes Pod 中已安装卷的所有权问题
【发布时间】: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(与containersvolumes 相同级别)的位置是否可能是错误的。有人可以就此事提出建议吗?

【问题讨论】:

  • 您使用的是什么类型的 PV?
  • this 是本主题所基于的storage.yml。不过从昨天开始我已经改变了我的策略,所以我不能 100% 确定这个话题是否仍然有效。根据同事的建议,我正在尝试使用initContainer 来设置访问权限。在启动实际的 postegres 容器之前。仍然无法真正运行。我想我仍然保留这个话题,一旦找到我会发布我的解决方案。

标签: postgresql kubernetes


【解决方案1】:

fsGroup 需要存储支持。

您已确认,您使用的是hostPath 卷。
在这种情况下,fsGroup 不应该工作。
出于安全原因,它因hostPath 而被禁用。

所以是的,通常 init 容器(在 root 用户下运行)是 hostPath 的唯一可行选项。

【讨论】:

    猜你喜欢
    • 2022-12-06
    • 2020-07-30
    • 2016-03-25
    • 2021-05-08
    • 2021-01-12
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多