k8s 开船记-修船:改 readinessProbe ,去 DaemonSet ,上 ??Autoscaler

(图片来自网络)

改 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

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

原文地址:https://www.cnblogs.com/cmt/p/12044012.html

时间: 2024-11-07 01:16:29

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

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

(图片来自网络) 非常抱歉,这次开船触礁故障给您带来麻烦了,请您谅解. 在我们昨天发布 k8s 开船记首航博文后,有园友在评论中发来贺词——“泰坦尼克号出发了[狗头]”,借此吉言,今天船就触礁了,还好不是冰山.在触礁后,我们收到了唯一一封贺电,贺电署名——“隔壁正在打酱油的 docker swarm 集群”. 触礁时间发生在今天上午 10:18~10:30 左右,当时航行用的是四涡轮发动机(4个nodes). 10:18 左右开始,3与4号发动机(k8s-n3与k8s-n4节点)被撞坏熄火,重新

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

之前我们搭建的 k8s 集群只用了1台 master ,可用性不高,这两天开始搭建高可用集群,但由于之前用 kubeadm 命令创建集群时没有使用 --control-plane-endpoint 参数,无法直接升级现有集群,只能重新创建高可用(High-Availability)集群. 高可用集群的原理很简单,多台 master ,每台都保存集群数据(etcd),所有 nodes 通过专门搭建的负载均衡访问 api server ,这样当部分 master 宕机时,对集群正常运行无影响. 我们

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

昨天晚上,我们将博客站点的生产环境从 docker swarm 集群切换到了 k8s 集群,开船到目前,航行非常平稳,可以说首航成功! k8s 集群是我们用10台阿里云服务器自己搭建的,1台 master 配置是2核4G,9台 nodes 配置都是4核8G,kubernetes 版本是 1.16.3 . 博客站点请求入口没有走 ingress ,直接通过 service 监听 30080 端口,阿里云负载均衡转发请求到该端口. apiVersion: v1 kind: Service metad

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

今天 18:30 左右,我们迈出了 kubernetes 航行的关键一步——全站登船,完成了全站应用部署从 docker swarm 集群向 k8s 集群的切换,以前所未有的决心与信心重新开起这艘巨轮,而这次航行能否成功就看明天访问高峰时狂风巨浪下的表现. 部署在 k8s 上的应用会在页脚显示下面的信息,如果航行失败,"Kubernetes" 会变成 "Linux" . Powered by .NET Core on Kubernetes Kubernetes 集群

记一次在linux 平台上的优化调试

Author:DriverMonkey Mail:[email protected] Phone:13410905075 QQ:196568501 测试平台:AM335X 优化前状态:采样速度  105次/S 优化目标:速度为 130次/S 以上(注:根据ADC的采样率理论上可以达到 330次/S) 优化步骤: 1)代码框架可分为四大模块(UI, 业务逻辑管理,设备管理,远程管理)共10个线程 模块间有项目依赖关系,不能一下全部停掉,先去掉一些辅助功能线程(如:按键扫描线程,远程命令处理线程等)

记一个使用Client Object Model上传文件的小例子

1. 新建一个C#的Console project. 2. 给project 添加reference: Microsoft.SharePoint.Client Microsoft.SharePoint.Runtime 3. 修改project的属性: Platform target – x64 Target framework – .NET Framework 4 4. 修改代码如下: using System; using System.IO; using System.Net; using

记一次将本地工程上传到github的过程

记一次将本地工程上传到github的过程 1.首先,进入本地工程所在文件夹,运行git init将工程初始化为git仓库: [email protected] MINGW64 ~/Desktop/toools/testApiProject $ git init Initialized empty Git repository in C:/Users/XH/Desktop/toools/testApiProject/.git/ 2.可以运行git status可以查看到此时本地仓库的变化: [em

六星经典CSAPP-笔记(7)加载与链接(上)

六星经典CSAPP-笔记(7)加载与链接 1.对象文件(Object File) 1.1 文件类型 对象文件有三种形式: 可重定位对象文件(Relocatable object file):包含二进制代码和数据,能与其他可重定位对象文件在编译时合并创建出一个可执行文件. 可执行对象文件(Executable object file):包含可以直接拷贝进行内存执行的二进制代码和数据. 共享对象文件(Shared object file):一种特殊的可重定位对象文件,能在加载时或运行时,装载进内存进

记一次惨痛的线上bug

讲述背景,刚入职新公司2个月的时候,接手一个红包系统.资历尚浅,对业务也不是很熟悉.公司开发新的平台,需要使用红包功能来进行推广,按照产品的需求,进行开发...然而,问题就出在这里,红包接口比较陈旧,许多代码并有过多注释(甚至多出注释不全,注释出错),接口参数参差不齐,看的很累. 起先,将系统中所有调用红包的地方,都改成调用我的红包系统.和某端联调时,出现各种bug,参数无规约,返回参数不明确,(不知道要返回些啥,无明确需求文档),最后还是某端哥们,将原来的sql提供给我才得以解决此问题. 接着