"没有指定命令"在Kubernetes

时间:2017-09-29 10:39:03

标签: kubernetes

我有两个Fedora安装了VM,我正在探索Kubernetes-一个是主节点,一个是从节点。

a)我使用基本的ssl身份验证在slave节点上创建了一个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)此外,除此之外,我继续检查从私人注册表中检索图像是否成功。是的 - 它是。

创建广告容器之前:

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

创建广告容器后:

$ 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目录后,我发现已发出容器创建事件,但失败了 - 因为没有指定命令。

你们有没有人可以帮助我进一步分类这个问题并进入关闭状态?

2 个答案:

答案 0 :(得分:0)

你指定"命令:[" / bin / bash"]"在你的yaml文件中,它是一个shell,在使用docker run --it / bin / bash运行时使用它,建议你运行nginx image而不是opensuse:latest。

答案 1 :(得分:0)

在 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"]