kubernetes-guide/best-practices/containerization/systemd-in-container.md

3.0 KiB
Raw Permalink Blame History

在容器内使用 systemd

概述

某些情况下我们需要在容器内使用 systemd 去拉起进程比如业务历史包袱重有许多依赖组件不能仅仅只启动1个业务进程还有许多其它进程需要启动短时间内不好改造好过渡期间使用 systemd 作为主进程拉起所有依赖进程。

安装 systemd

如果你用的基础镜像是 centos那么已经内置了 systemd建议使用 centos:8,启动入口是 /sbin/init;如果是 ubuntu那么需要安装一下 systemd启动入口是 /usr/sbin/systemdDockerfile 示例:

FROM ubuntu:22.04
RUN apt update -y
RUN apt install -y systemd

示例

systemd 相比业务进程比较特殊,它运行起来需要以下条件:

  1. 自己必须是 1 号进程,所以不能启用 shareProcessNamespace
  2. 需要对 /run/sys/fs/cgroup 等路径进行挂载,通常需要给到 systemd 容器一定特权。

最简单的方式是将运行 systemd 的 container 设为特权容器,示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: systemd
spec:
  replicas: 1
  selector:
    matchLabels:
      app: systemd
  template:
    metadata:
      labels:
        app: systemd
    spec:
      containers:
      - name: systemd
        image: centos:8
        command:
        - /sbin/init
        securityContext:
          privileged: true # 设置特权

如果希望尽量减少特权,可以只读方式挂载 hostPath /sys/fs/cgroup,然后 capabilities 给个 SYS_ADMIN:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: systemd
spec:
  replicas: 1
  selector:
    matchLabels:
      app: systemd
  template:
    metadata:
      labels:
        app: systemd
    spec:
      containers:
      - name: systemd
        image: centos:8
        command:
        - /sbin/init
        securityContext:
          capabilities:
            add:
            - SYS_ADMIN # 设置容器权限
          privileged: false # 非特权
        volumeMounts:
        - mountPath: /sys/fs/cgroup
          name: cgroup
          readOnly: true # 只读方式挂载 cgroup 目录
      volumes:
      - hostPath:
          path: /sys/fs/cgroup
          type: ""
        name: cgroup

如果用 ubuntu 安装了 systemd用法类似的只是启动入口变成了 /usr/bin/systemd:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: systemd
spec:
  replicas: 1
  selector:
    matchLabels:
      app: systemd
  template:
    metadata:
      labels:
        app: systemd
    spec:
      containers:
      - name: systemd
        image: cr.imroc.cc/library/systemd:ubuntu
        command:
        - /usr/bin/systemd
        securityContext:
          capabilities:
            add:
            - SYS_ADMIN
          privileged: false
        volumeMounts:
        - mountPath: /sys/fs/cgroup
          name: cgroup
      volumes:
      - hostPath:
          path: /sys/fs/cgroup
          type: ""
        name: cgroup