Kubernetes 无状态应用的一般特征

Stella981
• 阅读 427

以 12 要素为代表的微服务标准,很好地给微服务的特征做出了指导。然而具体到以容器形式在 Kubernetes 上运行的无状态业务应用上,这个标准是有些高层的——它看重的是方法和架构。如果仅从外在视角来对一个“顺眼”的 Kubernetes 应用进行观察,这个应用应该有什么特征呢?

依赖关系清晰

微服务应用通常会有各种外部依赖,例如数据库、缓存、队列等平台能力,或者业务上的依赖服务等,因此一个健康的微服务组合而成的应用,必须能处理好依赖关系。

微服务的启动顺序不是固定的,并且存在独立更新、重启的可能。而很多应用仅在启动时进行连接,这就要求在 Kubernetes 上运行的应用,首先在启动时,不会因为暂时无法连接依赖服务直接崩溃;同时在运行期间,也有处理这种随时重连的能力。

具备自检能力

存活检测关注的是进程是否活跃,是否应该重新启动;就绪检测代表的是服务能力,是否应该保存在 Service 的负载均衡池中。

在没有设置就绪检测的情况下,Pod 一旦启动成功,K8s 就会把相关服务的请求发给该实例,如果这个实例启动较慢,就有可能对业务造成损失。同理,存活和就绪检测应该分别进行,例如业务阻塞时,暂时将实例摘除,但是无需重启,即可逐步恢复服务能力。

联系到前面的依赖关系问题,在微服务环境中,一个服务的就绪检测应该仅仅关注本应用的情况,检测过程中不应包含对依赖服务的调用——否则所有依赖故障服务的其它服务的就绪检查失败,造成大面积故障。

日志采集和处理

  • 应用不应继续把日志输出到本地文件,而应该输出到 stdoutstderr

  • 集群应该针对容器的 stdoutstderr 提供统一的日志采集,建议使用 Daemonset 而非 Sidecar;

  • 进行日志采集的同时,集群应提供 ES、Loki 或其它类似机制来对日志进行处理,并且其处理和存储能力应该有初步预案;

  • 应用日志应提供分级开关,保证同一镜像在不同环境中可以输出不同数量和级别的日志信息。

尽量优雅关停

  • 容器命令入口应该有能力接收 SIGTERM,并在需要的情况下传递给业务主进程;

  • 应用进程接收到 SIGTERM 信号之后,不应立刻关停,而是处理好剩余的在途业务;

  • 使用 preStop 等 Pod 生命周期手段来完成特定任务;

  • 避免使用长连接,保持简单负载均衡的有效性。

故障预防和应对

  • 避免运行单 Pod 的 Deployment;

  • 使用 Pod 软亲和避免同 Deployment 中的不同 Pod 分布在同一节点上;

  • 遭遇不可恢复的故障,应该允许应用崩溃,由 K8s 重新启动;

  • 定义 PDB(Pod disruption budgets),告知 K8s 为应用提供最低 Pod 数量保障。

资源使用

  • 必须定义 CPU 和内存的 Requests;

  • 必须定义内存的 Limits;

  • 同一集群中的不同微服务,如果有不同 QoS 要求,应该定义不同的 qosClass,避免被无差别驱逐。

安全相关

  • 应清晰掌握并声明应用运行所需的 Linux Capabiltiy;

  • 避免使用 Root 身份运行容器;

  • 使用只读的 RootFS,所有写入需求应该使用存储卷来完成;

  • 避免特权逃逸。

本文分享自微信公众号 - 伪架构师(fake-architect)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Rancher开源Harvester:基于K8s的超融合基础架构软件
2020年12月17日,业界应用最为广泛的Kubernetes管理平台创建者RancherLabs(以下简称Rancher)宣布推出全新开源软件Harvester,一个通过Kubernetes构建的超融合基础架构(HCI)软件。!图片(https://img.rwimg.top/7592_5649bc00e54d4b30a1419db9c4
Stella981 Stella981
3年前
Prometheus在Kubernetes下的服务发现机制
Prometheus作为容器监控领域的事实标准,随着以Kubernetes为核心的云原生热潮的兴起,已经得到了广泛的应用部署。灵活的服务发现机制是Prometheus和Kubernetes两者得以连接的基础,本文将对这部分内容进行介绍,从而让读者了解Prometheus如何对Kubernetes集群本身以及对运行其上的各种应用进行有效地监控。
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
AWS国庆双重礼,仅限7天
自2021年10月1日00:00起至2021年10月7日24:00,新注册并激活(需全部完成账号注册的五个步骤,否则账号状态并未激活)AWS海外区域账户,填写页面下方表单,即可申领价值$200美元的AWS海外区域账户服务抵扣券直充到您的账户,用以抵扣服务消费,助您轻松体验多个云迁移应用场景。同时,您还可获赠。国庆双重礼,仅限7天$200美元AWS服务抵
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这