我正在Kubernetes中基于api和Web界面运行一个简单的应用程序。但是,我似乎无法获得与Web界面对话的API。在我的本地环境中,我只需在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_URL的设置是否可以正确地通过http://api-cluster-ip-service:5001来获取api的主机?
或者我不能依靠Kubernetes来获取api的适当dns,并且Web应用程序应该通过公共互联网调用api。
答案 0 :(得分:1)
如果要检查 API_URL 变量值,只需运行
kubectl exec -it web-deployment-pod env | grep API_URL
kube-dns服务从Kubernetes API监听服务和端点事件,并根据需要更新其DNS记录。当您创建,更新或删除Kubernetes服务及其关联的pod时,将触发这些事件。
kubelet在 /etc/resolv.conf
中设置每个新Pod的搜索选项不过,如果要通过群集服务从一个Pod到另一个Pod进行HTTP,建议按以下方式引用服务的ClusterIP
api-cluster-ip-service.default.svc.cluster.local
您应该在Web Pod中将服务IP分配给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
答案 1 :(得分:0)
如果要使用环境变量,可以执行以下操作:
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
P.S。请注意,Pod在创建过程中会获取其环境变量,并且将无法从其创建后的服务中获取它。