如何将环境变量传递到kubernetes中的服务



我已经配置了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部署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

我试着用这种方式传递env变量,但似乎不起作用:

...
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"
...

什么是快速解决方案?我最终应该尝试配置映射和秘密吗?

volumeMounts通常用于整个配置文件,例如***.conf在你的案件中使用秘密对你来说更方便。

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 
.
.
.
  1. 将kubectl配置为默认名称空间

如果您还没有,请运行以下命令来执行您创建的命名空间中的所有kubectl命令:

kubectl config set-context $(kubectl config current-context) --namespace=<metadata.namespace>
  1. 您可以选择使用明文密码:

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
...
  1. 创建一个新的用户机密YAML文件

要了解有关秘密存储选项的信息,请参阅https://kubernetes.io/docs/concepts/configuration/secret/

  1. 将这些值更改为您的值。

    stringData.password#所需用户的明文密码。

    data.password#所需用户的Base64编码密码。

  2. 将用户机密文件保存为.aml扩展名

创建MongoDB用户

  • 复制以下MongoDB用户示例

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"
...
  • 添加您自己的字段
  • 将用户的任何其他角色添加到MongoDB用户中
  • 调用以下Kubernetes命令来创建数据库用户:

kubectl apply -f <database-user-conf>.yaml

当您创建新的MongoDB数据库用户时,Kubernetes Operator会自动创建一个新的Kubernete机密。Kubernetes秘密包含以下关于新数据库用户的信息:

  • username:数据库用户的用户名
  • password:数据库用户的密码
  • connectionString.standard:标准连接字符串,可以将您作为此数据库用户连接到数据库
  • connectionString.standardSrv:DNS种子列表连接字符串,可以将您作为该数据库用户连接到数据库

有关更多详细信息,您可以访问此处

您可以通过使用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

您现在可以定义两个不同的秘密,一个用于生产,另一个用于开发

dev-securt.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

产品机密:

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中指定的值填充其环境变量。

相关内容

  • 没有找到相关文章

最新更新