2017-08-12 208 views
0

我嘗試在Kubernetes中設置mysql數據庫。我配置了一個ConfigMap來存儲數據庫名稱和一個包含用戶的root密碼,用戶和密碼的Secret。我得到一個「錯誤1045(28000):拒絕用戶'testadm'@'localhost'的訪問權限((在使用mysql cli的容器內部和從外部使用IntelliJ數據庫工具)使用密碼:是)「錯誤。當使用祕密密碼(訪問被拒絕)時,無法連接到Kubernetes中的mysql pod

我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 

如果我檢查容器內的env變量,我不能發現兩種方法之間的區別。

是否有任何其他格式要求使用存儲在密碼中的密碼?我也試圖把在數據字典中的值加引號是這樣的:

data: 
    mysql-root-password: "VGVzdDEyMzQK" 

版本信息

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

回答

1

你可以使用這個yaml文件。

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

你需要給訪問客戶機連接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 
+0

這並不解決問題。當我在容器內嘗試時,訪問也被拒絕。它也只發生在我使用我的K8S機密配置的密碼而不是直接配置env時。 –

+1

更新了答案測試通過創建新的祕密 – sfgroups

+0

謝謝!這也適用於我。有沒有什麼方法可以從yaml文件創建祕密? –

1

你確定你的祕密yaml中的數據是base64編碼的嗎?使用https://www.base64encode.org/,你data塊應該看起來像:

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

是的,我這樣做是因爲它在這裏的文檔中描述:https://kubernetes.io/docs/concepts/configuration/secret/#creating-a-secret-manually - 在我的機器上「echo Test1234 | base64」結果在VGVzdDEyMzQK。 –

+2

好的,我現在看到我的錯誤。我忘了-n標誌。謝謝! –

相關問題