【问题标题】:Add users to a Kubernetes deployment of MySQL with secrets使用机密将用户添加到 MySQL 的 Kubernetes 部署
【发布时间】:2021-06-03 05:52:51
【问题描述】:

我的总体目标是在 Kubernetes 中部署后自动创建 MySQL 用户(尽管有 root)。

我找到了以下资源:
How to create mysql users and database during deployment of mysql in kubernetes?
Add another user to MySQL in Kubernetes

人们建议可以使用 ConfigMap 将 .sql 脚本挂载到 docker-entrypoint-initdb.d 以创建这些用户。为此,我必须将这些用户的密码以纯文本形式放在此脚本中。这是一个潜在的安全问题。因此,我想将 MySQL 用户名和密码存储为 Kubernetes Secret。

这是我的 ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
  labels:
    app: mysql-image-db
data:
  initdb.sql: |-
    CREATE USER <user>@'%' IDENTIFIED BY <password>;

如何在此 ConfigMap 中访问关联的 Kubernetes 机密?

【问题讨论】:

  • Kubernetes SecretConfigMap 类似,但不同的 kubernetes 对象。在this guide 你可以找到用例。在部署中,您可以参考ConfigMapSecret。同样在this guide 中,您可以找到SecretConfigMapMySQL 的示例。请详细说明您的最后一个问题。
  • 感谢您的评论。我已经知道 Kubernetes Secrets 和 ConfigMaps 是什么。我使用 Secret 通过环境变量设置 MySQL root 密码。但是,没有 MySQL 环境变量可以为其他用户设置凭据。这就是我尝试在 ConfigMap 中检索 Secret 的原因。
  • 我有点困惑。在How to create mysql users and database during deployment of mysql in kubernetes? 你有使用脚本的例子。在 Add another user to MySQL in Kubernetes 中,您有创建 configmap 的示例,而不是在 pod 中使用。既然可以使用 secret,为什么还要将 ConfigMap 与 Secret 关联?
  • 在 Kubernetes 文档中,您有示例使用 Secret 作为 VolumeEnvironment Variable 在此文档中,您还有 2 种不同的方法。您是否需要一些需要通过 ConfigMap 使用 Secret 的特定场景?
  • 我其实不知道,您可以将 Secret 作为卷挂载到 Pod 中并在那里访问它。这实际上可能是我的用例的解决方案。如果它有效,我会尝试一下。谢谢!

标签: mysql docker kubernetes


【解决方案1】:

我终于能够为我自己的问题提供解决方案。由于 PjoterS 让我知道您可以将 Secrets 作为卷挂载到 Pod 中,因此我想出了以下解决方案。

这是用户创建脚本的 ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-init-script
  labels:
    app: mysql-image-db
data:
  init-user.sh: |-
    #!/bin/bash
    sleep 30s

    mysql -u root -p"$(cat /etc/mysql/credentials/root_password)" -e \
      "CREATE USER '$(cat /etc/mysql/credentials/user_1)'@'%' IDENTIFIED BY '$(cat /etc/mysql/credentials/password_1)';"

为了完成这项工作,我需要将 ConfigMap 和 Secret 挂载为我的 Deployment 的卷,并添加了一个 postStart 生命周期挂钩来执行用户创建脚本。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-image-db
spec:
  selector:
    matchLabels:
      app: mysql-image-db
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql-image-db
    spec:
      containers:
        - image: mysql:8.0
          name: mysql
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  key: root_password
                  name: mysql-user-credentials
          ports:
            - containerPort: 3306
              name: mysql
          volumeMounts:
            - name: mysql-persistent-volume
              mountPath: /var/lib/mysql
            - name: mysql-config-volume
              mountPath: /etc/mysql/conf.d
            - name: mysql-init-script-volume
              mountPath: /etc/mysql/init
            - name: mysql-credentials-volume
              mountPath: /etc/mysql/credentials
          lifecycle:
            postStart:
              exec:
                command: ["/bin/bash", "-c", "/etc/mysql/init/init-user.sh"]
      volumes:
        - name: mysql-persistent-volume
          persistentVolumeClaim:
            claimName: mysql-volume-claim
        - name: mysql-config-volume
          configMap:
            name: mysql-config
        - name: mysql-init-script-volume
          configMap:
            name: mysql-init-script
            defaultMode: 0777
        - name: mysql-credentials-volume
          secret:
            secretName: mysql-user-credentials

【讨论】:

  • 太棒了。很高兴你能解决它。
猜你喜欢
  • 2022-06-22
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 2019-11-04
  • 2017-06-29
  • 1970-01-01
相关资源
最近更新 更多