【问题标题】:Can't connect to mysql pod in Kubernetes when using Secrets for password (Access denied)使用 Secrets 输入密码时无法连接到 Kubernetes 中的 mysql pod(访问被拒绝)
【发布时间】:2018-01-20 20:20:32
【问题描述】:

我尝试在 Kubernetes 中设置一个 mysql 数据库。我配置了一个 ConfigMap 来存储数据库名称和一个包含 root 密码、用户和用户密码的 Secret。

当我之后尝试连接到数据库时(在容器内部使用 mysql cli 并从外部使用 IntelliJ 数据库工具)我收到“错误 1045 (28000): Access denied for user 'testadm'@'localhost' (using密码:YES)”错误。

我的 kubernetes.yaml 文件:

apiVersion: v1
kind: ConfigMap
metadata:
  name: db
data:
  mysql-database: database

---
apiVersion: v1
kind: Secret
metadata:
   name: db-credentials
type: Opaque
data:
  mysql-root-password: VGVzdDEyMzQK # Test1234
  mysql-user: dGVzdGFkbQo= # testadm
  mysql-password: VGVzdDEyMzQK # Test1234

---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: mysql
spec:
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:5.7
          ports:
            - containerPort: 3306
          env:
            - name: MYSQL_DATABASE
              valueFrom:
                configMapKeyRef:
                  name: db
                  key: mysql-database
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: mysql-root-password
            - name: MYSQL_USER
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: mysql-user
            - name: MYSQL_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: mysql-password

如果我像下面这样直接设置密码,则连接成功在容器内部和外部!

env:
  - name: MYSQL_ROOT_PASSWORD
    value: Test1234

如果我检查容器内的环境变量,我无法发现这两种方法之间的区别。

使用存储在密钥中的密码是否需要任何其他格式?我还尝试将数据字典中的值放在引号中,如下所示:

data:
  mysql-root-password: "VGVzdDEyMzQK"

版本信息

Docker 17.06.0-ce
Minikube 0.21.0
Kubectl Server 1.7.0
Kubectl Client 1.7.3

【问题讨论】:

    标签: mysql docker kubernetes


    【解决方案1】:

    你可以使用这个 yaml 文件。

    apiVersion: v1
    kind: Secret
    metadata:
       name: db-credentials
    type: Opaque
    data:
      mysql-password: VGVzdDEyMzQ=
      mysql-root-password: VGVzdDEyMzQ=
      mysql-user: dGVzdGFkbQ==
    

    【讨论】:

      【解决方案2】:

      您确定您的秘密 yaml 中的数据正确进行了 base64 编码吗?使用https://www.base64encode.org/,您的data 块应该如下所示:

      data:
        mysql-root-password: VGVzdDEyMzQ= # Test1234
        mysql-user: dGVzdGFkbQ== # testadm
        mysql-password: VGVzdDEyMzQ= # Test1234
      

      【讨论】:

      • 是的,我按照此处文档中的说明进行操作:kubernetes.io/docs/concepts/configuration/secret/… - 在我的机器上“echo Test1234 | base64”会导致 VGVzdDEyMzQK。
      • 好的,我现在明白我的错误了。我忘记了 -n 标志。谢谢!
      • @SteffenSchmitz,您能否提供有关 -n 标志的更多详细信息?我在这里面临同样的问题。谢谢。
      • @KokHowTeh 如果没有 -n 标志,echo 会在字符串末尾添加一个新行并对其进行编码。您的密码通常不应该有换行符,这就是需要标志的原因。
      【解决方案3】:

      对于任何遇到换行问题未解决的问题(例如此处的 OP),请注意,一旦创建数据库,您就无法更改 mysql 密码。只有在创建数据库时才会读取环境变量,因此如果您使用持久卷声明,则需要使用旧密码登录并“手动”更改:https://dev.mysql.com/doc/refman/8.0/en/resetting-permissions.html

      【讨论】:

        【解决方案4】:

        您需要授予对客户端计算机的访问权限才能连接 mysql 数据库。

        用你的桌面IP替换<ip>地址并在mysql数据库上运行这个命令。然后测试连接。

        GRANT ALL PRIVILEGES ON *.* TO 'root'@'<ip>'   WITH GRANT OPTION;
        GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'   WITH GRANT OPTION;
        FLUSH PRIVILEGES;
        

        您创建秘密的方式不正确。像这样删除并创建它。我在我的集​​群中测试它工作正常。

        kubectl create secret generic db-credentials --from-literal=mysql-root-password=Test1234 --from-literal=mysql-user=testadm --from-literal=mysql-password=Test1234
        

        【讨论】:

        • 这并不能解决问题。当我在容器内尝试时,访问也被拒绝。只有当我使用在我的 K8S 密码中配置的密码时才会发生这种情况,而不是在我直接配置 env 时发生。
        • 谢谢!这对我也有用。有没有办法从 yaml 文件中创建秘密?
        • 添加yaml文件,测试一下。
        • @sfgroups,我在这里面临同样的问题。如何从 kubernetes 清单 yaml 文件配置 GRANT?谢谢。
        • 我认为在 yaml 文件中添加授权命令不是一个好主意。您需要运行一次,使用kubectl exec 命令登录 pod 并授予权限。
        【解决方案5】:

        以下通过将数据库密码设置为stringData 来帮助我。

        秘密:

        apiVersion: v1
        kind: Secret
        metadata:
          name: db-secret
        type: Opaque
        data:
          db: bG8ryXYx1cw==
          db_username: cm9vdA==
        
        stringData:
          app_port: '3000'
          db_host: 'db-sql.default.svc.cluster.local'
          db_port: '3306'
          db_password: ‘<redacted>!'
        

        在您的Deployment yaml 中

         - name: DB_PASSWORD
                    valueFrom:
                      secretKeyRef:
                        name: lokalus-server-secret
                        key: db_password
        

        【讨论】:

          猜你喜欢
          • 2012-09-19
          • 1970-01-01
          • 1970-01-01
          • 2023-03-12
          • 1970-01-01
          • 2017-11-24
          • 2018-05-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多