kubernetes - Kubernetes - 将负载均衡的公共 IP 作为环境变量传递到 Pod
问题描述
要旨
我有一个ConfigMap
为我的 pod 提供必要的环境变量:
apiVersion: v1
kind: ConfigMap
metadata:
name: global-config
data:
NODE_ENV: prod
LEVEL: info
# I need to set API_URL to the public IP address of the Load Balancer
API_URL: http://<SOME IP>:3000
DATABASE_URL: mongodb://database:27017
SOME_SERVICE_HOST: some-service:3000
我在 Google Cloud 上运行我的 Kubernetes 集群,因此它会自动为我的服务创建一个公共端点:
apiVersion: v1
kind: Service
metadata:
name: gateway
spec:
selector:
app: gateway
ports:
- name: http
port: 3000
targetPort: 3000
nodePort: 30000
type: LoadBalancer
问题
我有一个 Web 应用程序需要从客户端的浏览器向gateway
服务发出 HTTP 请求。但是为了向外部服务发出请求,Web 应用程序需要知道它的 IP 地址。
因此,我设置了 pod,它以某种方式为 Web 应用程序提供服务,它获取一个环境变量“ API_URL
”,结果向这个 url 发出所有 HTTP 请求。
所以我只需要一种方法将API_URL
环境变量设置为gateway
服务的公共 IP 地址,以便在它启动时将其传递到 Pod 中。
解决方案
我知道这不是您想要的确切方法,但我发现创建静态 IP 地址并明确传递它往往更容易使用。
首先,创建一个静态 IP 地址:
gcloud compute addresses create gke-ip --region <region>
您的 GKE 集群所在region
的 GCP 区域在哪里。
然后,您可以通过以下方式获取新 IP 地址:
gcloud compute addresses describe gke-ip --region <region>
现在,您可以通过指定显式的loadBalancerIP
. 1
apiVersion: v1
kind: Service
metadata:
name: gateway
spec:
selector:
app: gateway
ports:
- name: http
port: 3000
targetPort: 3000
nodePort: 30000
type: LoadBalancer
loadBalancerIP: "1.2.3.4"
此时,您也可以将其硬编码到您的中ConfigMap
,而不必担心从集群本身中获取值。
1如果您已经创建了LoadBalancer
具有自动分配 IP 地址的 IP 地址,则设置 IP 地址不会更改底层 GCP 负载平衡器的 IP。相反,您应该删除LoadBalancer
集群中的服务,等待大约 15 分钟以清理底层 GCP 资源,然后LoadBalancer
使用显式 IP 地址重新创建。
推荐阅读
- php - 为什么mySql无法启动?
- flutter - Flutter:CupertinoPicker 触发 List 内的函数
- android - AudioDeviceCallback 将连接的 WearOS 手表返回为 AudioDeviceInfo.TYPE_BLUETOOTH_SCO
- android - 我可以使用向后兼容来保存 Room prelollipop 版本中的数据 Unicode
- javascript - 在 JavaScript 中以原始顺序迭代 JSON 对象
- python - 如何通过重复值“另一列的大小”次来创建数组列?
- sql - PostgreSQL 源连接器中的 timestamp.column.name 是否支持别名?
- spring-boot - 在 Spring Batch 中,我们如何比较 2 个具有不同记录布局的平面文件并在它们之间存在不一致时抛出错误消息
- excel - 大型 Excel 文件需要更多时间来初始化 ClosedXML
- python - 根据间隔为 pandas 数据框列分配值