(图片来自网络)

改 readinessProbe

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

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

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

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

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

  1. readinessProbe:
  2. initialDelaySeconds: 30
  3. periodSeconds: 5

改为

  1. readinessProbe:
  2. initialDelaySeconds: 40
  3. periodSeconds: 5
  4. successThreshold: 1
  5. failureThreshold: 5
  6. 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

  1. kind: DaemonSet
  2. kind: Deployment

上 Autoscaler

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

  1. apiVersion: autoscaling/v2beta2
  2. kind: HorizontalPodAutoscaler
  3. metadata:
  4. name: blog-web
  5. spec:
  6. scaleTargetRef:
  7. apiVersion: apps/v1
  8. kind: Deployment
  9. name: blog-web
  10. minReplicas: 5
  11. maxReplicas: 12
  12. metrics:
  13. - type: Resource
  14. resource:
  15. name: cpu
  16. target:
  17. type: Utilization
  18. 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. nyoj 67-三角形面积 (海伦公式, 叉积)

    67-三角形面积 内存限制:64MB 时间限制:3000ms 特判: No 通过数:8 提交数:13 难度:2 题目描述: 给你三个点,表示一个三角形的三个顶点,现你的任务是求出该三角形的面积 输入描 ...

  2. href=”javascript:void(0);

    href=”javascript:void(0);”这个的含义是,让超链接去执行一个js函数,而不是去跳转到一个地址,而void(0)表示一个空的方法,也就是不执行js函数. 为什么要使用href=” ...

  3. Nginx 代理本地文件夹(Windows环境)

    安装环境: win10 nginx-1.17.2 步骤: 一.打开nginx.conf 路径:\nginx-1.17.2\conf\nginx.conf 二.编辑 配置跨域以及代理文件夹路径 三.启动 ...

  4. PostGIS 安装教程(Linux)(二)

    ##接上篇,上篇讲述了Postgresql的安装,此篇介绍postgis的安装 ##附上上篇链接:https://www.cnblogs.com/giser-s/p/11195419.html 二.安 ...

  5. 【集训Day2】字符串

    字符串(string) [问题描述] 给一个字符串T,问在字符串T 中可以包含最多多少个不重叠的字符串S. 字符串中的每个字符为小写或者大写字母. [输入格式] 第一行输入一个字符串S. 第二行输入一 ...

  6. Lab4\5:进程和线程

    进程的定义 进程是指一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程 源代码在经过编译链接之后生成了可执行文件,再由操作系统进行加载并且进行一些堆栈的分配才是进程 进程控制块 操作系统管理 ...

  7. System.out.printf使用以及注意点

    一.System.out.printf格式化输出 1.常用控制符 控制符 说明 %d 按十进制整型数据的实际长度输出. %ld 输出长整型数据. %md m 为指定的输出字段的宽度.如果数据的位数小于 ...

  8. EFK教程(4) - ElasticSearch集群TLS加密通讯

    基于TLS实现ElasticSearch集群加密通讯 作者:"发颠的小狼",欢迎转载 目录 ▪ 用途 ▪ ES节点信息 ▪ Step1. 关闭服务 ▪ Step2. 创建CA证书 ...

  9. 11-kubernetes RBAC 及授权

    目录 RBAC role 和 clusterrole rolebinding 和 clusterrolebinding 公共权限 clusterrole user 创建测试 创建role案例 创建 r ...

  10. 点击查看大图滑动预览(h5,pc通用)

    点击预览大图并滑动观看,支持手机端和pc端,具体功能如下图: 一. touchTouch 的js和css 以及jquery依赖库 <link rel="stylesheet" ...