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

如何使一个kubernetes服务与另一个kubernetes服务对话?,kubernetes,kubernetes-service,Kubernetes,Kubernetes Service,我有两个服务(客户机和服务器),这两种类型的负载平衡器。我想让客户机服务与服务器服务对话。如何以编程方式(通过yaml文件等)执行 更明确地说,客户机运行一个python代码,需要访问服务器的外部ip。但是,我只知道服务器服务名称,不知道外部ip 当然,解决这个问题的一种方法是首先启动服务器,获取外部ip并将其添加到客户机的yaml文件中。我正在寻找一种解决方案,比如只需知道服务名称就可以访问外部ip 客户机和服务器位于同一kubernetes集群中 Client.yaml客户端运行一个web服

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

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

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

客户机和服务器位于同一kubernetes集群中

Client.yaml客户端运行一个web服务器,如果有人点击了web服务器发布的url
demo.py
应该调用服务器的服务。我正在考虑一种方法,在这里以编程方式获取服务器的
外部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
apiVersion:extensions/v1beta1
种类:部署
元数据:
名称:服务器部署
规格:
副本:3份
模板:
元数据:
标签:
应用程序:服务器
规格:
容器:
-名称:服务器容器
图像:服务器\u图像:最新
命令:
- 
端口:
-集装箱港口:9000
---
版本:v1
种类:服务
元数据:
标签:
运行:服务器服务
名称:服务器服务
规格:
端口:
-港口:9000
目标港:9000
选择器:
应用程序:服务器
类型:负载平衡器

客户端只需要知道链接到服务器的kubernetes服务名称。Kubernetes将处理到所需服务器机架的路由。指定负载平衡器也会隐式创建集群。您的客户端python应用程序可以使用它


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

< P>正如您没有指定服务器驻留的位置一样,请考虑这两种情况。

案例1:服务在同一集群中

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

案例2:服务不在同一集群中

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


您的“服务器”服务是否需要从“客户端”服务以外的任何地方访问,或者您的“服务器”服务是否与“客户端”服务以外的任何其他人通信?服务器的服务也可以从其他人处访问,如通过CLI等。我想问的是,如果该“服务器”服务也在集群外使用,因为如果不是,我们就不需要服务类型的负载平衡器,我们可以通过服务名称直接访问它,正如其他人在回答中提到的那样。是的,您可以直接执行ClusterIP:9000,或者通过“客户端”服务。如果两个服务位于不同的命名空间中,则“即使服务类型为';节点端口';或';负载平衡器'^注释,即“服务器服务:9000”也可以用于设置livenessProbe,ReadinesProbe在kubernetes中有很好的文档记录。你的应用程序是如何在这些内部运行的,这完全取决于你自己。