kubernetes节点间进行ssh登录通常有密码限制,当我们需要排查某特定节点故障时如何绕开密码进行故障排查呢,接下来我们可以利用下面的方法来解决这类场景需求。实现上面的需求需要介绍下如下两个知识点
- Linux namespace
在 Linux 中,命名空间(Namespace)是一种内核机制,用于隔离和管理系统资源。它允许在同一系统上创建多个独立的、相互隔离的环境,每个环境都有自己的资源副本,例如进程、网络、文件系统、用户等
Linux 内核提供了多种类型的命名空间,每种类型都用于隔离和管理不同的资源。以下是 Linux 中常见的命名空间类型:
1. PID 命名空间:每个 PID 命名空间都有自己的进程 ID(PID)空间,使得每个命名空间中的进程 ID 都是唯一的。这样就可以在不同的命名空间中运行进程,互相之间不会相互干扰。
2. NET 命名空间:每个网络命名空间都有自己的网络设备、IP 地址、路由表和网络连接。这允许不同的命名空间之间有独立的网络配置,实现网络资源的隔离。
3. MOUNT 命名空间:每个挂载命名空间都有自己的文件系统挂载点和挂载信息。这允许在不同的命名空间中对文件系统进行独立的挂载和卸载操作。
4. UTS 命名空间:UTS(UNIX Timesharing System)命名空间用于隔离主机名和域名。每个 UTS 命名空间都有自己的主机名和域名。
5. IPC 命名空间:IPC(Inter-Process Communication)命名空间用于隔离进程间通信的资源,如消息队列、信号量和共享内存等。
6. 用户命名空间:用户命名空间用于隔离用户和用户组。不同的用户命名空间中可以有相同的用户 ID 和用户组 ID,但它们在不同的命名空间中是独立的身份。
通过使用命名空间,可以实现资源的隔离和管理,提高系统的安全性、稳定性和性能。它在容器技术(如 Docker)和虚拟化技术中被广泛应用,为应用程序提供独立的运行环境。
- nsenter 工具
nsenter 是一个 Linux 命令行工具,用于进入到一个特定的命名空间(namespace)中。通过nsenter,您可以在命令行中切换到指定的命名空间,以便查看和操作该命名空间中的资源。
nsenter 命令的语法如下:
nsenter [options] <target> <command>
其中,target 可以是一个进程 ID(PID)或一个命名空间的路径(例如 /proc/<PID>/ns/net)。command 是要在目标命名空间中执行的命令。options 是其他可选参数,用于指定如何进入命名空间以及要进入的命名空间类型。
以下是一些常见的 nsenter 使用示例:
以进入 PID 命名空间为例(进入其他命名空间与之类似):
nsenter --target <PID> --pid -- <command>
这将进入指定 PID 的命名空间,并在该命名空间中执行 <command> 命令。
- 如何把上述内容应用到 kubernetes 中
针对上面的说明,我们需要把这些功能集成到一个 pod,通过把pod调度到指定 host并和host共享命名空间能力达到进入指定 host 的目的。
1. 整理需要部署的pod如下
apiVersion: v1
kind: Pod
metadata:
labels:
run: nsenter
name: nsenter
spec:
containers:
- command:
- nsenter
- --target
- "1"
- --mount
- --uts
- --ipc
- --net
- --pid
- --
- bash
- -l
image: docker.io/library/alpine
imagePullPolicy: Always
name: nsenter
resources:
limits:
cpu: 100m
memory: 256Mi
requests:
cpu: 100m
memory: 256Mi
securityContext:
privileged: true
stdin: true
stdinOnce: true
tty: true
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-942rm
readOnly: true
hostNetwork: true
hostPID: true
nodeName: minikube
tolerations:
- key: CriticalAddonsOnly
operator: Exists
- effect: NoExecute
operator: Exists
volumes:
- name: kube-api-access-942rm
projected:
defaultMode: 420
sources:
- serviceAccountToken:
expirationSeconds: 3607
path: token
- configMap:
items:
- key: ca.crt
path: ca.crt
name: kube-root-ca.crt
- downwardAPI:
items:
- fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
path: namespace
2. 部署pod 并查看效果
// 部署整理好的 pod 文件
kubectl apply -f pod.yaml
// 通过 kubectl进入 nsenter pod,由于命名空间共享。进入 pod 以后就跟进入 host 节点一样
kubectl exec -it nsenter -- bash
// 通过查看主机上的文件系统或运行进程是否和直接进入 node 节点一样
ls