searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

如何通过pod进入kubernetes任意node节点并进行节点相关操作

2023-10-27 07:01:49
49
0

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 
0条评论
0 / 1000
m****n
1文章数
0粉丝数
m****n
1 文章 | 0 粉丝
m****n
1文章数
0粉丝数
m****n
1 文章 | 0 粉丝
原创

如何通过pod进入kubernetes任意node节点并进行节点相关操作

2023-10-27 07:01:49
49
0

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 
文章来自个人专栏
容器服务-kubernetes
1 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0