我有两个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目录后,我发现已发出容器创建事件,但失败了 - 因为没有指定命令。
你们有没有人可以帮助我进一步分类这个问题并进入关闭状态?
答案 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"]
ENTRYPOINT ["executable", "param1", "param2"]