惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
GbyAI
GbyAI
博客园 - 叶小钗
B
Blog
Stack Overflow Blog
Stack Overflow Blog
The Register - Security
The Register - Security
W
WeLiveSecurity
S
Secure Thoughts
S
Security @ Cisco Blogs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Webroot Blog
Webroot Blog
爱范儿
爱范儿
SecWiki News
SecWiki News
N
News and Events Feed by Topic
Y
Y Combinator Blog
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
云风的 BLOG
云风的 BLOG
博客园 - 聂微东
V
V2EX
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
U
Unit 42
F
Full Disclosure
PCI Perspectives
PCI Perspectives
Security Archives - TechRepublic
Security Archives - TechRepublic
N
News | PayPal Newsroom
The Last Watchdog
The Last Watchdog
Cloudbric
Cloudbric
O
OpenAI News
S
Security Affairs
D
Docker
博客园 - Franky
Application and Cybersecurity Blog
Application and Cybersecurity Blog
The GitHub Blog
The GitHub Blog
博客园 - 三生石上(FineUI控件)
P
Proofpoint News Feed
Recent Commits to openclaw:main
Recent Commits to openclaw:main
aimingoo的专栏
aimingoo的专栏
Hugging Face - Blog
Hugging Face - Blog
TaoSecurity Blog
TaoSecurity Blog
F
Fortinet All Blogs
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Google DeepMind News
Google DeepMind News
L
LINUX DO - 最新话题
MyScale Blog
MyScale Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - 司徒正美
N
News and Events Feed by Topic

陈少文的网站

巨变与机遇的未来十年 Kubernetes 平台管理软件压力测试方案 使用镜像部署 Hexo 静态页面 终于等到你 - GitHub 镜像仓库服务(ghcr.io) 一起来学 Go --(6)Interface 一起来学 Go --(5)Goroutine 和 Channel 什么是函数式编程 如何在 Kubernetes 集群集成 Kata 柯里化与偏函数 使用 PyGithub 自动创建 Label 软件产品是团队能力的输出 IoT 变现 Kubernetes 中的 DNS 服务 国内的 Helm 镜像源 Harbor 使用自签证书支持 Https 访问 DevOps 工具链之 Prow 如何使用 kfctl 安装 Kubeflow VS Code 无法下载 Go 插件的工具包 工程师更应具有服务精神 你不知道的 Docker 使用技巧 使用 Docker 运行 Tensorflow 论中国 什么是左移 如何清空 Git 仓库全部历史记录 一禅小和尚 有风吹过厨房 时间的玫瑰 如何在 CentOS 安装 GPU 驱动 开发 Tips(19) 使用 Velero 备份 Kubernetes 集群 Kubernetes Cheat Sheet 开发 Tips(18) 如何构建一个 Java 工程 开发 Tips(17) KubeSpray 安装 Kubernetes 报错 ip in ansible_all_ipv4_addresses 基于 Kubernetes 和 Jenkins 搭建自动化测试系统 在 Kubernetes 上动态创建 Jenkins Slave 使用 Jenkins 进行服务拨测 开发 Tips(16) Kubernetes 签发 Ingress 证书及日常故障运维 Kubernetes 中 Deployment 的基本操作 Kubernetes 中的证书 如何使用 KubeBuilder 开发一个 Operator Kubernetes 1.6.0 安装问题汇总 镜像管理工具 -- Harbor 开发 Tips(15) Docker 如何拉取镜像 开发 Tips(14) 使用 Helm 安装 harbor 开发 Tips(13) 使用 S2I 构建云原生应用 在 Kubernetes 中使用 emptyDir、hostPath、localVolume 开发 Tips(12) 开发 Tips(11) 代码质量分析工具 SonarQube 使用 Kubeadm 安装 Kubernetes 集群 一起来学 Go --(4)常用函数 Kubernetes 中的 Ceph Kubernetes 之 Volumes Kubernetes 之 Labels、Selectors 开发 Tips(10) 开源正在重构商业模式 Kubernetes 之网络 Kubernetes 之 API 使用 Helm 和 Operator 快速部署 Prometheus Kubernetes 复杂有状态应用管理框架 -- Operator Kubernetes 的包管理器 -- Helm 一起来学 Go --(3)Go Modules 如何一步一步地优化博客方案 kubectl 实用指南 Kubernetes 中的基本概念 搭建远程 Kubernetes 开发环境 大公司和小公司的 ToB 思路 开发 Tips(9) Go 入门指南 一起来学 Go --(2)数据与逻辑结构 如何预防 Web 富文本中的 XSS 攻击 django-xss-cleaner 云工作时代 一起来学 Go --(1)背景与特点 SaaS 开发团队的不同阶段 你不知道的 Git 使用技巧 输出既服务 微服务设计 继续奔跑 开发 Tips(8) 从账户安全到二次验证 Django 性能之数据库查询优化 Django 性能之分库分表 敏捷开发之研发流程 打造一致性的团队 开发 Tips(7) Pytest 进阶学习之 Mock PaaS 部署之 buildpack Go 开发配置 领域输出才是 PaaS 的核心竞争力 Pytest 入门学习 开发 Tips(6) 如何使用 Jenkins、Docker、GitLab 搭建 Django 自动化部署流程 开发 Tips(5)
Helm 2 、Helm 3 比较
微信公众号 · 2020-04-25 · via 陈少文的网站

Helm 3 终于发布了。我们可以告别 Tiller 了,但 Helm 3 的改变不仅于此。让我们继续探讨其他的变化。

1. 告别 Tiller

Helm 3 移除了 Tiller ,是个不错的决定。但是要理解为什么不错,我们还需要了解一下 Tiller 产生的背景。Tiller 是 Helm 的服务端组件(运行在 Kubernetes 集群上),主要目的是为了让多个不同的操作者能够在同一个集群上操作。开发 Helm 2 时,由于 Kubernetes 没有基于角色的访问控制(RBAC),Helm 不得不自己控制谁、在哪里能够安装应用。直到 Kubernetes 1.6 中开启了 RBAC ,这件事就变得简单了。Helm 也不必与 Kubernetes 做重复的事情,因此 Helm 3 彻底移除了 Tiller 。

Tiller 作为维护 Helm 应用信息和状态的核心。Helm 3 直接从 Kubernetes API Server 就可以获取到相同的信息,并且在客户端呈现 Charts 。对于 Kubernetes 来说,这种方式更加简单而原生。

移除 Tiller 之后,Helm 的安全模型也变得简单(使用 RBAC 来控制生产环境 Tiller 的权限非常不易于管理)。Helm 3 使用 kubeconfig 鉴权。集群管理员针对应用,可以设置任何所需级别的权限控制,而其他功能保持不变。

2. 好吧,除了 Tiller ,还有什么改变?

正如前面提到的,移除 Tiller 是一件大事,但不是唯一的一件。让我们看看其他的。

2.1 三路合并补丁策略

Helm 2 使用的是两路合并补丁策略。也就是,当你想执行任何 helm 操作时,比较最新的 chart 包与期望的 chart 包配置。这两个包之间的不同,决定了应该调整 Kubernetes 中的哪些资源。听起来不错,对吗?但是没有考虑手动修改应用的情况(例如,使用 kubectl edit)。这将导致应用无法回滚到之前的状态,因为 Helm 2 将最新的 chart 包当做最新的状态,而最新的 chart 包里面没有改变(我们只是更新了应用在集群的状态),Helm 2 忽略了这一变化的回滚。

三路策略合并补丁可以解决这个问题。Helm 3 是如何做的呢?它只是多考虑了应用的线上状态(使用三路替代两路,旧的配置,线上状态,新的配置)。例如,假设你部署了一个应用:

1
helm install very_important_app ./very_important_app

这个应用的副本数量设置为 3 。现在,如果有人不小心执行了 kubectl edit 或:

1
kubectl scale -replicas=0 deployment/very_important_app

然后,团队中的某个人发现 very_important_app 莫名其妙宕机了,尝试执行命令:

1
helm rollback very_important_app

在 Helm 2 中,这个操作将比较旧的配置与新的配置,然后生成一个更新补丁。由于,误操作的人仅修改了应用的线上状态(旧的配置并未更新)。Helm 在回滚时,什么事情也不会做。因为旧的配置与新的配置没有差别(都是 3 个副本)。然后,Helm 不执行回滚,副本数继续保持为 0 。此时,你有些慌了…

另一方面,在 Helm 3 中,将使用旧的配置,线上状态,新的配置生成更新补丁。Helm 发现旧的配置副本数是 3 ,线上状态是 0 ,判断出新的配置期望改回 3 ,因此生成一个更新补丁回滚。此时,你不那么慌了…

使用 Helm 3 进行升级时,也会发生类似的过程。例如,某个基于控制器的应用(或类似服务网格)注入任何内容到 Helm 部署的 Kubernetes 对象中。在 Helm 2 中进行升级时,注入的内容将被移除。在 Helm 3 中,由于考虑到了在线状态,注入的内容将会被保留。假设我们想要在集群上安装 Istio 。Istio 将 Sidecar 注入到每个部署中。使用 Helm 进行部署:

1
2
3
containers:
  - name: server
    image: my_app:2.0.0

安装 Istio 之后,你的容器定义看起来像这样:

1
2
3
4
5
containers:
  - name: server
    image: my_app:2.0.0
  - name: istio-sidecar
    image: istio-sidecar-proxy:1.0.0

如果使用 Helm 2 进行升级,你将得到如下结果:

1
2
3
containers:
  - name: server
    image: my_app:2.1.0

Istio Sidecar 由于不在配置中,将会被移除。然而,Helm 3 将基于旧的配置、在线状态、新的配置生成一个更新补丁。Helm 3 会将 image 更新为 2.1.0 ,另外在线状态还包含一些额外的配置。最终,使用 Helm 3 升级将得到你想要的:

1
2
3
4
5
containers:
  - name: server
    image: my_app:2.1.0
  - name: istio-sidecar
    image: istio-sidecar-proxy:1.0.0

三路策略合并补丁更新,让 Helm 升级更加可控和安全。

2.2 Secrets 作为默认存储器

Helm 2 使用 ConfigMaps 存储应用的信息。在 Helm 3 中,改为 Secrets (secret 类型为 helm.sh/release )作为默认存储器。这带来了一些优势,并极大简化了 Helm 的功能。Helm 2 必须要经过一系列操作才能获取(和应用)配置。这些配置加密、打包存储在某一个 keys 或 ConfigMap 中。Helm 3 直接将配置存储在 Secret ,无需执行复杂操作,只需要提取、解码、使用即可。另一个优点是,应用名称不必集群唯一。包含应用信息的 Secrets 存储在应用安装的 Namespace 中。因此,在不同的 Namespace 中,应用可以具有相同的名字。

2.3 JSON Schema 验证 Chart 信息

可以使用 JSON Schema 强制对 chart 中的 values 值进行校验。基于此功能,你能够确保使用者提供的 values 值符合 chart 包的要求。这给 OPS 与 DEV 创造了更多合作机会(OPS 团队能给 DEVs 更大自由度),当用户 values 值设置错误时,能够给出更好的错误提示。

2.4 现在需要应用名字了

如果没有提供应用名,在 Helm 2 中,将会随机生成一个;在 Helm 3 中,将会报错(如果还是想使用随机名称,可以加上 — generate-name 标识)。

2.5 移除了 Helm serve

本来就没有很多人使用 helm serve(用来给开发,在机器上跑一个本地的 Chart Repository)。现在 helm serve 移除了。但是你仍然可以以插件的形式安装。

2.6 不再自动创建命名空间

当在不存在的 Namespace 中创建应用时,Helm 2 将会自动创建 Namespace 。Helm 3 遵循其他 Kubernetes 工具的惯例,如果 Namespaces 不存在,则返回错误。

3. 参考