我已經配置了 minikube,并試圖在我的本地 ubuntu 機器上運行 kubenetes。當我在本地構建 MongoDB docker 映像時,我可以通過這種方式傳遞 env 變數,并且它與后端 API 配合得很好:
mongo_db:
image: mongo:latest
container_name: db_container
environment:
- MONGODB_INITDB_DATABASE=contacts
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=password
ports:
- 27017:27017
volumes:
- ./mongodb_data_container:/data/db
但是當我嘗試在 Kubernetes 中運行整個應用程式(前端、后端和 MongoDB)時,如何使用 env 變數啟動 MongoDB,以便后端 API 可以連接到資料庫 pod 實體?我正在拉最新的 mongodb 實體,這是 mongo-deployment yaml 檔案:
# MongoDB Deployment - Database
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongo
spec:
selector:
matchLabels:
app: mern-stack
replicas: 1
template:
metadata:
labels:
app: mern-stack
spec:
containers:
- name: mern-stack
image: mongo:latest
ports:
- containerPort: 27017
volumeMounts:
- name: db-data
mountPath: /data
readOnly: false
volumes:
- name: db-data
persistentVolumeClaim:
claimName: mern-stack-data
我試圖以這種方式傳遞環境變數,但它似乎不起作用:
...
volumeMounts:
- name: db-data
mountPath: /data
readOnly: false
env:
- name: MONGODB_INITDB_DATABASE
value: "contacts"
- name: MONGO_INITDB_ROOT_USERNAME
value: "root"
- name: MONGO_INITDB_ROOT_PASSWORD
value: "password"
...
什么是快速解決方案?我最終應該嘗試配置映射和秘密嗎?
uj5u.com熱心網友回復:
volumeMounts 通常用于整個組態檔,例如 ***.conf 在您的情況下使用 secret 更方便。
1、創建秘密資源
apiVersion: v1
data:
db_url: YWRtaW4=
db_password: MWYyZDFlMmU2N2Rm
kind: Secret
metadata:
name: <secretname>
namespace: <namespaceuwant>
type: Opaque
2、你可以在你的mongodb中使用
mongo_db:
image: mongo:latest
container_name: db_container
env:
- name: db_url # env you can get
valueFrom:
secretKeyRef:
name: <secretname> # step 1 create
key: db_url # in your secret
.
.
.
uj5u.com熱心網友回復:
- 將 kubectl 配置為默認到您的命名空間。
如果您還沒有,請運行以下命令來執行您創建的命名空間中的所有 kubectl 命令:
kubectl config set-context $(kubectl config current-context) --namespace=<metadata.namespace>
- 您可以選擇使用明文密碼:
apiVersion: v1
kind: Secret
metadata:
name: <mms-user-1-password>
# corresponds to user.spec.passwordSecretKeyRef.name
type: Opaque
stringData:
password: <my-plain-text-password>
# corresponds to user.spec.passwordSecretKeyRef.key
data:
password: <base-64-encoded-password>
# corresponds to user.spec.passwordSecretKeyRef.key
...
或者您可以選擇使用 Base64 編碼的密碼:
---
apiVersion: v1
kind: Secret
metadata:
name: <mms-user-1-password>
# corresponds to user.spec.passwordSecretKeyRef.name
type: Opaque
stringData:
password: <my-plain-text-password>
# corresponds to user.spec.passwordSecretKeyRef.key
data:
password: <base-64-encoded-password>
# corresponds to user.spec.passwordSecretKeyRef.key
...
- 創建一個新的用戶密鑰 YAML 檔案。
要了解您的秘密存盤選項,請參閱 https://kubernetes.io/docs/concepts/configuration/secret/
將這些值更改為您的值。
stringData.password #所需用戶的明文密碼。
data.password #Base64 編碼的所需用戶密碼。
使用 .yaml 擴展名保存用戶機密檔案
創建 MongoDB 用戶
- 復制以下示例 MongoDBUser
apiVersion: mongodb.com/v1
kind: MongoDBUser
metadata:
name: <mms-scram-user-1>
spec:
passwordSecretKeyRef:
name: <mms-user-1-password>
# Match to metadata.name of the User Secret
key: password
username: "<mms-scram-user-1>"
db: "admin" #
mongodbResourceRef:
name: "<my-replica-set>"
# Match to MongoDB resource using authenticaiton
roles:
- db: "admin"
name: "clusterAdmin"
- db: "admin"
name: "userAdminAnyDatabase"
- db: "admin"
name: "readWrite"
- db: "admin"
name: "userAdminAnyDatabase"
...
- 添加您自己的欄位。
- 將用戶的任何其他角色添加到 MongoDBUser。
- 呼叫以下 Kubernetes 命令來創建您的資料庫用戶:
kubectl apply -f <database-user-conf>.yaml
當您創建一個新的 MongoDB 資料庫用戶時,Kubernetes Operator 會自動創建一個新的 Kubernetes 密鑰。Kubernetes 密鑰包含有關新資料庫用戶的以下資訊:
username: 資料庫用戶的用戶名password:資料庫用戶的密碼connectionString.standard:標準連接字串,可以將您作為該資料庫用戶連接到資料庫。connectionString.standardSrv: DNS 種子串列連接字串,可以將您作為該資料庫用戶連接到資料庫。
有關更多詳細資訊,您可以訪問這里
uj5u.com熱心網友回復:
您可以通過使用 Secrets 或 ConfigMaps 來填充容器的環境變數。當您使用的資料是敏感資料(例如密碼)時使用 Secrets,如果不是,則使用 ConfigMaps。
在您的 Pod 定義中指定容器應從 Secret 中提取值:
apiVersion: v1
kind: Pod
metadata:
labels:
context: docker-k8s-lab
name: mongo-pod
name: mongo-pod
spec:
containers:
- image: "mongo:latest"
name: mongo
ports:
- containerPort: 3306
envFrom:
- secretRef:
name: mongo-secret
您現在可以定義兩個不同的 Secret,一個用于生產,一個用于開發。
開發-secret.yaml:
apiVersion: v1
kind: Secret
metadata:
name: mongo-secret
type: Opaque
data:
MYSQL_USER: bXlzcWwK
MYSQL_PASSWORD: bXlzcWwK
MYSQL_DATABASE: c2FtcGxlCg==
MYSQL_ROOT_PASSWORD: c3VwZXJzZWNyZXQK
產品-secret.yaml:
apiVersion: v1
kind: Secret
metadata:
name: mongo-secret
type: Opaque
data:
MYSQL_USER: am9obgo=
MYSQL_PASSWORD: c2VjdXJlCg==
MYSQL_DATABASE: cHJvZC1kYgo=
MYSQL_ROOT_PASSWORD: cm9vdHkK
并將正確的密鑰部署到正確的 Kubernetes 集群:
kubectl config use-context dev
kubectl create -f dev-secret.yaml
kubectl config use-context prod
kubectl create -f prod-secret.yaml
現在,每當 Pod 啟動時,它都會根據 Secret 中指定的值填充其環境變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/527023.html
