【发布时间】: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