【问题标题】:Kubernetes Pod unable to communicate with another Pod using a ServiceKubernetes Pod 无法使用 Service 与另一个 Pod 通信
【发布时间】:2021-06-19 22:58:39
【问题描述】:

我有 2 个 Pod,每个都有 1 个容器。容器名称是:

  1. mc1
  2. mc2

mc1 容器托管一个 asp.net core razor pages 应用程序,而 mc2 托管一个 web api 应用程序。现在 mc1 必须与 mc2 通信,即剃须刀页面应用程序必须调用 web api 应用程序。

我试图在下图中解释它:

我为这 2 个 pod 创建了 2 个部署:

name: dep1
labels:
    app: mc-app1
spec:
  replicas: 1
  selector: 
    matchLabels:
      app: mc-app1
  template:
    metadata: 
      labels:
        app: mc-app1
    spec:
      containers:
        - name: mc1
          image: multiapp
          imagePullPolicy: Never
          ports:
            - containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dep2
  labels:
    app: mc-app2
spec:
  replicas: 1
  selector: 
    matchLabels:
      app: mc-app2
  template:
    metadata: 
      labels:
        app: mc-app2
    spec:
      containers:
        - name: mc2
          image: multiapi
          imagePullPolicy: Never
          ports:
            - containerPort: 80

我还为包含 mc2 容器(即 web api 应用程序)的 POD 创建了一个服务。

apiVersion: v1
kind: Service
metadata:
  name: multi-container-service-2
spec:
  type: NodePort
  selector:
    app: mc-app2
  ports:
    - port: 8080
      targetPort: 80

部署和服务成功应用到k8s集群。

接下来,我进入容器“mc1”并尝试卷曲名为 multi-container-service-2 的服务,但这不起作用。

我收到错误:

curl: (7) 无法连接到 multi-container-service-2 端口 80:连接被拒绝

在下图中,我使用以下命令进入容器 mc1 的外壳:

kubectl exec -it dep1-5c78b8c889-tjzzr -c mc1 -- /bin/bash

在下一张图片中,我正在做卷曲,但出现错误:

请注意,我已经使用下面给出的 2 个命令安装了 curl:

apt-get update
apt-get install curl

为什么不能使用服务调用mc2容器中的应用?我的操作系统是 windows 10。

我正在参考这两个教程:

  1. Build ASP.NET Core applications deployed as Linux containers into an AKS/Kubernetes orchestrator
  2. Communicate Between Containers in the Same Pod Using a Shared Volume

【问题讨论】:

  • 您好。您已经创建了一个 NodePort 服务。那是为了暴露在集群之外。考虑改用ClusterIP。现在回到你的问题。查看端点kubectl get endpoint。然后,您可以描述为该服务创建的端点。基本上在创建服务时,会创建相应的 Endpoint。检查它是否在端点中列出了 pod IP。如果它在那里,请检查您的应用是否真的在监听 :80。可能不是。
  • 另一件事 - 当你卷曲时,你实际上是在点击 service。该服务正在侦听 8080,而不是 80。因此您需要更改 curl。

标签: kubernetes kubernetes-pod kubernetes-service


【解决方案1】:

您已将服务端口设置为8080,但您正在端口 80(即容器的端口)上调用服务。

这应该可行:

curl http://multi-container-service-2:8080

【讨论】:

    【解决方案2】:

    official kubernetes documentation:中所述

    Kubernetes 为服务和 pod 创建 DNS 记录。您可以使用一致的 DNS 名称而不是 IP 地址联系服务。

    为了通过集群中的服务进行 Pod 到 Pod 的通信,您必须使用以下语法:

    {service_name}.{namespace}.svc.cluster.local

    所以在你的情况下,使用 curl 会是:

    curl multi-container-service-2.default.svc.cluster.local
    

    【讨论】:

    • 我运行了你的命令curl multi-container-service-2.default.svc.cluster.local。它也失败了。
    • 那是正确的命名空间吗?我的意思是你在“默认”命名空间中吗?
    猜你喜欢
    • 2021-12-30
    • 2019-12-17
    • 2019-12-23
    • 2020-04-20
    • 1970-01-01
    • 2020-03-13
    • 2021-06-03
    • 2020-08-12
    • 2017-05-04
    相关资源
    最近更新 更多