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

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

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

翻船经过如下。


翻墙前的船只情况


博客站点正在使用的 k8s 集群一共用了 9 台 worker 节点服务器,在访问低峰时用 5 台,另外 4 台处于关机状态,在进入访问高峰前启动。所以我们用 cron 定时任务在工作日每天早上启动 4 台服务器,每天晚上关闭 4 台服务器。为了节约成本,这 4 台服务器用的是阿里云抢占式实例,由此带来的风险是如果启动时当前可用区对应的实例库存不足,就会启动失败。

还有一个正在搭建中的高可用 k8 集群,运行着 1 台 master 与 1 台 worker 节点,另外 2 台 master 与 1 台 worker 处于关机状态。

在 k8s 集群之前使用的 docker swarm 集群处于待弃用状态,运行着 1 台 manager 与  1 台 worker 节点,其他节点都处于关机状态,用的也是阿里云抢占式实例。


风云突变,船只颠簸


今天新年上班第一天,阿里云上生意非常火爆,我们的服务器所在可用区的所有4核8G的抢占式实例全部售罄,造成定时启动 k8s 集群节点服务器的任务全部失败,仅有的 5 台服务器在访问高峰不堪重负,开始出现 502 ,当我们发现后,尝试通过阿里云 ecs 控制台启动这些服务器,但依然因库存不足而无法启动。

操作有错误发生:

i-bp10c3nww9y26s9yppcq : 库存不足,请您尝试其它类型的实例规格 或者 其它可用区/地域的实例。您可以选择变配到其他规格,然后启动。更改实例规格

RequestId: 86752D85-39F0-4FEC-875B-80A3269D0B23


紧急自救,却遭意外雷击而翻船


手动启动服务器失败后,我们赶紧新购服务器添加到集群,本以为等服务器加好就能恢复,哪知却遭遇新的意外情况,新加服务器上所有博客站点的 pod 都启动失败。

NAME             READY   STATUS              RESTARTS   AGE 
blog-web-bw87z   0/1     CrashLoopBackOff    4          4m36s

Pod 启动失败是因为其中的博客站点容器 dns 解析失败,无法解析所依赖的服务的地址。

接着情况变得越来越严重,不仅新加服务器因 dns 解析问题无法启动 pod ,而且集群中已有服务器也因为这个问题无法启动 pod 。本来已有 5 台还能支撑部分请求,但由于这个意外的 dns 解析问题,集群中除了1-2台博客应用的 pod 还在运行,其他全挂了,这时整个博客站点全是 502 错误,k8s 巨轮就这么翻了。


救援行动,旧渔船挺身而出


巨轮翻了后,我们开始救援行动,首当其冲就是另外一艘建造中的更高级的巨轮 —— k8s 高可用集群,新购服务器加到这个集群,准备用这个集群处理负载,哪知这个集群也出现了异常情况,pod 也是无法启动,一直处于 ContainerCreating 状态。

NAME                            READY   STATUS              RESTARTS   AGE
blog-web-b2ggt                  0/1     ContainerCreating   0          4m48s
Error from server: Get https://10.0.2.82:10250/containerLogs/production/blog-web-b2ggt/blog-web: dial tcp 10.0.2.82:10250: connect: connection refused

这时唯一的救命稻草就是那艘准备弃用的旧渔船 —— docker swarm 集群,这个集群中处于关机状态的节点服务器也因为库存不足而无法启动,只能新加服务器,赶紧把 k8s 集群中的那些服务器拿过来用镜像更换系统后加入 docker swarm 集群。

sudo rm -rf /var/lib/docker/swarm && \
service docker restart && \
docker swarm join --token xxx 10.0.151.251:2377

当 docker swarm 集群投入使用并加到一定量的服务器后,博客站点才恢复正常。

恢复正常后,我们立即去排查出现 dns 解析问题的 k8s 集群,发现所有 worker 节点都出现了 dns 解析问题, 上次我们也被 dns 解析问题坑过(详见 k8s 开船记:升级为豪华邮轮(高可用集群)与遇到奇怪故障(dns解析异常)),只是上次只有部分节点出现这个问题,这次是所有 worker 节点,上次是通过重启服务器解决的,难道这次也要重启才能解决?

于是将 worker 节点全部重启,重启后所有 pod 都正常运行了,这时我们恍然大悟,后悔莫及,当时营救翻船最简单快速的方法就是重启所有 worker 节点服务器。

开着旧渔船,回想着靠岸待修理的巨轮,望着茫茫大“云”,我们更加迷茫了。使用 docker swarm 时多次遭遇奇怪的网络问题,通过重启节点服务器解决,开始我们怀疑水(云),后来我们怀疑船(docker swarm),于是下定决心换掉渔船,换上巨轮(k8s),结果又遇到到了奇怪的网络问题(dns 解析问题是网络问题引起的),现在我们该怀疑谁呢?.

对于这次大翻船,最重要的原因是我们过多地使用了抢占式实例,是我们的过错,我们会吸取教训,调整服务器的部署。

这次大故障给您带来麻烦了,再次恳请您的谅解。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
7月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
651 1
|
7月前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
476 89
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
937 9
|
8月前
|
存储 Kubernetes 网络安全
关于阿里云 Kubernetes 容器服务(ACK)添加镜像仓库的快速说明
本文介绍了在中国大陆地区因网络限制无法正常拉取 Docker 镜像的解决方案。作者所在的阿里云 Kubernetes 集群使用的是较旧版本的 containerd(1.2x),且无法直接通过 SSH 修改节点配置,因此采用了一种无需更改 Kubernetes 配置文件的方法。通过为 `docker.io` 添加 containerd 的镜像源,并使用脚本自动修改 containerd 配置文件中的路径错误(将错误的 `cert.d` 改为 `certs.d`),最终实现了通过多个镜像站点拉取镜像。作者还提供了一个可重复运行的脚本,用于动态配置镜像源。虽然该方案能缓解镜像拉取问题,
903 3
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
1214 33
|
Kubernetes 开发者 Docker
集群部署:使用Rancher部署Kubernetes集群。
以上就是使用 Rancher 部署 Kubernetes 集群的流程。使用 Rancher 和 Kubernetes,开发者可以受益于灵活性和可扩展性,允许他们在多种环境中运行多种应用,同时利用自动化工具使工作负载更加高效。
784 19
|
人工智能 分布式计算 调度
打破资源边界、告别资源浪费:ACK One 多集群Spark和AI作业调度
ACK One多集群Spark作业调度,可以帮助您在不影响集群中正在运行的在线业务的前提下,打破资源边界,根据各集群实际剩余资源来进行调度,最大化您多集群中闲置资源的利用率。
|
安全 持续交付 云计算
课时5:阿里云容器服务:最原生的集成Docker和云服务
阿里云容器服务以服务化形式构建容器基础设施,大幅提升开发效率,简化应用部署流程。通过Docker容器和DevOps工具(如Jenkins),实现自动化部署与迭代,优化企业内部复杂部署问题。该服务支持GPU调度、混合云架构无缝迁移,并与阿里云产品体系无缝集成,提供安全防护、网络负载均衡等多重功能支持。凭借微服务架构,帮助企业突破业务瓶颈,提高资源利用率,轻松应对海量流量。
487 0
课时5:阿里云容器服务:最原生的集成Docker和云服务
|
Prometheus Kubernetes 监控
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
556 0
OpenAI故障复盘丨如何保障大规模K8s集群稳定性

推荐镜像

更多