当前位置: 首页 > 知识库问答 >
问题:

如何让两个Kubernetes服务互相对话?

郜彦
2023-03-14

目前,我在一个连接到K8s Redis服务的K8s服务中使用了K8s API Pod,并且使用了它自己的K8s Pod。问题是,我使用NodePort的意思是两个都暴露在公众面前。我只想让公众访问API。问题是,如果我使Redis服务不公开,API就看不到它。有没有一种方法可以将两个服务连接起来,同时又不会将一个服务暴露在公众面前?

这是我的API服务YAML:

apiVersion: v1
kind: Service
metadata:
   name: app-api-svc
spec:
   selector:
     app: app-api
     tier: api
   ports:
     - protocol: TCP
       port: 5000
       nodePort: 30400
   type: NodePort

这是我的Redis服务YAML:

apiVersion: v1
kind: Service
metadata:
   name: app-api-redis-svc
spec:
   selector:
     app: app-api-redis
     tier: celery_broker
   ports:
     - protocol: TCP
       port: 6379
       nodePort: 30537
   type: NodePort

共有2个答案

阚吕恭
2023-03-14

我将尝试从所有的答案和我自己的研究中取其精华,并做一个简短的指南,希望你会发现对我有帮助:

连接到不同的pod(例如ruby pod):

kubectl exec -it some-pod-name -- /bin/sh

验证它是否能够ping到有问题的服务:

ping redis

它能连接到端口吗?(我发现telnet对此不起作用)

nc -zv redis 6379

如果您的服务配置如下所示:

kind: Service
apiVersion: v1
metadata:
  name: redis
  labels:
    app: redis
    role: master
    tier: backend
spec:
  ports:
  - port: 6379
    targetPort: 6379
  selector:
    app: redis
    role: master
    tier: backend

确认这些选择器也设置在您的POD上?

get pods --selector=app=redis,role=master,tier=backend

通过运行以下操作确认您的服务已绑定到POD:

$> describe service redis
Name:           redis
Namespace:      default
Labels:         app=redis
            role=master
            tier=backend
Annotations:        <none>
Selector:       app=redis,role=master,tier=backend
Type:           ClusterIP
IP:         10.47.250.121
Port:           <unset> 6379/TCP
Endpoints:      10.44.0.16:6379
Session Affinity:   None
Events:         <none>

检查端点:字段并确认其不为空

欲了解更多信息,请访问:https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service/#my-service-is-missing-endpoints

凤昊东
2023-03-14

首先,将Redis服务配置为clusterIP服务。它将是私有的,仅对其他服务可见。可以使用type选项删除行。

apiVersion: v1
kind: Service
metadata:
   name: app-api-redis-svc
spec:
   selector:
     app: app-api-redis
     tier: celery_broker
   ports:
     - protocol: TCP
       port: 6379
       targetPort: [the port exposed by the Redis pod]

最后,当您配置API以到达Redis时,地址应该是app-api-redis-svc:6379

仅此而已。我有很多服务以这种方式相互通信。如果这对你不起作用,请在评论中告诉我。

 类似资料:
  • 我有以下情况: 我有两个JVM进程(实际上是两个单独运行的java进程,而不是两个线程)在本地机器上运行。让我们把它们称为进程A和进程B。 我希望他们彼此通信(交换数据)(例如,ProcessA向ProcessB发送消息以执行某些操作)。 现在,我通过编写一个临时文件来解决这个问题,这些过程会定期扫描该文件以获取消息。我认为这个解决方案不太好。 什么是实现我想要的更好的选择?

  • 问题内容: 有没有人在编写比较两个REST服务的测试方面有任何技巧?我们这样做是作为回归测试的一种形式。 我希望按照以下方式做一些事情: 向两个服务发送“ / 1”的GET并比较结果 向这两个服务发送POST,然后比较结果 向两个服务发送一个PUT,并比较结果 这个想法是: 每个操作都发送到两个服务 结果应该相同 REST服务是用Java / Jersey编写的,因此使用它是理想的,但是人们发现有

  • 编辑:为了弄清楚事情,这里有一个例子。如果有五个成员玩一个游戏,那么所有五个成员都将拥有该游戏的外键。另一方面,游戏会有一个外键指向轮到的特定成员。

  • 我的情况是这样,在 host H 上, 有 docker-compose.yml A 有 docker-compose.yml B 在 host A 上,curl localhost:801 可以访问。 但是进入 docker-compose.yml B 的 容器 nginx,curl host.docker.internal:801 缺无法访问,如何做到可以呢?

  • 我在tomcat 8上部署了一个web应用程序,它使用来自两个不同系统的web服务,每个系统都需要相互验证。现在我需要将我的应用程序与两个不同的客户端证书集成,或者我们可以说两个不同的密钥存储库使用不同的密码。现在,我很难为这两项服务使用正确的证书。 我使用自己的代码调用其中一个服务,但第二个服务是从第三方库调用的,我无法控制其调用者代码。如果我使用任何一个密钥库,则相应的服务调用成功,但另一个失

  • 每个人希望您能在这方面帮助我:我有两个线程,负责处理来自客户端的连接。 这是我的密码 当我尝试两次连接到loginSocket时,服务器将阻塞并停止工作,从而阻塞客户端,但如果我删除以下内容,则不会发生这种情况: 我没有收到任何错误消息,那么为什么会发生这种情况,我如何修复?