从部署在 Kubernetes 中的应用程序连接到外部数据库
Connecting to an external database from an app deployed in Kubernetes
我正在 minikube 中部署 Spring 启动应用程序,它连接到主机上的数据库 运行。按照 12 因素应用程序建议,我使用环境变量进行必要的配置:
SPRING_DATASOURCE_DRIVER_CLASS_NAME=org.postgresql.Driver
SPRING_DATASOURCE_PASSWORD=...
SPRING_DATASOURCE_URL=jdbc:postgresql://<HOST_IP_FROM_K8S>:5432/myservice
SPRING_DATASOURCE_USERNAME=...
kubernetes 文档只展示了如何在服务和部署 .yaml 文件中设置环境变量,我不想这样做。创建部署时,有没有办法在 minikube 或 kubectl 的命令行上传递环境变量? (在 Docker 中,我使用 -e 执行此操作。)
请注意,必须在启动应用程序之前设置环境变量,否则它会崩溃。
kubectl
中的 create
子命令没有直接选项来传递环境变量。
您可以使用 Helm 自定义部署。
(示例:https://docs.bitnami.com/kubernetes/how-to/deploy-java-application-kubernetes-helm/)
根据上面 Ansil 的评论,我使用 configmap
和 secret
来传递这样的配置:
kubectl create secret generic springdatasourcepassword --from-literal=SPRING_DATASOURCE_PASSWORD=postgres
kubectl create secret generic springdatasourceusername --from-literal=SPRING_DATASOURCE_USERNAME=postgres
kubectl create configmap springdatasourcedriverclassname --from-literal=SPRING_DATASOURCE_DRIVER_CLASS_NAME=org.postgresql.Driver
kubectl create configmap springdatasourceurl --from-literal=SPRING_DATASOURCE_URL=jdbc:postgresql://172.18.0.1:5432/bookservice
这些在 deployment.yaml 文件中引用如下:
env:
- name: GET_HOSTS_FROM
value: dns
- name: SPRING_DATASOURCE_DRIVER_CLASS_NAME
valueFrom:
configMapKeyRef:
name: springdatasourcedriverclassname
key: SPRING_DATASOURCE_DRIVER_CLASS_NAME
- name: SPRING_DATASOURCE_URL
valueFrom:
configMapKeyRef:
name: springdatasourceurl
key: SPRING_DATASOURCE_URL
- name: SPRING_DATASOURCE_PASSWORD
valueFrom:
secretKeyRef:
name: springdatasourcepassword
key: SPRING_DATASOURCE_PASSWORD
- name: SPRING_DATASOURCE_USERNAME
valueFrom:
secretKeyRef:
name: springdatasourceusername
key: SPRING_DATASOURCE_USERNAME
可以找到完整的解释 here。
我正在 minikube 中部署 Spring 启动应用程序,它连接到主机上的数据库 运行。按照 12 因素应用程序建议,我使用环境变量进行必要的配置:
SPRING_DATASOURCE_DRIVER_CLASS_NAME=org.postgresql.Driver
SPRING_DATASOURCE_PASSWORD=...
SPRING_DATASOURCE_URL=jdbc:postgresql://<HOST_IP_FROM_K8S>:5432/myservice
SPRING_DATASOURCE_USERNAME=...
kubernetes 文档只展示了如何在服务和部署 .yaml 文件中设置环境变量,我不想这样做。创建部署时,有没有办法在 minikube 或 kubectl 的命令行上传递环境变量? (在 Docker 中,我使用 -e 执行此操作。)
请注意,必须在启动应用程序之前设置环境变量,否则它会崩溃。
kubectl
中的 create
子命令没有直接选项来传递环境变量。
您可以使用 Helm 自定义部署。
(示例:https://docs.bitnami.com/kubernetes/how-to/deploy-java-application-kubernetes-helm/)
根据上面 Ansil 的评论,我使用 configmap
和 secret
来传递这样的配置:
kubectl create secret generic springdatasourcepassword --from-literal=SPRING_DATASOURCE_PASSWORD=postgres
kubectl create secret generic springdatasourceusername --from-literal=SPRING_DATASOURCE_USERNAME=postgres
kubectl create configmap springdatasourcedriverclassname --from-literal=SPRING_DATASOURCE_DRIVER_CLASS_NAME=org.postgresql.Driver
kubectl create configmap springdatasourceurl --from-literal=SPRING_DATASOURCE_URL=jdbc:postgresql://172.18.0.1:5432/bookservice
这些在 deployment.yaml 文件中引用如下:
env:
- name: GET_HOSTS_FROM
value: dns
- name: SPRING_DATASOURCE_DRIVER_CLASS_NAME
valueFrom:
configMapKeyRef:
name: springdatasourcedriverclassname
key: SPRING_DATASOURCE_DRIVER_CLASS_NAME
- name: SPRING_DATASOURCE_URL
valueFrom:
configMapKeyRef:
name: springdatasourceurl
key: SPRING_DATASOURCE_URL
- name: SPRING_DATASOURCE_PASSWORD
valueFrom:
secretKeyRef:
name: springdatasourcepassword
key: SPRING_DATASOURCE_PASSWORD
- name: SPRING_DATASOURCE_USERNAME
valueFrom:
secretKeyRef:
name: springdatasourceusername
key: SPRING_DATASOURCE_USERNAME
可以找到完整的解释 here。