我有两个作业只能运行一次。一种称为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: Never
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
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
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
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环境中运行。
但是我无法确定我的问题是什么。任何帮助表示赞赏。
答案 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。