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 文件:
- 用于创建 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
- 一个服务(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
- 允许主机在线获取信息的服务(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
- 从 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
- 以及允许从 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 放在命令部分奴隶的。此外,主节点无法与外界通信(即使我创建了一个 configMap
和 upstreamNameservers: | ["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
服务,除非您需要 接受来自集群外部的 请求;它可能与您使用的服务相同接受来自集群内的请求。您不需要在对象的名称中包含对象的类型。您所显示的任何内容都与集群外的通信没有任何明显的相关性。)
我有两份工作 运行 只有一次。一种叫做Master
,一种叫做Slave
。顾名思义,Master pod 需要来自 slave 的一些信息,然后在线查询一些 API。
一个关于如何像这样进行通信的简单方案:
Slave --- port 6666 ---> Master ---- port 8888 ---> internet:www.example.com
为此我创建了 5 个 yaml 文件:
- 用于创建 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
- 一个服务(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
- 允许主机在线获取信息的服务(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
- 从 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
- 以及允许从 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 放在命令部分奴隶的。此外,主节点无法与外界通信(即使我创建了一个 configMap
和 upstreamNameservers: | ["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
服务,除非您需要 接受来自集群外部的 请求;它可能与您使用的服务相同接受来自集群内的请求。您不需要在对象的名称中包含对象的类型。您所显示的任何内容都与集群外的通信没有任何明显的相关性。)