文章目录

  • 1.13升级至1.14
    • 主要流程
    • 关键问题
  • 镜像下载脚本
  • 参考文献

简要介绍
本文介绍的是k8s集群从1.13升级到1.16的过程。依照官方文档进行升级,在实际实践的时候,遇到了一些官方文档没有描述到的问题,故记录于此。主要的问题有:

  • 国外镜像问题
  • 安装后节点Not Ready问题以及相关排查技巧
  • 遇到的其他问题导致集群无法起来。

收获

  • 一定要学会看kubelet的日志,这样才能清楚的知道到底是哪个步骤出了问题,大厂的项目日志记录还是非常详细的,有助于解决问题。

1.13升级至1.14

主要流程

主要步骤和过程

  • 更新master节点上的kubelet,kubeadm,kubectl等组件。
  • 手动查看并拉取所需镜像。
  • 升级master节点
  • 升级工作节点

master节点升级

1.master节点上升级kubeadm

# 查看软件包的版本
yum list --showduplicates kubeadm --disableexcludes=kubernetes
# 安装最新版本kubeadm和kubectlyum install -y kubeadm-1.14.0-0 --disableexcludes=kubernetes# 查看kubeadm version
kubeadm version
# 查看更新计划
kubeadm upgrade plan
# 通过更新计划和version 判断kubeadm 是否更新成功

查看所需镜像并通过脚本拉取。

# 查看所需镜像
kubeadm config images list
# 根据镜像名称编辑脚本,并使用脚本拉取镜像。脚本编写见后文
# 执行脚本拉取镜像./pull_images.sh

926329751cadbbc22f769179080c69cf43bfc0e5

升级master节点

sudo kubeadm upgrade apply v1.14.0yum install -y kubelet-1.14.0-0 kubectl-1.14.0-0 --disableexcludes=kubernetessudo systemctl restart kubelet

升级worker

# 先下载相关镜像,主要是proxy和coredns#升级kubeadm
yum install -y kubeadm-1.14.0-0 --disableexcludes=kubernetes
# 驱逐工作负载,master上执行
kubectl drain $NODE --ignore-daemonsets
# 更新kubelet
sudo kubeadm upgrade node
yum install -y kubelet-1.14.0-0 kubectl-1.14.0-0 --disableexcludes=kubernetes
sudo systemctl restart kubelet
kubectl uncordon $NODE

验证是否成功

kubectl get nodes

后续升级步骤类似,只需要注意里面的坑就好,坑我已经放在关键问题里面了,升级的步骤建议按照官方的步骤来走。

关键问题

  • 镜像拉取问题。需要用脚本提前拉取好镜像。此处为1.14版本的镜像,如果要使用其他版本的只需要替换镜像名字即可。镜像脚本放在最后了。镜像问题还有两方面的问题

    • control pladn的镜像问题。指k8s升级所需要的所有组件问题。
    • node节点的镜像问题,node节点上的proxy镜像和coredns镜像也需要下载。
  • 操作步骤问题。一定要按照官方文档的升级方式来,不然很容易出现BUG。worker上的workload需要进行驱逐,不驱逐的话,后面会形成双份的工作负载,导致系统启动失败。我最终把node节点上运行的容器全部停止并删除了,然后依靠k8s自己去维护新的工作负载,保证了不会出现遗留版本的问题,但最好的方式还是按照官方升级指南一步一步来做。
  • 节点Not Ready问题。需要排查相关日志。
    • 排查kube-system下的pod是否都在运行。
    • 排查kubelet的日志,看是否有问题。journalctl -f -u kubelet
  • 经过排查,发现flannel的网络一直是不通的,解决方法同最后一个文献,增加CNI的版本号,每个节点都修改。
vim /etc/cni/net.d/10-flannel.conflist {"name": "cbr0","cniVersion": "0.3.1","plugins": [{"type": "flannel","delegate": {"hairpinMode": true,"isDefaultGateway": true}},{"type": "portmap","capabilities": {"portMappings": true}}]
}
  • 最后查看kubelet日志,出现了一个新的问题。英文描述如下.这个错误每次升级都会出现。

Worker start to fail CSINodeIfo: error updating CSINode annotation

解决方法:在/var/lib/kubelet/config.yaml文件末尾追加两行文字。

featureGates:CSIMigration: false
  • 1.14升级到1.15的时候,发现了一个死环。因为3个节点都not ready-》所以无法执行调度,因为无法执行调度所以无法部署系统组件到合适的节点上去-》因为节点安装不全,所以集群not ready。。。。最终解决办法是去掉了taint。
kubectl taint node $NODE node.kubernetes.io/not-ready-
  • 1.15升级到1.16。upgrade plan发生错误。通过 github 上 的 相关 issue 知道这个问题没有影响,可以忽略。把那个错误忽略即可。sudo kubeadm upgrade apply v1.16.0 --ignore-preflight-errors=CoreDNSUnsupportedPlugins
  • 升级后有一些namespace出问题了,需要把这些出问题的namespace删掉。
kubectl get namespace cattle-prometheus -o json > tmp.json
# 删除掉spec里面的内容。
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/cattle-prometheus/finalize
  • 升级后通过kubectl get nodes命令发现version为1.18。但实际上我最多也就升级到了1.16。在github上有个类似的issue解决了此问题,通过kubectl get nodes查看到的版本实际上是kubelet的版本,需要对kubelet进行降级处理即可。降级命令yum -y downgrade kubelet-1.16.0-0

镜像下载脚本

1.14镜像脚本下载

vim pull_images1.14.sh# 设置国内镜像源
MY_REGISTRY=registry.cn-hangzhou.aliyuncs.com/google_containers# 拉取镜像
docker pull ${MY_REGISTRY}/kube-apiserver:v1.14.0
docker pull ${MY_REGISTRY}/kube-controller-manager:v1.14.0
docker pull ${MY_REGISTRY}/kube-scheduler:v1.14.0
docker pull ${MY_REGISTRY}/kube-proxy:v1.14.0
docker pull ${MY_REGISTRY}/pause:3.1
docker pull ${MY_REGISTRY}/etcd:3.3.0
docker pull ${MY_REGISTRY}/coredns:1.3.1# 添加tag
docker tag ${MY_REGISTRY}/kube-apiserver:v1.14.0 k8s.gcr.io/kube-apiserver:v1.14.0
docker tag ${MY_REGISTRY}/kube-controller-manager:v1.14.0 k8s.gcr.io/kube-controller-manager:v1.14.0
docker tag ${MY_REGISTRY}/kube-scheduler:v1.14.0 k8s.gcr.io/kube-scheduler:v1.14.0
docker tag ${MY_REGISTRY}/kube-proxy:v1.14.0 k8s.gcr.io/kube-proxy:v1.14.0
docker tag ${MY_REGISTRY}/pause:3.1 k8s.gcr.io/pause:3.1
docker tag ${MY_REGISTRY}/etcd:3.3.0 k8s.gcr.io/etcd:3.3.0
docker tag ${MY_REGISTRY}/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1# 移除其他tag的镜像docker rmi ${MY_REGISTRY}/kube-apiserver:v1.14.0
docker rmi ${MY_REGISTRY}/kube-controller-manager:v1.14.0
docker rmi ${MY_REGISTRY}/kube-scheduler:v1.14.0
docker rmi ${MY_REGISTRY}/kube-proxy:v1.14.0
docker rmi ${MY_REGISTRY}/pause:3.1
docker rmi ${MY_REGISTRY}/etcd:3.3.0
docker rmi ${MY_REGISTRY}/coredns:1.3.1

1.15镜像脚本下载

vim pull_image1.15.sh
# 设置国内镜像源
MY_REGISTRY=registry.cn-hangzhou.aliyuncs.com/google_containers# 拉取镜像
docker pull ${MY_REGISTRY}/kube-apiserver:v1.15.0
docker pull ${MY_REGISTRY}/kube-controller-manager:v1.15.0
docker pull ${MY_REGISTRY}/kube-scheduler:v1.15.0
docker pull ${MY_REGISTRY}/kube-proxy:v1.15.0
docker pull ${MY_REGISTRY}/pause:3.1
docker pull ${MY_REGISTRY}/etcd:3.3.0
docker pull ${MY_REGISTRY}/coredns:1.3.1# 添加tag
docker tag ${MY_REGISTRY}/kube-apiserver:v1.15.0 k8s.gcr.io/kube-apiserver:v1.15.0
docker tag ${MY_REGISTRY}/kube-controller-manager:v1.15.0 k8s.gcr.io/kube-controller-manager:v1.15.0
docker tag ${MY_REGISTRY}/kube-scheduler:v1.15.0 k8s.gcr.io/kube-scheduler:v1.15.0
docker tag ${MY_REGISTRY}/kube-proxy:v1.15.0 k8s.gcr.io/kube-proxy:v1.15.0
docker tag ${MY_REGISTRY}/pause:3.1 k8s.gcr.io/pause:3.1
docker tag ${MY_REGISTRY}/etcd:3.3.0 k8s.gcr.io/etcd:3.3.0
docker tag ${MY_REGISTRY}/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1# 移除其他tag的镜像docker rmi ${MY_REGISTRY}/kube-apiserver:v1.15.0
docker rmi ${MY_REGISTRY}/kube-controller-manager:v1.15.0
docker rmi ${MY_REGISTRY}/kube-scheduler:v1.15.0
docker rmi ${MY_REGISTRY}/kube-proxy:v1.15.0
docker rmi ${MY_REGISTRY}/pause:3.1
docker rmi ${MY_REGISTRY}/etcd:3.3.0
docker rmi ${MY_REGISTRY}/coredns:1.3.1

1.16镜像脚本下载

vim pull_image_1.16.sh# 设置国内镜像源
MY_REGISTRY=registry.cn-hangzhou.aliyuncs.com/google_containers# 拉取镜像
docker pull ${MY_REGISTRY}/kube-apiserver:v1.16.0
docker pull ${MY_REGISTRY}/kube-controller-manager:v1.16.0
docker pull ${MY_REGISTRY}/kube-scheduler:v1.16.0
docker pull ${MY_REGISTRY}/kube-proxy:v1.16.0
docker pull ${MY_REGISTRY}/pause:3.1
docker pull ${MY_REGISTRY}/etcd:3.3.15-0
docker pull ${MY_REGISTRY}/coredns:1.6.2# 添加tag
docker tag ${MY_REGISTRY}/kube-apiserver:v1.16.0 k8s.gcr.io/kube-apiserver:v1.16.0
docker tag ${MY_REGISTRY}/kube-controller-manager:v1.16.0 k8s.gcr.io/kube-controller-manager:v1.16.0
docker tag ${MY_REGISTRY}/kube-scheduler:v1.16.0 k8s.gcr.io/kube-scheduler:v1.16.0
docker tag ${MY_REGISTRY}/kube-proxy:v1.16.0 k8s.gcr.io/kube-proxy:v1.16.0
docker tag ${MY_REGISTRY}/pause:3.1 k8s.gcr.io/pause:3.1
docker tag ${MY_REGISTRY}/etcd:3.3.15-0 k8s.gcr.io/etcd:3.3.15-0
docker tag ${MY_REGISTRY}/coredns:1.6.2 k8s.gcr.io/coredns:1.6.2# 移除其他tag的镜像docker rmi ${MY_REGISTRY}/kube-apiserver:v1.16.0
docker rmi ${MY_REGISTRY}/kube-controller-manager:v1.16.0
docker rmi ${MY_REGISTRY}/kube-scheduler:v1.16.0
docker rmi ${MY_REGISTRY}/kube-proxy:v1.16.0
docker rmi ${MY_REGISTRY}/pause:3.1
docker rmi ${MY_REGISTRY}/etcd:3.3.15-0
docker rmi ${MY_REGISTRY}/coredns:1.6.2

参考文献

https://my.oschina.net/u/2306127/blog/309587

https://blog.51cto.com/foxhound/2490073

https://v1-15.docs.kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-1-14/

k8s 节点 not ready原因排查

k8s升级出现问题

删除掉namespace

k8s升级从1.13到1.16教程与采坑解决办法相关推荐

  1. tmac v6设置中文_给升级到10.6.8后无线BCM43xx不能用的解决办法

    昨天更新了10.6.8后出现了很多问题,如: 1,在菊花转完后出现的蓝色背景后就卡住几秒钟时间才能登陆,虽然10.6.8加快了启动速度,不过这个卡住就托慢了. 2,整个系统运行很卡,网卡和无线不能用( ...

  2. Python 库升级问题-module ‘requests.exceptions‘ has no attribute ‘ReadTimeout‘原因及解决办法

    用 python 登陆微信时报错了: module 'requests.exceptions' has no attribute 'ReadTimeout' 原因是 requests 这个库老了,老的 ...

  3. idea 升级到2020后 无法启动_IDEA 2020 无法启动的解决办法(启动崩盘)附IDEA 2020 新功能...

    今天早上看到 IDEA 可以升级新版本,想着体验一下新功能,点击升级,然后全部项目工程无法打开. 报错信息如下: Cannot execute command No project found to ...

  4. Windows10升级Windows11之后Edge浏览器被强制修改成360的解决办法

    今天升级了11之后发现任务栏怎么打开Edge都会360首页.在Edge中设置的默认页是百度.从Edge主程序位置打开程序显示的主页就没问题.但是任务栏上的快捷方式不管怎么点都是360. 右键任务栏浏览 ...

  5. STM32F0系列芯片SPI发送一字节数据却输出16个CLK时钟的解决办法

    问题 上一个项目在用寄存器操作STM32F0芯片的SPI_DR寄存器的时候,发现一个问题: 我给DR寄存器赋值一个uint8_t一字节大小的数据,SPI引脚能正确输出数据和时钟,但前面八位正确的数据输 ...

  6. IOS14降级到13.5.1过程中卡在60%的解决办法以及保留用户数据的方法(建议完整看完再刷机)

    本人觉得iOS 14耗电太厉害,而且系统不是很适合我,就想着降级回原来的系统,然而试了无数次,无论是用爱思助手降级还是用iTunes降级,都失败. 在网上找了无数种方法,总结起来就是网络的原因.有的人 ...

  7. Quartus II 13.1破解后无法仿真波形的解决办法(MGLS、LM环境变量配置出错)

    先说原因:只破解了Quartus(到在Quartus中设置修改好的license.dat就结束了),没有破解Quartus中的仿真器Modelsim 解决方法一:放弃13.1,下载Quartus 9. ...

  8. Makefile:160: recipe for target 'all' failed (Ubuntu 16.06 + Opencv3.2)解决办法

    前言 之前一直用的opencv 好好的,今天安装了anaconda之后,python中的opencv不能用了,即便是拷贝cv2.so之后也是不能用,问题如下: 根本原因 安装anaconda之后,很多 ...

  9. stlink 升级固件以后失败_ST-Link不能下载程序的几种解决办法

    一直在用J-LINK,最近改用ST-Link,出现了不少无法下载程序的情况,这里列出几种解决的办法(针对STM32F103系列): 1#是不是你没有选择Flash算法? 什么都没有加的话,会提示&qu ...

  10. 升级Xcode 11.2 后报错: Multiple commands produce 的解决办法

    报错日志: Multiple commands produce '/Users/tjsoft/Library/Developer/Xcode/DerivedData/TYKYTwoLearnOneDo ...

最新文章

  1. 【深度学习理论】(3) 激活函数
  2. cacti邮件告警设置
  3. Excahange2007邮件收件人的管理
  4. AndroidStuido编译release版本apk(非签名apk)
  5. HDU_2795 Billboard(线段树)
  6. 认证服务器的搭建_SpringCloud搭建的认证中心和资源服务器的微服务项目源码分享...
  7. c++ 栈中如何给string malloc空间_malloc,free,calloc,realloc函数
  8. 混迹职场,有交换意识的人都是聪明人
  9. 深入浅出通信原理笔记(1)
  10. Origin申请、安装和激活手记
  11. steam移动所有文件至新库文件夹失败_VBA进阶 | 文件操作17:File对象与Files集合详解...
  12. 平均绝对误差python_机器学习回归模型的常用评价指标(8):均方误差MSE、平均绝对误差MAE、平均绝对比例误差MAPE、相关系数R2,方差,相关性...
  13. 电阻式湿度传感器原理
  14. 实测realme手机丢失定位功能
  15. java adobe ocr_Acrobat自带的OCR识别文本功能提取图片文字
  16. 无线蓝牙耳机哪个价位性价比最高?500以内最好的蓝牙耳机推荐
  17. 制图大赛计算机二维绘图,第五届“高教杯”全国大学生先进成图技术与产品信息建模创新大赛 机械类 计算机绘图试卷.pdf...
  18. FileStore omap的实现
  19. BI神器Power Query(4)-- PQ导入动态名称定义的表格
  20. nohup命令原理解析

热门文章

  1. python数据结构3-链表
  2. 与TensorFlow类似的项目有哪些?TensorFlow的优缺点是什么?
  3. 《大数据——大价值、大机遇、大变革》试读
  4. 面试题 17.09. 第 k 个数
  5. 机器学习实战系列(七):数值回归与预测
  6. numpy教程:基本输入输出和文件输入输出Input and output
  7. Android Toast小解
  8. java oom分析_JAVA各种OOM代码示例与解决方法
  9. 蓝桥杯2020年第十一届C/C++省赛B组第二题-既约分数
  10. 范文杰 201421410010 作业2