Rancher 系列文章 -K3S 集群升级

简介: Rancher 系列文章 -K3S 集群升级

概述

书接上回:《Rancher 系列文章 -Rancher 升级》, 我们提到:将 Rancher 用 Helm 从 v2.6.3 升级到 v2.6.4.

接下来开始进行 K3S 集群的升级:将 K3S 集群从 v1.21.7+k3s1 升级到 v1.22.5+k3s2

相关信息

本次升级的 K3S 集群的基本信息为:

  1. 天翼云上用 4 台机器安装的一个 1 master(及 etcd) 3 node 的 K3S 集群
  2. 其实… 这个 K3S 集群使用 k3s-ansible 脚本批量安装的。…
  3. K3S v1.21.7+k3s1
  4. Rancher 刚升级到 v2.6.4, 验证没啥大问题
  5. K3S 集群有用到 Traefik 管理 Ingress
  6. K3S 集群使用嵌入式 etcd 数据存储

升级方式评估

官方 提供了以下几种升级方式:

  • 基础升级
  • 使用安装脚本升级 K3s
  • 使用二进制文件手动升级 K3s
  • 自动升级
  • 使用 Rancher 来升级 K3s 集群
  • 使用 system-upgrad-controller 来管理 K3s 集群升级

我大概都过了一下,先说 Pass 的原因:

使用 Rancher 来升级 K3s 集群 - 🙅‍♂️

详细的文档在这里:升级 Kubernetes 版本 | Rancher | Rancher 文档

原文如下:

📚️ Quote:

先决条件:

  1. 全局 视图中,找到要升级 Kubernetes 版本的集群。选择 省略号 > 编辑
  2. 点开 集群选项
  3. Kubernetes 版本 下拉菜单中,选择要用于集群的 Kubernetes 版本。
  4. 单击 保存

结果: 集群开始升级 Kubernetes 版本。

但是,但是!我在我的 Rancher v2.6.4 上始终没找到 省略号 > 编辑 在哪里,😂😂😂

我猜可能是因为我看的中文文档只有 Rancher v2.5 的,而 Rancher v2.6 UI 又经过了很大的调整,所以找不到了。

另外,这种 Rancher 的 local 集群,而且还是 单 master 节点,我个人评估是无法实现 自动升级 的。

PAAS

使用 system-upgrad-controller 来管理 K3s 集群升级 - 🙅‍♂️

详细文档见这里:自动升级 | Rancher 文档

我试了一下,结果就是在我创建了 server-plan 后,提示我 server-plan 的 POD 无法进行调度,因为所有节点都不满足调度的条件。

我大概看了一下,调度的条件是要求在 master 节点上,同时我只有 1 个 master, 其在升级前已经设置为了 cordon: true, 导致冲突,升级无法进行。

也正是因为这个,所以我判断:

  • 单 master 节点,是无法实现 自动升级 的, 或者即使可以进行升级, 风险也较大

PAAS

使用二进制文件手动升级 K3s - 🙅‍♂️

这个还行,步骤也很清晰明了, 也正好可以在 k3s-ansible 脚本增加 upgrade.yml playbook 来实现。

但是… 近期没时间,先记下这个事吧,后面有时间再增加这个功能。

使用安装脚本升级 K3s - ✔️

虽然我不是用安装脚本安装的 K3s, 但是 k3s-ansible 脚本的逻辑基本上和官方的安装脚本是一样的,只是用的是 ansible 而已。个人评估后认为:只要确保 使用相同的标志重新运行安装脚本 即可从旧版本升级 K3s.

就决定是你啦 ✔️

升级步骤

〇、信息收集

registries.yaml

有配置 registries.yaml, 如下:

mirrors:
  docker.io:
    endpoint:
      - "https://registry.cn-hangzhou.aliyuncs.com"
      - "https://docker.mirrors.ustc.edu.cn"
configs:
  'docker.io':
    auth:
      username: caseycui
      password: <my-password>
  'quay.io':
    auth:
      username: east4ming
      password: <my-password>
YAML

但是位置没有动,还是 /etc/rancher/k3s/registries.yaml. 所以不会因此导致有额外的升级步骤。

K3s Server 和 Agent 其他配置

---
k3s_version: v1.21.7+k3s1
ansible_user: caseycui
systemd_dir: /etc/systemd/system
master_ip: "{{ hostvars[groups['master'][0]]['ansible_host'] | default(groups['master'][0]) }}"
extra_server_args: '--write-kubeconfig-mode "644" --cluster-init --disable-cloud-controller --tls-san <my-public-ip> --kube-apiserver-arg "feature-gates=EphemeralContainers=true" --kube-scheduler-arg "feature-gates=EphemeralContainers=true" --kube-apiserver-arg=default-watch-cache-size=1000 --kube-apiserver-arg=delete-collection-workers=10 --kube-apiserver-arg=event-ttl=30m --kube-apiserver-arg=max-mutating-requests-inflight=800 --kube-apiserver-arg=max-requests-inflight=1600 --etcd-expose-metrics=true'
extra_agent_args: ''
YAML

分析上面配置,就是多了一些 server 的安装配置参数而已,使用官方安装脚本时注意确保 使用相同的标志重新运行安装脚本 即可。

一、备份

使用 k3s etcd-snapshot 进行备份,如下:

# k3s etcd-snapshot
INFO[2022-05-05T17:10:01.884597095+08:00] Managed etcd cluster bootstrap already complete and initialized
W0505 17:10:02.477542 2431147 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
W0505 17:10:02.923819 2431147 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
W0505 17:10:03.398185 2431147 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
INFO[2022-05-05T17:10:03.687171696+08:00] Saving etcd snapshot to /var/lib/rancher/k3s/server/db/snapshots/on-demand-4azlmvglqkx7migt-0002-1651741803
{"level":"info","msg":"created temporary db file","path":"/var/lib/rancher/k3s/server/db/snapshots/on-demand-4azlmvglqkx7migt-0002-1651741803.part"}
{"level":"info","ts":"2022-05-05T17:10:03.693+0800","caller":"clientv3/maintenance.go:200","msg":"opened snapshot stream; downloading"}
{"level":"info","msg":"fetching snapshot","endpoint":"https://127.0.0.1:2379"}
{"level":"info","ts":"2022-05-05T17:10:14.841+0800","caller":"clientv3/maintenance.go:208","msg":"completed snapshot read; closing"}
{"level":"info","msg":"fetched snapshot","endpoint":"https://127.0.0.1:2379","size":"327 MB","took":"11.182733612s"}
{"level":"info","msg":"saved","path":"/var/lib/rancher/k3s/server/db/snapshots/on-demand-4azlmvglqkx7migt-0002-1651741803"}
INFO[2022-05-05T17:10:14.879646814+08:00] Saving current etcd snapshot set to k3s-etcd-snapshots ConfigMap
SHELL

📝Notes:

也可以增加更多的参数以将数据备份到 s3 中。

之所以这次没选择,是因为集群的互联网带宽太小,备份到 s3 频繁中断所以放弃。

备份结果位于:/var/lib/rancher/k3s/server/db/snapshots/, 如下图:

K3s 备份结果

二、k3s-killall.sh

为了保证升级成功率,且当前 K3s 集群主要用于测试和 Demo, 完全可以停机,所以使用 k3s-killall.sh 停止对应 node 后,再进行升级。

升级对应 node 前先执行如下命令:

/usr/local/bin/k3s-killall.sh
BASH

三、使用安装脚本升级 server

🐾Notes:

要从旧版本升级 K3s,你可以使用相同的标志重新运行安装脚本

执行如下命令进行升级:

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_VERSION=v1.22.5+k3s2  INSTALL_K3S_MIRROR=cn K3S_KUBECONFIG_MODE=644 sh -s - --cluster-init --disable-cloud-controller --tls-san <my-public-ip> --kube-apiserver-arg "feature-gates=EphemeralContainers=true" --kube-scheduler-arg "feature-gates=EphemeralContainers=true"  --kube-apiserver-arg default-watch-cache-size=1000 --kube-apiserver-arg delete-collection-workers=10 --kube-apiserver-arg event-ttl=30m --kube-apiserver-arg max-mutating-requests-inflight=800 --kube-apiserver-arg max-requests-inflight=1600 --etcd-expose-metrics true
BASH

说明如下:

  • INSTALL_K3S_VERSION=v1.22.5+k3s2 升级的目标版本
  • K3S_KUBECONFIG_MODE=644 ... --etcd-expose-metrics true 都是和之前的安装标志保持一致

升级成功,日志如下:

[INFO]  Using v1.22.5+k3s2 as release
[INFO]  Downloading hash https://rancher-mirror.rancher.cn/k3s/v1.22.5-k3s2/sha256sum-amd64.txt
[INFO]  Downloading binary https://rancher-mirror.rancher.cn/k3s/v1.22.5-k3s2/k3s
[INFO]  Verifying binary download
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Skipping /usr/local/bin/kubectl symlink to k3s, already exists
[INFO]  Skipping /usr/local/bin/crictl symlink to k3s, already exists
[INFO]  Skipping /usr/local/bin/ctr symlink to k3s, already exists
[INFO]  Creating killall script /usr/local/bin/k3s-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO]  env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO]  systemd: Creating service file /etc/systemd/system/k3s.service
[INFO]  systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.
[INFO]  systemd: Starting k3s
PGSQL

四、使用安装脚本升级 Agent

🐾Notes:

要从旧版本升级 K3s,你可以使用相同的标志重新运行安装脚本

执行如下命令进行升级:

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_VERSION=v1.22.5+k3s2  INSTALL_K3S_MIRROR=cn K3S_URL=https://<my-master-ip>:6443  K3S_TOKEN=<my-token> sh -s -
BASH

说明如下:

  • 其他和 server 升级类似,主要就是版本和相同的标志
  • K3S_URL=https://<my-master-ip>:6443 K3S_TOKEN=<my-token>这是作为 agent 安装需要的参数
  • K3S_TOKEN 位于:/var/lib/rancher/k3s/server/node-token, 该 token 升级前后没有发生变化

五、验证

验证可以通过一些 kubectl 命令,或图形化界面 LensK9S 或 Rancher 进行验证。

粗略看这些地方:

  • Events: 有没有 Warning
  • Node 状态:有没有异常的
  • Pod 状态:有没有异常的
  • Jobs 状态:有没有失败的
  • Ingress 状态:有没有访问异常的
  • PVC 状态:有没有非 Bound 状态的
  • kind: Addon status 有没有异常的

🎉🎉🎉

但是,验证过程中也发现几个问题,下面一一描述及解决:

📚️参考文档

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
Kubernetes 负载均衡 安全
【K8S系列】深入解析k8s网络插件—Cilium
【K8S系列】深入解析k8s网络插件—Cilium
3249 1
|
Kubernetes 负载均衡 应用服务中间件
【K8S系列】第十三讲:Ingress详解
【K8S系列】第十三讲:Ingress详解
9402 0
|
存储 弹性计算 运维
快速部署 K3s 社区版
K3s 是轻量级的 Kubernetes。K3s 易于安装,仅需要 Kubernetes 内存的一半,所有组件都在一个小于 100 MB 的二进制文件中。K3s 是一个完全兼容的 Kubernetes 发行版。本文向您介绍如何通过计算巢快速部署K3s社区版。
快速部署 K3s 社区版
|
11月前
|
机器学习/深度学习 设计模式 人工智能
workflow is all you need?探讨乐高式流程编排能否实现任意Multi-Agent模式
阿里集团安全部探索利用AI工作流(workflow)构建多智能体系统(MAS),以提升网络安全领域的创造性协作能力。文章围绕“Workflow is All You Need”这一核心观点,分析当前主流AI Workflow产品是否具备支持多种MAS协作模式的能力。通过Dify等工具演示了单Agent、路由、顺序执行、主从控制、反思、辩论、群聊等多种典型协作模式的实现方式,并指出现有平台在异步交互、动态扩展及并行化MOA模式上的局限性。最终强调,尽管目前尚存挑战,但AI Workflow仍是快速搭建多智能体系统的有效路径。
workflow is all you need?探讨乐高式流程编排能否实现任意Multi-Agent模式
|
存储 开发工具 数据库
gitea docker 快捷安装部署
通过Docker快速部署Gitea,可以大大简化安装过程,确保系统环境的稳定性与一致性。使用Docker Compose管理容器,使得Gitea的维护和升级更加方便。通过定期备份数据,确保在需要时可以快速恢复。这个部署方案适合各种规模的开发团队,特别是希望通过自托管方式管理代码库的用户。
1504 24
|
前端开发 Java 数据库连接
35个项目,开源,开源!
35个项目,开源,开源!
1818 0
35个项目,开源,开源!
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化的自适应马尔科夫链蒙特卡洛(Adaptive-MCMC)算法matlab仿真
本项目基于贝叶斯优化的自适应马尔科夫链蒙特卡洛(Adaptive-MCMC)算法,实现MATLAB仿真,并对比Kawasaki sampler、IMExpert、IMUnif和IMBayesOpt四种方法。核心在于利用历史采样信息动态调整MCMC参数,以高效探索复杂概率分布。完整程序在MATLAB2022A上运行,展示T1-T7结果,无水印。该算法结合贝叶斯优化与MCMC技术,通过代理模型和采集函数优化采样效率。
|
Kubernetes Apache 流计算
flink-kubernetes-operator 的简单使用
flink-kubernetes-operator 的简单使用
1384 0
|
监控 Ubuntu Linux
在Linux中,如何使用Pacemaker和Corosync?
在Linux中,如何使用Pacemaker和Corosync?
|
消息中间件 存储 数据处理
实时计算 Flink版产品使用合集之有没有rocketMq的connector
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
550 1