CI Weekly #6 | 再谈 Docker / CI / CD 实践经验

CI Weekly 分享了Docker容器化应用的持续交付经验,包括百度的质量部实践和Jenkins、Docker在部署流水线中的应用。此外,还探讨了前端项目的持续集成、腾讯的毫秒服务引擎MSEC开源、基于Appium的Android UI自动化测试以及阿里巴巴的分层自动化实践。

CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成、持续交付,持续部署、自动化测试、 DevOps 等实践教程、工具与资源,以及一些工程师文化相关的程序员 Tips 。同步于 flow.ci Blog、微信公众号、官方微博知乎专栏简书,欢迎关注或投稿:)

嗨,上周我们对 iOS/Android 项目持续集成做了比较多的功能优化,同时恢复了对 GitLab 的支持,修复了一些常见问题,详情见flow_ci changelog,如有问题可通过「在线消息」或去Gitter群 及时反馈 :)

下面递上一份新鲜的 CI Weekly,这期收录了关于Docker/CI/CD实践、自动化测试、DevOps相关的国内外技术文章,希望对你有用~

『 Docker/CI/CD实践 』

Docker容器化应用持续交付实践

本文百度质量部以 网盟合一(零号DSP)项目过程中建立起来的通用容器化交付系统EMC为案例,分享了基于Docker的容器化应用持续交付实践经验。(via:百度质量部

项目DevOps研发云CI实践之路

笔者所在项目在敏捷推进过程中,已经建立了一套以Jenkins为核心的CI持续集成系统,并分享了相关的实践情况经验。(via :中兴开发者社区)

部署流水线搭建小记:Docker、Jenkins、Java和Couchbase

这篇文章讲述了如何用Jenkins和Docker来为一个需要和数据库交互的Java应用创建部署流水线(deployment pipeline)。(via : dockone.io

flow.ci

前端开源项目持续集成三剑客

Github 项目都会有徽章 (badage) ,这展示了代码的测试覆盖率构建状态在各个浏览器中的运行情况,这会让项目显得更加专业和有说服力。本文笔者集齐了一套徽章的亲身经历,总结了过程中的主要流程和一些踩到的坑!(via : 百度EFE)

腾讯毫秒服务引擎 MSEC开源

腾讯开源的MSEC 集 RPC、名字发现服务、负载均衡、业务监控、灰度发布、容量管理、日志管理、key-value存储于一体。(via: 开源中国

A Simple Introduction to Microservices

一个微服务的简洁手册,包含了微服务的定义、特点、优缺点、案例等等。(via : Medium @flow.ci

Building, Testing and Deploying Django App with Bitbucket Pipelines

使用Bitbucket Pipelines 来Building, Testing and Deploying Django App,感兴趣的可以看看。( via :Medium@ozren

flow.ci

『 自动化测试/DevOps 』

基于 Appium 的 Android UI 自动化测试

好的自动化测试机制能够让开发者及早发现编码中的逻辑缺陷,将风险前置。为什么需要UI自动化测试?来看看这篇文章。(via :@美团点评技术团队李磊 )

揭秘阿里巴巴分层自动化实践之路

为什么外部环境、业务变更、应用环境问题、执行机问题、数据问题、框架问题这些都能引起这么多失败呢?结合多年自动化实践与总结,12月8日16:00 阿里云效开启《阿里巴巴持续集成持续交付之分层自动化》直播分享,感兴趣的可以看看。(via :阿里云效平台

基于 DevOps 理念的私有 PaaS 平台实践

本文将系统的从4个方面,分享YY互娱运维团队对于 PaaS 运维平台实践经验及未来展望,希望对大家有一些参考意义。(via:刘亚丹 YY 互动)

How your startup can leverage production-grade infrastructure for less than $200/month

这篇文章的目的是帮助你专注于于生产级别的服务集合,尽量减少时间和金钱花费在基础设施上。(via :Medium@jp.delimat
flow.ci


以上是 CI Weekly #6 的所有技术分享,
如有问题,请联系我们~

Happy building!

flow.ci

<think>我们面对的是两个主要错误: 1. mkdir failed for /var/run: Read-only file system 2. Failed to setup cgroup2 directory 根据用户提供的引用,虽然引用内容是关于kubelet配置文件的,但我们可以推断用户可能是在部署Kubernetes节点时遇到这些错误。然而,错误本身与文件系统挂载和cgroup配置有关。 首先,我们分析错误原因: 1. "mkdir failed for /var/run: Read-only file system": - 这表明系统试图在`/var/run`目录下创建目录或文件,但该目录所在的文件系统被挂载为只读(read-only)。通常,`/var/run`是一个临时文件系统(tmpfs),在Linux系统中应该被挂载为可读写(rw)。 2. "Failed to setup cgroup2 directory": - cgroup(控制组)是Linux内核的功能,用于资源管理和隔离。cgroup v2是较新的版本。这个错误表明系统在设置cgroup v2目录时失败,可能与文件系统权限或挂载方式有关。 解决思路: 1. 检查文件系统挂载状态: - 确认根文件系统(/)是否以只读方式挂载。有时系统在启动过程中如果检测到文件系统错误,会以只读方式重新挂载。 2. 重新挂载文件系统为可读写: - 如果根文件系统被挂载为只读,我们可以尝试重新挂载为可读写。 3. 检查并挂载cgroup2: - 确认cgroup2是否已挂载。在支持cgroup v2的系统上,需要挂载到`/sys/fs/cgroup`。 具体步骤: 步骤1:检查文件系统挂载状态 - 运行命令:`mount | grep -E &#39; / | /var/run&#39;` - 观察输出中根目录(/)和/var/run的挂载选项。如果看到`ro`(只读),则需要重新挂载。 步骤2:重新挂载根文件系统为可读写(如果只读) - 执行:`mount -o remount,rw /` - 然后检查:`mount | grep &#39; / &#39;`,应该显示`rw` 步骤3:检查/var/run挂载 - 通常,/var/run是一个tmpfs,应该被挂载为可读写。如果没有挂载,可以尝试:`mount -t tmpfs tmpfs /var/run` 步骤4:处理cgroup2错误 - 检查cgroup2挂载:`mount | grep cgroup2` - 如果没有挂载,尝试挂载: ``` mkdir -p /sys/fs/cgroup mount -t cgroup2 none /sys/fs/cgroup ``` - 如果已经挂载,检查权限和挂载选项。 步骤5:确保系统启动时自动挂载 - 如果上述步骤是临时生效,重启后可能还会出现。需要修改`/etc/fstab`文件,确保根文件系统以可读写方式挂载,并添加tmpfs和cgroup2的挂载项(如果不存在)。 示例/etc/fstab条目(根据需要添加): - 对于tmpfs:`tmpfs /var/run tmpfs defaults 0 0` - 对于cgroup2:`cgroup2 /sys/fs/cgroup cgroup2 defaults 0 0` 步骤6:重启系统并检查 - 重启后,使用`mount`命令检查挂载情况。 注意:如果文件系统有错误(如磁盘错误),重新挂载为可读写可能不会持久,或者系统可能再次挂载为只读。因此,在重新挂载后,建议运行文件系统检查(fsck)。 如果问题仍然存在,可能需要考虑硬件故障或更深入的系统日志分析(使用`dmesg`或`journalctl`)。 下面是一个完整的解决流程: ### 解决"/var/run只读文件系统"和"cgroup2目录设置失败"错误 #### 一、错误原因分析 1. **只读文件系统**:系统检测到磁盘错误或挂载选项错误时,会以只读方式挂载文件系统防止进一步损坏[^1]。 2. **cgroup2挂载失败**:通常由以下原因导致: - cgroup v2未在内核中启用 - 挂载点目录不存在 - 系统资源不足 #### 二、紧急恢复操作 ```bash # 1. 重新挂载根目录为读写模式 mount -o remount,rw / # 2. 创建临时挂载点(如果缺失) mkdir -p /var/run # 3. 挂载tmpfs到/var/run mount -t tmpfs tmpfs /var/run # 4. 挂载cgroup2 mkdir -p /sys/fs/cgroup mount -t cgroup2 none /sys/fs/cgroup ``` #### 三、永久性修复方案 1. **修改/etc/fstab文件**: ```bash # 备份原文件 cp /etc/fstab /etc/fstab.bak # 编辑fstab nano /etc/fstab ``` 添加以下条目: ``` tmpfs /var/run tmpfs defaults 0 0 none /sys/fs/cgroup cgroup2 defaults 0 0 ``` 2. **检查根文件系统挂载选项**: 确保根目录挂载行包含`rw`选项,例如: ``` /dev/mapper/ubuntu--vg-ubuntu--lv / ext4 rw,relatime 0 1 ``` 3. **修复磁盘错误**: ```bash # 卸载文件系统(若根目录无法卸载,可尝试在救援模式下操作) umount /dev/sda1 fsck -y /dev/sda1 ``` #### 四、系统重启验证 ```bash reboot # 重启后检查 mount | grep -E &#39; / | /var/run|/sys/fs/cgroup&#39; ``` #### 五、故障排查流程图 ```mermaid graph TD A[启动失败] --> B{检查日志} B -->|只读文件系统| C[尝试remount rw] B -->|cgroup2错误| D[检查内核支持] C --> E[成功?] E -->|| F[修复fstab] E -->|| G[进入救援模式] D --> H[内核>=4.5?] H -->|| I[手动挂载cgroup2] H -->|| J[升级内核] ``` #### 六、技术原理 - **tmpfs作用**: $$ \text{Memory}_{\text{RAM}} \xrightarrow{\text{tmpfs}} \text{/var/run} $$ 将临时文件存储在内存中,加速访问并避免磁盘磨损[^2]。 - **cgroup2资源管控**: ```mermaid sequenceDiagram 进程->>cgroup2: 申请资源 cgroup2->>内核: 查询当前资源使用 内核-->>cgroup2: 返回使用量 cgroup2->>进程: 分配资源或限制 ``` --- ### §§ 相关问题 §§ 1. 如何检查Linux系统是否启用了cgroup2? 2. 系统启动时自动进入只读模式该如何处理? 3. 在Kubernetes节点部署中如何避免cgroup配置错误? 4. 如何通过GRUB修复无法挂载为读写模式的问题? 5. 在Docker容器中遇到"Read-only file system"错误应如何解决?[^3]</think>### 解决 "mkdir failed for /var/run: Read-only file system" 和 "Failed to setup cgroup2 directory" 错误指南 #### 一、错误原因分析 1. **只读文件系统问题**: - 系统检测到磁盘错误或挂载配置错误时,会自动将文件系统挂载为只读模式以防止数据损坏[^1] - 常见触发场景: - 文件系统损坏(如意外断电) - 磁盘空间耗尽 - `/etc/fstab` 配置错误 - 硬件故障(SSD/HDD坏道) 2. **cgroup2目录设置失败**: - 系统未启用cgroup2或挂载点配置错误 - 容器运行时(如Docker/containerd)与cgroup版本不兼容 - 内核版本过低(cgroup2需要Linux 4.5+) - 权限问题(特别是SELinux/AppArmor限制) ```mermaid graph TD A[错误原因] --> B[/var/run 只读/] A --> C[cgroup2 失败] B --> D[文件系统损坏] B --> E[磁盘空间不足] B --> F[fstab配置错误] C --> G[内核不支持cgroup2] C --> H[容器运行时配置错误] C --> I[权限问题] ``` #### 二、紧急恢复操作 ```bash # 1. 检查磁盘空间 df -h # 查看根分区使用率 # 2. 尝试重新挂载为读写模式(关键步骤) mount -o remount,rw / # 3. 检查文件系统错误 touch /testfile 2>/dev/null || echo "仍为只读模式" ``` #### 三、永久性解决方案 ##### 方案1:修复文件系统错误 ```bash # 卸载文件系统(如无法卸载,需重启到救援模式) umount /dev/sda1 # 运行fsck修复 fsck -y /dev/sda1 # 重新挂载 mount -o rw /dev/sda1 / ``` ##### 方案2:修复cgroup2配置 ```bash # 1. 检查cgroup2支持 grep cgroup /proc/filesystems # 应显示cgroup2 # 2. 手动挂载cgroup2(临时) mount -t cgroup2 none /sys/fs/cgroup # 3. 永久配置(/etc/fstab添加) echo "none /sys/fs/cgroup cgroup2 defaults 0 0" >> /etc/fstab # 4. 更新容器运行时配置(以containerd为例) cat > /etc/containerd/config.toml <<EOF version = 2 [plugins."io.containerd.grpc.v1.cri"] systemd_cgroup = true EOF systemctl restart containerd ``` ##### 方案3:处理磁盘空间问题 ```bash # 查找大文件(>100MB) find / -xdev -type f -size +100M -exec ls -lh {} \; # 清理Docker/容器日志 journalctl --vacuum-size=200M docker system prune -af rm -rf /var/lib/docker/containers/*/*-json.log ``` #### 四、系统重启后验证 ```bash # 检查挂载状态 mount | grep -E &#39; / | cgroup&#39; # 测试文件系统写入 echo "test" > /var/run/testfile && rm -f /var/run/testfile # 验证cgroup2 ls /sys/fs/cgroup | grep cgroup.controllers ``` #### 五、高级故障排除 ```bash # 1. 检查内核日志 dmesg | grep -i -E &#39;error|read-only|cgroup&#39; # 2. SELinux/AppArmor诊断 sestatus # SELinux状态 aa-status # AppArmor状态 # 3. 硬件诊断(SMART检测) smartctl -a /dev/sda # 4. 系统救援模式操作 # 使用Live CD/USB启动后: fsck /dev/sda1 mount /dev/sda1 /mnt chroot /mnt ``` #### 六、配置优化建议 1. **fstab加固配置**: ```bash # /etc/fstab 示例(添加错误检测) /dev/sda1 / ext4 defaults,errors=remount-ro 0 1 ``` 2. **cgroup混合模式配置**: ```bash # 启用cgroup混合模式(/etc/default/grub) GRUB_CMDLINE_LINUX="systemd.unified_cgroup_hierarchy=0" update-grub ``` 3. **自动维护任务**: ```bash # 每周自动清理(/etc/cron.weekly/cleanup) #!/bin/sh docker system prune -f journalctl --vacuum-size=500M find /var/log -type f -name "*.gz" -delete ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值