使用 Secret 时无法连接到 kubernetes 上的 mariadb

Dan*_*iel 0 mysql mariadb docker google-cloud-platform google-kubernetes-engine

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

这是我的服务和部署的 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
Run Code Online (Sandbox Code Playgroud)

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

apiVersion: v1
kind: Secret
metadata:
  name: mariadb-secret
type: Opaque
 data:
   rootpassword: dGVzdHJvb3RwYXNzCg==
   username: dGVzdHVzZXIK
   password: dGVzdHBhc3MK
Run Code Online (Sandbox Code Playgroud)

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

# mysql -u testuser -ptestpass

ERROR 1045 (28000): Access denied for user 'testuser'@'localhost' (using password: YES)
Run Code Online (Sandbox Code Playgroud)

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

+-----------+-------------+-------------------------------------------+
| Host      | User        | Password                                  |
+-----------+-------------+-------------------------------------------+
| localhost | mariadb.sys |                                           |
| localhost | root        | *293286706D5322A73D8D9B087BE8D14C950AB0FA |
| %         | root        | *293286706D5322A73D8D9B087BE8D14C950AB0FA |
| %         | testuser    | *B07683D91842E0B3FEE182C5182AB7E4F8B3972D |
+-----------+-------------+-------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

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

apiVersion: v1
kind: Secret
metadata:
  name: mariadb-secret
type: Opaque
stringData:
  rootpassword: testrootpass
  username: testuser
  password: testpass
Run Code Online (Sandbox Code Playgroud)

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

echo testuser | base64
echo testpass | base64
echo testrootpass | base64
Run Code Online (Sandbox Code Playgroud)

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

Daw*_*ruk 5

您通过以下方式创造了所有价值观:

  • $ 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=
Run Code Online (Sandbox Code Playgroud)

之后您应该能够连接到您的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)]> 
Run Code Online (Sandbox Code Playgroud)
  • $ 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)]> 
Run Code Online (Sandbox Code Playgroud)

其他资源: