Kubernetes展望与思考

接触kubernetes两年有余,从18年初加入kubernetes社区来算,已经一年半,或许是时候写点什么。简单文章如何写好,难点文章如何写透,或许是一种学问,打算推一个系列:《Kubernetes GO》算是对这两年的一个总结。

kubernetes 1.17当前changlog,

距离Kubernetes 1.17正式发布还剩不到一个月,那么我们在即将迎来的1.17版本中,会引入哪些新特性以及性能增强呢?下⾯我们基于最新commit状态,分享社区最新动向。


一、1.16版本回顾

9月18日,Kubernetes 1.16正式发布,其包含31项增强功能,其中8项增强功能已经GA,另有8项增强功能处于beta阶段,15项处于alpha阶段,该版本有以下亮点:

  • 自定义资源(CRD)

    CRD作为Kubernetes的可扩展机制之一得到广泛使用,其自1.7版本发布以来就一直处于beta阶段。Kubernetes 1.16版本,也标志着CRD迎来了GA版本。

  • 存储卷扩展

    新版本当中包含一系列与存储卷以及卷修改相关的功能。CSI规范中的存储卷大小调整能力提升为beta阶段,允许用户对CSI规范下的存储卷插件进行大小调整。

  • 拓扑管理[alpha]

    Kubelet中旨在协调资源分配决策,从而提供优化效果更好的资源分配能力

  • 双栈[alpha]

    IPv4/IPv6双栈可以将IPv4与IPv6地址分配给各Pod与服务
    a. Pod 的多个 IPv4/IPv6 地址分配
    b. 集群之间本地双栈通信

下述表单为kubernetes维护时限

维护周期

Kubernetes 发现版本的通常只维护支持九个月,在维护周期内,如果发现有比较重大的 bug 或者安全问题的话,
可能会发布补丁版本。下面是 Kubernetes 的发布和维护周期。

Kubernetes 版本 发行月份 终止维护月份
v1.11.x 2018 年 6 月 2019 年 3 月
v1.12.x 2018 年 9 月 2019 年 6 月
v1.13.x 2018 年 12 月 2019 年 9 月
v1.14.x 2019 年 3 月 2019 年 12 月
v1.15.x 2019 年 6 月 2020 年 3 月
v1.16.x 2019 年 9 月 2020 年 6 月
v1.17.x 2019 年 12 月 2020 年9 月

二、1.17 版本动态

社区1.17版本的代码freeze时间节点为11月18日,正式发布在12月9日左右,社区在调度、存储等方面进行大量优化,一些PR的进展如下:

一般更新

  1. klog升级至v1.0.0

  2. 更新SIG图谱,详见community#4129

    • 将特定cloud provider修改为公有云SIG子项目

    • 移除容器认证工作组

    • 新增Usability SIG等

  3. 推迟NodeRestriction admission插件研发时间至1.19

  4. 解决kubectl flag --certificate-authority重写问题

  5. kubeadm不再移除/etc/cni/net.d目录

  6. etcd server版本升级至3.3.17

  7. kubeadm配置版本从v1beta1升级至v1beta2

  8. golang性能优化

    • encoding/json中的sync.Pool使用scanner

    • golang抢占调度,详见golang#24543,里程碑设定于Go 1.14版本

    • 优化complie、link

  9. 统一CRI于docker shim字节流长度,限定readiness/liveness字节流输出长度10kb

  10. 为相关组件新增readyz及livez接口

  11. 限制kubelet静态pod文件最大长度为10MB,防范Dos

  12. 增加PVC存储需求为负数的校验

  13. 移除firewalld监控,优化iptables处理

  14. 云服务商相关:

    • openstack中doSafeMakeDir时可能带来的fd泄露

    • openstack LB删除故障处理,详见kubernetes#82264

    • azure控制器新增操作技术相关指标

    • 升级azure sdk client至v33.1.0,优化API调用

  15. metrics-server版本升级至0.3.5

  16. hyperkube镜像将不再与kubernetes一同发行

安全相关

  • 解决API-Server处理JSON/YAML时面临DoS安全风险(CVE-2019-11253),详情可参看issue#83253

  • net/textproto 头部字段兼容性处理导致CVE-2019-16276

  • 非常规构建JSON安全风险问题,详见kubernetes#81158

故障解决

  1. 升级Go 1.13.3

    • 解决当http2握手时的写错误,transport永久缓存断链,详见go#34978

    • Go页分配器未优化导致apiserver延迟及内存趋高等问题,解决详见go#34978、go#35112,此问题的讨论过程详见go#32828

    • 解决go mod在k8s模块的使用,更新heketi模块,详见kuberneets#82506

  2. 升级etcd client 3.3.17:详见kubernetes#83801

    • 解决客户端无法正确解析IPv6

    • etcd集群故障时无法证书检查时dns不匹配

  3. apiserver故障

    • 当CRD资源定义中包含x-kubernetes-int-or-string字段,导致apiextensions panic:详见kubernetes#83787
  4. 存储故障

    • kubelet重启时清理raw bolck,详见kubernetes#83451

特性维护

  1. 调度优化

    • 新增pre-filter插件以更新pod状态

    • 将内置调度算法插件化:framwork等

    • TaintNodesByCondition特性1.17正式GA,移除节点状态相关predicate算法:内存、磁盘、PID、状态,以TaintNodesByCondition替换

    • 新增调度队列操作pod的相关指标

    • 新增调度相关延迟及请求相关指标

    • 将调度插件中节点计算分范围从【0,10】调整为【0,100】,其不会影响第三方及RequestedToCapacityRatio算法

  2. 优化EndpointSlice特性

    • 通过使用string对比替换IP,在kube-proxy启用EndpointSlice时,显著提升性能~50%,详见kubernetes#83035
  3. apiserver增强

    • 新增认证功能延迟的监控指标
    • 移除apiserver loopback客户端QPS限制,其将影响apiserver性能,详见kuberneets#80465
    • 提供开启/关闭 REST API及特性配置:–runtime-config=api/beta=false –feature-gates=AllBeta=false
    • 解决kube-apiserver goroutine泄露,详见kubernetes#83333
    • WatchBookmark特性1.17正式GA
  4. dns优化

    • kube-dns降权运行,详见kubernetes#82347
  5. 存储优化:

    a. CSI raw block特性

    • 拆分NodeStage / NodePublish
    • 修改重启kubelet时的volume重建逻辑

    b. VolumeSubpathEnvExpansion特性正式GA

  6. 控制器优化

    • 优化ReplicaSet处理逻辑:创建/删除时考虑pod相关性,详见kubernetes#80004

    • Pod Disruption Budged对象处理优化,详见kubernetes#83951


三、CNCF相关

  1. Jaeger项目顺利毕业

    相关介绍:Jaeger由Uber开源的端到端分布式追踪平台,用于监控与排查应用故障。

  2. Vitess项目顺利毕业

    相关介绍:Vitess最初在2010年由YouTube创建的一个内部解决方案,用于MySQL集群扩展 ,近期发布4.0版本。

  3. CNCF发布2019/2020赞助企划书及KubeCon相关日程

    会议:2020年KubeCon + CloudNativeCon + 中国开源峰会
    日程:中国上海|2020年7月28日-30日
    人数:4000多名参会者


参考资料