我试图将一个单片应用程序移植到k8s pods。从理论上讲,pod被认为是短暂的,建议使用服务概念来提供静态IP。但到目前为止,在我的测试中,我还没有看到POD IP被更改。那么现在问题是什么时候k8会为我的POD分配一个新的IP?
我创建了具有固定主机名的POD(不使用任何控制器),它们被限制在一个节点上。那么节点和主机名永远不会改变,POD永远不会被删除?所以在这种独特的情况下,POD IP什么时候可以改变。我查看了文档,这对我来说并不清楚。
正如coderanger所提到的,你不应该依赖豆荚本身,因为豆荚是短暂的和可更换的。由于Pod是Kubernetes中最小的可部署对象,并且被认为是易于更换的,我们应该避免与pod本身直接交互;相反,我们应该与控制器进行交互,控制器将负责Pod。 David Maze提到您应该使用该服务来管理pod / pods。我的前辈们的意思是,在对Pod进行任何更改后,它可能会导致删除pod,失败后它将停止工作,如果你将与你的Pod与控制器交互,它将导致重新创建。所以更清楚一点 - 你的问题是“如果我不使用最佳实践和与我的集群交互的建议方式将会发生什么”。答案是 - 很多事情都可能出错,其中之一就是错误和许多不必要的故障排除。那么我们建议您遵守Kubernetes社区提供的规则和文档:如上所述:here:
一般来说,豆荚不会消失,直到有人摧毁它们。这可能是人或控制者。这个规则的唯一例外是具有成功或失败超过一定时间的
phase
的荚(由主人中的terminated-pod-gc-threshold
确定)将到期并自动销毁。
即使在你的单例场景中,你也应该总是使用控制器;控制器提供了很多优点,如自我修复或复制等。正如coderanger所提到的,StatefullSets还可以为有状态的pod提供支持。更多关于Pods here的耐用性。
更进一步,我们使用不同类型的controllers,因此你可以避免与pod的直接交互: - 预期终止的pods的Job - 预计不会终止的pods的ReplicationController,ReplicaSet或Deployment - 需要运行的DaemonSet Pods每台机器一台,因为它们提供机器特定的系统服务
之所以这样,是因为控制器具有弹性,它们可以承受Pods不会遇到的机器故障。 Pod不是持久的实体,不应该像那样对待。他们将not survive调度错误,节点故障(缺乏资源驱逐)等。
直接问到问题的本质,由于Kubernetes的性质,您无法为Pod分配静态IP。对主机名进行硬编码并不是一个好主意,您可以根据@coderanger建议的最接近您的解决方案创建StatefullSet,这将或多或少地为您的Pod提供静态主机名。
只要pod正在运行,IP就不会改变,但是没有承诺你的pod将继续运行。最接近稳定网络名称的是StatefulSet。这将创建一致的pod名称,这意味着kubedns / coredns中的一致DNS名称。在Kubernetes中没有通用的方法来获取pod(或服务上的)长期静态IP,虽然它在技术上取决于你的CNI网络插件,所以可能其中一些有特殊情况?
如果在部署中启动Pod的多个副本,则pod IP地址将更改。如果更改基本容器并重新启动容器,则新容器可能具有不同的IP地址。
你声称“pod永远不会被删除”,但这在Kubernetes中是一个非常强大且不寻常的声明。更新应用程序或其下的基本OS容器的典型方法是构建新的Docker镜像并重新部署它,这将导致删除pod及其IP地址更改。
在任何情况下,您都应该创建引用pod的Kubernetes服务。该服务将在群集中提供DNS名称,该名称将在您的控制下保持稳定。从群集中运行的其他应用程序,您可以引用servicename.namespacename.svc.cluster.local
作为主机名。