如何使一个kubernetes服务与其他kubernetes服务对话?

时间:2018-11-12 08:04:15

标签: kubernetes kubernetes-service

我有两种负载平衡器类型的服务(客户端和服务器)。我想让客户端服务与服务器服务对话。我该如何编程(通过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

2 个答案:

答案 0 :(得分:2)

客户端仅需要知道链接到服务器的kubernetes服务名称。 Kubernetes将处理到所需服务器Pod的路由。指定负载平衡器也会隐式创建一个clusterip。您的客户端python应用程序可以使用哪个。

您可以在客户端代码中提供准备就绪探针,以检查服务器是否已启动,这样可以确保在服务器就绪时,客户端也可以开始接收请求。

答案 1 :(得分:0)

由于您尚未指定服务器所在的位置,因此请考虑两种情况。

案例1:服务位于同一集群中

  

使用服务名称代替主机IP地址。 kube-proxy将服务名称转换为IP地址(内部)。

情况2:服务不在同一群集中。

  

在它们之间建立连接需要一个外部IP地址。一种替代方法是编写bash脚本。   编写bash脚本以编程方式获取ip地址并将其存储在变量中。在服务器yaml文件中替换此变量。