首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Kubernetes(k8s)-pod介绍

Kubernetes(k8s)-pod介绍

作者头像
运维小路
发布2024-12-23 15:38:43
发布2024-12-23 15:38:43
6580
举报
文章被收录于专栏:运维小路运维小路

我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。

后续操作都是以docker版本为基准。k8s配置文件一般使用yaml格式进行编写,所以后续的范例都是这样的。

Pod的介绍

基本介绍

在 Kubernetes 中,Pod(容器组)是最小的可调度和可部署的单元。它是一个逻辑概念,用于包装一个或多个相关的容器,并共享网络和存储资源。

Pod 中的容器紧密相关,并且它们一起协同工作来提供某种服务或应用程序。这些容器可以共享同一个网络命名空间和存储卷,它们可以通过 localhost 直接通信。

Pod 具有以下特点:

  1. 调度单元:Pod 是 Kubernetes 中最小的调度单元,调度器将一个 Pod 分配给一个可用的节点来运行。
  2. 共享网络和存储:Pod 中的容器共享同一个网络命名空间和存储卷。它们可以通过 localhost 直接通信,并共享数据。
  3. 生命周期:Pod 具有自己的生命周期,可以创建、启动、停止和删除。当 Pod 被删除时,它内部的所有容器也会被终止。

Pod 有以下几种常见的使用方式:

  1. 单容器 Pod:一个 Pod 中只包含一个容器,用于运行一个独立的应用程序服务。
  2. 多容器 Pod:一个 Pod 中包含多个紧密相关的容器,可以协同工作。例如,一个应用程序容器和一个辅助容器(如 Sidecar 容器)共同组成一个 Pod。
  3. 无状态 Pod:Pod 中的容器不需要保持任何状态,所有数据都来自外部存储(如数据库)或者共享数据卷。
  4. 有状态 Pod:Pod 中的容器需要保持一些状态,例如使用本地存储或者共享存储卷存储数据。

总而言之,Pod 是 Kubernetes 中最小的可调度和可部署的单元。它包含一个或多个紧密相关的容器,并共享网络和存储资源。Pod 具有自己的生命周期,可以独立创建、启动、停止和删除。Pod 可以以单容器或多容器的方式使用,并可以是无状态或有状态的。

范例一: 单容器

代码语言:javascript
复制
apiVersion: v1            # API 版本
kind: Pod                 # 资源类型
metadata:
  name: example-pod       # Pod 名称
  labels:
    app: example          # 标签,用于标识和选择相关的资源
spec:
  containers:             # 容器列表
  - name: example-container  # 容器名称
    image: nginx:latest      # 容器镜像
    ports:
    - containerPort: 80      # 容器内的端口号

这个 Pod 清单定义了一个名为example-pod的 Pod,其中包含一个名为example-container的容器,该容器基于nginx:latest镜像。容器将打开端口 80 以便其他 Pod 或服务可以访问它。

要在 Kubernetes 集群中创建这个 Pod,你可以保存这个 YAML 文件,并使用kubectl命令行工具应用它:

代码语言:javascript
复制
kubectl apply-f my-pod.yaml

在这里,my-pod.yaml是包含上述内容的文件。执行这个命令后,Kubernetes 会根据定义创建 Pod,并确保它按预期运行。

这里有一个坑哈,因为官方镜像无法下载,我提前把镜像下载到了每台机器上,但是创建容器的时候还会去下载镜像,所以这里有2个方法:换一个你自己可用下载的地址,或者修改镜像下载策略。

代码语言:javascript
复制
image: nginx:latest      # 容器镜像
imagePullPolicy: IfNotPresent  #添加这样一行

范例二:多容器

下面是一个包含两个容器的 Pod 清单文件的示例。这个 Pod 会运行两个容器,其中一个使用nginx镜像,另一个使用busybox镜像。每个容器运行不同的应用或服务。

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: two-containers-pod
  labels:
    purpose: demonstrate-multi-container
spec:
  containers:
  - name: nginx-container     # 第一个容器
    imagePullPolicy: IfNotPresent
    image: nginx:latest
    ports:
    - containerPort: 80

  - name: busybox-container   # 第二个容器
    imagePullPolicy: IfNotPresent
    image: busybox
    args:                     # 为 busybox 提供参数,让它执行死循环命令
    - /bin/sh
    - -c
    - "while true; do sleep 3600; done"

在这个 YAML 文件中:

  • apiVersion: 指定 Kubernetes API 版本,v1是核心 API 版本。
  • kind: 指定 Kubernetes 资源类型,这里是 Pod。
  • metadata: 提供 Pod 的元数据,包括名称和标签。
  • spec: 描述 Pod 的规范,包括其中运行的容器。
  • containers: 这是一个容器列表,包含 Pod 内的所有容器。
    • name: 容器的名称。
    • image: 容器使用的镜像。
    • ports: 指定容器需要暴露的端口(对于 nginx 容器)。
    • args: 提供给容器的启动参数(对于 busybox 容器),这里让 busybox 容器执行一个死循环命令,让它保持运行状态。

保存这个文件,例如命名为two-containers-pod.yaml,然后可以使用kubectl工具来创建 Pod:

代码语言:javascript
复制
kubectl apply -f two-containers-pod.yaml

这个命令会在你的 Kubernetes 集群中创建一个名为two-containers-pod的 Pod,该 Pod 内运行两个容器。

从图上可以看到单容器会显示1/1,2个容器会显示2/2,前面的数字代表准备好的容器,后面的数字代表总容器数量。

以上都是居于Kubernetes层面来看的,如果从容器层面来看,第一个单容器的Pod,会真实生成2个容器,第二个实例会生成3个容器。

甚至连Kubernetes自身的pod,包括kube-apiserver/kube-controller-manager/kube-scheduler等也会默认有2个容器。

可以看到,每个Pod都有一个容器,使用了pause的镜像,启动命令也只有 一个/pause,他是做什么用的,为什么会有这样一个容器的存在。

在 Kubernetes Pod 的上下文中,"pause" 容器起着特殊且重要的角色。在一个 Pod 内,可以有一个或多个业务容器,它们是实际运行应用程序的容器。除此之外,每个 Pod 还会启动一个特殊的容器,称为 "pause" 容器。这个容器不会执行任何实际的应用程序逻辑,它的目的是充当整个 Pod 所有容器的 "父容器"。Pause 容器的作用包括:

  1. 资源共享和管理:Pause 容器是 Pod 内所有容器的资源命名空间的持有者。这意味着网络和 IPC(进程间通信)命名空间都是由 pause 容器创建和持有的。其他业务容器在启动时会加入到这个已经存在的命名空间,从而能够共享相同的网络视图(比如 IP 地址和端口空间)和能够进程间通信。
  2. 保持 Pod 的存活状态:Pause 容器的另一个作用是保证 Pod 保持运行状态,即使业务容器被停止或者崩溃,只要 pause 容器还在运行,Pod 就不会被 Kubernetes 认为是完全死亡的。这可以让 Kubernetes 的调度器和控制器以一种可预测的方式管理 Pod 的生命周期。
  3. 提供一个恒定的环境:Pause 容器在 Pod 的整个生命周期内都是运行的,这为其他容器提供了一个稳定的环境。例如,如果一个业务容器需要重启,它可以重新连接到相同的网络和 IPC 命名空间。

为了实现这些功能,pause 容器通常是一个非常轻量级的容器,使用的镜像占用空间非常小,它不会执行任何实质性的程序,只是简单地在无限循环中休眠状态,等待被 Kubernetes 使用。

Pause 容器的使用是 Kubernetes 管理 Pod 内部容器的一个技术细节,并且对于大多数用户来说是透明的。然而,了解它的存在和作用可以帮助更好地理解 Kubernetes Pod 的内部工作原理。

在早期的Kubernetes介绍pod会直接引用pod的英文翻译豆荚来介绍什么是Pod,还是很贴切的,整个豆荚包括豆荚壳+豆子,其中豆荚壳可以理解为pause容器,每个豆荚都必须有一个,至于豆荚里面有几个豆子,其实就等效于里面有几个容器,他们共享了豆荚壳的空间等信息。

重点

1.理解这个pod的是个什么。

2.就是理解pause这个容器。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Pod的介绍
    • 基本介绍
    • 范例一: 单容器
    • 范例二:多容器
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档