【问题标题】:single pod vs docker container单个 pod 与 docker 容器
【发布时间】:2021-09-15 07:53:21
【问题描述】:

我对 k8s 中 pod 的一种行为感到困惑。我拉动并运行了我的 alpine 容器,当我看到 docker ps -a 命令时它工作正常,但是当我通过 k8s 运行它时,kubectl get pod 的输出显示完成。虽然在 Dockerfile 我输入 CMD ["sleep", "3600"],在 k8s 中是不会休眠的。我可以使用 kubectl run myalpine --image=myalpine -- sleep infinity 将其发送到睡眠模式,并且 pod 工作正常,但我不想使用该命令,我希望当我在 Dockerfile 中明确键入 sleep 命令时并构建它,k8s 也应该运行它。 如果有人解释 pod 的行为,我真的很感激。

【问题讨论】:

  • 简单来说,pod就是运行在kubernetes集群中的进程。它基本上与运行 docker 容器非常相似。 cloud.google.com/kubernetes-engine/docs/concepts/pod
  • docker 用于开发,kubernetes pod 用于生产。确保你可以运行像 minikube 这样的小型 kubernetes。
  • 它也应该在 kubernetes 上工作。是否可以在问题中提供您的 Dockerfile 和 pod yaml 文件?

标签: docker kubernetes


【解决方案1】:

Pod 和 Container 是两个不同的东西。在 Kubernetes 中,一个或多个容器被包装到一个 pod 中。换句话说,您可以将 pod 视为容器的运行时环境

【讨论】:

  • 这不太正确,Pod 不是运行时抽象(大部分情况下)。它们是调度程序抽象,一个或多个容器必须始终在单个物理服务器上一起运行。它们的原始名称显示了这种传统:allocs。
  • pods 不是容器的运行时环境,运行时是 containerd(在我的情况下)问题是为什么另一个容器运行时没有任何问题,如任何 websever(nginx 和 httpd)但是带有busybox或alpine linux的pod没有在Dockerfile中运行sleep命令
  • 实际上,您通常希望每个 pod 只运行一个容器,但允许更多。
【解决方案2】:

The documentation 有一些有用的解释:

Pod 是您可以在 Kubernetes 中创建和管理的最小可部署计算单元。

想想“部署”这个单元——请原谅这里的术语滥用,因为 部署 本身在 k8s 中也是一个非常明确和精确的概念,即另一种类型的工作负载. Pod 被归类为工作负载。

Pod(如鲸鱼荚或豌豆荚)是一组一个或多个容器,具有共享的存储和网络资源,以及如何运行容器的规范。 Pod 的内容始终是共同定位和共同调度的,并在共享上下文中运行。 Pod 为特定于应用程序的“逻辑主机”建模:它包含一个或多个相对紧密耦合的应用程序容器。在非云环境中,在同一物理机或虚拟机上执行的应用程序类似于在同一逻辑主机上执行的云应用程序。

这就是您正在寻找的答案的一部分:Pod 模拟了一个“逻辑主机”,您可以在其中组装功能相当齐全的应用程序(“微服务”,如果您愿意,它只做一件基本的事情,但做它很好)从一个或几个容器中取出。

我喜欢将其视为某种形式的组合,但通过 sidecaradapter 等模式提升到应用程序级别。类似于您在 DDD 中实现横切关注点的方式,例如日志记录,通过抽象它们并提供一个通用实现,该实现在任何类(“附加”到任何主容器)使用时都应该工作相同,尽管需要一些布线工作.正是 PodSpec 将这些容器连接起来。

除了应用程序容器,Pod 还可以包含在 Pod 启动期间运行的 init 容器。如果您的集群提供此功能,您还可以注入临时容器进行调试。

继续支持我在上面对 OOP/DDD 中的组合所做的类比。

官方文档继续在这些方面添加更多解释。

就 Docker 概念而言,Pod 类似于一组具有共享命名空间和共享文件系统卷的 Docker 容器。

最后,当您想通过 kubectl run 在 Kubernetes 中运行容器(必须通过 pod)时,请注意不要覆盖容器入口点/命令参数:

当您覆盖默认的入口点和 Cmd 时,这些规则适用:

  • 如果您没有为 Container 提供 commandargs,则使用 Docker 映像中定义的默认值。
  • 如果您为容器提供command 但没有args,则仅使用提供的command。默认入口点和默认 Cmd Docker 映像中定义的内容将被忽略。
  • 如果您只为容器提供 args,则 Docker 映像中定义的默认入口点将使用您提供的 args 运行。
  • 如果您提供commandargs,则会忽略Docker 映像中定义的默认入口点和默认Cmd。您的command 是 使用您的args 运行。

【讨论】:

    猜你喜欢
    • 2017-05-09
    • 2017-08-25
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 2022-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多