【问题标题】:kubectl exec failed with "container <command> is not valid for pod <pod_name>"kubectl exec 失败,“容器 <command> 对 pod <pod_name> 无效”
【发布时间】:2018-12-30 02:37:03
【问题描述】:

我正在使用 Minikube,我有一个带有一个容器的高山吊舱。
当我跑步时:
kubectl exec -it -v=6 alpinec1-7c65db48b4-v2gpc /bin/sh

我收到一个 shell,我可以在其中运行任何命令(ifconfig 等)。

但是当我尝试用-c 运行sh 时失败了:

root:~# kubectl exec -it -v=6 alpinec1-7c65db48b4-v2gpc /bin/sh -c 'ifconfig'
I0722 05:45:25.091111   80392 loader.go:357] Config loaded from file /home/root/.kube/config
I0722 05:45:25.111876   80392 round_trippers.go:405] GET https://192.168.190.143:8443/api/v1/namespaces/default/pods/alpinec1-7c65db48b4-v2gpc 200 OK in 16 milliseconds
I0722 05:45:25.232564   80392 round_trippers.go:405] POST https://192.168.190.143:8443/api/v1/namespaces/default/pods/alpinec1-7c65db48b4-v2gpc/exec?command=%2Fbin%2Fsh&container=ifconfig&container=ifconfig&stdin=true&stdout=true&tty=true 400 Bad Request in 13 milliseconds
                                                                     I0722 05:45:25.232921   80392 helpers.go:201] server response object: [{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {},
  "status": "Failure",
  "message": "container ifconfig is not valid for pod alpinec1-7c65db48b4-v2gpc",
  "reason": "BadRequest",
  "code": 400
}]
F0722 05:45:25.233095   80392 helpers.go:119] Error from server (BadRequest): container ifconfig is not valid for pod alpinec1-7c65db48b4-v2gpc

【问题讨论】:

    标签: kubernetes kubectl minikube


    【解决方案1】:

    kubectl 将 -c 标志解释为不是 ifconfig 的标志,而是作为 kubectl exec 命令本身的标志——它指定了应该在其中执行命令的 Pod 的确切容器;这也是kubectl 在您的 Pod 中查找名为“ifconfig”的 容器 的原因。请参阅the documentation 了解更多信息。

    改为使用-- 来表示不应再由kubectl exec 解释而是按原样传递给调用的命令(在本例中为ifconfig)的标志:

    $ kubectl exec -it -v=6 alpinec1-7c65db48b4-v2gpc -- /bin/sh -c 'ifconfig'
    

    另外请注意,在这种情况下,您实际上并不需要从 shell 调用 ifconfig;你也可以直接调用ifconfig而不使用/bin/sh

    $ kubectl exec -it -v=6 alpinec1-7c65db48b4-v2gpc -- ifconfig
    

    【讨论】:

    • 似乎 kubectl exec 需要容器名称(无论我们是否指定)。有没有办法只连接 pod(而不是容器)?
    • 否 -- Pod 只是容器的逻辑组,因此您总是连接到 Pod 中的容器。通常,您始终需要指定要连接到 Pod 中的哪个容器(使用 -c),除了您的 Pod 仅包含一个容器(在这种情况下,没有真正的选择,无论如何)。
    • 这是有道理的,因为容器和 Pod 共享相同的命名空间、IP 地址。希望从逻辑上讲,连接到容器和连接到 Pod 不会有任何区别?
    猜你喜欢
    • 2017-02-20
    • 1970-01-01
    • 2018-08-17
    • 2020-01-04
    • 1970-01-01
    • 2015-08-06
    • 2017-04-29
    • 1970-01-01
    • 2018-12-11
    相关资源
    最近更新 更多