精彩推荐:
      南阳吧   手机数码交易   智汇华云 | 使用Kubeadm进行Kubernetes集群版本升级
    返回手机数码交易
    发新帖 回复
    查看: 76|回复: 0

    智汇华云 | 使用Kubeadm进行Kubernetes集群版本升级

    [复制链接]
    楼主

    138

    主题

    138

    帖子

    498

    积分

    中级会员

    Rank: 3Rank: 3

    积分
    498
    发表于 2021-12-22 17:41:46 | 显示全部楼层 |阅读模式

    8 R0 }4 ~; F* e1 O+ C+ E4 W# _
    - t" R, }6 E8 Z. X) F0 l+ tKubernetes集群通常使用 Kubeadm进行版本升级,当前支持跨一个大版本的升级,例如从 1.19.x 升级到 1.20.x,不支持一个大版本内的不同小版本之间的升级,也不支持跨超过 1 个以上的大版本进行升级。, v* e  h9 F6 x6 j5 v

    - H% M, B0 |, h- ~! J在进行一个Kubernetes 集群版本升级过程中,集群应始终保持在可用状态,集群中已经部署的业务对于升级过程也是无感知的 (如果要做到完全无感知,需要业务使用的存储可以随着 Pod 的驱逐实现跨节点迁移) 。+ Z0 B0 H' l7 Y" I& p* G
    ) z1 j& N" ?$ j$ D0 a. ^+ s9 y! I
    本文中以从1.19.0升级到1.20.0为例进行说明,具体升级方法是针对不同类型的节点上的组件分别进行升级。例中的升级步骤主要分为以下4 步:
    ' R6 P8 G( ?0 `  {- h
    4 R' J4 U( R5 n. G集群预检7 g- v" o. _' R
    升级控制平面4 t3 V& K3 I1 T+ q$ L5 h
    升级数据平面( t+ E" k! ~4 Q' |
    升级其它组件" [4 C# ^/ q: ^* L$ @

    * s. L2 M6 @+ z8 Q集群预检
    & K& N. `5 \7 z* z  d: a. \0 I+ b/ ]- J. a  b* e* w
    预检这一步骤主要是为了在 Kubernetes 升级之前对集群的各个组件的状态进行检测,以便提高集群升级的成功率,当检测出现异常时则停止后续的升级步骤。预检的内容主要包括两大类:
    ; i! g+ v& y5 O  U' B
    9 C' W" Y# w5 I& b集群节点环境的检查:
    0 d0 _' k; q6 G/ i( x8 O虚机或者裸机节点的健康状态检查0 c) s( e6 a6 i* X8 u8 ]8 T, `
    节点内部系统服务的检查:例如NTP、防火墙、内核配置等$ D: u( W0 m$ {6 B6 J: K5 ~
    多Master集群的控制平面和数据平面的高可用状态的检查
    ! ?- n; ]/ W- v8 S" G7 P' P等等
    ; [( U8 [6 e6 M) _" O& }1 P3 \0 t9 p  f8 f: F
    集群K8s状态的检查:8 R+ E. |. g# C4 \- i2 G% N
    控制面和数据面节点是否都处于 Ready 状态。; _& i" S* z- G( e, `# D7 D
    Etcd 集群的可用状态检
    8 M! w5 M$ @! _& [负载和服务的可用状态检查# E3 Q0 R$ |, M, `  Y4 N* Q4 a6 ?+ J9 V
    等等! \6 }/ k3 N% i$ C4 t9 f" |' l
    6 G1 q$ {# q  c5 ]
    注意:# h/ V1 ]$ j- u/ O# R; J1 ^4 {
    面检查的步骤都不是必须实现的,可以根据需要选择一些来完成。8 v9 A& a8 m$ p4 Z# F
    除了上述预检之外,kubeadm在执行升级步骤中也会进行即时性的环境检测,以保证升级的成功率。& X' t$ D. x6 z# l- L# }) F
    ) _' d6 x; M4 H) b' P
    升级控制平面(Master节点): B0 @1 z" z4 E  D

    0 ~6 W& t+ S8 ]7 w' a# L2 w* ]控制平面主要是指Master节点上的以下组件:/ F9 M$ Y, T6 V( g: K# u$ B
    Kubernetes API Server( O- t' R% v4 ~4 x
    Kubernetes Scheduler0 f! v; w- l8 Q
    Kubernetes Controller Manager; h1 N1 K; j8 I- `
    Kubelet
    $ S3 L4 P8 y- K) D; VKubeadm
    2 S1 C6 P- N/ \第一步、在 Master 节点上安装新版本的 kubeadm: T2 X) J+ |/ f6 Y* G: p7 p

    , y6 N1 ^: c0 ?9 ]第二步、执行以下命令进行升级:
    6 E! y. p' }% H6 K7 Okubeadm upgrade apply v1.20.0
    5 H7 ~* z% s2 p$ e8 F此升级过程会针对 Kubernetes API Server、Kubernetes Scheduler 和 Kubernetes Controller Manager 这三个组件生成新版本的配置文件覆盖旧版本的,Master 节点上的 Kubelet 会 Watch 到这些改动,会重建对应的 Pod。另外还会重新生成 Kube-Proxy DaemonSet 的配置,Node 节点上所有的 Kube-Proxy 相关的 Pod 会进行重建。" Q* {: w8 {8 m. s$ r
    : @4 Y; b, g6 h! r. S- Z
    第三步、腾空节点
    4 J( M1 B4 q9 s0 D& M( `2 }- g通过将节点标记为不可调度并腾空节点为节点作升级准备:5 R4 l) n, V; k
    kubectl drain node_name --ignore-daemonsets
    & f( S3 q4 I3 B8 V
    ) B$ @9 _7 T. k7 i第四步、升级 Kubelet
    ; [3 E3 R6 I/ F/ L& J6 o升级后需要重启 Kubelet1 J, m/ X- e1 O* H& x! ~7 X
    sudo systemctl daemon-reload" O9 A2 Z! T% ~) r# {1 T( ]9 S
    sudo systemctl restart kubelet6 c& T$ i2 `7 e+ X

    2 m" ^( q3 ]5 j4 Y1 a8 c第五步、解除节点的保护3 v/ n8 \) H' t
    通过将节点标记为可调度,让其重新上线:
    : l. ~" k$ p% D! I& p5 Xkubectl uncordon node_name
    % c' S8 t/ Y: T, Y  ^如果集群的控制平面是 HA 的情况,在 API Server 前端应该有类似 HAProxy的负载均衡软件,高可用依赖 HAProxy 对于后端的 API Server 周期性的检测机制,如果某个 Mater 正在升级,这时 HAProxy 会检测到,然后后续的请求就不会转发到这个 Master 节点。等升级完成后,状态恢复正常,这时 HAProxy 将其作为正常的后端进行请求转发。' d! o+ `% c' x! y+ R8 G

    " a: F& m3 M$ r4 c% V$ R升级数据平面(Node 节点)% A' K8 ^. `0 S: Q3 x% N
    ' f) `6 e* L  y  T
    数据平面是指 Node节点上的Kubectl和Kubelet等组件。; |: F+ X2 n' S
    ; I2 Z4 L1 |2 z
    如果用户的某个应用只有一个 Pod,这种情况下无法做到升级过程中业务不会中断。另外,如果Kubernetes集群只有一个Node节点,在这升级这一个Node节点的过程中,这个Pod会被驱逐,并且由于没有其它节点可以调度,因此会一直处于pending状态,在这段时间内业务会完全中断。
    7 c+ X; A" }# O$ t$ d1 R( e& J2 R: [. q
    第一步、在 Node 节点上安装新版本的kubectl。
    : E$ U% [3 |. X0 H. e6 u6 B5 ^" K2 A( c# i& O  S! S% l  s+ G
    第二步、腾空节点' u" l, ^: G" h2 _% C
    通过将节点标记为不可调度并腾空节点为节点作升级准备:
    5 ?9 ~2 f2 w- O* S0 Lkubectl drain node_name --ignore-daemonsets
    . X/ c2 U5 u1 U; h* f. Q注意,这一步需要保证业务流量不受到影响,如果某个业务有多个 Pod,则需要保证其它节点上的 Pod 处于正常运行状态。1 H/ }+ [3 C: o3 H) O3 h
    # s" ?1 C; }/ ^  V
    第三步、升级 Kubelet
    ; ~7 g6 g- ^' z升级后需要重启 Kubelet+ H& R4 y7 T5 o1 H
    sudo systemctl daemon-reload8 y4 h) ~& Q1 N5 o  R3 l
    sudo systemctl restart kubelet
    " E/ L, Z1 R3 [% o* }9 w" A5 P# r& d" k4 l
    第四步、解除节点的保护7 [- M- M2 W( j4 P" N
    通过将节点标记为可调度,让其重新上线:
    ) y- Z$ M" D- ?: W( ikubectl uncordon node_name
    4 o) f( D8 N5 e. o' O
    + h3 |8 m% @3 f& l升级其它组件" Z+ V9 h5 F' N6 f

    # k  ?" k; V- l' C* ?* X  y其它组件不仅包括CNI Driver、CSI Driver等基础能力组件,还包括Ingress Controller、Dashboard、Prometheus、Metric-Server 等用户或管理员安装的辅助组件。( p1 _5 A: _# z9 u& P

    ( F7 i( t' E! H% F& l. H当 Kubernetes 集群进行版本升级时,这些组件是否需要升级或者变更需要参考各组件与 Kubernetes 的版本兼容性,本文不再进行深入阐述。
    2 e$ S8 D3 e4 V2 c. K( F7 c
    2 p. ~. U- m6 F& t2 h8 y几点解释
    6 g0 w# j% ^' w8 K, L8 g4 {& I7 N8 @; m4 f9 S7 Z% U, M
    关于 "腾空节点"的操作: h9 |. h) n  s
    在升级控制平面和数据平面的时候都要先做一个"腾空节点"的操作,这个操作会首先驱逐当前节点上的 Pod(不包含控制面Pod和DaemonSet的Pod),然后将当前节点标记为不可调度。待升级完成后,执行 uncordon 命令将节点恢复正常状态。这是 Kubernetes 官方推荐的维护某一个节点的标准流程。
    & b4 a5 r$ O- L+ U9 d' N$ A, S; H% T
    如果一个节点同时作为 Master 和 Node 节点,如何处理?9 M7 i, E* \2 {
    按照正常的控制面升级流程即可。
    9 D/ S4 @# ?6 X
    # ]: M; ?: M8 K, f$ X: VAPI 转换的问题
    ; Y/ M% L% A2 Q( |$ Q! c; _目前,整个升级过程,不会涉及到具体业务的 API 升级问题,比如从alpha升级到beta版本。用户如果有这方面的需求,可以使用 kubectl convert 命令在不同 API 版本之间转换清单。例如:kubectl convert -f pod.yaml --output-version v1 & kubectl apply -fpod.yaml 的内容,在新的清单文件中,kind 被设置为 Pod(未变),但 apiVersion 则被修订了。
    3 W" a) W+ g$ _; y/ C" e  y1 c* {; z- e$ _2 A# z
    升级后,负载是否需要手动重启
    . O* o' _/ x( U/ }. T# g+ q8 k! I升级后,因为容器的 spec 中的哈希值已更改,所有容器都会被重新启动。由于在升级数据面的时候已经对 Pod 做了驱逐操作,因此所有的Pod 都已经完成了重建操作。/ K7 ~7 r2 D' U3 i9 B5 ]% V4 u
    ; J0 A: K- R7 k! x
    ; G( l0 x, x; i7 y3 C  x4 a8 G
    回复

    使用道具 举报

    返回手机数码交易
    发新帖 回复
    使用 高级模式(可批量传图、插入视频等)
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则