我正在努力在 K8s 集群中设置一个 mysql 实例,并为客户端连接提供 TLS 支持。为此,我设置了一个cert-manager
来颁发自签名证书。我可以看到ca.crt, tls.key, tls.crt
在我的 mysql 命名空间内的秘密中成功创建。我关注了以下文章https://www.jetstack.io/blog/securing-mysql-with-cert-manager/
现在要使用这个证书,我的计划是将证书放在 /var/lib/mysql 目录中,并使用 config map 更新 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
如果我使用 /app/ca.crt 更新挂载路径,则挂载工作正常,当我在 shell 中访问时,我可以看到证书。但是对于 /var/lib/mysql* 我得到以下错误。
我尝试使用,securityContext
但它没有帮助,因为 root 和 mysql 用户都可以访问该目录。任何帮助将不胜感激。如果有更好的方法来完成这项工作,我也很乐意尝试。
这一切都是使用 KinD 集群在本地完成的。
谢谢