k8s集群StatefulSets的Pod调度查问失落问题?

考点之简略介绍下StatefulSets 和 Deployment 之间有什么本质区别?特定场景该如何做出抉择呢?
考点之你能辩证的说说看StatefulSets 和 Deployment具体有哪些区别嘛?
考点之你理解k8s集群StatefulSets的Pod调度查问失落问题吗?k8s集群中StatefulSet治理的Pod曾经实现调度并启动,为什么还是无奈查问Pod 的 DNS 命名?

囧么肥事-胡言乱语

简略介绍下StatefulSets 和 Deployment 之间有什么本质区别?

首先、StatefulSetDeployment 都是用来治理利用的工作负载 API 对象,都治理基于各自雷同容器规约的一组 Pod,同时负责各自治理的Pod 汇合的部署和扩缩、更新回滚等。

但和 Deployment 实质上不同的是,StatefulSets 用来治理有状态利用,而Deployment 负责管理无状态利用

如果应用程序不须要任何稳固的标识符或有序的部署、删除或伸缩,则应该应用 由一组无状态的正本控制器提供的工作负载来部署应用程序,比方 Deployment或者ReplicaSet

如果心愿应用存储卷为工作负载提供长久存储,能够应用 StatefulSet 作为解决方案的一部分。

只管 StatefulSet 中的单个 Pod 仍可能呈现故障, 但长久的 Pod 标识符 能够更容易将现有卷与于从新调度的Pod进行绑定。

说道这里,上面简略介绍一下,利用分类:

利用通常能够分为两大类:有状态与无状态

无状态利用

简略了解就是没有非凡状态的服务服务和数据拆散,自身不存储数据各个申请对于服务器来说对立无差别解决申请能够随机发送到任意一台server上申请本身携带了所有服务端所须要的所有参数服务本身不存储跟申请相干的任何数据

有状态利用

容器数据须要长久化放弃对于有数据存储性能的服务每个实例都须要有本人独立的长久化存储或者指多线程类型的服务、队列mysql数据库、kafka、zookeeper等

如果server是有状态的,客户端须要始终把申请发到同一台server才行,

同时,这里了解StatefulSets 两个关键点:1、稳固的 2、有序的

“稳固的”意味着 Pod 调度或重调度的整个过程是有持久性的
“有序的”意味着 Pod 调度或重调度的整个过程是须要放弃程序的

对于Deployment 的具体情况,可参考:【跟k8s工作负载Deployments的缘起缘灭】

你能辩证的说说看StatefulSets 和 Deployment具体有哪些区别嘛?

Deployment治理的Pod特点

Deployment被设计用来治理无状态服务的pod,每个pod完全一致

  • 无序性:无状态服务的多个Pod正本创立和销毁是无序的,能够并行创立或销毁,相互之间不用期待,除了须要恪守规约中定义的正本个数之外,没有其余制约。
  • 随机性:无状态服务的多个Pod正本的名称是随机的,pod被重新启动调度后,它的名称与IP都会发生变化,替换为一个新的正本。
  • 共享性:无状态服务的多个Pod正本共享存储卷。Deployment中Pod基于template定义存储卷,所有正本集共用一个存储卷。

StatefulSets治理的Pod特点

StatefulSets 被设计用来治理有状态的利用,StatefulSet 治理的 Pod 具备惟一的标识,该标识包含程序标识、稳固的网络标识和稳固的存储。 并且该标识和 Pod 是绑定,不论它被调度在哪个节点上,最终都会被绑定这个惟一标识

  • 唯一性:对于具备 N 个正本的 StatefulSet,它治理的每个 Pod 将被调配一个整数序号,该序号在 StatefulSet 上是惟一的
  • 程序性:程序标识、Pod 调度过程,无论是启动、销毁、更新都须要严格遵守程序。有序优雅的部署和缩放,有序主动的滚动更新
  • 稳固的网络标识:Pod主机名、DNS地址不会随着Pod被从新调度而发生变化。
  • 稳固的长久化存储:Pod被从新调度后,不会删除原有的PV,从新调度胜利后,持续挂载绑定原有的PV,从而保障了数据的完整性和一致性。

你理解过k8s集群StatefulSets的Pod调度查问失落问题吗?

k8s集群中StatefulSet治理的Pod曾经实现调度并启动,为什么还是无奈查问Pod 的 DNS 命名?如果须要在 Pod 调度实现之后及时发现,该怎么做?

先看看StatefulSet是如何为每个Pod调配DNS的呢?

StatefulSet 中治理的每个 Pod 会依据 StatefulSet 的名称和 以及为 Pod 的调配的有序索引(序号),派生出它的主机名。

组合主机名的格局为:

$(StatefulSet 名称)-$(序号)

StatefulSet 应用 Headless Services 管制外部 Pod 的网络域。

通过Headless Service为Pod编号,在DNS服务器中生成带有编号的DNS记录,从而能够达到通过Pod名字定位到相应的服务

治理域的服务的格局为:

$(服务名称).$(命名空间).svc.cluster.local

其中 cluster.local 是集群域。 一旦每个 Pod 创立胜利,就会失去一个匹配的 DNS 子域,格局为: $(pod 名称).$(所属服务的 DNS 域名),其中所属服务由 StatefulSetserviceName 域来设定。

理解完调配和组成,接下来说一下为什么会呈现查问失败的状况呢?

第一种状况,Pod尚在创立过程中,这时候查问,DNS命名还未调配胜利

第二种状况,Pod曾经创立胜利,取决于集群域外部 DNS 的配置,可能无奈查问一个刚刚启动的 Pod 的 DNS 命名。起因是k8s有个负缓存的概念。

负缓存 (在 DNS 中较为常见)

之前失败的查问后果会被记录和重用至多若干秒钟默认缓存时长为 30s查问过程第一次查问后果是失败后果记录到负缓存中,标注失败在缓存周期内查问,间接从负缓存中取,后果是失败

如何及时发现创立的Pod的DNS命名?

如果须要在 Pod 被创立之后及时发现它们,有以下选项:

  • 间接查问 Kubernetes API(比方,利用 watch 机制)而不是依赖于 DNS 查问
  • 缩短 Kubernetes DNS 驱动的缓存时长(批改 CoreDNSConfigMap,目前DNS缓存时长为 30 秒)


获取更多干货,欢送关注微信公众号:囧么肥事

Kubernetes 举荐学习书

Kubernetes权威指南PDF
链接: https://pan.baidu.com/s/11huL... 提取码:sa88