kubernetes 版本更新记录(1.11-1.22)

可直接查看官方github: https://github.com/kubernetes/kubernetes/tree/master/CHANGELOG,包含1.2.md 至当前最新的 1.23.md,共22个版本。

这里简单记录 1.11至1.23的更新要点,方便查阅。更早的版本参考以前记录的这篇文章——《从 k8s changelog 了解 k8s》

发布通知可参考:https://groups.google.com/g/kubernetes-announce

周数 版本 时间 笔记
50 1.23 (12 月 7 日) KubeCon + CloudNativeCon NA
15 1.24 (4 月 12 日)  
    (4 月 26 日) KubeCon + CloudNativeCon EU
32 1.25 (8 月 9 日)  
    (8 月 22 日) KubeCon + CloudNativeCon NA
49 1.26 (12 月 6 日)  

1.23(未发布)

  • 使用 Golang 1.16.7 构建
  • Client-go 事件库允许自定义垃圾邮件过滤功能。
  • 允许节点扩展本地卷
  • 将 Cluster Autosaler 更新到 1.22.0 版
  • 更新基础镜像包
    • debian 到 v1.9.0
    • debian-iptables 到 v1.6.6
    • setcap 到 v2.0.4
  • apiserver 公开了 4 个 CIDR 分配状态的新指标
  • cri-tools 依赖更新到 v1.22.0

1.22 (2021-08-06)

53 项增强功能:13 项增强功能已升级到稳定版,24 项增强功能正在进入 beta 版,16 项增强功能正在进入 Alpha 版,还有 3 项功能已经被弃用。

  • 发布周期从每年 4 个版本更改为 3 个版本。
    • Kubernetes 发布周期的长度约为 15 周。
    • 第一个 Kubernetes 版本应该在 1 月的第二/三个星期开始。
    • 最后一个 Kubernetes 版本应该在 12 月中旬完成。
  • 使用 Golang 1.16.7 构建
  • 删除几个 beta Kubernetes API

  • 服务器端应用(Server-side Apply)GA。 Kubernetes API 服务器上运行的一个新的字段所有权和对象合并算法。
  • Kubernetes客户端凭证插件, Stable。1.11版本以来一直处于测试。
  • etcd 更新至3.5.0-beta.3。
  • cgroups v2 API 控制内存分配与隔离,内存QoS。alpha
  • node 节点支持 swap。
  • Windows 增强和功能。
  • kubelet seccomp 配置文件。 alpha
  • 非 root 用户的身份运行 kubeadm 控制平面组件,v1beta3 为首选api版本。alpha
  • client-go 凭证插件 GA

1.21 (2021-01-11~4-8)

51 项增强功能:13 项增强功能已进入稳定阶段,16 项增强功能已转为 beta 版,20 项增强功能已进入 alpha 版,弃用了 2 项功能。

  • CronJobs,GA
  • 不可变secret/configmap,stable
  • IPv4 / IPv6 双协议栈支持,beta。双栈支持可以将原生 IPv6 路由到 Pod 和 service,同时仍允许集群在需要的地方使用 IPv4。
  • kubelet 优雅节点关闭,alpha
  • pv 健康监控。 alpha
  • 简化构建kubernetes,标准化原生 Golang 构建工具
  • 弃用 PodSecurityPolicy,v1.25 中删除。
  • 弃用 topologyKeys,改由topology-aware hints(拓扑感知提示)替换,alpha。
  • EndpointSlice stable
  • sysctl 支持 stable

1.20 (2020.12.08)

42 项增强功能:11 项增强功能已升级到稳定版,15 项增强功能正在进入测试版,16 项增强功能正在进入 Alpha 版

  • Volume 快照,快照支持需要 Kubernetes 发行厂商捆绑 Snapshot 控制器、Snapshot CRD 和验证 Webhook。支持快照功能的 CSI 驱动程序也要部署在集群上。
  • Kubectl Debug beta
  • 默认启用 API 优先级和公平性 (APF)
  • IPV4/IPV6 alpha
  • 进程 PID 稳定性限制 GA
  • kubelet 优雅节点关闭,alpha
  • Dockershim弃用
  • Exec 探测超时处理

1.19 (2020.08.26)

33 个增强功能:其中 12 个增强功能已趋于稳定,18 个进入 beta,13 个进入 alpha。

  • 将 Kubernetes 的支持周期延长到一年
  • 储存容量追踪
  • CSI 健康状况监控 Alpha
  • Ingress API, GA
  • 结构化日志,Klog
  • Kubelet 客户端 TLS 证书轮换,请求证书签名成为 kubelet 启动过程的一部分,stable
  • Seccomp,stable
  • 限制节点对 API 的访问,stable
  • 重新设计 Event API,stable
  • Ingress V1,stable
  • CertificateSigningRequest API,stable
  • 在没有 Docker 的情况下构建 Kubelet,stable

1.18(2020-03-25)

38 个增强功能:其中 15 个增强功能已趋于稳定,11 个 beta,12 个进入 alpha

  • Kubernetes 拓扑管理器,beta
  • Serverside Apply,beta
  • 用 IngressClass 扩展 Ingress
  • 引入 kubectl debug,alpha
  • 引入 Windows CSI 支持,alpha
  • 基于污点的驱逐,stable
  • kubectl diff,stable
  • CSI 块存储支持,stable
  • API Server dry run ,stable
  • 在 CSI call 中传递 Pod 信息,stable
  • 支持 Out-of-Tree vSphere 云提供商,stable
  • 支持针对 Windows 工作负载的 GMSA,stable
  • 跳过 non-attachable CSI 的 attach,stable
  • PVC 克隆,stable
  • 将 kubectl 软件包代码移至暂存,stable
  • Windows 的 RunAsUserName,stable
  • 适用于服务和端点的 AppProtocol,stable
  • 扩展 Hugepage 功能,stable
  • 客户端签名重构,以标准化选项和上下文处理,stable
  • 节点本地 DNS 缓存,stable

1.17(2019-12-09)

22项改进:14项功能毕业升至GA版本,4项升至Beta版本,4项增强升至Alpha版本。

  • 云服务供应商标签功能,GA
  • 卷快照功能,beta
  • CSI迁移,Beta
  • 服务路由拓扑感知功能,Alpha
  • Windows功能增强
  • 添加IPv4/IPv6 双栈协议支持
  • 遵循条件的Taint节点,GA
  • 可配置的Pod进程命名空间共享,GA
  • 可使用kube-scheduler调度DaemonSet Pod,GA
  • 节点最大存储卷数量的动态和通用机制支持,GA
  • Kubernetes CSI 拓扑支持,GA
  • 在SubPath Mount中提供环境变量扩展,GA
  • 缺省自定义资源支持,GA
  • 将高频度Kubelet节点续约行为视为健康确认,GA
  • 拆分 Kubernetes的Test压缩包文件(从整个kubernetes-test.tar.gz文件拆分为按操作系统分的压缩包),GA
  • 添加Watch Bookmarks支持,GA
  • 行为驱动的一致性测试,GA
  • 为服务负载均衡器提供中止器保护,GA
  • 避免对各Watcher中的同一对象进行序列化,GA

1.16(2019-09-18)

31 个增强功能组成:8 个进入稳定,8 个进入 Beta,15 个进入 Alpha。

  • CRD ,GA
  • Admission webhook,GA
  • Overhauled metrics
  • Volume Extension,Beta
  • 拓扑管理器,一个新的 Kubelet 组件
  • IPv4/IPv6 双栈,引入
  • API Server Network Proxy ,Alpha
  • Cloud Controller Manager Migration 增强

1.15( 2019-06-19)

25 个增强功能组成:2 个进入稳定,13 个进入 Beta,10 个进入 Alpha。

正在 CRD 的 GA 版本和 admission webhooks GA 的道路上

  • CRD
    • 重新考虑了在 CRD 中使用基于 OpenAPI 的验证模式
    • 根据 structural schema 的限制检查资源定义(这基本上强制了 CustomResource 中每个字段使用非多态和完整类型)
    • CustomResourceDefinition Webhook 转换,Beta
    • CustomResourceDefinition OpenAPI 发布,Beta
    • CustomResourceDefinitions 自动删除发送到 Kubernetes API 对象中的未知字段
    • CustomResourceDefinition 默认值
  • Admission Webhook 重构和改进
  • 集群生命周期稳定性和可用性:kubeadm api v1beta2
  • CSI 持续改善
  • Kubernetes Core 支持 Go module
  • 继续筹备云提供商的提取和代码组织。云提供商代码现已移至 kubernetes/legacy-cloud-providers,以便以后更容易删除和方便外部使用;
  • Kubectl 的 get 和 describe 现在适用于扩展;
  • 节点现在支持第三方监控插件;
  • 一个用于调度插件的新调度框架已进入 Alpha;
  • 用于在容器中触发 hook 命令的 ExecutionHook API 现在已进入 Alpha;

1.14(2019-03-25)

31 项功能强化构成:10 个功能已经稳定,12 个功能进入 Beta,7 个全新功能。

  • 生产级 Windows 节点支持
  • 新的 kubectl 文档, kubectl 插件机制 GA,集成 kustomize
  • 持久化本地存储卷 GA
  • 应用就绪状态判断的改进:Pod Readiness Gates (Pod Ready++)
  • Pod 优先级与抢占式调度 Beta
  • PID 限制:beta
  • kubeadm:在 HA 设置中自动执行控制平面之间的证书复制

1.13 (2018-12-03)

史上发布时间最短的版本,只利用了 10 周的时间。

  • 使用 kubeadm 简化集群管理,GA
  • Container Storage Interface(CSI), GA
  • 以CoreDNS 作为默认 DNS。
  • SIG API Machinery beta
  • SIG Auth 改进

1.12 (2018-09-27)

  • Kubelet TLS Bootstrap GA
  • SIG API Machinery
  • SIG-autoscaling
  • Scheduling 提高调度器性能和可靠性方面开发:
    • 通过对算法优化,提高 Pod 亲和/反亲和特性,性能提升超过 100X;
    • DaemonSet pods由默认调度程序调度;
    • 调度程序吞吐量提高约 50%
  • Originating Identity 特性
  • Namespace 代理,GA

1.11 (2018-06-27)

增强网络方面的主要功能,为 SIG-API Machinery 和 SIG-Node 提供了两个主要功能用于 beta 测试,持续增强过去两个版本关注的存储功能。

  • SIG API Machinery 主要集中在 CustomResoures 方面
    • CustomResources 的子资源现在进入 beta 版本,并且默认开启
    • CustomResourceDefinitions 现在可以定义多个版本
  • 基于 IPVS 的集群内负载均衡
  • CoreDNS 进入 GA
  • 动态 Kubelet 配置, Beta
  • CSI 的增强

关于 ietf rfc 和 k8s kep

无论是 IETF RFCs, 还是 K8S KEPs,亦或是Pyton PEPs 、 Rust RFCs,都是为了解决一个问题:如何解决项目发展到很大规模时的功能协作问题。

名词释义:

  • IETF RFC - IETF Request For Comments: IETF 意见征集稿
  • K8S KEP - Kubernetes Enhancement Proposal: k8s增强特性提案
  • Pyton PEP - Python Enhancement Proposal:Python改进建议书
  • Rust RFC - Rust request for comments

这些形形色色的 RFC/Xep 在不同语境下意思也不完全一致,具体看社区达成的共识。无论是什么场景,初心都是有利于不同角色间的协作。以下是我整理的一些好处:

  • 对于项目管理人,能够跟踪重大功能从概念到实施整个路径。
  • 对于PM(项目经理、产品经理),以一个连贯的叙述,向外界阐述为什么这个特定的版本很重要。
  • 对于项目核心开发人员,需要一个前瞻性的路线图(roadmap)来规划什么时候落地那些特性。
  • 对于开发经理等,通过 rfc 快速掌握全局,安排开发工作。
  • 对于开发者,通过编写 rfc 理清自己的思路,避免过早的陷入实现细节。
  • 对于社区,可以加强沟通,扩大知识的范围,避免知识掌握在少数人手中。
  • 对于新人,通过 rfc 了解项目发展历程,更好融入社区
  • 对于一定经验的从业人员,通过 rfc 跟进社区动态,获知业内的最佳实践方案,调整学习方向,改进工作业务的内容
  • 对于资深的黑客,通过 rfc 了解本技术的特性,与其它同类社区的差异,为什么要设计这些特性,是怎么设计的,怎样更好地运用(攻破)它们

当然,一个东西当然不可能仅带来优点而没有缺点:

  • 写文档,不是所有人都愿意去做。
  • 额外的流程,会降低我们的开发速度。
  • 项目管理人员也需要花费额外的心思维护和处理rfc相关的工作。

至于有的人说什么开发圣经之类的,个人觉得也大可不必,rfc 就是一个记录设计思路的文档,掌握思路和背后的思考,才是我们开发者应该关注的。

rfc 经过长年累月会累积产生特别多的内容,我们并不需要对每个rfc都熟知,也没有必要,一般快速了解全貌,再针对性看个人感兴趣的。

ps: 写文档和写单元测试一样,虽然开发者可能不太喜欢,但还是要坚持才行啊。

参考资料


kubernetes cpu绑核配置

经过压测,我们发现绑核功能导致cpu不能充分利用,只能利用到 65%-70%,因而最后并没有启用该功能。同行有位大佬给出的结论是,docker绑核是软实现的,不能被系统灵活调度,qps下降是正常现象。

这篇文章仅做记录。

一、CPU 管理策略

CPU 管理策略通过 kubelet 参数 --cpu-manager-policy 来指定。支持两种策略:

  • none: 默认策略,表示现有的调度行为。
  • static: 允许为节点上具有某些资源特征的 pod 赋予增强的 CPU 亲和性和独占性。

同时,要求使用 --kube-reserved 和/或 --system-reserved--reserved-cpus 来保证预留的 CPU 值大于零,可以不是整数,最终计算reserved cpu时会向上取整。

要使得绑核生效,pod 的配置需要 request 和 limit 的值相等。

二、设置步骤

1. 确认非绑核

随便找一个可用的pod,确认目前非绑核状态:

  • docker ps 确认docker id
  • docker inspect查找 pid
  • taskset 查看cpu绑定情况
# docker ps|grep demo
# docker inspect xxx|grep Pid
            "Pid": 123203,
            "PidMode": "",
            "PidsLimit": 0,
# taskset -c -p 123203
pid 123203's current affinity list: 0-71

当前机器的核数时72核,可以看到容器没有绑核。

2. 修改kubelet配置

cd /var/lib/kubelet
mv cpu_manager_state bak_cpu_manager_state

修改 kubelet 的启动参数,添加: –cpu-manager-policy=static 和 –kube-reserved=cpu=1(给cpu池子留点资源)。各人的kubelet启动配置不完全一致,以下仅供参考。

# vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

# 在 Environment= 列添加/修改下面两行
Environment="... ...
--cpu-manager-policy=static \
--kube-reserved=cpu=1,memory=1000Mi"

重启kubelet

systemctl daemon-reload
systemctl start kubelet
systemctl status kubelet

3. 修改pod的yaml配置

仅供参考:

          resources:
            limits:
              cpu: '4'
              ephemeral-storage: 40Gi
              memory: 8G
            requests:
              cpu: '4'
              ephemeral-storage: 40Gi
              memory: 8G
 

4. 确认已绑核

pod 不需要重启,也会自动绑核

# docker ps|grep demo
# docker inspect xxx|grep Pid
            "Pid": 123203,
            "PidMode": "",
            "PidsLimit": 0,
# taskset -c -p 123203
pid 123203's current affinity list: 2,4,38,39

三、参考资料


graph-easy 绘制流程图

前几天安装了 slides 这个工具,它有个挺有趣的功能,可以展示简单的流程图,便进一步学习了下 graph-easy 这个工具的使用。

一些简易流程图,如果用visio等工具来作图比较麻烦。使用 graph-easy 会简单的多,例如:

image-20210713142245900

image-20210713142255964

一、背景

Graph::Easy 是一个处理图形DSL的Perl模块,它有如下功能:

  • 提供了一种易懂,可读性很强的图形描述语言
  • 一种支持 ASCII Art 的基于网格的布局器
  • 可以导出为 Graphviz, VCG (Visualizing Compiler Graphs), GDL (Graph Description LAnguages) 和 GraphML 格式。
  • 可以从 Graphviz, VCG 和 GDL 导入图像。

二、安装

2.1 源码安装

这里以centos 7为例进行安装。可以从graph-easy 官网 进行下载包。

//下载安装包
wget https://cpan.metacpan.org/authors/id/S/SH/SHLOMIF/Graph-Easy-0.76.tar.gz

//解决依赖与编译安装
yum install perl perl-ExtUtils-MakeMaker graphviz
Makefile.PL
make test
make install

2.2 软件包安装

# centos
yum install perl 
yum install graphviz

# debian
apt-get install perl 
apt-get install graphviz

# 安装上述软件后安装 Graph::Easy
perl -MCPAN -e shell
cpan[1]> install Graph::Easy
graph-easy -version

Graph::Easy v0.76  (c) by Tels 2004-2008.  Released under the GPL 2.0 or later.

三、使用

第三章内容转载原文:graph easy绘制ascii简易流程图 - Xinkun Blog, 有修改。

3.1 hello world

先来一个入门的hello world。

[root@host /]# echo '[hello]->[world]' | graph-easy
+-------+     +-------+
| hello | --> | world |
+-------+     +-------+

graph-easy 的语法相对来说比较宽松,[hello]->[world][hello]-->[world],[ hello ]-->[ world ]都是可以的。这里可以根据个人的风格。我比较喜欢紧凑的风格。所以后面都是使用紧凑的方式来做。

3.2 线上加个上标

有时候要在连接线上加一个标志说明,比如我想要表明从上海坐车到北京,则可以使用下面的方式:

[root@host /]# echo "[shanghai]-- car -->[beijing]" | graph-easy
+----------+  car   +---------+
| shanghai | -----> | beijing |
+----------+        +---------+

3.3 画一个环

[root@host /]# echo "[a]->[b]->[a]" | graph-easy

  +---------+
  v         |
+---+     +---+
| a | --> | b |
+---+     +---+
[root@host /]# echo "[a]->[a]" | graph-easy

  +--+
  v  |
+------+
|  a   |
+------+

3.4 多个目标或者多个源

[root@host /]# echo "[a],[b]->[c]" | graph-easy
+---+     +---+     +---+
| a | --> | c | <-- | b |
+---+     +---+     +---+

[root@host /]# echo "[a]->[b],[c]" | graph-easy
+---+     +---+
| a | --> | b |
+---+     +---+
  |
  |
  v
+---+
| c |
+---+

3.5 多个流程在一个图内

[root@host /]# echo "[a]->[b]  [c]->[d]" | graph-easy
+---+     +---+
| a | --> | b |
+---+     +---+
+---+     +---+
| c | --> | d |
+---+     +---+

3.6 改变图方向

默认图方向是从左到右的。有时候想要从上向下的流程图。可以用标签来调整

[root@host /]# echo "graph{flow:south} [a]->[b]" | graph-easy
+---+
| a |
+---+
  |
  |
  v
+---+
| b |
+---+

更多示例:https://github.com/ironcamel/Graph-Easy/tree/master/t/txt

四、语法

graph-easy 语法都是基于 Graph::Easy::Parser

4.1 节点

  • 单节点:即单个节点,用[xx]表示,比如[a]那出来的就一个节点

  • 复合节点:由多个节点组成的一个复合节点。

    用[xx | xx | xx]表示,节点之间使用|分隔,比如[a | b | c | d]
    

4.2 连接线

  • 单向箭头:使用->表示,比如[a] -> [b]
  • 无方向连接线:使用–表示,比如[a] – [b]
  • 双横线单向箭头:使用==>表示,比如[a] ==> [b]
  • 点横线单向箭头:使用…>表示,比如[a] …> [b]
  • 波浪线单向箭头:使用~~>表示,比如[a] ~~> [b]
  • 横线、点单向箭头:使用.->表示,比如[a] .-> [b]
  • 双向箭头:使用<->表示,比如[a] <-> [b]
  • 双横线双向箭头:使用<=>表示,比如[a] <=> [b]

参考资料