我正在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
的默认模式。但我不确定它是否会起作用,或者不会有任何其他问题。