【问题标题】:Using azure file storage with kubernetes and azure container service (aks) - permission denied将 azure 文件存储与 kubernetes 和 azure 容器服务 (aks) 一起使用 - 权限被拒绝
【发布时间】:2017-11-03 18:02:46
【问题描述】:

我有一个 azure 容器服务 (aks) 集群。它已迁移到版本 1.8.1。我正在尝试部署 postgres 数据库并使用 AzureFileVolume 来持久化 postgres 数据。

默认情况下,如果我在没有挂载卷的情况下部署 postgres 数据库,则一切正常,即创建 pod 并初始化数据库。

当我尝试使用下面的 yaml 挂载卷时,我得到 initdb: could not access directory "/var/lib/postgresql/data": Permission denied

我尝试了长篇 github thread 中建议的各种 hack,例如:为 pod 设置安全上下文或在 initContainers 中运行 chown 命令。结果是一样的——权限被拒绝。

任何想法都将不胜感激。

apiVersion: v1
kind: Service
metadata:
  labels:
    app: myapp
    component: test-db
  name: test-db
spec:
  ports:
    - port: 5432
  selector:
    app: myapp
    component: test-db
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: test-db
spec:
  template:
    metadata:
      labels:
        app: myapp
        component: test-db
    spec:
      securityContext:
        fsGroup: 999
        runAsUser: 999      
      containers:
      - name: test-db  
        image: postgres:latest  
        securityContext:
          allowPrivilegeEscalation: false          
        ports:
        - containerPort: 5432
        env:
        - name: POSTGRES_DB
          value: myappdb
        - name: POSTGRES_USER
          value: myappdbuser  
        - name: POSTGRES_PASSWORD
          value: qwerty1234
        volumeMounts:
          - name: azure
            mountPath: /var/lib/postgresql/data              
      volumes:
        - name: azure
          azureFile:
            secretName: azure-secret
            shareName: acishare
            readOnly: false

【问题讨论】:

  • 您指定了 runAsUser: 999,但请记住所有 Docker 卷都将是 mounted as root。这可能会导致权限问题。另外,我发现 kubernetes 有时会重新挂载卷,因此初始的 chmod 可能不够。

标签: postgresql azure kubernetes azure-storage azure-container-service


【解决方案1】:

我们遇到了同样的问题并想出了以下解决方案:

我们没有使用 AzureFileVolume,而是使用了 AzureDisk。所以我们在 Kubernetes 中需要的是以下...

存储类

使用您的 Azure 帐户名

永久卷声明

PostgreSQL 部署 在 Kubernetes 部署中包含 PVC

- name: postgres-db
  persistentVolumeClaim:
      claimName: pvc-postgresdb

此外,我们需要将 PGDATA 变量指向已挂载目录的子目录。因为 Azure 在基目录中创建了一些 AzureDisk 类型的问题。

#... evn definitions... 
- name: PGDATA
  value: /var/lib/postgresql/data/pgdata
volumeMounts:
- mountPath: /var/lib/postgresql/data/
  name: postgres-db

【讨论】:

  • 是的,我从不同的地方听说应该使用 AzureBlob/Disk 而不是 FileStorage。我会在接下来的几天里再试一次。谢谢
  • 请随时在 twitter (@lennartblom) 上向我发送消息以了解详细信息(YAML、Azure 设置)。我们在过去 5 天里一直在解决这个问题……我们很乐意提供帮助!
  • @LennartBlom 您是否像这样运行多个 postgres 副本?
【解决方案2】:

这不起作用,您需要使用 azure 磁盘,因为 postgres 使用 azure 文件不支持的硬链接 https://github.com/docker-library/postgres/issues/548

【讨论】:

    猜你喜欢
    • 2021-05-18
    • 1970-01-01
    • 2019-08-29
    • 2015-06-14
    • 2018-06-25
    • 1970-01-01
    • 2021-09-20
    • 2021-10-04
    • 1970-01-01
    相关资源
    最近更新 更多