我試圖通過StatefulSet在k8s中部署一個mysql實體,使用DockerHub的官方Mysql鏡像。我按照DockerHub的鏡像檔案,提供了MYSQL_ROOT_PASSWORD、MYSQL_USER和MYSQL_PASSWORD環境變數,所以用戶應該被自動創建,但它沒有。我在容器的日志中看到的錯誤是,在MYSQL_USER中提供的用戶被創建時,root用戶無法連接。
20210914 17: 28:20 00:00【注意】【入口點】。創建user foo_user
2021-09-14T17:28:20。 860763Z 5 [Note] 拒絕訪問 for user 'root'@'localhost' (using password: 是)。)
ERROR 1045(28000)。拒絕訪問 for user 'root'@'localhost' (using password: YES)
經過調查,我注意到當env變數的值取自k8s secrets時,問題就會發生,但如果我在StatefulSet的manifest中硬編碼它們的值,它就能正常作業。你可以看到我目前的代碼如下:
apiVersion: apps/v1
kind: StatefulSet
metadata: StatefulSet
名稱: mysql
標簽:
app: mysql mysql
規格:
replicas: 1
serviceName: mysql-svc
選擇器:
matchLabels:/span>
應用程式: mysql
template:
metadata: metadata:
標簽:
應用程式: mysql
規格:
容器:
- name:/span> mysql
image: "mysql:latest"
env:
- name: MYSQL_DATABASE[/span
value: 'foo_db'/span>
- name: MYSQL_USER
value: 'foo_user'/span>
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:/span>
name: mysql-sec
key: MYSQL_PASSWORD
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-sec
key: MYSQL_ROOT_PASSWORD
埠:
- containerPort: 3306
協議: TCP
volumeMounts:
- name:/span> mysql-db
mountPath: /var/lib/mysql
subPath: mysql
volumeClaimTemplates:
- metadata:
name: mysql-db
規格:
accessModes:
- ReadWriteOnce
資源:
請求:
storage: 4Gi
還有secrets.yml檔案:
apiVersion: v1
kind: Secret
metadata: Secret
名稱: mysql-sec
標簽:
應用程式: mysql
type: Opaque
資料:
MYSQL_PASSWORD: ***************************
MYSQL_ROOT_PASSWORD: ***************************
我也嘗試過先創建秘密,以確保當pod旋轉起來時秘密已經存在,但沒有任何成功。
有什么想法嗎?
uj5u.com熱心網友回復:
我終于找到了問題的根本原因,它與秘密無關。問題是與為密碼選擇的 "復雜性 "有關。我選擇了一個由在線工具自動生成的強密碼,類似于!6Y*]q~x xG{9HQ~,由于某些未知的原因,這個密碼使得mysql docker's image的/entrypoint.sh腳本失敗,出現了上述的錯誤Access denied for user 'root' @'localhost' (using password: YES)。然而,盡管腳本失敗了,但容器和mysql服務器是啟動和運行的,我能夠潛入并成功執行mysql -u root --password="$MYSQL_ROOT_PASSWORD",所以對我來說,似乎很清楚錯誤是在這個腳本和它擴展和使用這個環境變數值的方式。 在用一個 "不太復雜 "的密碼值交換后,它像一個魅力。
uj5u.com熱心網友回復:
這可能取決于你到底是如何創建Secret的。事實上,如果你在創建Secret時使用單引號,包含某些特殊字符的密碼不應該是一個問題。
我相信官方kubernetes檔案中的這個片段應該可以回答你的問題:
。注意:
特殊字符如
$,,*,=, 和! 解釋為由你的 shell并需要轉義。 轉義。在大多數shell中,轉義密碼的最簡單方法是 用單引號(')包圍它。例如,如果你的實際 密碼是S!B*d$zDsb=,你應該這樣執行命令:kubectl create secret generic dev-db-secret --from-iteral=username=devuser --from-iteral=password='S! B*d$zDsb='/span>你不需要在檔案的密碼中轉義特殊字符 (
--from-file)。
注意,存盤在Secret中的值,例如,在下面的片段中顯示:
type:/span> Opaque
資料:
MYSQL_PASSWORD: ***************************
MYSQL_ROOT_PASSWORD: ***************************
是base64編碼的字串。因此,如果你在把它們放入你的secret.yaml之前對它們進行適當的編碼:
echo '!6Y*]q~x xG{9HQ~'/span> | base64
你應該不會遇到任何問題。
。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/319493.html
標籤:
上一篇:GKE入口;對特定服務應用重寫
