首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >豆荚不能彼此沟通

豆荚不能彼此沟通
EN

Stack Overflow用户
提问于 2019-09-10 09:27:39
回答 2查看 148关注 0票数 1

我有两个只运行一次的任务。一个叫做Master,一个叫做Slave。顾名思义,主荚需要从从中获取一些信息,然后在线查询一些API。关于如何进行通信的简单方案如下:

代码语言:javascript
复制
Slave --- port 6666 ---> Master ---- port 8888 ---> internet:www.example.com

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

  1. 制作主吊舱的工作高手:
代码语言:javascript
复制
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. 允许从服务器向端口6666上的主节点发送信息的服务(ClusterIP):
代码语言:javascript
复制
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):
代码语言:javascript
复制
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. 奴隶舱的工作:
代码语言:javascript
复制
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),它允许奴隶荚向主荚发送信息:
代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: slave-service
spec:
  selector:
    app: slave-job
  ports:
    - protocol: TCP
      port: 6666
      targetPort: 6666

但是,无论我做什么(就像在注释行中的job_slave.yaml文件中看到的那样),它们不能相互通信,除非我将主节点的IP放在从节点的命令部分。此外,主节点无法与外部世界通信(即使我用upstreamNameservers: | ["8.8.8.8"]创建了一个upstreamNameservers: | ["8.8.8.8"],但一切都运行在微型环境中。但我无法确定我的问题是什么。任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-10 10:02:10

您的职务规范有两个部分:对作业本身的描述和对它创建的Pods的描述。(在这里使用作业有点奇怪,我可能会选择部署,但这里也是如此。)其中,Service有一个selector:,它与Pods的labels:匹配。

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

代码语言:javascript
复制
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服务;它可能与您在集群内接受请求时使用的服务相同。您不需要将对象的类型包含在它们的名称中。您展示的任何内容都与集群之外的通信没有任何明显的相关性。)

票数 2
EN

Stack Overflow用户

发布于 2019-09-10 09:39:32

尝试使用无头服务:

代码语言:javascript
复制
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端口。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57867829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档