本地安装的 Docker 没有容器在 Kubernetes 创建的 pod 中运行是绝对正常的。让我解释一下为什么。
首先,我们需要弄清楚,为什么 Kubernetes 真的需要 Docker。它不需要它来运行 pod 内的容器。它需要 Docker 来创建容器,该容器将成为 Kubernetes 节点——在这个容器上,您将拥有 pod,其中包含您正在寻找的容器。
kind是一个使用 Docker 容器“节点”运行本地 Kubernetes 集群的工具。
所以基本上这些层是:你的VM->在你的VM的docker上托管的容器,它充当Kubernetes节点->在这个容器上有pod->在这些pod中是容器。
在实物快速入门部分,您可以找到有关实物使用的图像的更多详细信息:
这将使用预构建的 节点映像引导 Kubernetes 集群。预构建图像托管在kindest/node
,但要找到适合当前给定版本的图像,您应该查看给定种类版本的 发行说明 (检查 kind version
),您将在其中找到为种类版本创建的图像的完整列表。
回到你的问题,让我们找到丢失的容器!
在我的本地虚拟机上,我设置了 Kubernetes并安装了kubectl
工具然后,我创建了一个示例nginx-deployment。通过运行,kubectl get pods
我可以确认 pod 正在工作。
让我们通过运行找到充当节点的容器docker ps -a
:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1d2892110866 kindest/node:v1.21.1 "/usr/local/bin/entr…" 50 minutes ago Up 49 minutes 127.0.0.1:43207->6443/tcp kind-control-plane
好的,现在我们可以执行它并找到容器。请注意,kindest/node
图像不是使用 docker 作为容器运行时,而是crictl
.
让我们执行到节点docker exec -it 1d2892110866 sh
::
# ls
bin boot dev etc home kind lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
#
现在我们在节点中 - 是时候检查容器是否在这里了:
# crictl ps -a
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID
135c7ad17d096 295c7be079025 47 minutes ago Running nginx 0 4e5092cab08f6
ac3b725061e12 295c7be079025 47 minutes ago Running nginx 0 6ecda41b665da
a416c226aea6b 295c7be079025 47 minutes ago Running nginx 0 17aa5c42f3512
455c69da57446 296a6d5035e2d 57 minutes ago Running coredns 0 4ff408658e04a
d511d62e5294d e422121c9c5f9 57 minutes ago Running local-path-provisioner 0 86b8fcba9a3bf
116b22b4f1dcc 296a6d5035e2d 57 minutes ago Running coredns 0 9da6d9932c9e4
2ebb6d302014c 6de166512aa22 57 minutes ago Running kindnet-cni 0 6ef310d8e199a
2a5e0a2fbf2cc 0e124fb3c695b 57 minutes ago Running kube-proxy 0 54342daebcad8
1b141f55ce4b2 0369cf4303ffd 57 minutes ago Running etcd 0 32a405fa89f61
28c779bb79092 96a295389d472 57 minutes ago Running kube-controller-manager 0 2b1b556aeac42
852feaa08fcc3 94ffe308aeff9 57 minutes ago Running kube-apiserver 0 487e06bb5863a
36771dbacc50f 1248d2d503d37 58 minutes ago Running kube-scheduler 0 85ec6e38087b7
他们来了。您还可以注意到,还有其他容器充当Kubernetes 组件。
对于进一步调试容器,我建议阅读有关使用 crictl 调试 Kubernetes 节点的文档。
另请注意,在您的本地 VM 上有一个文件~/.kube/config
,其中包含在您的 VM 和 Kubernetes 集群之间进行通信所需的信息kubectl
(在 Kubernetes 类型的情况下 - 本地运行的 docker 容器)。
希望它会帮助你。随时问任何问题。
编辑 - 添加信息如何设置安装点
回答评论中关于从节点安装目录到本地 VM 的问题。我们需要设置“额外的坐骑”。让我们创建一个 Kubernetes 所需的定义:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
# add a mount from /path/to/my/files on the host to /files on the node
extraMounts:
- hostPath: /tmp/logs/
containerPath: /var/log/pods
# optional: if set, the mount is read-only.
# default false
readOnly: false
# optional: if set, the mount needs SELinux relabeling.
# default false
selinuxRelabel: false
# optional: set propagation mode (None, HostToContainer or Bidirectional)
# see https://kubernetes.io/docs/concepts/storage/volumes/#mount-propagation
# default None
propagation: Bidirectional
请注意,我使用/var/log/pods
而不是/var/log/containers/
- 这是因为在由 kind Kubernetescontainers
目录创建的集群上,只有指向登录pod
目录的符号链接。
保存这个yaml
,例如作为cluster-with-extra-mount.yaml
,然后使用这个创建一个集群(/tmp/logs
在应用这个命令之前创建一个目录!):
kind create cluster --config=/tmp/cluster-with-extra-mount.yaml
然后所有容器日志都将在/tmp/logs
您的 VM 上。