k8s集群StatefulSets的Pod调度查询丢失问题?
k8s集群StatefulSets的Pod调度查询丢失问题?
考点之简单介绍下StatefulSets 和 Deployment 之间有什么本质区别?特定场景该如何做出选择呢?
考点之你能辩证的说说看StatefulSets 和 Deployment具体有哪些区别嘛?
考点之你了解k8s集群StatefulSets的Pod调度查询丢失问题吗?k8s集群中StatefulSet管理的Pod已经完成调度并启动,为什么还是无法查询Pod 的 DNS 命名?
囧么肥事-胡说八道
简单介绍下StatefulSets 和 Deployment 之间有什么本质区别?
首先、StatefulSet
和Deployment
都是用来管理应用的工作负载 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 域名)
,其中所属服务由 StatefulSet
的 serviceName
域来设定。
了解完分配和组成,接下来说一下为什么会出现查询失败的情况呢?
第一种情况,Pod尚在创建过程中,这时候查询,DNS命名还未分配成功
第二种情况,Pod已经创建成功,取决于集群域内部 DNS 的配置,可能无法查询一个刚刚启动的 Pod 的 DNS 命名。原因是k8s有个负缓存的概念。
负缓存 (在 DNS 中较为常见)
之前失败的查询结果会被记录和重用至少若干秒钟
默认缓存时长为 30s
查询过程
第一次查询结果是失败
结果记录到负缓存中,标注失败
在缓存周期内查询,直接从负缓存中取,结果是失败
如何及时发现创建的Pod的DNS命名?
如果需要在 Pod 被创建之后及时发现它们,有以下选项:
- 直接查询
Kubernetes API
(比如,利用watch
机制)而不是依赖于 DNS 查询 - 缩短
Kubernetes DNS
驱动的缓存时长(修改CoreDNS
的ConfigMap
,目前DNS缓存时长为 30 秒)
k8s集群StatefulSets的Pod调度查询丢失问题?的更多相关文章
- k8s集群StatefulSets的Pod优雅调度问题思考?
k8s集群StatefulSets的Pod优雅调度问题思考 考点之你能解释一下为什么k8s的 StatefulSets 需要VolumeClaimTemplate嘛? 考点之简单描述一下Statefu ...
- 如何用prometheus监控k8s集群中业务pod的metrics
一般,我们从网上看到的帖子和资料, 都是用prometheus监控k8s的各项资源, 如api server, namespace, pod, node等. 那如果是自己的业务pod上的自定义metr ...
- 【故障公告】没有龙卷风,k8s集群翻船3次,投用双集群恢复
今天没有龙卷风(异常的高并发请求),故障却依然出现,问题非常奇怪. 某种异常情况会造成短时间内, k8s 集群中大量 pod (超过60%)因健康检查失败而处于 CrashLoopBackOff 状态 ...
- k8s集群调度方案
Scheduler是k8s集群的调度器,主要的任务是把定义好的pod分配到集群节点上 有以下特征: 1 公平 保证每一个节点都能被合理分配资源或者能被分配资源 2 资源高效利用 集群所有资 ...
- k8s集群启动了上万个容器(一个pod里放上百个容器,起百个pod就模拟出上万个容器)服务器超时,无法操作的解决办法
问题说明: 一个POD里放了百个容器,然后让K8S集群部署上百个POD,得到可运行上万个容器的实验目的. 实验环境:3台DELL裸机服务器,16核+64G,硬盘容量忽略吧,上T了,肯定够. 1.一开始 ...
- kubeadm搭建K8s集群及Pod初体验
基于Kubeadm 搭建K8s集群: 通过上一篇博客,我们已经基本了解了 k8s 的基本概念,也许你现在还是有些模糊,说真的我也是很模糊的.只有不断地操作去熟练,强化自己对他的认知,才能提升境界. 我 ...
- 从认证到调度,K8s 集群上运行的小程序到底经历了什么?
导读:不知道大家有没有意识到一个现实:大部分时候,我们已经不像以前一样,通过命令行,或者可视窗口来使用一个系统了. 前言 现在我们上微博.或者网购,操作的其实不是眼前这台设备,而是一个又一个集群.通常 ...
- k8s集群Job Pod 容器可能因为多种原因失效,想要更加稳定的使用Job负载,有哪些需要注意的地方?
k8s集群Job Pod 容器可能因为多种原因失效,想要更加稳定的使用Job负载,有哪些需要注意的地方? 面试官:"计数性Job默认完成模式是什么?Indexed模式如何发布自定义索引呢?& ...
- 案例分享 生产环境逐步迁移至k8s集群 - pod注册到consul
#案例分享 生产环境逐步迁移至k8s集群 - pod注册到consul #项目背景 多套业务系统, 所有节点注册到consul集群,方便统一管理 使用consul的dns功能, 所有节点hostnam ...
随机推荐
- hashmap 实现 相同的key值时,value值叠加效果。
一,了解一些基础 package com.ohs.demo; /** * * 一.需求是:停止相同的key值,覆盖效果,将重复的value值,叠加起来. * * 二.hash? 什么是hash? * ...
- plsql 函数的定义 包规范和包主体。
/* 一.函数? 1.函数定义 函数的内容 根据实际需要来定义 2.使用的方式 */ -- 定义函数 根据部门编号查询出部门的总人数 create or replace function fn( de ...
- 蓝桥杯试题 基础练习 2n皇后问题以及n皇后问题
在学习2n皇后之前,我们应该认识一下n皇后问题: 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于 ...
- Lesson7——Pandas 使用自定义函数
pandas目录 简介 如果想要应用自定义的函数,或者把其他库中的函数应用到 Pandas 对象中,有以下三种方法: 操作整个 DataFrame 的函数:pipe() 操作行或者列的函数:apply ...
- AT2650 [ARC077C] guruguru
可以发现,如果我们枚举每个理想亮度 \(X\) 然后再求在这个理想亮度情况下的答案是非常难维护的. 不妨反过来,考虑每个位置 \(i, i + 1\) 之间对每个理想亮度 \(X\) 减少次数的贡献. ...
- simpholders 官方网址 https://www.simpholders.com/
SimPholders可让你快速直接地访问iPhone模拟器应用的app文档.你可以通过SimPholders找到数据库文件.永久存储以及缓存,它是一个非常实用的app debug工具,同时还可以离线 ...
- MySQL数据类型的最优选择
MySQL数据类型的最优选择 慎重选择数据类型很重要.为啥哩?可以提高性能.原理如下: ● 存储(内存.磁盘).从而节省I/O(检索相同数据情况下) ● 计算.进而 ...
- feiQ发送信息
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import j ...
- 如何在 pyqt 中实现全局事件总线
前言 在 Qt 中可以使用信号和槽机制很方便地实现部件之间的通信,考虑下面这样的场景: 我想要点击任意一个专辑卡并通知主界面跳转到专辑界面,那么一种实现方式如上图所示:点击任意一个蓝色方框所示的专辑卡 ...
- vue中的钩子函数
什么是vue的钩子函数? Vue 实例在被创建时,会经过一系列的初始化过程,初始化过程中会运行一些函数,叫做生命周期钩子函数,通过运用钩子函数,用户在可以在Vue实例初始化的不同阶段添加自己的代码,以 ...