我有两个只运行一次的任务。一个叫做Master,一个叫做Slave。顾名思义,主荚需要从从中获取一些信息,然后在线查询一些API。关于如何进行通信的简单方案如下:
Slave --- port 6666 ---> Master ---- port 8888 ---> internet:www.example.com为此,我创建了5个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: NeverapiVersion: 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: 6666apiVersion: v1
kind: Service
metadata:
name: master-np-service
spec:
type: NodePort
selector:
app: master-job
ports:
- protocol: TCP
port: 8888
targetPort: 8888
nodePort: 31000apiVersion: 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: NeverapiVersion: 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"],但一切都运行在微型环境中。但我无法确定我的问题是什么。任何帮助都是非常感谢的。
发布于 2019-09-10 10:02:10
您的职务规范有两个部分:对作业本身的描述和对它创建的Pods的描述。(在这里使用作业有点奇怪,我可能会选择部署,但这里也是如此。)其中,Service有一个selector:,它与Pods的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服务;它可能与您在集群内接受请求时使用的服务相同。您不需要将对象的类型包含在它们的名称中。您展示的任何内容都与集群之外的通信没有任何明显的相关性。)
发布于 2019-09-10 09:39:32
尝试使用无头服务:
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端口。
https://stackoverflow.com/questions/57867829
复制相似问题