「K8S 生态周报」内容主要包含我所接触到的 K8S 生态相关的每周值得推荐的一些信息。欢迎订阅知乎专栏「k8s生态」。
大家好,我是张晋涛。
这是 2023 年的第一篇『K8S 生态周报』,在上个月的月中之后我因为阳了就停止更新了,一直在修养身体。生病相关的内容我在上一篇文章 张晋涛:我的 2022 总结 | MoeLove有做介绍。愿大家都注意身体,保持健康。
这篇中的内容同样也包含了近一个月中值得关注的内容。
containerd v1.6.15 发布
尽管 containerd 的 1.7.0-beta.2 也已经于近期发布,但正式版发布还需要一段时间。现在 containerd 使用最多的还是 v1.6 和 v1.5 这两个主要版本,
这次发布的 v1.6.15 中有一个非常关键的变更,是 #7845 - CRI: Fix no CNI info for pod sandbox on restart by dcantah
我主要也是想聊一下这个,从 v1.6.9 开始的最近几个 containerd 版本中都受到了此问题影响。
简单来说就是 containerd 重启后,Sandbox IP 没能保留,最终导致 kubelet 将会重启 Pod (如果重启 kubelet)。
具体现象如下,在 Node 上通过 crictl 工具查看任意未使用 HostNetwork 的 Pod 的 .status.network
字段,可以看到如下结果:
(MoeLove) ➜ crictl -r unix:///run/containerd/containerd.sock inspectp e03077da768e6 | jq .status.network
{
"additionalIps": [],
"ip": "10.244.1.5"
在重启 containerd 后,再次重复操作,就会发现 .status.network.ip
字段为空了:
(MoeLove) ➜ crictl -r unix:///run/containerd/containerd.sock inspectp e03077da768e6 | jq .status.network
{
"additionalIps": [],
"ip": ""
不过次是如果在 Kubernetes 集群中通过 kubectl 查看该 Pod 的状态,会发现 Pod 的 IP 还在。
(MoeLove) ➜ kubectl get pods moelove-test-pods -o json | jq .status.podIPs
[
{
"ip": "10.244.1.5"
}
]
但如果在 Node 上重启 kubelet,再次查看 Pod 的状态,则会发现它的 IP 发生了变化,并且还重启了。
(MoeLove) ➜ kubectl get pods moelove-test-pods -o json | jq '{podIPs: .status.podIPs, restartCount: .status.containerStatuses[].restartCount}'
{
"podIPs": [
{
"ip": "10.244.1.8"
}
],
"restartCount": 1
}
在生产环境中,比如要进行版本升级,或者一些维护操作,kubelet 发生重启是一件常规的事情。
但上述这种情况, 在大多数生产环境都是不能接受的。 这将会导致 Node 上的 Pod 都发生重启,进而可能会影响到业务的稳定性。
现在 containerd 上游已经进行了修复,也 cherry-pick 到了 v1.6.15 中。
所以,如果想要避免或者修正此问题,
可以使用低于 containerd v1.6.9 的版本,或者直接更新到 v1.6.15。
更多关于 containerd 新版本的变更,请参考其 ReleaseNote
Apache APISIX Ingress v1.6 发布
距离上一个版本 v1.5 发布,已经过了 3 个月,Apache APISIX Ingress v1.6 终于正式发布!
在这个版本中,共有 29 位贡献者参与代码提交,其中 17 位是新增贡献者,感谢大家的支持和参与!
本次发布的 Apache APISIX Ingress v1.6 版本带来了众多新特性,主要集中在对 Gateway API 的支持,扩展 APISIX Ingress 的使用场景,和一些易用性方面的提升。以下是一些重点特性的介绍。
扩展对 Gateway API 的支持
Gateway API 是 Kubernetes 中下一代的 Ingress 规范,致力于提供富有表现力,可扩展和面向角色的接口来发展 Kubernetes 的网络,各个 Ingress controller 项目都在积极推进对该规范的支持。Apache APISIX Ingress 项目自 2021 年开始就在积极的紧跟上游社区的发展,并积极推进 Gateway API 在 APISIX Ingress 项目中的实现。
当前,Apache APISIX Ingress 项目中通过 Gateway API 进行配置的特性尚处于 beta 阶段,欢迎大家在测试环境中积极进行测试,并提供反馈,我们将持续的对此特性进行优化和改进,尽早完成此特性的 GA。
在 APISIX Ingress v1.6 版本中,我们添加了对 Gateway API 中的 TCPRoute
和 UDPRoute
这两种资源的支持,同时,扩展了对 HTTPRoute
资源中 Filters
的支持,这样用户在使用 HTTPRoute
资源的时候,就可以在该资源中应用一些重定向,Header 改写等能力了。
例如可以使用如下配置:
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: HTTPRoute
metadata:
name: http-route
spec:
hostnames: ["httpbin.org"]
rules:
- matches:
- path:
type: PathPrefix
value: /headers
filters:
- type: RequestHeaderModifier
requestHeaderModifier:
add:
- name: X-Api-Version
value: v1
- name: X-api-key
value: api-value
set:
- name: X-Auth
value: filter
remove:
- Remove-header
backendRefs:
- name: httpbin
port: 80
通过使用此配置,client 在对 httpbin.org
进行请求时,将会添加 "X-Api-Version": "v1"
和 "X-Api-Key": "api-value"
的请求头,并将 "X-Auth"
请求头的值设置为 filter
,同时将移除 "Remove-Header"
这个请求头 。
另外就是在这个版本中,增加了对外部服务的代理以及 ExternalName Service 支持;还有支持和外部服务注册发现组件的集成,比如 Consul, Nacos,Eureka, DNS 等,
而 这些功能在很多 Ingress controller 中是不具备的 。
此外,我们也积极的和众多开源项目进行了协作,比如可以和 Flagger 以及 Argo 等 GitOps 领域的主流项目集成。关于 Flagger 和 Argo 等相关项目的使用,可以查看我之前写的文章。
欢迎感兴趣的小伙伴查看具体的 ReleaseNote
KEDA v2.9 正式发布
KEDA 是一个基于 Kubernetes ,由事件驱动的自动扩容组件,它为部署在 Kubernetes 上的应用提供了非常灵活的弹性伸缩的能力。
它最新发布的 v2.9 包含了很多值得注意的更新:
- 新增了基于 CouchDB, Etcd 和 Loki 的缩放器;
- 为应用程序自动所放引入现成的 Grafana Dashboard;
- 提供了经过改进的 Prometheus metrics;
- 实验性的支持了在轮询间隔期间为缩放器缓存指标值的功能;
- 关于 metrics 指标如何暴露给 Kubernetes 的性能改进和架构变化;
- Azure Key Vault 身份验证提供程序现在支持用于身份验证的容器标识;
- 针对我们 50 多个缩放器中的一些缩放器的大量新功能和修复;
另外需要注意的是,根据 KEDA 的废弃策略,自 v2.9 开始官方仅为 Kubernetes v1.23 及更新版本提供支持。
HPA 的 apiVersion 也从 autoscaling/v2beta2
升级到了 autoscaling/v2
。
更多关于此版本的变更,请查看 ReleaseNote
上游进展
- kubernetes components using leader election to leases by aimuz · Pull Request #114055 · kubernetes/kubernetes 我在之前的文章中介绍过,Kubernetes 中的选举机制,之前使用基于 ConfigMap 和 secrets 的比较多,但是自 Kubernetes v1.27 开始,将仅仅允许使用 Lease 的接口进行选举相关操作了;
- Add metric for max no. of CIDRs available by aryan9600 · Pull Request #112260 · kubernetes/kubernetes 新增了
cidrset_cidrs_max_total
和multicidrset_cidrs_max_total
metrics,用于暴露有多少 CIDRs 可供分配; - Migrate to runtime.v1 for CRI · Issue #125 · Mirantis/cri-dockerd 目前 Mirantis 维护的 cri-dockerd 项目也已经将 CRI 升级到了 runtime.v1 了,这样就可以和 Kubernetes 新版本进行兼容,配合使用了;
- Release v1.9.0-beta.1 · kyverno/kyverno Kyverno 发布了 v1.9.0-beta.1 版本;
- Release v1.13.0-rc4 · cilium/cilium Cilium v1.13.0-rc4 发布;
- Release v23.0.0-rc.1 · moby/moby Docker v23.0.0-rc1 发布,这次应该不会跳票了,现在试用里面便有我的一些努力;
其他
- CircleCI security alert: Rotate any secrets stored in CircleCI (Updated Jan 7) CircleCI 中的一些信息可能遭到了泄漏,所以建议用户尽快修改其中的机密信息。(我已经注销了账户)
- update image to v1.7.0 by wangyang0616 · Pull Request #2636 · volcano-sh/volcano 看起来 volcano 是打算发布 v1.7 版本了
欢迎订阅我的文章公众号【MoeLove】