1

我有两种服务(客户端和服务器)两种类型的负载均衡器。我想让客户端服务与服务器服务对话。我如何以编程方式进行(通过 yaml 文件等)。

更明确地,客户端运行一个 python 代码,它需要访问服务器的外部 IP。但是我只知道服务器服务名称而不是外部 ip。

当然,解决此问题的一种方法是首先启动服务器并获取外部 ip 并将其添加到客户端的 yaml 文件中。我正在寻找解决方案,比如只知道服务名称就可以访问外部 ip。

客户端和服务器驻留在同一个 Kubernetes 集群中。

Client.yaml客户端运行一个网络服务器,如果有人点击了网络服务器公布的 url,demo.py应该调用服务器的服务。我正在考虑一种以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
4

2 回答 2

2

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

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

于 2018-11-12T11:18:45.790 回答
1

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

案例一:服务在同一个集群内

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

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

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

于 2018-11-12T11:20:04.360 回答