Kubernetes —— Pod

Posted 刘小豆豆豆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes —— Pod相关的知识,希望对你有一定的参考价值。

1、Pod

1.1 介绍Pod

pod是一组并置的容器,代表了K8s中的基本构建模块。在实际应用中,我们并不会单独部署容器,更多的针对一组pod的容器进行部署和操作。然而这并不意味着一个pod总是要包含多个容器,实际上大多数pod只包含一个容器。

当一个pod包含多个容器时,这些容器总是运行于同一个工作节点上,一个pod不会跨越多个工作节点。

1.1.1 为何需要pod?

由于容器被设计为只允许一个进程(除子进程外),因此需要一种更高级的结构将容器绑定在一起,并且将它们作为一个单元进行管理,这就是Pod的根本原理。

在包含容器的Pod下, 可以同时运行一些密切相关的进程,并为它们提供几乎一样的环境,此时这些进程好像全部运行在单个容器中一样,但同时保持着一定的隔离。

1.1.2 了解Pod

同一Pod容器之间的部分隔离

k8s通过配置Docker来让一个pod内的所有容器共享相同的Linux命名空间,而不是每个容器都有自己的一组命名空间。由于一个pod 中的所有容器都在相同的network 和UTS命名空间下运行,所以它们都共享相同的主机名和网络接口。

注意: 在最新的Kubernetes 和 Docker 版本中,它们也能够共享相同的PID命名空间,但是该特征默认是未激活的。

但当涉及文件系统时,容器间是隔离的。由于大多数容器的文件系统来自容器镜像,因此默认情况下,每个容器的文件系统与其他容器完全隔离。但可以使用名为Volume的Kubernetes资源来共享文件目录。

注意:由于一个pod 中的容器运行于相同的Network命名空间中,因此它们共享相同的IP地址和端口空间。这意味着在同一pod中的容器运行的多个进程需要注意不能绑定到相同的端口号,否则会导致端口冲突,但这只涉及同一pod中的容器。**由于每个pod都有独立的端口空间,对于不同pod中的容器来说则永远不会遇到端口冲突。**此外,一个pod中的所有容器也都具有相同的 loopback网络接口,因此容器可以通过localhost与同一pod 中的其他容器进行通信。

1.1.3 Pod间的网络

Kubernetes集群中的所有pod都在同一个共享网络地址空间中,这意味着每个pod都可以通过其他pod的IP地址来实现相互访问。

总而言之:pod是逻辑主机,运行在同一个pod的进程与在同一物理机上的进程相似,只不过pod中将进程封装到了容器里。

1.2 标签

标签是一种简单却功能强大的Kubemetes特性, 不仅可以组织pod, 也可以组 织所有其他的Kubemetes资源。

详细来讲, 标签是可以附加到资源的任意键值对标签是一种简单却功能强大的Kubemetes特性, 不仅可以组织pod, 也可以组 织所有其他的Kubemetes资源。 详细来讲, 标签是可以附加到资源的任意键值对

  • 可以通过标签来筛选Pod子集,找到一组自己需要的pod。

    • 找到标签值为xx的pod
      • kubectl get po -1 key=xx
    • 列出包含env标签的所有pod,无论其值如何:
      • kubectl get po -1 env
    • 列出没有env标签的pod:
    • kubectl get po -1 '!env'
  • 使用标签和选择器来约束pod调度

    • 使用标签分类工作节点

      假设我们集群中的 一个节点刚添加完成, 它包含一个用于通用GPU计算的 GPU。我们希望向节点添加标签来展示这个功能特性, 可以通过将标签gpu= true 添加到其中一个节点来实现(只需从kubectl get nodes返回的列表中选择一 个)

      • kubectl label node gke-kubia-85f6-node-Orrx gpu吐rue

      现在我们可以在列出节点时使用标签选择器, 就像之前操作pod 一样, 列出 只 包含标签gpu= true的节点:

      • kubectl get nodes -1 gpu=true
    • 将Pod调度到特定节点:

      在 pod 的YAML文件中添加一个节点选择器即可。

      在 spec部分添加了 一个nodeSelector字段。当我们创建该 pod时, 调度器将只在包含标签gpu =true的节点中选择。

      由于每个节点都有一个唯一标签 , 其中键为kubernetes.io/hostname, 值为该节点的实际主机名, 因此我们也可以将pod调度到某个确定的节点。但如果节点处于离线状态,通过 hostname 标签将nodeSelector设置为特定节点可能会导致pod不可调度。

以上是关于Kubernetes —— Pod的主要内容,如果未能解决你的问题,请参考以下文章

kubernetes Pod 异常排错

Kubernetes-Pod基本概念(六)

Kubernetes中Pod的生命周期

kubernetes限制节点启动的pod数量

理解Kubernetes的NodePort、LoadBalancer和Ingress

Kubernetes——Pod控制器详解