1.runc hang 导致 Kubernetes 节点 NotReady
2.kubelet 远程调试方法
3.VS Code能代替VS吗?区分编辑器、源码编译器与集成开发环境?
4.VS Code 的编译 7 个开源替代品 | Linux 中国
5.什么是S2I--利用 S2I 方式构建镜像
runc hang 导致 Kubernetes 节点 NotReady
Kubernetes 1..3 OS: CentOS 7.9. Kernel: 5.4.-1.el7.elrepo.x_ Docker: ..6
线上告警提示集群中存在 2-3 个 K8s 节点处于 NotReady 的状态,并且 NotReady 状态一直持续。源码问题的编译解决可以通过两种方法,我们先来看看 A 方案。源码
针对 docker hang 住这样的编译同花顺无极轨道指标源码现象,通过搜索资料后发现了以下两篇文章里也遇到了相似的源码问题。这两篇文章都提到了是编译由于 pipe 容量不够导致 runc init 往 pipe 写入卡住了,将 /proc/sys/fs/pipe-user-pages-soft 的源码限制放开,就能解决问题。编译查看问题主机上 /proc/sys/fs/pipe-user-pages-soft 设置的源码是 。所以将它放大 倍 echo > /proc/sys/fs/pipe-user-pages-soft,编译然而 kubelet 还是源码没有恢复正常,pleg 报错日志还在持续,编译runc init 程序也没有退出。源码考虑到 runc init 是 kubelet 调用 CRI 接口创建的,可能需要将 runc init 退出才能使 kubelet 退出。通过文章中的说明,只需要将对应的 pipe 中的内容读取掉,runc init 就能退出。尝试了几个后,runc init 果然退出了。再次检查,节点状态切换成 Ready,pleg 报错日志也消失了,观察一天也没有出现节点 NotReady 的情况,问题(临时)解决。
对解决方案 A 的疑问,虽然问题解决了,但是仔细读 /proc/sys/fs/pipe-user-pages-soft 参数的说明文档,发现这个参数跟本次问题的根本原因不太对得上。pipe-user-pages-soft 含义是对没有 CAP_SYS_RESOURCE CAP_SYS_ADMIN 权限的用户使用 pipe 容量大小做出限制,默认最多只能使用 个 pipe,一个 pipe 容量大小为 k。这里就有疑问:为什么容器 root 用户 pipe 容量会超过限制。
定位问题最直接的方法,就是阅读源码。先查看下 Linux 内核跟 pipe-user-pages-soft 相关的代码。线上内核版本为 5.4.-1,切换到对应的版本进行检索。在创建 pipe 时,内核会通过 too_many_pipe_buffers_soft 检查是否超过当前用户可使用 pipe 容量大小。如果发现已经超过,则将容量大小从 个 PAGE_SIZE 调整成 2 个 PAGE_SIZE。通过机器上执行 getconf PAGESIZE 可以获取到 PAGESIZE 是 字节,也就是说正常情况下 pipe 大小为 字节,但是由于超过限制,pipe 大小被调整成 字节,这就有可能出现数据无法一次性写入 pipe 的问题。
找到问题根本原因的css框架源码第一步,往往是在线下环境复现问题。由于线上环境已经通过方案 A 做了紧急修复,因此,需要找到一种必现的手段。功夫不负有心人,在 issue 中找到了相同的问题,并且可以通过以下方法复现。执行命令之后,立刻就出现 runc init 卡住的情况。通过 lsof -p 查看 runc init 打开的文件句柄情况,可以看到 fd4、fd5、fd6 都是 pipe 类型,其中,fd4 和 fd6 编号都是 ,是同一个 pipe。如何来获取 pipe 大小来实际验证下「疑问 2」中的猜想呢?Linux 下没有现成的工具可以获取 pipe 大小,但是内核开放了系统调用 fcntl(fd, F_GETPIPE_SZ)可以获取到,代码如下。编译好之后,查看 pipe 大小情况如下。重点看下 fd4 和 fd6,两个句柄对应的是同一个 pipe,获取到的容量大小是 = 2 * PAGESIZE。所以的确是因为 pipe 超过软限制导致 pipe 容量被调整成了 2 * PAGESIZE。
对解决方案 A 疑问的探索,对解决方案 B 的考虑,线上应该如何做修复呢?是否需要把 docker 所有组件都升级呢?如果把 dockerd/containerd/runc 等组件都升级的话,就需要将业务切走然后才能升级,整个过程相对比较复杂,并且风险较高。因此考虑是否可以单独升级 runc?因为在 Kubernetes v1. 版本中还没有弃用 dockershim,因此运行容器整个调用链为:kubelet → dockerd → containerd → containerd-shim → runc → container。不同于 dockerd/containerd 是后台运行的服务端,containerd-shim 调用 runc,实际是调用了 runc 二进制来启动容器。因此,只需要升级 runc,对于新创建的容器,就会使用新版本的 runc 来运行容器。
通过测试环境验证,的确不会出现 runc init 卡住的情况了。最终,逐步将线上 runc 升级成 v1.1.1,并将 /proc/sys/fs/pipe-user-pages-soft 调整回原默认值。runc hang 住的问题圆满解决。
总结,本次故障的原因是,操作系统对 pipe-user-pages-soft 有软限制,mysqlclient 源码下载但是由于容器 root 用户的 UID 与宿主机一致都是 0,内核统计 pipe 使用量时没有做区分,导致当 UID 为 0 的用户 pipe 使用量超过软限制后,新分配的 pipe 容量会变小。而 runc 1.0.0-rc 正好会因为 pipe 容量太小,导致数据无法完整写入,写入阻塞,进而 runc init 卡住,kubelet pleg 状态异常,节点 NotReady。修复方案是 runc 通过 goroutine 及时读取 pipe 内容,防止写入阻塞。
kubelet 远程调试方法
Kubelet远程调试方法详解
Kubelet作为Kubernetes的核心组件,可以通过系统服务管理和编译工具进行远程调试。首先,理解kubelet的启动命令至关重要。在v1..4的K8s集群中,kubelet作为systemd服务,其配置文件位于</etc/systemd/system/kubelet.service.d/-kubeadm.conf>。通过执行ps -ef | grep /usr/bin/kubelet,可以查看完整的启动命令。 若需修改kubelet命令,可以先停止服务,然后使用相应参数重新启动,或者修改systemd配置后重启服务。编译kubelet时,推荐使用Kubernetes makefile源码中的编译指令,调整GOLDFLAGS和GOGCFLAGS以保留调试信息。编译完成后,kubelet二进制文件会位于_output/bin/kubelet。 对于Go语言的调试,Delve是一个高效工具,尤其适合调试标准工具链构建的Go程序。可以通过安装命令轻松获取,并使用它来调试kubelet。例如,使用dlv命令行进行调试步骤包括设置地址和端口,以及在GoLand IDE中配置并启动kubelet进行调试。 除了Kubelet,其他容器软件如runc和docker-cli也可通过修改编译命令进行调试。例如,runc和dockerd的编译过程中,需要在scripts/build/binary或hack/make/.binary文件中相应位置调整编译参数。 获取更多详细教程和实践步骤,可以参考ssst0n3.github.io/post/...。通过以上步骤,你可以有效地对kubelet和其他容器软件进行远程调试,提升开发效率。VS Code能代替VS吗?区分编辑器、专业修改源码编译器与集成开发环境?
在编程世界里,VS Code和Visual Studio(VS)就像一对并肩作战的伙伴,各自有着独特的角色和优势。VS Code以其强大的源代码编辑能力,为开发者提供了语法高亮、智能代码补全等基础且实用的功能,它是轻盈的开源选择,专注于满足基本的代码编写需求。VS Code的插件生态系统丰富,无论是文件管理、命令行集成,还是针对特定语言的定制,都能轻松实现。 然而,VS则是一把更为锋利的剑,它是一个完整的集成开发环境(IDE),集成了编译器、调试器和工程管理等多功能于一体。VS的强大之处在于它提供了一站式的解决方案,代码生成器、WYSIWYG设计工具和多语言支持使得开发速度和效率得到显著提升。它的界面设计直观,窗口布局紧凑,适合大型项目开发和团队协作。 在编译器层面,两者均内置了编译功能,但VS的编译器MSVC是Windows开发的首选,同时支持其他编译器如gcc和llvm。VS Code则需要额外安装和配置,但它支持多种编程语言的编译器,为开发者提供了更大的灵活性。 作为IDE,VS的全功能特性使其在项目开发的全生命周期中扮演着重要角色,从代码编写、调试,到打包和发布,它都提供了完整的支持。相比之下,VS Code虽然不是完整的IDE,但通过其内置的Git、Docker和Kubernetes扩展,使得开发人员能够在实际项目中高效工作。 总的来说,VS适合需要全方位开发支持和强大功能的大型项目,而VS Code则更适合独立开发者和小型项目,它以轻量和扩展性赢得了众多开发者的青睐。每款工具都有其适用的场景,选择哪个,取决于你的js validate 源码项目需求和个人偏好。 如果你对我的解答满意,那就请给予肯定,一个赞同就是对我们工作的认可。我会持续在这里,为你的疑问提供详尽的解答! 我是 @爱次肉丸鸭VS Code 的 7 个开源替代品 | Linux 中国
为了避免使用微软版本的 VS Code,我们需要另行选择一个开源的代码编辑器。
Visual Studio Code,简称 VS Code,是一款跨平台代码编辑器,适用于 Linux、Windows 以及 macOS。它不仅可以编辑简单文本,还可以像集成开发环境(IDE)一样管理整个代码库。它可以通过插件进行扩展,并被证明是一个可靠的文本编辑器,轻松击败非开源的强大竞品编辑器。
微软以开源的方式发布了 VS Code,但下载的版本并非开源。不过,你仍有办法以开源方式使用 VS Code,或者选择其它的开源替代品。
以开源方式构建 VS Code
你可以在 GitHub 获得 VS Code 的源代码。然而,当你从微软下载 VS Code 时,你会发现它是基于微软软件许可证授权的。这并不是一个开源许可证。其区别在于构建过程。
Chris Dias 是微软 VS Code 项目开发者之一,他对 VS Code 作了一个对比,就像 Chrome 浏览器和其开源的“上游”项目 Chromium 一样。VS Code 确实是基于开源代码库构建的。微软官方发布的版本带有一些与微软相关的功能,包括一项商标、一个插件库、一个 C# 调试器以及遥测。但如果你克隆仓库然后自行编译,这些东西都不会被加入,所以你会得到一个名为 Code - OSS 的“干净”版本(OSS 代表开源软件)。
实际上,VS Code 与 Code - OSS 之间的差异很小。最值得注意的是,VS Code 包含遥测功能,它会记录使用数据。微软不可能监控你的一举一动,而且目前越来越多软件都在收集使用数据。是否在乎 VS Code 的遥测功能,完全取决于你自己。如果你不希望它追踪你的使用情况,这里有一些很棒的 VS Code(开源)替代品。
VSCodium
最简单的替代方案就是构建不带微软附属功能的 VS Code 版本。VSCodium 项目提供了可下载的 Code-OSS 可执行文件,它基于 VS Code 代码库编译,没有配置微软的 product.json 中的改变。VSCodium 的开发者还竭尽全力禁用了所有难以寻找的遥测选项,除非你自行编译,否则这已经是你能找到的最干净的 VS Code 版本了。
VSCodium 提醒说,VS Code 悄悄地包含了一些专有工具,这些工具无法与开源版本一起提供。这包括一个 C# 调试器和部分插件。如果你需要它们,可以在 [文档中] 找到解决办法。假如你依赖 VS Code 中某些特定的功能,你应该验证它在 VSCodium 中是否可以发挥功用。
此外,你还应该验证是否已禁用所有的遥测功能。
Code - OSS
如果不想用 VSCodium 的版本,你可以自己从头编译 VS Code,得到一样的版本。可执行文件叫做 Code - OSS,而不是 VSCode,适用于 VSCodium 的许可证限制也适用于你的构建,而工作方式也是一样。
如果通过编译源码构建应用,首次启动时你要确保 [所有遥测都已经被禁用]。
Atom
Atom 是一个类似于 IDE 的文本编辑器,当微软收购 Github 的同时也收购了它。和 VS Code 一样,你可以使用插件,扩展 Atom 编辑器,此外,你还能通过自己的工具和主题实现定制。它开源且与 Github 集成。简而言之,只要你能找到你想用的插件,或者你愿意自己动手写,那么 Atom 几乎可以满足你的一切需求。
跟 VS Code 一样,Atom 也默认包含遥测。你可以禁用这个功能,而且跟 VS Code 不同的是,使用插件不受任何限制,所以不必再因为隐私改变你的工作流。对写代码的人来说,毫无疑问 Atom 是很有用的工具,而对于使用电脑的任何人,它同样会是一个很赞的编辑器。如果你需要一个顺手的通用文本编辑器,请试试 Atom。
GNOME Builder
为 GNOME 桌面而开发的 IDE,GNOME Builder 是一个 Linux 平台的代码编辑器,专门用于构建 GNOME 应用。如果你为 Linux 构建应用程序,希望轻松解决兼容性问题,那么 Builder 就是最简单的选择。从 Flathub.org 安装 Builder;当你开启一个新项目,如果没有安装 GNOME SDK,它会提醒你。这意味着当维护你的应用时,你不必刻意关注 GNOME 的状态,因为 Builder 在替你做这件事。
然而,Builder 不仅能够构建 GNOME 程序。它还支持各种各样的编程语言,包括 Python、Rust、C/C++、Java、Go、JavaScript、TypeScript、VB.NET、Markdown 和几种标记语言等等。它对部分语言有全面的支持,包括自动补全以及弹出式函数定义,但是其它语言仅仅含有一些比较方便的功能,例如语法高亮跟自动匹配括号。不管你是不是一个专门的程序员,或者你只想要一个给力的 HTML 和 CSS 编辑器,这个 IDE 都能让你舒心使用。
Geany
Geany 是一个强大、稳定而轻量级的编辑器,它有很多有用的特性,能帮你写 Bash、Python、Lua、XML、HTML、LaTex,当然远不止这些。对 种各种编程及脚本语言、标记语言和各种文件类型(比如 .diff 和 .po),Geany 都有很好的支持。退一万步讲,Geany 还有括号匹配和语法高亮 —— 通常来说,它包含更多功能。
Geany 是一个小型编辑器,但是通过插件,你可以为它添加特性,例如项目视图面板、文件系统树、调试、终端等,直到它看起来像一个 IDE。当然,萝卜白菜各有所爱,你也可以尽量使它保持简洁易用。如果因为电脑 CPU 或者内存的限制而无法使用 VS Code,那么很明显 Geany 可以作为你的选择。它只占用少量内存,而且启动迅速。即便跟运行在终端里的 Vim 相比,Geany 稍显笨重,但就算在树莓派,它也能做到快速、灵活。
Brackets
Brackets 是一款面向网页开发者的文本编辑器和 IDE。对于 HTML、CSS、JavaScript、PHP 甚至 Python,它都有很强大的支持。而且跟 VS Code 一样,它也有一个很丰富的插件生态,所以你可以最大限度地扩展它,以适应你所有编程语言的工作。
有的插件用于辅助解析语言、运行脚本,甚至编译执行代码。Brackets 有一个传统的界面,不管你是否熟悉 IDE 或者像记事本一样简单的文本编辑器,都能驾轻就熟。如果稍微花点时间,添加几个相关插件,然后熟悉它们,你会发现 Brackets 真的是一个很精妙、很有用的编辑器,不管你输入什么,它都能通过自动补全、提示帮你避免低级错误。假如你是程序员,它能帮你加快测验和调试周期。
Che
如果你喜欢新技术,那你应当尝试 Che 编辑器。这是一个基于云的 IDE,所以它默认以软件即服务(SaaS)的形式运行,但它是完全开源的,如果你有 Kubernetes 实例,那就可以运行为你自己的 SaaS。
Che 不仅是一个在线 IDE,而且是一个为云开发而构建的 IDE。在 Che 的概念里,用户无需查看本地文件系统。由于它在云端工作,所以你也可以这么做。事实上,如果你有一台 Git 服务器,那就可以直接把它当作你的文件系统,在它的仓库中完成你的项目。当然,你也可以下载所有文件做本地备份。
但 Che 的主要特点,也是云开发者最为兴奋的一点,它是一个功能全面、带有 Kubernetes 感知功能的开源 IDE。如果你正在为云构建应用、网站或容器(或三者的组合),那么 Che 是一个你需要尝试的编辑器。
那么你的选择是?
你有没有在使用这些 VS Code 替代品中的某一个呢?想不想挑一个试试呢?欢迎在评论中分享你的见解。
什么是S2I--利用 S2I 方式构建镜像
S2I:源码到镜像的构建魔法 S2I,全称Source-to-Image,是OpenShift Container Platform中的一种独特镜像构建方式,它为开发者提供了一种无需Dockerfile即可构建可复现容器镜像的创新路径。相较于传统的Dockerfile方式,S2I以一种更为灵活且模块化的方式简化了镜像构建过程。 与Dockerfile的对比 Dockerfile构建方法流程清晰,通过逐行指令,直接从源代码生成镜像成品。然而,S2I则引入了额外的层次和组件。首先,它从基础镜像构建器(Builder Image)开始,根据预先定义的S2I脚本,如assemble、run、save-artifacts和usage,进行环境设置、编译源代码、部署服务并启动。这个过程多了S2I脚本的指导和基础镜像的使用,使得构建过程更加灵活和可定制化。 选择S2I的理由 S2I的核心价值在于将环境设置和源码编译部署这两个部分分离,极大地提高了效率。通过复用基础镜像,如Python、CentOS或Node.js,开发者可以专注于他们的代码,无需过多关注底层环境配置。对于团队协作,S2I使得开发人员无需深入理解Docker细节,只需关注代码的开发和维护,降低了知识门槛。 在OKD中的实践 在Red Hat OpenShift (OKD)中,S2I构建流程分为几个关键步骤:基础镜像基础
运维人员构建基础镜像,包含通用依赖和环境变量,可复用到多个服务,也可根据需求定制。OKD提供了预设的Java基础镜像模板,如Tomcat,为快速搭建提供便利。
持续集成与自动化
通过Jenkins等工具,自动化构建流程,接收代码、生成配置、编译打包,触发OpenShift构建,确保部署的精确性和一致性。
assemble脚本的应用
从私有仓库获取基础镜像,结合源码或打包文件,安装特定依赖,最终构建出运行时镜像,并通过ImageStream上传到私有仓库,由deploymentconfig或deployment监控并自动部署到Kubernetes集群。
DeploymentConfig的部署策略
DeploymentConfig监控ImageStream的变化,一旦有新版本,就触发部署,将镜像无缝地部署到集群中,保证服务的实时更新。
S2I的出现,使得容器镜像构建更加灵活和高效,为DevOps团队提供了更加直观、易用的解决方案,极大地提升了开发和运维的效率。