kubernetes mysql 不允许进行 chown 操作
kubernetes mysql chown operation not permitted
我目前正在试验 Kubernetes 并在 ESX 基础设施上安装了一个小型集群,我在本地 运行ning 了。我使用带有 Fedora 的 Project Atomic 安装了两个从节点和一个主节点。集群全部安装正常,似乎 运行ning。但是,我首先想启动一个 MySQL 容器并 运行ning,但无论我尝试什么,我都无法将其安装到 运行.
apiVersion: v1
kind: Pod
metadata:
name: mysql
labels:
name: mysql
spec:
containers:
- resources:
limits :
cpu: 0.5
image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: myPassw0rd
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
nfs:
server: 10.0.0.2
path: "/export/mysql"
对于我已经尝试过各种解决方案的卷,我尝试使用有声明和没有声明的持久卷。我尝试使用主机卷和 emptyDir,但是当容器启动时我总是以这个错误结束:
chown:更改“/var/lib/mysql/”的所有权:不允许操作
我一定是在做傻事,但不知道该做什么?
好的,看来我可以回答我自己的问题了,问题出在用作持久卷的 NFS 共享上。我在导出中将它设置为 'squash_all' 但它需要有一个 'no_root_squash' 以允许 root 在 docker 容器的情况下在 nfs 绑定卷上进行 chown。
我用其他方法解决了这个问题。关于允许 root 访问 NFS 客户机上导出的 NFS 目录,我与系统管理员发生了争执。他有充分的安全理由不将其设置为 reason one and reason two -read no_root_squash 部分。
最后我没有要求no_root_squash。这就是我在不影响安全性的情况下制作 mysql pod 运行 所做的。
第 1 步
执行到 pod 的容器运行 mysql 图像。 kubectl exec -it -n <namespace> <mysql_pod> -- bash
第 2 步
获得uid(999)和gid(999)mysql 用户。 cat /etc/passwd | tail -n
或 id mysql
。 mysql 用户名可以在 Dockerfile
指定的第二条指令中找到
步骤 3
更改对包含 docker 容器的 /var/lib/mysql 内容的目录的权限。这更有可能是您的 PersistentVolume 中指定的目录。 此命令在主机上执行,而不是在 Pod 中执行!!!
# PerisistentVolume
...
nfs:
path: /path/to/app/mysql/directory
server: nfs-server
运行 chown 999:999 -r /path/to/app/mysql/directory
第 4 步
最后,在设置好所有内容后,部署您的 MySQL Pod(部署、副本集或任何您正在使用的)。
这也可以通过使用 Kubernetes 的 securityContext 定义让 mysql 容器 运行 具有与拥有 nfs 卷相同的 uid 来解决。
containers:
- name: mysql
image: ...
securityContext:
runAsUser: 2015
allowPrivilegeEscalation: false
此处 2015 应替换为 nfs 路径上的任何所有权。
我目前正在试验 Kubernetes 并在 ESX 基础设施上安装了一个小型集群,我在本地 运行ning 了。我使用带有 Fedora 的 Project Atomic 安装了两个从节点和一个主节点。集群全部安装正常,似乎 运行ning。但是,我首先想启动一个 MySQL 容器并 运行ning,但无论我尝试什么,我都无法将其安装到 运行.
apiVersion: v1
kind: Pod
metadata:
name: mysql
labels:
name: mysql
spec:
containers:
- resources:
limits :
cpu: 0.5
image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: myPassw0rd
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
nfs:
server: 10.0.0.2
path: "/export/mysql"
对于我已经尝试过各种解决方案的卷,我尝试使用有声明和没有声明的持久卷。我尝试使用主机卷和 emptyDir,但是当容器启动时我总是以这个错误结束:
chown:更改“/var/lib/mysql/”的所有权:不允许操作
我一定是在做傻事,但不知道该做什么?
好的,看来我可以回答我自己的问题了,问题出在用作持久卷的 NFS 共享上。我在导出中将它设置为 'squash_all' 但它需要有一个 'no_root_squash' 以允许 root 在 docker 容器的情况下在 nfs 绑定卷上进行 chown。
我用其他方法解决了这个问题。关于允许 root 访问 NFS 客户机上导出的 NFS 目录,我与系统管理员发生了争执。他有充分的安全理由不将其设置为 reason one and reason two -read no_root_squash 部分。
最后我没有要求no_root_squash。这就是我在不影响安全性的情况下制作 mysql pod 运行 所做的。
第 1 步
执行到 pod 的容器运行 mysql 图像。 kubectl exec -it -n <namespace> <mysql_pod> -- bash
第 2 步
获得uid(999)和gid(999)mysql 用户。 cat /etc/passwd | tail -n
或 id mysql
。 mysql 用户名可以在 Dockerfile
步骤 3
更改对包含 docker 容器的 /var/lib/mysql 内容的目录的权限。这更有可能是您的 PersistentVolume 中指定的目录。 此命令在主机上执行,而不是在 Pod 中执行!!!
# PerisistentVolume
...
nfs:
path: /path/to/app/mysql/directory
server: nfs-server
运行 chown 999:999 -r /path/to/app/mysql/directory
第 4 步
最后,在设置好所有内容后,部署您的 MySQL Pod(部署、副本集或任何您正在使用的)。
这也可以通过使用 Kubernetes 的 securityContext 定义让 mysql 容器 运行 具有与拥有 nfs 卷相同的 uid 来解决。
containers:
- name: mysql
image: ...
securityContext:
runAsUser: 2015
allowPrivilegeEscalation: false
此处 2015 应替换为 nfs 路径上的任何所有权。