Pod无法相互通信

时间:2019-09-10 09:27:39

标签: docker kubernetes minikube

我有两个作业只能运行一次。一种称为Master,另一种称为Slave。顾名思义,主控窗格需要从属节点提供一些信息,然后在线查询一些API。 关于如何进行通信的简单方案如下:

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

为此,我创建了5个Yaml文件:

  1. 用于创建Master窗格的job-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. 从属窗格的工作:
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. 还有一项服务(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放置在从站的命令部分中,否则它们无法相互通信。主节点也无法与外界通信(即使我使用configMap创建了upstreamNameservers: | ["8.8.8.8"] 一切都在minikube环境中运行。 但是我无法确定我的问题是什么。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

您的Job规范包含两个部分:Job本身的描述,以及它创建的Pod的描述。 (在这里使用Job有点奇怪,我可能会选择Deployment,但在这里也适用。)Service对象的selector:与Pod的labels:相匹配。 / p>

在YAML文件中,您显示作业具有正确的标签,但生成的Pod没有。您需要将标签(可能重复)添加到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服务,除非您需要接受来自集群外部的请求;它可能与您用来接受来自集群内部的请求的服务相同无需在对象名称中包括对象的类型。显示的内容与群集外的通信没有明显的关联。)

答案 1 :(得分:1)

尝试使用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

并在您的command: ["python", "run.py", "master-service"]中使用job_slave.yaml

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