Kind Kubernetes 集群没有容器日志
Kind Kubernetes cluster doesn't have container logs
我已经使用 kind k8s 安装了一个 Kubernetes 集群,因为它更容易在我的本地 VM 中设置和 运行。我还单独安装了Docker。然后,我为 Spring 启动应用程序创建了一个 docker 映像,我为将消息打印到 stdout 而构建。然后它被添加到 kind k8s 本地注册表。使用这个新创建的本地映像,我使用 kubectl apply -f config.yaml CLI 命令在 kubernetes 集群中创建了一个部署。使用类似的方法,我还部署了 fluentd,希望从 /var/log/containers
收集日志,这些日志将安装到 fluentD 容器中。
我注意到 /var/log/containers/
symlink link 不存在。但是有 /var/lib/docker/containers/
并且它有一些过去创建的容器的文件夹。 None 个新容器 ID 似乎也不存在于 /var/lib/docker/containers/
中。
当我 运行 kubectl logs pod-name
时,我可以在控制台中看到日志,即使我无法在本地存储中找到日志。
根据 Whosebug 成员给出的另一个 thread 中的答案,我能够获得一些信息,但不是全部。
我已经确认 Docker 已通过 运行 宁以下命令配置了 json 日志记录驱动程序。
docker info | grep -i logging
当我运行以下命令(在上面给出的线程中找到)时,我可以获得图像ID。
kubectl get pod pod-name -ojsonpath='{.status.containerStatuses[0].containerID}'
但是我不能使用它来检查使用 docker inspect
的 docker 图像,因为 Docker 不知道这样的图像,我假设它是因为它是由 种类 控制平面.
感谢论坛中的专家能否协助确定日志的写入位置并重新创建 /var/log/containers
symbolink link 以访问容器日志。
您本地安装的 Docker 在 kind Kubernetes 创建的 pod 中没有容器 运行 是绝对正常的。让我解释一下为什么。
首先,我们需要弄清楚,为什么 kind Kubernetes 实际上需要 Docker。对于 pods 内的 运行 个容器,它需要 而不是 。它需要 Docker 到 create container which will be Kubernetes node - 在这个容器上,您将有 pods,其中包含您正在寻找的容器。
kind is a tool for running local Kubernetes clusters using Docker container “nodes”.
所以基本上这些层是:你的虚拟机 -> 容器托管在你的虚拟机 docker 上,它充当 Kubernetes 节点 -> 在这个容器上有 pods -> 在那些 pods 是容器。
实物quickstart section您可以找到更多关于实物使用图片的详细信息:
This will bootstrap a Kubernetes cluster using a pre-built node image. Prebuilt images are hosted atkindest/node
, but to find images suitable for a given release currently you should check the release notes for your given kind version (check with kind version
) where you'll find a complete listing of images created for a kind release.
回到你的问题,让我们找到丢失的容器!
在我的本地 VM 上,我设置了 kind Kubernetes and I have installed kubectl
tool Then, I created an example nginx-deployment。通过 运行 kubectl get pods
我可以确认 pods 正在工作。
让我们找到充当节点的容器 运行 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 Components.
为了进一步调试容器,我建议阅读有关 debugging Kubernetes nodes with crictl.
的文档
另请注意,在您的本地 VM 上有文件 ~/.kube/config
,其中包含 kubectl
在您的 VM 和 Kubernetes 集群之间进行通信所需的信息(如果是 kind Kubernetes - docker 容器 运行 本地)。
希望对您有所帮助。欢迎提问。
编辑 - 添加了如何设置安装点的信息
回答有关从节点到本地 VM 的安装目录的评论中的问题。我们需要设置 "Extra Mounts"。让我们创建一个 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 Kubernetes 创建的集群上 containers
目录只有指向登录的符号链接 pod
目录。
保存此 yaml
,例如 cluster-with-extra-mount.yaml
,然后使用此创建集群(在应用此命令之前创建一个目录 /tmp/logs
!):
kind create cluster --config=/tmp/cluster-with-extra-mount.yaml
然后所有容器日志将在您的 VM 上 /tmp/logs
。
我已经使用 kind k8s 安装了一个 Kubernetes 集群,因为它更容易在我的本地 VM 中设置和 运行。我还单独安装了Docker。然后,我为 Spring 启动应用程序创建了一个 docker 映像,我为将消息打印到 stdout 而构建。然后它被添加到 kind k8s 本地注册表。使用这个新创建的本地映像,我使用 kubectl apply -f config.yaml CLI 命令在 kubernetes 集群中创建了一个部署。使用类似的方法,我还部署了 fluentd,希望从 /var/log/containers
收集日志,这些日志将安装到 fluentD 容器中。
我注意到 /var/log/containers/
symlink link 不存在。但是有 /var/lib/docker/containers/
并且它有一些过去创建的容器的文件夹。 None 个新容器 ID 似乎也不存在于 /var/lib/docker/containers/
中。
当我 运行 kubectl logs pod-name
时,我可以在控制台中看到日志,即使我无法在本地存储中找到日志。
根据 Whosebug 成员给出的另一个 thread 中的答案,我能够获得一些信息,但不是全部。
我已经确认 Docker 已通过 运行 宁以下命令配置了 json 日志记录驱动程序。
docker info | grep -i logging
当我运行以下命令(在上面给出的线程中找到)时,我可以获得图像ID。
kubectl get pod pod-name -ojsonpath='{.status.containerStatuses[0].containerID}'
但是我不能使用它来检查使用 docker inspect
的 docker 图像,因为 Docker 不知道这样的图像,我假设它是因为它是由 种类 控制平面.
感谢论坛中的专家能否协助确定日志的写入位置并重新创建 /var/log/containers
symbolink link 以访问容器日志。
您本地安装的 Docker 在 kind Kubernetes 创建的 pod 中没有容器 运行 是绝对正常的。让我解释一下为什么。
首先,我们需要弄清楚,为什么 kind Kubernetes 实际上需要 Docker。对于 pods 内的 运行 个容器,它需要 而不是 。它需要 Docker 到 create container which will be Kubernetes node - 在这个容器上,您将有 pods,其中包含您正在寻找的容器。
kind is a tool for running local Kubernetes clusters using Docker container “nodes”.
所以基本上这些层是:你的虚拟机 -> 容器托管在你的虚拟机 docker 上,它充当 Kubernetes 节点 -> 在这个容器上有 pods -> 在那些 pods 是容器。
实物quickstart section您可以找到更多关于实物使用图片的详细信息:
This will bootstrap a Kubernetes cluster using a pre-built node image. Prebuilt images are hosted at
kindest/node
, but to find images suitable for a given release currently you should check the release notes for your given kind version (check withkind version
) where you'll find a complete listing of images created for a kind release.
回到你的问题,让我们找到丢失的容器!
在我的本地 VM 上,我设置了 kind Kubernetes and I have installed kubectl
tool Then, I created an example nginx-deployment。通过 运行 kubectl get pods
我可以确认 pods 正在工作。
让我们找到充当节点的容器 运行 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 Components.
为了进一步调试容器,我建议阅读有关 debugging Kubernetes nodes with crictl.
的文档另请注意,在您的本地 VM 上有文件 ~/.kube/config
,其中包含 kubectl
在您的 VM 和 Kubernetes 集群之间进行通信所需的信息(如果是 kind Kubernetes - docker 容器 运行 本地)。
希望对您有所帮助。欢迎提问。
编辑 - 添加了如何设置安装点的信息
回答有关从节点到本地 VM 的安装目录的评论中的问题。我们需要设置 "Extra Mounts"。让我们创建一个 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 Kubernetes 创建的集群上 containers
目录只有指向登录的符号链接 pod
目录。
保存此 yaml
,例如 cluster-with-extra-mount.yaml
,然后使用此创建集群(在应用此命令之前创建一个目录 /tmp/logs
!):
kind create cluster --config=/tmp/cluster-with-extra-mount.yaml
然后所有容器日志将在您的 VM 上 /tmp/logs
。