ᕕ( ᐛ )ᕗ Jimyag's Blog

在 pod 中操作宿主机

要在 pod 中操作宿主机,有以下几种方式:

  1. 在 pod 中使用 ssh 连接到物理机,然后使用物理机的命令
  2. 物理机上有 agent,pod 调用 agent 执行命令
  3. 使用 特权 pod 操作宿主机

下面只介绍第三种方式。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
apiVersion: v1
kind: Pod
metadata:
  name: host-shell
spec:
  containers:
  - command:
    - nsenter
    - --target
    - "1"
    - --mount
    - --uts
    - --ipc
    - --net
    - --pid
    - --
    - bash
    - -c
    - cd ~ && exec bash -l
    image: busybox:latest
    name: host-shell
    securityContext:
      privileged: true
    stdin: true
    stdinOnce: true
    tty: true
  hostIPC: true
  hostNetwork: true
  hostPID: true
  restartPolicy: Never
  • hostIPC: true 让这个 Pod 共享宿主机的 IPC 命名空间,你可以看到和操作主机的信号量、消息队列、共享内存等。
  • hostNetwork: true 让这个 Pod 共享宿主机的网络命名空间,你可以看到和操作主机的网络设备、IP 地址、路由表等。
  • hostPID: true 让这个 Pod 共享宿主机的 PID 命名空间,你可以看到和操作主机的进程、线程、文件等。使用 nsenter 进入其他进程的 namespace
1
nsenter --target 1 --mount --uts --ipc --net --pid -- bash -c 'cd ~ && exec bash -l'

进入宿主机所有 namespace,然后执行一个交互式 bash 终端。

参数 含义
nsenter 工具,用于进入指定进程的命名空间
–target 1 进入 PID 为 1 的进程(即宿主机的 init 或 systemd)
–mount 指定要进入的命名空间类型(共享所有主机命名空间)
之后是你要执行的命令
bash -c ‘cd ~ && exec bash -l’ 在主机命名空间中打开一个 Bash shell
1
2
3
stdin: true
stdinOnce: true
tty: true

这些让 Pod 可以交互:

  • stdin: true:接受标准输入
  • tty: true:分配伪终端(必须有,才能像 SSH 那样交互)
  • stdinOnce: true:连接断开后自动关闭

#K8s