【问题标题】:Cannot connect to mariadb on kubernetes when using secret使用秘密时无法连接到 kubernetes 上的 mariadb
【发布时间】:2020-10-06 18:16:26
【问题描述】:

我在 Google Kubernetes Engine 上的 Kubernetes 集群中托管了一个 mariadb。我正在使用来自 dockerhub (mariadb:10.5) 的官方 mariadb 映像。

这是我的服务和部署的 yml

apiVersion: v1
kind: Service
metadata:
  name: mariadb
spec:
  ports:
  - port: 3306
  selector:
    app: mariadb
  clusterIP: None
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mariadb
spec:
  selector:
    matchLabels:
      app: mariadb
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mariadb
    spec:
      containers:
      - image: mariadb:10.5
        name: mariadb
        env:
        - name: MYSQL_USER
          valueFrom:
            secretKeyRef:
              name: mariadb-secret
              key: username
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mariadb-secret
              key: password
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mariadb-secret
              key: rootpassword
        - name: MYSQL_DATABASE
          value: test
        ports:
        - containerPort: 3306
          name: mariadb-port
        volumeMounts:
        - name: mariadb-volume
          mountPath: /var/lib/mysql
      volumes:
      - name: mariadb-volume
        persistentVolumeClaim:
          claimName: mariadb-pvc

如您所见,我使用秘密来配置环境。秘密的 yml 如下所示:

apiVersion: v1
kind: Secret
metadata:
  name: mariadb-secret
type: Opaque
 data:
   rootpassword: dGVzdHJvb3RwYXNzCg==
   username: dGVzdHVzZXIK
   password: dGVzdHBhc3MK

应用此配置后,一切似乎都很好,除了我无法与用户连接并且它是数据库的密码。不是来自本地主机,也不是来自远程:

# mysql -u testuser -ptestpass

ERROR 1045 (28000): Access denied for user 'testuser'@'localhost' (using password: YES)

我只能使用root 和它的密码(相同的连接字符串)进行连接。当我查看 mariadb 中的用户时,他们看起来像这样:

+-----------+-------------+-------------------------------------------+
| Host      | User        | Password                                  |
+-----------+-------------+-------------------------------------------+
| localhost | mariadb.sys |                                           |
| localhost | root        | *293286706D5322A73D8D9B087BE8D14C950AB0FA |
| %         | root        | *293286706D5322A73D8D9B087BE8D14C950AB0FA |
| %         | testuser    | *B07683D91842E0B3FEE182C5182AB7E4F8B3972D |
+-----------+-------------+-------------------------------------------+

如果我将我的 Secret 更改为使用 stringData 而不是 data 并使用非编码字符串,一切都会按预期工作:

apiVersion: v1
kind: Secret
metadata:
  name: mariadb-secret
type: Opaque
stringData:
  rootpassword: testrootpass
  username: testuser
  password: testpass

我使用以下命令(在 Mac OS 上)生成 base64 编码字符串:

echo testuser | base64
echo testpass | base64
echo testrootpass | base64

我在这里做错了什么?我想使用 base64 编码的字符串而不是普通的字符串。

【问题讨论】:

    标签: mysql docker google-cloud-platform mariadb google-kubernetes-engine


    【解决方案1】:

    你创造了所有的价值观:

    • $ echo "value" | base64
    • 您应该改用:$ echo -n "value" | base64

    按照echo的官方手册页:

    说明

    STRING回显到标准输出。

    -n = 不输出尾随的换行符

    TL;DR:您需要使用新值编辑您的 Secret.yaml 定义:

    • $ echo -n "testuser" | base64
    • $ echo -n "testpass" | base64
    • $ echo -n "testrootpass" | base64

    按照上述说明,您的Secret.yaml 应该如下所示:

    apiVersion: v1
    kind: Secret
    metadata:
      name: mariadb-secret
    type: Opaque
    data:
      rootpassword: dGVzdHJvb3RwYXNz
      username: dGVzdHVzZXI=
      password: dGVzdHBhc3M=
    

    之后,您应该能够连接到您的mariadb,如下所示:

    • $ mysql -u testuser -ptestpass
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 5
    Server version: 10.5.5-MariaDB-1:10.5.5+maria~focal mariadb.org binary distribution
    <----> 
    MariaDB [(none)]> 
    
    • $ mysql -u root -ptestrootpass
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 6
    Server version: 10.5.5-MariaDB-1:10.5.5+maria~focal mariadb.org binary distribution
    <---->
    MariaDB [(none)]> 
    

    其他资源:

    【讨论】:

    • 我使用 kubectl --from-file (kubectl create secret generic dev-db-secret --from-file=username=./testrootpass.txt --from-file=password=./testrootpass.txt) 具有相同的行为。事实证明,vim 总是附加一个换行符,为了避免这种情况,你必须将文件保存为二进制文件。 stackoverflow.com/a/16114535/3972213
    猜你喜欢
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 2021-07-24
    • 1970-01-01
    • 2018-03-12
    • 2019-05-07
    相关资源
    最近更新 更多