You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在K8s集群的Kata Containers Pod中启用systemd?

解决Kata Containers Pod中systemd无法运行的问题

你的问题核心是Pod的PID 1不是systemd,导致systemctl无法连接到systemd总线。下面是具体的解决方案和调整步骤:

1. 修正Pod的启动命令

你在Pod配置中设置了command: ["bash"],这会覆盖镜像中定义的CMD ["/sbin/init"],使得容器启动时PID 1是bash而非systemd——systemd必须作为PID 1才能正常初始化系统环境。

解决方法:

  • 直接删除Pod YAML中的command字段,让镜像自带的/sbin/init作为PID 1启动;
  • 或者将command改为["/sbin/init"],显式指定systemd作为初始化进程。

2. 移除冲突的Cgroup挂载

你当前挂载了主机的/sys/fs/cgroup到容器中,但Kata Containers的轻量虚拟机本身已经拥有独立的Cgroup文件系统,挂载主机Cgroup会导致systemd无法识别自身的Cgroup层级,进而启动失败。

解决方法:删除Pod YAML中所有与cgroup相关的volume和volumeMounts配置。

3. 优化镜像(可选)

为了避免systemd启动时出现不必要的服务报错,可以在Dockerfile中添加一些清理和配置步骤:

FROM ubuntu:20.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y systemd systemd-sysv && \
    apt-get clean && rm -rf /var/lib/apt/lists/* && \
    # 禁用不需要的系统服务,减少启动冲突
    systemctl mask systemd-networkd.service systemd-resolved.service && \
    # 删除machine-id避免容器间ID冲突
    rm -f /etc/machine-id
CMD ["/sbin/init"]

调整后的完整Pod YAML

apiVersion: v1
kind: Pod
metadata:
  name: pod6
spec:
  runtimeClassName: kata-qemu
  containers:
  - name: c1
    image: my-ubuntu-systemd:latest
    imagePullPolicy: Always
    securityContext:
      privileged: true
      capabilities:
            add: ["SYS_ADMIN"]
    volumeMounts:
    - name: tmp
      mountPath: /tmp
      subPath: tmp
    - name: tmp
      mountPath: /run
      subPath: run
    - name: tmp
      mountPath: /run/lock
      subPath: run-lock
  volumes:
  - name: tmp
    emptyDir:
     medium: Memory
     sizeLimit: 128Mi

验证效果

应用调整后的Pod配置后,进入容器执行systemctl status,应该能正常显示systemd的运行状态,不再出现"System has not been booted with systemd as init system"的报错。

内容的提问来源于stack exchange,提问作者triple fault

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:43:32