我在Kubernetes中运行一个基于api和web界面的简单应用程序。但是,我似乎不能让api与web界面对话。在我的本地环境中,我只是在web界面中定义了一个变量API_URL。localhost:5001,并且web接口正确连接到api。由于api和web运行在不同的pod中,我需要让它们通过Kubernetes中的服务相互通信。到目前为止,这就是我正在做的事情,但没有任何运气。
我为API设置了一个部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-deployment
spec:
replicas: 1
selector:
matchLabels:
component: api
template:
metadata:
labels:
component: api
spec:
containers:
- name: api
image: gcr.io/myproject-22edwx23/api:latest
ports:
- containerPort: 5001我给它附加了一个服务:
apiVersion: v1
kind: Service
metadata:
name: api-cluster-ip-service
spec:
type: NodePort
selector:
component: api
ports:
- port: 5001
targetPort: 5001然后创建一个应该连接到此api的web部署。
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
spec:
replicas: 1
selector:
matchLabels:
component: web
template:
metadata:
labels:
component: web
spec:
containers:
- name: web
image: gcr.io/myproject-22edwx23/web:latest
ports:
- containerPort: 5000
env:
- name: API_URL
value: http://api-cluster-ip-service:5001然后,我为web界面+入口等添加了一个服务,但这似乎与问题无关。我想知道api的设置是否通过http://api-cluster-ip-service:5001正确获取了API_URL的主机。
或者我不能依赖Kubernetes为api获得适当的dns,以及web应用程序是否应该通过公共互联网调用api。
发布于 2019-04-05 21:49:54
如果要检查API_URL变量值,只需运行
kubectl exec -it web-deployment-pod env | grep API_URLkube-dns服务侦听来自Kubernetes API的服务和端点事件,并根据需要更新其DNS记录。在创建、更新或删除Kubernetes服务及其关联的pods时,会触发这些事件。
kubelet在/etc/resolv.conf中设置每个新pod的搜索选项
但是,如果您想通过集群服务从一个pod到另一个pod,建议您参考服务的ClusterIP,如下所示
api-cluster-ip-service.default.svc.cluster.local您应该将服务IP分配给web pod中的env变量,因此不需要重新创建它:
sukhoversha@sukhoversha:~/GCP$ kk exec -it web-deployment-675f8fcf69-xmqt8 env | grep -i service
API_CLUSTER_IP_SERVICE_PORT=tcp://10.31.253.149:5001
API_CLUSTER_IP_SERVICE_PORT_5001_TCP=tcp://10.31.253.149:5001
API_CLUSTER_IP_SERVICE_PORT_5001_TCP_PORT=5001
API_CLUSTER_IP_SERVICE_PORT_5001_TCP_ADDR=10.31.253.149阅读有关DNS for Services的更多信息
发布于 2019-04-05 23:13:01
如果要使用环境变量,可以执行以下操作:
Python中的示例:
import os
API_URL = os.environ['API_CLUSTER_IP_SERVICE_SERVICE_HOST'] + ":" + os.environ['API_CLUSTER_IP_SERVICE_SERVICE_PORT']请注意,环境变量基于您的服务名称。如果您想要检查Pod中所有可用的环境变量:
kubectl get pods #get {pod name}
kubectl exec -it {pod_name} printenv注意,Pod在创建过程中获取其环境变量,并且无法从之后创建的服务中获取环境变量。
https://stackoverflow.com/questions/55535587
复制相似问题