【问题标题】:"No command specified" Error while creating pod in Kubernetes在 Kubernetes 中创建 pod 时出现“未指定命令”错误
【发布时间】:2021-03-18 18:44:04
【问题描述】:

我有两个安装了 Fedora 的虚拟机,我正在探索 Kubernetes——一个是主节点,一个是从节点。

a) 我使用基本的 ssl 身份验证在从节点上创建了一个 docker 私有注册表。让我们称之为abc.def.com:1234

b) 然后我使用docker login 登录到 docker。登录成功。

c) 我从 docker hub 下载了opensuse:latest 图像,标记它并上传到注册表。 Docker 推送成功。我从 docker 本地缓存中删除并尝试 docker pull 来验证图像推送是否成功,是的,它是成功的。

d) 我可以使用从我的私人注册表下载的图像并使用基本命令/bin/bash 运行它。例如:docker run -it taggedimage /bin/bash

e) 现在,我停止了容器。我也从本地缓存中删除了图像。

f) 然后,我创建了一个基本的 yaml 文件来创建相同类型的容器 - 只需使用 /bin/bash 启动容器即可。

g) 我在我的 yaml 文件中提供了适当的 REGSECRET,并在更新参数 --pod-container-infra-image 后重新启动了 kubelet 服务。

$ ps -ef | grep kubelet
root     23683     1  2 05:42 ?        00:01:12 /usr/bin/kubelet --logtostderr=true --v=0 --api-servers=http://wer.txy.com:8080 --address=0.0.0.0 --hostname-override=abc.def.com --allow-privileged=false --pod-infra-container-image=abc.def.com:1234/s5678:test --cluster-dns=x.y.z.b --cgroup-driver=systemd

(注意:不要按我提供的值,只是为了保护隐私)

h) 然后我运行命令 - kubectl create -f test.yaml;其中test.yaml 的内容如下所示:

apiVersion: v1  
kind: Pod  
metadata:  
  name: test1  
spec:  
  containers:  
  - image: abc.def.com:1234/s5678:test  
    imagePullPolicy: IfNotPresent  
    ports:  
      - containerPort: 80  
    command: ["/bin/bash"]  
  imagePullSecrets:  
    - name: regsecret  

i) pod 创建成功,但状态为 containercreating。

$ kubectl get pods  
NAME      READY     STATUS              RESTARTS   AGE  
test1     0/1       ContainerCreating   0          22m  

j) 检查 kubectl 日志时:

Error from server (BadRequest): container "utest1" in pod "test1" is waiting to start: ContainerCreating    

k) 选中时kubectl describe:

  47m           9s              216     kubelet, abc.def.com                     Warning         FailedSync      Error syncing pod, skipping: failed to "CreatePodSandbox" for "test1_default(8961fa88-a4fa-11e7-95b4-0050568dcdb2)" with CreatePodSandboxError: "CreatePodSandbox for pod \"test1_default(8961fa88-a4fa-11e7-95b4-0050568dcdb2)\" failed: rpc error: code = 2 desc = failed to create a sandbox for pod \"test1\": Error response from daemon: {\"message\":\"No command specified\"}"  

l) 我进一步检查了/var/log/messages。它指定 kubelet 能够接收所需的参数:

kubelet[23683]: I0929 06:31:14.465534   23683 kuberuntime_manager.go:458] Container {Name:utest1 Image:abc.def.com:1234/s5678:test Command:[/bin/sh] Args:[] WorkingDir: Ports:[{Name: HostPort:0 ContainerPort:80 Protocol:TCP HostIP:}] EnvFrom:[] Env:[] Resources:{Limits:map[] Requests:map[]} VolumeMounts:[] LivenessProbe:nil ReadinessProbe:nil Lifecycle:nil TerminationMessagePath:/dev/termination-log TerminationMessagePolicy:File ImagePullPolicy:IfNotPresent SecurityContext:nil Stdin:false StdinOnce:false TTY:false}  

如您所见,上面的命令被 Kubelet 接收。但不会传递给 dockerd-current 守护进程:

dockerd-current[23526]: time="2017-09-29T06:31:14.474656750-04:00" level=error msg="Handler for POST /v1.26/containers/create?name=k8s_POD_test1_default_8961fa88-a4fa-11e7-95b4-0050568dcdb2_0 returned error: No command specified"    

m) 此外,除此之外,我继续检查从私有注册表中检索图像是否成功。是的 - 它是。

创建 pod 之前:

$ docker images    
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE  
docker.io/registry   2                   28525f9a6e46        10 days ago         33.2 MB  

创建 pod 后:

$ docker images    
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE  
abc.def.com:1234/s5678   test                54ae12a89367        8 days ago          108 MB  
docker.io/registry                2                   28525f9a6e46        10 days ago         33.2 MB    

因此,图像检索成功。而且,在检查了/var/run/container* 目录和相关的 docker 目录之后,我发现容器创建事件已经发出,但是失败了——因为没有指定命令。

请你们中的任何人帮我进一步分类这个问题并关闭吗?

【问题讨论】:

  • 请阅读stackoverflow.com/editing-help 并相应地编辑您的帖子。目前非常难以阅读。使用预览查看帖子发布后的外观,以便确保其可读性。
  • 同理。我现在对其进行了编辑以提供适当的阅读能力。
  • 您确定要为 kubelet 的--pod-container-infra-image 使用自己的镜像吗?我不知道 Google 的 pause 图像到底是做什么的(默认的基础图像),但我从未见过有人试图使用自己的图像......

标签: kubernetes


【解决方案1】:

你在你的yaml文件中指定了“command: [”/bin/bash“]”并且它是一个shell,在使用docker run --it /bin/bash运行时使用它,建议你运行nginx镜像而不是打开使用:最新的。

【讨论】:

  • 如果想运行opensuse,运行类似 echo "some text" 或执行时得到结果的东西。
  • 我尝试发出“echo test”作为命令,但它对我没有用。还有其他建议吗?此外,另一个查询是关于使用 nginx - 它类似于 opensuse 吗?它是与 Kubernetes 集成的最佳镜像吗?我需要 opensuse 才能工作,因为我正在试验一个需要在容器环境中的 opensuse 中部署的应用程序。
【解决方案2】:

在 OP 的情况下,产生的错误似乎是由于使用带有 --pod-container-infra-image 标志的自定义图像引起的,并且自定义图像缺少入口点。

这里也有一个很好的解释:What is --pod-infra-container-image meant for?


“未指定命令”错误的其他可能原因可能是未在 pod 定义中指定命令或在 Dockerfile 中缺少入口点:

Pod 版本:

spec:  
  containers:  
  - command: ["executable", "param1", "param2"]

Dockerfile version:

ENTRYPOINT ["executable", "param1", "param2"]

【讨论】:

    猜你喜欢
    • 2020-05-04
    • 1970-01-01
    • 2019-08-27
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多