(图片来自网络)

改 readinessProbe

对于昨天 k8s 尼克号发生的触礁事故,我们分析下来主要是2个原因,一是当时4个节点不够用造成部分容器负载过高而宕机,二是 readinessProbe 健康检查配置不合理,造成重启后的容器无法通过健康检查。

skipping: failed to "StartContainer" for "blog-web" with CrashLoopBackOff.

CrashLoopBackOff 是指容器“启动 -> 挂了 -> 又启动了 -> 又挂了…”。(参考资料: Kubernetes Troubleshooting Walkthrough - Pod Failure CrashLoopBackOff

对于原因一,已改为在访问低峰也用5个节点。

对于原因二,将 readinessProbe 的配置由

readinessProbe:
initialDelaySeconds: 30
periodSeconds: 5

改为

readinessProbe:
initialDelaySeconds: 40
periodSeconds: 5
successThreshold: 1
failureThreshold: 5
timeoutSeconds: 5

readinessProbe 健康检查决定 service 是否将请求转发给该容器处理。(参考资料:Kubernetes Liveness and Readiness Probes: How to Avoid Shooting Yourself in the Foot

initialDelaySeconds 表示在容器启动后进行第一次检查的等待时间(默认是0秒)。

periodSeconds 表示每隔多长时间进行检查(默认是30秒)。

successThreshold 表示几次检查通过才算成功(默认是1次)

failureThreshold 表示几次检查失败才算失败(默认是3次),失败后会重启容器。

timeoutSeconds 检查的超时时间(默认是1秒),当时我们用的就是默认值,而容器中的 ASP.NET Core 应用第一次请求时预热时间比较长,使用默认值很容易造成检查超时,现在改为5秒。

去 DaemonSet

使用 DaemonSet 是因为我们对 k8s 还不熟悉,在用开渔船(docker swarm)的方式驾驶巨轮(k8s),docker swarm compose 中用的是  mode: global ,换到 k8s 后我们就用了对应的替代  DaemonSet ,却不知道 k8s 强大的功能之一 —— 自动伸缩(autoscaling)。昨天故障时,DaemonSet 的部署方式是雪上加霜,部分 pod 挂了,剩下的 pod 即使负载再高,也不会启动新的 pod 分担负载。

在这次修船中将 DaemonSet 改为 Deployment

kind: DaemonSet
kind: Deployment

上 Autoscaler

自动伸缩(autoscaling)这个 k8s 强大的功能之一,让我们体会到了现代化的巨轮与落后的渔船(docker swarm)之间的巨大差别。之前只在云上看到到自动伸缩,现在船上就有,而且使用起来很简单,比如我们需要根据容器的 CPU 占用情况自动伸缩 pod ,采用了下面的配置。

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: blog-web
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: blog-web
minReplicas: 5
maxReplicas: 12
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 90

关于自动伸缩的参考资料:

* Horizontal Pod Autoscaler Walkthrough

* How to autoscale apps on Kubernetes with custom metrics

* Kubernetes Autoscaling 101: Cluster Autoscaler, Horizontal Pod Autoscaler, and Vertical Pod Autoscaler

这次修船到此,预计明天开上新船。

k8s 开船记-修船:改 readinessProbe ,去 DaemonSet ,上 Autoscaler的更多相关文章

  1. k8s 开船记-触礁:四涡轮发动机撞坏3个引发502故障

    (图片来自网络) 非常抱歉,这次开船触礁故障给您带来麻烦了,请您谅解. 在我们昨天发布 k8s 开船记首航博文后,有园友在评论中发来贺词——“泰坦尼克号出发了[狗头]”,借此吉言,今天船就触礁了,还好 ...

  2. k8s 开船记-故障公告:自建 k8s 集群在阿里云上大翻船

    非常非常抱歉,新年上班第一天, 在今天阿里云上气候突变情况下,由于我们开船技术差,在今天 10:15~12:00 左右的访问高峰,我们竟然把船给开翻了,造成近2个小时整个博客站点无法访问,由此给您带来 ...

  3. k8s 开船记:升级为豪华邮轮(高可用集群)与遇到奇怪故障(dns解析异常)

    之前我们搭建的 k8s 集群只用了1台 master ,可用性不高,这两天开始搭建高可用集群,但由于之前用 kubeadm 命令创建集群时没有使用 --control-plane-endpoint 参 ...

  4. k8s 开船记-首航:博客站点从 docker swarm 切换到 k8s

    昨天晚上,我们将博客站点的生产环境从 docker swarm 集群切换到了 k8s 集群,开船到目前,航行非常平稳,可以说首航成功! k8s 集群是我们用10台阿里云服务器自己搭建的,1台 mast ...

  5. k8s 开船记-全站登船:Powered by .NET Core on Kubernetes

    今天 18:30 左右,我们迈出了 kubernetes 航行的关键一步——全站登船,完成了全站应用从 docker swarm 集群向 k8s 集群的切换,以前所未有的决心与信心重新开起这艘巨轮,而 ...

  6. 【故障公告】k8s 开船记:增加控制舱(control-plane)造成的翻船

    春节期间我们更换了 kubernetes 生产集群,旧集群的 kubernetes 版本是 1.17.0,新集群版本是 1.23.3,新集群上部署了 dapr,最近准备将更多独立部署的服务器部署到 k ...

  7. k8s 开船记-脚踏两只船:船儿还是旧的好,不翻船才是硬道理

    自从上次开始脚踏两只船(2个独立的k8s集群同时运行),园子暂时用奢侈的土豪方式过上了安稳的船上生活. 这种方式除了费钱之外,还带来一个问题,我们的集装箱自动装船系统(基于gitlab-ci的自动化部 ...

  8. 从零开始入门 K8s | 应用编排与管理:Job & DaemonSet

    一.Job 需求来源 Job 背景问题 首先我们来看一下 Job 的需求来源.我们知道 K8s 里面,最小的调度单元是 Pod,我们可以直接通过 Pod 来运行任务进程.这样做将会产生以下几种问题: ...

  9. php7 改为从栈上分配内在的思路

    php7的特点是规则上不从堆上分配内存,改为从栈上分配内存, 因为有些场景是从堆上分配内在后,还要手动释放内存,利用栈分配内在快的特点,在有需要的时候,再在堆上分配内在 但是栈上分配的内存,不能返回, ...

随机推荐

  1. 【algo&ds】1.时间复杂度和空间复杂度分析

    1.时间复杂度分析O(f(n)) 分析方法 只关注循环执行次数最多的一段代码 加法原则 乘法原则 高优先级原则 常见时间复杂度量级 多项式量级和非多项式量级.其中,非多项式量级只有两个:O(2^n) ...

  2. 如何基于 PHP-X 快速开发一个 PHP 扩展

    0x01 起步 PHP-X本身基于C++11开发,使用cmake进行编译配置.首先,你需要确定所有依赖项已安装好.包括: gcc-4.8 或更高版本 PHP7.0 或更高版本,需要php7-dev 开 ...

  3. nyoj 457-大小写互换

    457-大小写互换 内存限制:64MB 时间限制:1000ms 特判: No 通过数:18 提交数:21 难度:0 题目描述:       现在给出了一个只包含大小写字母的字符串,不含空格和换行,要求 ...

  4. 领扣(LeetCode)删除链表中的节点 个人题解

    请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 4 -> 5 -> 1 - ...

  5. linux磁盘分区、格式化、挂载

    新建分区的操作步骤,如下图: 1)RAID卡: 机器有没有RAID卡可以在开机时看有没有出现配置RAID什么的提示(亲测),系统运行时有没有,不知道! 服务器大多有这个新加硬盘后不修改raid,开即f ...

  6. Centos上通过shell脚本备份数据库

    #!/bin/bash ds=`` list=`date +%Y`/`date +%m` dname="callme" eval "mkdir -p $list" ...

  7. PHP的global和$GLOBALS的区别

    global是关键字,通常添加在变量前,可以使变量的作用域为全局. $GLOBALS预定义的超全局变量,把变量扔到里面一样可以变成全局变量. $GLOBALS 是一个关联数组,每一个变量为一个元素,键 ...

  8. 初识JVM内存模型

    计算机内存模型 在程序运行时,CPU通过访问主存获取数据,但随着CPU的快速发展,CPU访问速度越来越高,硬件无法满足CPU的条件下,大多内存加入了高速缓存机制,不同CPU都有对应的多级(一般为三)缓 ...

  9. ZeroC ICE源代码中的那些事 - 嵌套类和局部类

    使用嵌套类(类中定义的类,c++没有静态类)或局部类(在函数或成员方法中定义的类),进行行为模式的委托(委托请求)或异步 . java中嵌套类和局部类隐式完成了你对外部对象(实例)访问的私有堆栈的初始 ...

  10. opencv 2 Opencv数据结构与基本绘图

    基础图像容器Mat Mat 是一个类,又两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法不同,矩阵可以是不同的维数)的指针.矩阵头的尺 ...