1

我正在努力在 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 集群在本地完成的。

谢谢

4

1 回答 1

0

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

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

如果您仍想尝试此操作,您也许可以尝试将默认的 db 存储位置更改为/var/lib/mysql文件中以外的其他内容,/etc/my.cnf甚至是该volumeMount. 但我不确定它是否会起作用或者不会有任何其他问题。

于 2021-04-08T09:45:48.583 回答