问题描述
在使用AKS时遇到了问题,他无法在AKS中获取到Postgres的权限或者使PVC工作。他已经按照文档中的步骤进行了操作,但仍然无法解决问题。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
根据最佳回答,以下设置对我来说是有效的。当在volumeMounts
中使用subPath
时,权限问题会自动解决,因为用户postgres
拥有与subPath
对应的文件夹。
以下是一个示例配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres-deployment
spec:
replicas: 1
...
template:
...
spec:
...
containers:
- ...
volumeMounts:
# 需要一个subpath,因为postgres需要一个空文件夹(挂载的文件夹`/var/lib/postgresql/data`有一个`lost+found`目录)
# 参考:https://stackoverflow.com/questions/51168558/how-to-mount-a-postgresql-volume-using-aws-ebs-in-kubernete
# 这与下面的环境变量PGDATA = /var/lib/postgresql/data/pgdata一起使用
# 这个文件夹的所有者和组是70:70(postgres:postgres),由docker镜像中的这一步完成:
# https://github.com/docker-library/postgres/blob/master/Dockerfile-alpine.template#L146
- mountPath: /var/lib/postgresql/data
subPath: pgdata
name: my-postgres-pv
...
env:
# 需要定义PGDATA环境变量,因为不使用默认的/var/lib/postgresql/data,而是其下的一个子路径
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
...
方案2
请注意,这是一种可能的解决方案,但可能会增加安全风险。请在使用之前评估风险并做好备份。
根据用户的评论,您可以尝试更改POD运行的用户。例如,尝试使用与数据库文件所有者匹配的特权用户。
以下是一个示例配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres-deployment
spec:
replicas: 1
...
template:
...
spec:
securityContext:
runAsUser: 70 # 更改为与数据库文件所有者匹配的用户ID
...
containers:
- ...
volumeMounts:
...
...
env:
...
...
以上是两种可能的解决方案,您可以根据您的需求选择其中一种。希望能帮助到您解决问题。
正文完