在Kubernetes中连接两个Job而不使用Service

65次阅读
没有评论

问题描述

在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(对于该规范中名为busyboxname元数据字段)将是有效的,并且应该可以从另一个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之间实现连接的方法。如果您的集群版本较低,您可能需要考虑升级集群以支持这些功能。

正文完