Pods无法相互通信

Pods cannot communicate with each other

我有两份工作 运行 只有一次。一种叫做Master,一种叫做Slave。顾名思义,Master pod 需要来自 slave 的一些信息,然后在线查询一些 API。 一个关于如何像这样进行通信的简单方案:

Slave --- port 6666 ---> Master ---- port 8888 ---> internet:www.example.com

为此我创建了 5 个 yaml 文件:

  1. 用于创建 Master pod 的作业-master.yaml:
apiVersion: batch/v1
kind: Job
metadata:
  name: master-job
  labels:
    app: master-job
    role: master-job
spec:
  template:
    metadata:
      name: master
    spec:
      containers:
      - name: master
        image: registry.gitlab.com/example
        command: ["python", "run.py", "-wait"]
        ports:
        - containerPort: 6666

      imagePullSecrets:
      - name: regcred
      restartPolicy: Never

  1. 一个服务(ClusterIP),允许从节点向端口 6666 上的主节点发送信息:
apiVersion: v1
kind: Service
metadata:
  name: master-service
  labels:
    app: master-job
    role: master-job
spec:
  selector:
    app: master-job
    role: master-job
  ports:
    - protocol: TCP
      port: 6666
      targetPort: 6666
  1. 允许主机在线获取信息的服务(NodePort):
apiVersion: v1
kind: Service
metadata:
  name: master-np-service
spec:
  type: NodePort
  selector:
    app: master-job
  ports:
    - protocol: TCP
      port: 8888
      targetPort: 8888
      nodePort: 31000
  1. 从 pod 的作业:
apiVersion: batch/v1
kind: Job
metadata:
  name: slave-job
  labels:
    app: slave-job
spec:
  template:
    metadata:
      name: slave
    spec:
      containers:
      - name: slave
        image: registry.gitlab.com/example2
        ports:
        - containerPort: 6666
        #command: ["python", "run.py", "master-service.default.svc.cluster.local"]
        #command: ["python", "run.py", "10.106.146.155"]
        command: ["python", "run.py", "master-service"]
      imagePullSecrets:
      - name: regcred
      restartPolicy: Never
  1. 以及允许从 pod 将信息发送到主 pod 的服务 (ClusterIP):
apiVersion: v1
kind: Service
metadata:
  name: slave-service
spec:
  selector:
    app: slave-job
  ports:
    - protocol: TCP
      port: 6666
      targetPort: 6666

但是无论我做什么(在注释行的 job_slave.yaml 文件中都可以看到)它们无法相互通信,除非我将主节点的 IP 放在命令部分奴隶的。此外,主节点无法与外界通信(即使我创建了一个 configMapupstreamNameservers: | ["8.8.8.8"] 一切都在 minikube 环境中 运行ning。 但我无法确定我的问题是什么。任何帮助表示赞赏。

尝试使用 headless 服务:

apiVersion: v1
kind: Service
metadata:
  name: master-service
  labels:
    app: master-job
    role: master-job
spec:
  type: ClusterIP
  clusterIP: None
  selector:
    app: master-job
    role: master-job
  ports:
    - protocol: TCP
      port: 6666
      targetPort: 6666

并在 job_slave.yaml

中使用 command: ["python", "run.py", "master-service"]

确保您的主作业正在侦听容器内的端口 6666。

您的作业规范包含两部分:作业本身的描述,以及它创建的 Pods 的描述。 (在这里使用 Job 有点奇怪,我可能会选择 Deployment,但这同样适用于这里。)Service 对象的 selector: 与 [=27 的 labels: 相匹配=].

在 YAML 文件中,您显示的作业具有正确的标签,但生成的 Pods 没有。您需要向 pod 规范部分添加(可能重复)标签:

apiVersion: batch/v1
kind: Job
metadata:
  name: master-job
  labels: {...}
spec:
  template:
    metadata:
      # name: will get ignored here
      labels:
        app: master-job
        role: master-job

您应该可以使用 kubectl describe service master-service 进行验证。在其输出的末尾将有一行内容为 Endpoints:。如果服务选择器和 Pod 标签不匹配,则会显示 <none>;如果它们匹配,您将看到 Pod IP 地址。

(您不需要 NodePort 服务,除非您需要 接受来自集群外部的 请求;它可能与您使用的服务相同接受来自集群内的请求。您不需要在对象的名称中包含对象的类型。您所显示的任何内容都与集群外的通信没有任何明显的相关性。)