【问题标题】:Is it possible to exec in to a K8s pod the same way we exec in to a docker containers or containers running inside of a pod?是否可以像执行到 docker 容器或在 pod 内运行的容器一样执行到 K8s pod?
【发布时间】:2020-11-02 14:04:48
【问题描述】:

是否可以像 exec 进入 docker 容器或在 pod 内运行的容器一样将 exec 加入 K8s pod?p

编辑 -
这个问题不是关于 execing 进入 pod 中的容器。这是关于 pod 本身的。可能是不可能的,但这就是问题所在。所以不要再用-Can we exec into container in a POD in K8S?标记它重复了

【问题讨论】:

  • 一个 pod 只不过是一组一个或多个容器。你能详细说明一下 exec into a pod 是什么意思吗?
  • 所以,答案是否定的......这就是我正在寻找的。 POD 是一个或多个容器的集合,它没有与之关联的映像或操作系统...因此无法使用 kubectl 执行...
  • 但是如果 pod 有它自己的进程,我认为它有,那么就可以对进程执行nsenter(如果它有自己的命名空间)。我不确定一个 pod 是否有它自己的逻辑 NS。

标签: docker kubernetes namespaces kubernetes-pod nsenter


【解决方案1】:

Pod 是一组容器,是一个逻辑概念。所以你不能真正执行到一个 pod 中。您所能做的就是执行到 pod 中的一个容器中。

kubectl exec 命令可能会让您认为您正在执行 pod,但实际上您执行到容器中。此命令仅在其单个容器 pod 时有效。如果 pod 中有多个容器,即它是一个多容器pod 那么您需要使用-c 选项显式选择一个容器。

这是kubectl exec -h 的输出,其中也提到了容器。

Execute a command in a container.

Examples:
  # Get output from running 'date' command from pod mypod, using the first container by default
  kubectl exec mypod -- date
  
  # Get output from running 'date' command in ruby-container from pod mypod
  kubectl exec mypod -c ruby-container -- date
  
  # Switch to raw terminal mode, sends stdin to 'bash' in ruby-container from pod mypod
  # and sends stdout/stderr from 'bash' back to the client
  kubectl exec mypod -c ruby-container -i -t -- bash -il

pause 容器在创建 pod 的任何其他实际容器之前创建。pause 容器的职责是创建将在 pod 的其他容器之间共享的 linux 命名空间。

无法使用 kubectl exec 执行到该暂停容器中,但您可以使用 docker exec 执行到它。

【讨论】:

  • pod 是否有自己的 NS,不同于主机和容器。 ???
  • 默认情况下,pod 具有与主机不同的命名空间..但是您可以操纵它来共享主机上的某些内容..例如 'hostNetwork:true' 将使 pod 内的容器共享同一个网络命名空间作为主机
【解决方案2】:

是的,使用 kubectl exec 命令我们可以 shell 进入正在运行的容器/pod

controlplane $ kubectl run --image=nginx web --restart=Never
pod/web created
controlplane $ kubectl get po
NAME   READY   STATUS              RESTARTS   AGE
web    0/1     ContainerCreating   0          4s
controlplane $ kubectl exec -it web -- /bin/bash
root@web:/# ls
bin   dev                  docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint.d  etc                   lib   media  opt  root  sbin  sys  usr

【讨论】:

    【解决方案3】:

    pod 是包装容器的抽象实体。当您通过 kubectl exec -it 执行到 pod 时,您实际上是在为您的容器执行包装器命令。您也没有什么可以在 Pod 中执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-09
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多