kubernetes-guide/content/best-practices/containerization/systemd.md

122 lines
3.0 KiB
Markdown
Raw Normal View History

2023-10-13 13:37:29 +08:00
# 在容器内使用 systemd
## 概述
某些情况下我们需要在容器内使用 systemd 去拉起进程比如业务历史包袱重有许多依赖组件不能仅仅只启动1个业务进程还有许多其它进程需要启动短时间内不好改造好过渡期间使用 systemd 作为主进程拉起所有依赖进程。
## 安装 systemd
如果你用的基础镜像是 centos那么已经内置了 systemd建议使用 `centos:8`,启动入口是 `/sbin/init`;如果是 ubuntu那么需要安装一下 systemd启动入口是 `/usr/sbin/systemd`Dockerfile 示例:
```dockerfile
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 设为特权容器,示例:
```yaml
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`:
```yaml
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`:
```yaml
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
```