问题描述

创建Azure Kubernetes Service服务后,需要升级AKS集群的 kubernetes version。在AKS页面的 Cluster configuration 页面中,选择新的版本 1.25.5,确认升级。等待50分钟左右,却等到了升级失败的消息:

Failed to save Kubernetes service 'xxxx-aks3'. Error: Drain of aks-agentpool-xxxxxxxx-vmss00000j did not complete: Too many req pod aks-helloworld-one-9df87f7df-zxnbq on node aks-agentpool-xxxxxxxx-vmss00000j: ingress-basic/aks-helloworld-one-9df87f7df-zxnbq blocked by pdb pdbforhelloworldone with unready pods []. See  http://aka.ms/aks/debugdrainfailures

问题解答

查看错误消息,其中提到 “... blocked by pdb pdbforhelloworldone with unready pods ... ” ,所以需要检查AKS集群中PDB(Pod Disruption Budget:Pod中断预算 --  https://kubernetes.io/docs/tasks/run-application/configure-pdb/#create-the-pdb-object).

第一步:查看AKS集群中的事件,检查错误内容

使用指令:kubectl get event , 得到错误信息 :Eviction blocked by too many Requests ( usually a pdb)

第二步:查看AKS集群中PDB的配置信息

使用指令  kubectl get pdb -A , 查看到其中一个配置为 MIN AVAILABLE : 100%, ALLOWED DISRUPTIONS: 0

MIN AVAILABLE 为 100%, 说明POD都需要处于活跃状态,不能中断。

ALLOWED DISRUPTIONS为0,也表明POD可以中断的数量为0,即全部的POD都不能中断。

所以,升级失败的根源就是PDB策略的阻挡,升级的时候POD需要中断替换,而PDB策略不允许有POD中断,所以无法完成升级。

解决方案:

方案一:修改PDB设置,根据情况改变MIN AVAILABLE和ALLOWED DISRUPITIONS的值。

方案二:(当不能修改PDB设置时),可以先把PDB保存到本地,然后删除它,在执行升级,当升级完成后,恢复PDB设置即可。

第一种方式很简单,修改POD YAML中的配置即可。而本文中主要使用的是第二种方式:

1)保存PDB配置到本地(如pdb.yaml)

使用命令:kubectl get pdb <the block pdb name> -o yaml --namespace <the pdb namespace>

然后把输出的内容复制到文件 pdb.yaml 中

2)删除阻挡升级操作的PDB设置

使用命令删除pdb:kubectl delete pdb <your pdb name> --namespace <right namespace>

3)执行升级操作

因为在门户上,先前的升级操作报错,锁定了页面上的升级操作(即无法继续在页面中执行升级), 并且ASK 控制层面(Control panel)的版本升级已经完成,只是Node的升级是失败的。所以可以通过az aks nodepool upgrade 指令,执行对NodePool的升级。

az aks nodepool upgrade -g <group name> --cluster-name <name> --name <node name> --kubernetes-version 1.25.5 --no-wait

升级过程中,节点由2个 变为 3个,然后节点的kubernetes Version也在改变中

升级完成后, 节点数恢复为2,kubernetes Version都变为新的 1.25.5

完成此步后,整个AKS集群的升级表示完成,下一步就是根据第一步保存的pdb.yaml,重新创建PDB

4)恢复原有的PDB设置

使用指令

kubectl apply -f pdb.yaml --namespace <the pdb namespace>

kubectl get pdb -A

参考资料

Specifying a Disruption Budget for your Application :  https://kubernetes.io/docs/tasks/run-application/configure-pdb/#create-the-pdb-object

排查“PodDrainFailure”错误代码 : https://learn.microsoft.com/zh-cn/troubleshoot/azure/azure-kubernetes/error-code-poddrainfailure

【Azure K8S】AKS升级 Kubernetes version 失败问题的分析与解决的更多相关文章

  1. 【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)

    问题描述 使用Azure Kubernetes服务(AKS),可以通过kubectl连接 pod 中查看日志,但是如何来查看节点的系统日志呢?如是否有ubuntu系统升级的记录? 问题解答 是的,可以 ...

  2. discuz云平台报调用远程接口失败的问题分析和解决

    根据网络两篇文章整理 问题描述:当开通或关闭某个云平台服务的时候,报如下错误信息:调用远程接口失败.请检查您的服务器是否处于内网以及您服务器的防火墙设置. 云平台测试站点的接口文件正常,于是开始在文件 ...

  3. vue 使用npm install安装依赖失败 【问题分析与解决】

    1 进入项目根目录,先通过 npm install 命令安装项目所需依赖,再通过 vue ui 命令打开 Vue Cli 提供的图形化界面,选择项目所在文件夹将项目导入. 出现问题 npm insta ...

  4. 在Azure Container Service创建Kubernetes(k8s)群集运行ASP.NET Core跨平台应用程序

    引子 在此前的一篇文章中,我介绍了如何在本地docker环境中运行ASP.NET Core跨平台应用程序(http://www.cnblogs.com/chenxizhang/p/7148657.ht ...

  5. eShopOnContainers 知多少[10]:部署到 K8S | AKS

    1. 引言 断断续续,感觉这个系列又要半途而废了.趁着假期,赶紧再更一篇,介绍下如何将eShopOnContainers部署到K8S上,进而实现大家常说的微服务上云. 2. 先了解下 Helm 读过我 ...

  6. 记一次centos6升级salt-minion启动失败的问题

    记一次centos6升级salt-minion启动失败的问题 作者:耀耀 blog:https://www.liuyao.me 一.起因 升级Salt-minion后 使用/etc/init.d/sa ...

  7. mac版chrome升级到Version 65.0.3325.18后无法打开百度bing搜狗

    mac版本chrome升级到Version 65.0.3325.18后发现突然无法访问百度,搜狗,bing,神马等一系列的国内搜索引擎网站.连百度的儿子们比如知道,百度百科都无法访问. 1.首先想到的 ...

  8. Kubernetes 部署失败的 10 个最普遍原因

    [原文].后面我们可能还会看到一个 OOMKilled 错误. 我们的应用正在挂掉?为什么? 首先我们查看应用日志.假定你发送应用日志到 stdout(事实上你也应该这么做),你可以使用 kubect ...

  9. WIN10升级失败,故障代码 0X8007042B-0X4000D 解决

    个人博客链接:WIN10升级失败,故障代码 0X8007042B-0X4000D 解决

  10. 升级Kubernetes 1.18前,你不得不知的9件事

    本文来自Rancher Labs 昨天Kubernetes最新版本v1.18已经发布,其包含了38项功能增强,其中15项为稳定版功能.11项beta版功能以及12项alpha版功能.在本文中,我们将探 ...

随机推荐

  1. opengl helloworld vscode 通过glfw 绘制三角形

    opengl helloworld vscode 调用glfw 绘制三角形 目录 opengl helloworld vscode 调用glfw 绘制三角形 打开 glfw.org, 我下的64 目录 ...

  2. 【踩坑系列】发送微信模板消息返回40165 invalid weapp pagepath

    1. 踩坑经历 最近做了个需求,需要往公司微信公众号推送一个模板消息,并且点击该消息需要跳转到公司小程序的某个页面. 1.1 拿到模板id 既然是发送模板消息,第一步就需要登录微信公众号后台新建模板消 ...

  3. xcodebuild命令行工具使用详解

    xcodebuild命令行工具使用 如何通过命令行编译ios项目? xcodebuild是一个命令行工具,允许你从命令行对Xcode项目和工作区执行编译.查询.分析.测试和归档操作.它对项目中包含的一 ...

  4. [MAUI 项目实战] 手势控制音乐播放器(二): 手势交互

    @ 目录 原理 交互实现 容器控件 手势开始 手势运行 手势结束 使用控件 拖拽物 创建pit集合 项目地址 原理 定义一个拖拽物,和它拖拽的目标,拖拽物可以理解为一个平底锅(pan),拖拽目标是一个 ...

  5. mysql中innodb_open_files限制导致数据库异常重启

    问题描述:收到监控软件告警,提示数据库发生重启,进去查看,截止到6/27 10:00 之前,作为主节点的orch1先重启,然后故障转移到orch2和orch3节点上.在持续到6/27 9:00 左右, ...

  6. Golang爬虫:使用正则表达式解析HTML

    之前所写的爬虫都是基于Python,而用Go语言实现的爬虫具有更高的性能. 第一个爬虫 使用http库,发起http请求 package main import ( "fmt" & ...

  7. for of 和 for in 的区别

    1 var arr = ["f", "6", 3, "a", 7]; 2 var obj = { name: "shun" ...

  8. vue将页面(dom元素)转换成图片,并保存到本地

    1 npm install html2canvas --save <template> <div class="QRCode-box"> <img i ...

  9. Spring之丐版IOC实现

    文章目录 IOC控制反转 依赖注入 Bean的自动装配方式 丐版IOC实现 BeanDefinition.java ResourceLoader.java BeanRegister.java Bean ...

  10. 【Azure 应用服务】Azure JS Function 异步方法中日志无法输出问题引发的(await\async)关键字问题

    问题描述 开发 Azure JS Function(NodeJS),使用 mssql 组件操作数据库.当SQL语句执行完成后,在Callback函数中执行日志输出 context.log(" ...