你的努力,终将成就无可替代的自己
本科毕业后就一直从事Java开发的工作,和多数人一样,最开始从事crud的工作,看着自己的同学一步一步往上走,自己还是在原地踏步,说实话这不是自己想要的状态。
一年半后开始沪漂生活,又摸爬滚打了一年半,薪资基本上在16K。疫情在家开始了系统的学习,目的就是为了进大厂,得到更多的学习机会,也是为了自己到所谓的“35岁”之后,也能在老家恰一口好饭。
努力也没有白费,8个月时间的系统性学习成功上岸Alibaba,直接涨薪14K,下面分享一下我的学习指南,面试真题以及个人心得体会。(晒一下入职offer)
metadata:
name: hotupgrade-sidecarset
spec:
selector:
matchLabels:
app: hotupgrade
containers:
- name: sidecar
image: openkruise/hotupgrade-sample:sidecarv1
imagePullPolicy: Always
lifecycle:
postStart:
exec:
command:
-
/bin/sh
-
/migrate.sh
upgradeStrategy:
upgradeType: HotUpgrade
hotUpgradeEmptyImage: openkruise/hotupgrade-sample:empty
-
**upgradeType **: HotUpgrade 代表该 sidecar 容器的类型是 Hot upgrade ,即热升级方案。
-
**HotUpgradeEmptyImage **: 当热升级 Sidecar 容器时,业务须要提供一个 empty 容器用于热升级过程中的容器切换。Empty 容器同 Sidecar 容器具有相同的配置(镜像地址除外),例如 command , lifecycle , probe 等。
SidecarSet 热升级机制主要包含注入热升级 Sidecar 容器和 Mesh 容器平滑升级两个过程。
[](()注入热升级 Sidecar 容器
针对热升级类型的 Sidecar 容器,在 Pod 创建时 SidecarSet Webhook 将会注入两个容器:
- {Sidecar.name} -1: 如下图所示 envoy -1,这个容器代表正在实际工作的 sidecar 容器,例如:envoy :1.16.0
- {Sidecar.name} -2: 如下图所示 envoy-2,这个容器是业务提供的 HotUpgradeEmptyImage 容器,例如:empty :1.0
上述 Empty 容器在 Mesh 容器运行过程中,并没有做任何实际的工作。
[](()Mesh 容器平滑升级
热升级流程主要分为一下三个步骤:
-
Upgrade: 将 Empty 容器替换为最新版本的 Sidecar 容器,例如:envoy-2.Image = envoy:1.17.0
-
Migration : 执行 Sidecar 容器的 PostStartHook 脚本,完成 mesh 服务的平滑升级
-
Reset: Mesh 服务平滑升级后,将老版本 Sidecar 容器替换为 Empty 容器,例如:envoy-1.Image = empty : 1.0
仅需上述三个步骤即可完成热升级中的全部流程,若对 Pod 执行多次热升级,则重复执行上述三个步骤即可。
[](()Migration 核心逻辑
SidecarSet 热升级机制不仅完成了 Mesh 容器的切换,并且提供了新老版本的协调机制( PostStartHook ),但是至此还只是万里长征的第一步,Mesh 容器同时还需要提供 PostSartHook 脚本来完成 Mesh 服务自身的平滑升级(上述 Migration 过程),如:Envoy 热重启、Mosn 无损重启。
Mesh 容器一般都是通过监听固定端口来对外提供服务,此类 Mesh 容器的migration 过程可以概括为:通过 UDS 传递 ListenFD 和停止 Accpet 、开始排水。针对不支持热重启的 Mesh 容器可以参考此过程完成改造,逻辑图如下:
[](()热升级 Migration Demo
不同 Mesh 容器对外提供的服务以及内部实现逻辑各有差异,进而具体的 Migration也有所不同,上述逻辑只是对其中一些要点做了一些总结,希望能对有需要的各位有所裨益,同时在 Github 上面我们也提供了一个热升级 Migration Demo 以供参考,下面将对其中的一些关键代码进行介绍。
1. 协商机制
Mesh 容器启动逻辑首先就需要判断第一次启动还是热升级平滑迁移过程,为了减少Mesh 容器沟通成本,Kruise 在两个 sidecar 容器中注入了两个环境变量 **SIDECARSET_VERSION 和 SIDECARSET_VERSION_ALT ,**通过判断两个环境变量的值来判断是否是热升级过程以及当前 sidecar 容器是新版本还是老版本。
// return two parameters:
// 1. (bool) indicates whether it is hot upgrade process
// 2. (bool ) when isHotUpgrading=true, the current sidecar is newer or older
func isHotUpgradeProcess() (bool, bool) {
// 当前sidecar容器的版本
version := os.Getenv(“SIDECARSET_VERSION”)
// 对端sidecar容器的版本
versionAlt := os.Getenv(“SIDECARSET_VERSION_ALT”)
// 当对端sidecar容器version是"0"时,表明当前没有在热升级过程
if versionAlt == “0” {
return false, false
}
// 在热升级过程中
versionInt, _ := strconv.Atoi(version)
versionAltInt, _ := strconv.Atoi(versionAlt)
// version是单调递增的int类型,新版本的version值会更大
总结如果你选择了IT行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了
《Java中高级核心知识全面解析》
小米商场项目实战,别再担心面试没有实战项目:
总结如果你选择了IT行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了
《Java中高级核心知识全面解析》
[外链图片转存中…(img-MjSjKO0z-1649750042170)]
小米商场项目实战,别再担心面试没有实战项目:
[外链图片转存中…(img-huq1XGsY-1649750042171)]
阿里P7熬夜整理的《Java全套学习手册》,火爆IT圈
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)