【问题标题】:Kind Kubernetes cluster doesn't have container logsKind Kubernetes 集群没有容器日志
【发布时间】:2021-08-26 06:01:19
【问题描述】:

我使用kind k8s 安装了一个 Kubernetes 集群,因为它更容易在我的本地 VM 中设置和运行。我还单独安装了 Docker。然后,我为我为将消息打印到标准输出而构建的 Spring 启动应用程序创建了一个 docker 映像。然后它被添加到 kind k8s 本地注册表中。使用这个新创建的本地镜像,我使用 kubectl apply -f config.yaml CLI 命令在 kubernetes 集群中创建了一个部署。使用类似的方法,我还部署了 fluentd,希望从 /var/log/containers 收集日志,这些日志将被挂载到 fluentD 容器中。

我注意到/var/log/containers/ 符号链接不存在。但是有/var/lib/docker/containers/,它有一些过去创建的容器的文件夹。 /var/lib/docker/containers/ 中似乎也不存在任何新的容器 ID。

当我运行kubectl logs pod-name 时,我可以在控制台中看到日志,即使我无法在本地存储中找到日志。

按照stackoverflow成员给出的另一个thread的答案,我能够获得一些信息,但不是全部。

我已经通过运行以下命令确认 Docker 配置了 json 日志记录驱动程序。 docker info | grep -i logging

当我运行以下命令(在上面给出的线程中找到)时,我可以获得图像 ID。 kubectl get pod pod-name -ojsonpath='{.status.containerStatuses[0].containerID}'

但是我不能使用它来检查使用docker inspect 的 Docker 映像,因为 Docker 不知道这样的映像,我假设它是由 kind 控制平面管理的。 p>

感谢论坛中的专家能否协助确定日志的写入位置并重新创建/var/log/containers symbolink 链接以访问容器日志。

【问题讨论】:

    标签: kubernetes logging containers fluentd kind


    【解决方案1】:

    本地安装的 Docker 没有容器在 Kubernetes 创建的 pod 中运行是绝对正常的。让我解释一下原因。

    首先,我们需要弄清楚,为什么 Kubernetes 真的需要 Docker。它需要它在 pod 内运行容器。它需要 Docker 来 create container which will be Kubernetes node - 在这个容器上,您将拥有 pod,其中包含您正在寻找的容器。

    kind 是一个使用 Docker 容器“节点”运行本地 Kubernetes 集群的工具。

    所以基本上这些层是:你的 VM -> 容器托管在你的 VM 的 docker 上,它充当 Kubernetes 节点 -> 在这个容器上有 pod -> 在这些 pod 中是容器。

    in kindquickstart section你可以找到更多关于kind使用的图片的详细信息:

    这将使用预构建的 node image 引导 Kubernetes 集群。预建镜像托管在kindest/node,但要找到适合当前给定版本的镜像,您应该查看release notes 以获取您的给定类型版本(查看kind version),您将在其中找到为创建的镜像的完整列表善意的释放。

    回到你的问题,让我们找到丢失的容器!

    在我的本地虚拟机上,我设置了kind 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 Components

    对于进一步调试容器,我建议阅读有关 debugging Kubernetes nodes with crictl 的文档。

    还请注意,在您的本地 VM 上有一个文件 ~/.kube/config,其中包含 kubectl 在您的 VM 和 Kubernetes 集群之间进行通信所需的信息(如果是 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/ - 这是因为在由 Kubernetes 类型创建的集群上,containers 目录只有指向 pod 目录中的登录的符号链接。

    保存这个yaml,例如cluster-with-extra-mount.yaml,然后使用它创建一个集群(在应用这个命令之前创建一个目录/tmp/logs!):

    kind create cluster --config=/tmp/cluster-with-extra-mount.yaml
    

    然后所有容器日志将在您的 VM 上的 /tmp/logs 中。

    【讨论】:

    • 感谢@Mikolaj S. 的详细回复。由于工作节点本身是一个容器,这意味着日志位于 kind 容器节点内。我可以确认这一点,因为日志在 kind 容器中的 /var/log/containers 中可用。这意味着在同一节点上运行的 fluentd 可以访问这些日志。有什么办法可以将此路径安装到 VM 存储?
    • 我添加了如何将路径挂载到 VM 存储的信息。也请检查this article - 也许你会发现它很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 2018-05-09
    • 2019-09-22
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    相关资源
    最近更新 更多