“「K8S 生态周报」内容主要包含我所接触到的 K8S 生态相关的每周值得推荐的一些信息。欢迎订阅知乎专栏「k8s生态」[1]。 ”
大家好,我是张晋涛。
runc v1.1.4 发布
runc 是一个底层容器运行时,我在之前已经写过很多篇文章介绍它了,感兴趣的小伙伴可以翻翻历史文章。上周它发布了 v1.1.4 版本, 这是 v1.1 系列的第 4 个 patch 版本。当前该项目正在积极的进行 v1.2 版本的开发。
大多数人都不会直接操作 runc 来启动容器,但是 runc 却是 Docker, containerd 等主流容器工具的底层依赖。本次 runc 新版本中修复的问题, 同样的也都会出现在 Docker 和 containerd 环境中。
具体包含如下内容:
- libct: fix mounting via wrong proc fd by kolyshkin · Pull Request #3510 · opencontainers/runc
这个 bug 确实存在挺长时间了,但由于触发的条件比较严格,所以一直未发现。究其原因是 mountFd 未被清理,并且它可能被用于后续的挂载操作所使用。
这里介绍下它的触发条件:
- userns 和 mountns 都被使用;
- cgroupns 未被使用;
- 使用 cgroup v1 ;
/sys/fs/cgroup
的挂载在 bind mount 之后;
本身这些条件要同时都满足就概率比较小,加上现在 containerd,Docker,Kubernetes,runc 等都已经支持了 cgroup v2 ,并且在逐步完成往 cgroup v2 的迁移,所以被这个 bug 影响的可能性相对较小。
- Fix error from runc run on noexec fs by kolyshkin · Pull Request #3522 · opencontainers/runc
这个 PR 修正了 runc run
命令在 noexec fs 上的权限问题。本质上来说它替换了 exec.LookPath
函数, 使用了如下函数进行替代。
func Eaccess(path string) error {
err := unix.Faccessat2(unix.AT_FDCWD, path, unix.X_OK, unix.AT_EACCESS)
if err != unix.ENOSYS && err != unix.EPERM { //nolint:errorlint // unix errors are bare
return err
}
// Faccessat2() not available; check if we are a set[ug]id binary.
if os.Getuid() == os.Geteuid() && os.Getgid() == os.Getegid() {
// For a non-set[ug]id binary, use access(2).
return unix.Access(path, unix.X_OK)
}
// For a setuid/setgid binary, there is no fallback way
// so assume we can execute the binary.
return nil
}
这里值得注意的一点是 faccessat2
使用 AT_EACCESS
是从 Linux v5.8 才开始提供支持的,不过这里通过 Go 的封装进行解决了。
- [1.1] Fix failed exec after systemctl daemon-reload (regression in 1.1.3) by kolyshkin · Pull Request #3554 · opencontainers/runc
此处修正了一处自 v1.1.3 起存在的一个 bug,可能导致在 systemctl daemon-reload
后,runc exec
失败的情况。
exec failed: unable to start container process: open /dev/pts/0: operation not permitted: unknown
这是由于 runc v1.1.3 中不再添加 DeviceAllow=char-pts rwm
规则了,当执行 systemctl daemon-reload
后, 会导致重新应用 systemd 的规则,进而导致这条规则的缺失。
该问题不仅仅会影响 runc,包括 containerd 和 Docker 都受到了影响,以及一些使用它们作为容器运行时的 Kubernetes 集群也受到了影响。解决办法是升级到 runc 的 v1.1.4 或者 containerd v1.6.8 版本即可。
以上就是 runc 新版本中值得关注的变更。建议仔细检查,尽早进行修复 。
Linkerd 2.12 正式发布
Linkerd 是 Service Mesh 领域中很重要的组成部分,近期发布了 v2.12 版本,其中有两个很重要的特性:
- 支持了 Gateway API (中的 HTTPRoute) ,具体信息可参考:https://buoyant.io/blog/linkerd-and-the-gateway-api
- 支持更细粒度的单路由策略,详情可参考:https://linkerd.io/2.12/tasks/configuring-per-route-policy/
我觉得上面的文章写的挺好的,我想聊的事情,在那篇文章中基本都聊到了,就不再重复了。
额外一点,Gateway API 被越来越多的厂商支持,整体而言是个好事情,可以促进 Gateway API 逐步达到毕业标准。
上游进展
- Fix rollout history bug by brianpursley · Pull Request #111093 · kubernetes/kubernetes
在执行 kubectl rollout history
的时候可以传递 --revision=3
拿到指定版本的信息。但是如果指定了 output format ,则 --revision
可能会失效。通过此 PR 便可解决此问题,但要到 v1.26 才会携带。
- Expose a pending pods summary in scheudler's dummper output by Huang-Wei · Pull Request #111726 · kubernetes/kubernetes
调度程序可以 dump 出更多信息。
- Revert "promote LocalStorageCapacityIsolationFSQuotaMonitoring to beta" by rphillips · Pull Request #112076 · kubernetes/kubernetes
由于 OpenShift 团队发现在使用它的时候存在一些问题, 将 LocalStorageCapacityIsolationFSQuotaMonitoring
重新回退到 Alpha 阶段。
以上就是本期的全部内容, 好了,我们下期再见!
参考资料
[1]k8s生态: https://zhuanlan.zhihu.com/container