大家好,我是张晋涛。
Kubernetes v1.30 是 2024 年发布的第一个大版本,包含了 45 项主要的更新。 对比去年的话,v1.27 有近 60 项,v1.28 有 46 项,v1.29 有 49 项。可以看到 Kubernetes 变得更加谨慎了,会更加保守的控制进入其核心的功能。
恰好前些天我在 “硬地骇客” 播客上录制了一期节目,正好提到 Kubernetes 现在是不是变得太复杂了,感兴趣的话可以听一下。
具体来看 v1.30 版本中有 10 个增强功能正在进入 Alpha 阶段,18 个将升级到 Beta 阶段,而另外 17 个则将升级到稳定版。
这次的版本称之为 “Uwernetes” 是 UwU
和 Kubernetes
的组合,因为发布团队认为这个版本是最可爱的版本了,也是对所有参与到 Kubernetes 生态中的人的一种致敬。让我们一起探索这个充满爱和喜悦的版本吧 UwU
我维护的 「k8s生态周报」每篇都有一个叫上游进展的部分,会发一些 Kubernetes 上游中值得关注的内容。不过我年终总结中提到了,我断更了一段时间,之后会继续更新的,感谢大家的支持。
Pod 调度就绪机制达到 GA
这个功能实际上是从 Kubernetes v1.26 开始增加的。是 KEP 3521 的第一部分。并且在 v1.27 时候达到了 Beta。
我们来快速的回顾一下 Pod 的创建过程。
当 client 通过 kube-apiserver 创建成功 Pod 资源后,kube-scheduler 会去检查尚未被调度的 Pod,然后为其进行调度,分配 Node。之后 Node 获取到调度到该 Node 上的 Pod 然后进行创建。(这里省略了很多细节,但其他的部分与我们此处要介绍的内容关系不太大,就不展开了。)
根据上述的过程,我们可以发现,在 Pod 创建成功后,其实就默认该 Pod 是可以被调度了,kube-scheduler 就应该开始工作了。
但在实际的场景中,Pod 通常还会需要一些其他的资源,最典型的比如存储。在一些环境中,这些资源是需要预先进行创建的,尤其是在一些云厂商的场景中,还需要检查用户账户中是否还有余额可以用于创建云盘等。
一但前置的依赖无法满足,假如 kube-scheduler 已经完成了 Pod 的调度,那么 kubelet 侧就会处于尝试创建 Pod ,但失败的情况。
这个 KEP 的出现就可以很好的解决这个问题,增加了一个 Pod 是否准备好被调度的机制。如果前置依赖不满足,那么 Pod 就无需被调度,这也不会消耗资源。kube-scheduler 和 kubelet 都无需进行处理。待条件满足,Pod 再被调度和创建即可。
![3e79eff172db061a5dc5935963ebc33b.png](https://img-blog.csdnimg.cn/img_convert/3e79eff172db061a5dc5935963ebc33b.png)
这个机制我个人感觉还是挺好的,甚至我可以有更灵活的策略来控制应用的副本。比如在大流量,需要动态扩容的场景下,我可以利用此机制预先创建一些 Pod 资源以及准备好它的依赖, 甚至可以在 Node 上准备好镜像等。当需要增加副本时,直接标记 Pod 可被调度,
使用时,通过配置 Pod 的 .spec.schedulingGates
即可。例如:
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
schedulingGates:
- name: moelove.info/disk
- name: foo.bar/xyz
containers:
- name: kong
image: kong:3.6
注意这里可以为它设置多个 schedulingGates
但是要确保它们的唯一性。
如果将上述配置应用到 Kubernetes 集群中,则会看到
➜ ~ kubectl get pods
NAME READY STATUS RESTARTS AGE
test-pod 0/1 SchedulingGated 0 17s
.status
中也会有相关输出:
status:
conditions:
- lastProbeTime: null
lastTransitionTime: null
message: Scheduling is blocked due to non-empty scheduling gates
reason: SchedulingGated
status: "False"
type: PodScheduled
phase: Pending
qosClass: BestEffort
那么何时能正常调度呢?我们在实现对应的 controller 或者 operator 时,只需要移除 schedulingGates
的配置即可。
kubectl 交互式删除达到 GA
很多人都会直接使用 kubectl
进行 Kubernetes 集群的管理,包括资源的创建和删除等。删除操作是很危险的动作,并且不可逆,如果由于错误的拼写,不小心的复制粘贴或者错误的补全等, 不小心误删了重要的资源,可能会带来一些不小的麻烦。
这是一般情况下的删除操作,在回车后就直接执行了。