我有两种负载平衡器类型的服务(客户端和服务器)。我想让客户端服务与服务器服务对话。我该如何编程(通过yaml文件等)。
更明确地,客户端运行python代码,在其中需要访问服务器的外部ip。但是我只知道服务器服务名称,而不是外部ip。
当然,解决此问题的一种方法是先启动服务器并获取外部ip,然后将其添加到客户端的yaml文件中。我正在寻找只知道服务名称就可以访问外部ip的解决方案。
客户端和服务器位于同一kubernetes集群中。
Client.yaml 客户端运行Web服务器,并且如果有人点击了Web服务器demo.py
所发布的URL,则应调用该服务器的服务。我当时在想一种通过编程方式获取服务器external-ip
的方法,但是我愿意提出建议。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name:client-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: client
spec:
containers:
- name: client-container
image: client_image:latest
command:
- "python"
- "/root/demo.py"
ports:
- containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
labels:
run: client-service
name: client-service
spec:
ports:
- port: 5000
targetPort: 5000
selector:
app: inception-client
type: LoadBalancer
Server.yaml :它在端口9000公开了服务,客户端应调用该服务。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: server-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: server
spec:
containers:
- name: server-container
image: server_image:latest
command:
- <Command to start a server which listens on port 9000>
ports:
- containerPort: 9000
---
apiVersion: v1
kind: Service
metadata:
labels:
run: server-service
name: server-service
spec:
ports:
- port: 9000
targetPort: 9000
selector:
app: server
type: LoadBalancer
答案 0 :(得分:2)
客户端仅需要知道链接到服务器的kubernetes服务名称。 Kubernetes将处理到所需服务器Pod的路由。指定负载平衡器也会隐式创建一个clusterip。您的客户端python应用程序可以使用哪个。
您可以在客户端代码中提供准备就绪探针,以检查服务器是否已启动,这样可以确保在服务器就绪时,客户端也可以开始接收请求。
答案 1 :(得分:0)
由于您尚未指定服务器所在的位置,因此请考虑两种情况。
案例1:服务位于同一集群中
使用服务名称代替主机IP地址。 kube-proxy将服务名称转换为IP地址(内部)。
情况2:服务不在同一群集中。
在它们之间建立连接需要一个外部IP地址。一种替代方法是编写bash脚本。 编写bash脚本以编程方式获取ip地址并将其存储在变量中。在服务器yaml文件中替换此变量。