问题描述
在Kubernetes中有一个部署,其中包含一个包含两个容器的Job。由于分布和经济原因,他希望这两个容器可以独立部署。然而,它们之间仍然存在互联性,这意味着它们之间需要进行网络通信。
根据他的描述,他知道无法在Job上创建Service。至少需要一个简单的Pod。然而,这会增加一个额外的元素并改变了问题的背景:他想将一个Job拆分成两个Job,而不是一个Job、一个Pod和一个Service。
所以,在这种背景下,是否有一种方法可以直接连接两个Job,而不创建一个Service呢?这两个Job都将在同一个集群中,在不同的机器上使用相同的内部DNS。
基本上,他希望能够从Job1中连接到 job1.job1namespace:8080
。
解决方案
请注意以下操作可能涉及到Kubernetes版本和配置方面的细节,需要在实际操作前做好备份和验证。
在Kubernetes 1.20版本以上,你可以尝试利用Pod
规范的一个测试特性,允许在DNS中设置Pod
的FQDN。虽然我不确定这个特性是否适用于Job
资源(至少在v1.20版本中),但由于它是Pod
规范的一部分,我认为在Job
之间也应该适用。在这个例子中,假设在该定义中设置了setHostnameAsFQDN: true
,那么类似于 busybox-1.default-subdomain.my-namespace.svc.cluster-domain.example
的FQDN(对于该规范中名为busybox
的name
元数据字段)将是有效的,并且应该可以从另一个Job
中访问。
我能够测试Job
资源接受setHostnameAsFQDN
在定义中,并且似乎没有问题。以下是一个示例,其中设置了setHostnameAsFQDN: true
:
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
setHostnameAsFQDN: true
backoffLimit: 4
上述示例在Kubernetes v1.21.1版本中测试通过。
评论:非常好的答案。但是,我们目前正在使用Kubernetes 1.19。我会尝试查找是否有可能至少更新到1.20,因为1.21在AWS EKS上还不可用。
总结
在Kubernetes中连接两个Job并实现网络通信可以通过设置setHostnameAsFQDN
来实现,这样可以在DNS中为Pod
设置FQDN。尽管这可能需要更新到Kubernetes 1.20或更高版本,但它提供了一种在Job之间实现连接的方法。如果您的集群版本较低,您可能需要考虑升级集群以支持这些功能。