如何克服安装在mysql映像中的机密的只读文件系统错误



我正在K8s集群中设置一个mysql实例,该实例支持TLS客户端连接。为此,我设置了一个cert-manager来颁发自签名证书。我可以看到ca.crt, tls.key, tls.crt成功地在我的mysql命名空间中的secret中创建。我遵循了以下文章https://www.jetstack.io/blog/securing-mysql-with-cert-manager/

现在要使用这个证书,我的计划是将证书放在/var/lib/mysql目录中,并使用配置映射更新mysql.conf文件。以下是mysql.yaml pod规范的外观。

kind: Service
metadata:
name: mysql
namespace: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
clusterIP: None
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config
data:
mysql.cnf: |- 
[mysqld]
ssl-ca=/var/lib/mysql/ca.crt
ssl-cert= /var/lib/mysql/tls.crt
ssl-key=/var/lib/mysql/tls.key
require_secure_transport=ON 
---
apiVersion: v1
kind: Pod
metadata:
name: mysql
labels:
name: mysql
spec:
#  securityContext:
#    runAsUser: 0
containers:
- image: mysql:5.7
name: mysql
resources: {}
env:
# Use secret in real usage
- name: MYSQL_ROOT_PASSWORD
value: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-cert-secret
#mountPath: /app/ca.crt
mountPath: /var/lib/mysql/ca.crt
subPath: ca.crt
- name: mysql-cert-secret
mountPath: /var/lib/mysql/tls.crt
#mountPath: /app/tls.crt
subPath: tls.crt
- name: mysql-cert-secret
mountPath: /var/lib/mysql/tls.key
#mountPath: /app/tls.key
subPath: tls.key
- name: config-map-mysqlconf
mountPath: /etc/mysql/mysql.conf
volumes:
- name: mysql-cert-secret
secret:
secretName: mysql-server-tls
- name : config-map-mysqlconf
configMap:
name: mysql-config

如果我用say/app/ca.crt更新挂载路径,那么挂载就可以工作了,当我在shell中访问时,我可以看到证书。但是对于/var/lib/mysql*,我得到以下错误。

错误图像

我尝试使用securityContext,但没有帮助,因为root和mysql用户都可以访问该目录。如有任何帮助,我们将不胜感激。如果有更好的方法来完成这件事,我也很乐意尝试。

这一切都是使用KinD集群在本地完成的。

谢谢

MySQL默认情况下将DB文件存储在/var/lib/mysql中,并且肯定会尝试将所有权设置为mysql用户。也许在这里。

任何更新机密卷的尝试都将导致错误,而不是成功的更改,因为它们是Pod文件系统中的只读投影。我认为这就是为什么您在后面的文章中没有建议在任何地方使用dir/var/lib/mysql的原因。

如果您仍然想尝试这样做,您可以尝试将文件/etc/my.cnf中的默认数据库存储位置更改为/var/lib/mysql以外的位置,甚至更改为该volumeMount的默认模式。但我不确定它是否会起作用,或者不会有任何其他问题。

相关内容

  • 没有找到相关文章

最新更新