
我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。
后续操作都是以docker版本为基准。k8s配置文件一般使用yaml格式进行编写,所以后续的范例都是这样的。
在 Kubernetes 中,Pod(容器组)是最小的可调度和可部署的单元。它是一个逻辑概念,用于包装一个或多个相关的容器,并共享网络和存储资源。
Pod 中的容器紧密相关,并且它们一起协同工作来提供某种服务或应用程序。这些容器可以共享同一个网络命名空间和存储卷,它们可以通过 localhost 直接通信。
Pod 具有以下特点:
Pod 有以下几种常见的使用方式:
总而言之,Pod 是 Kubernetes 中最小的可调度和可部署的单元。它包含一个或多个紧密相关的容器,并共享网络和存储资源。Pod 具有自己的生命周期,可以独立创建、启动、停止和删除。Pod 可以以单容器或多容器的方式使用,并可以是无状态或有状态的。
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命令行工具应用它:
kubectl apply-f my-pod.yaml在这里,my-pod.yaml是包含上述内容的文件。执行这个命令后,Kubernetes 会根据定义创建 Pod,并确保它按预期运行。

这里有一个坑哈,因为官方镜像无法下载,我提前把镜像下载到了每台机器上,但是创建容器的时候还会去下载镜像,所以这里有2个方法:换一个你自己可用下载的地址,或者修改镜像下载策略。
image: nginx:latest # 容器镜像
imagePullPolicy: IfNotPresent #添加这样一行下面是一个包含两个容器的 Pod 清单文件的示例。这个 Pod 会运行两个容器,其中一个使用nginx镜像,另一个使用busybox镜像。每个容器运行不同的应用或服务。
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 的规范,包括其中运行的容器。name: 容器的名称。image: 容器使用的镜像。ports: 指定容器需要暴露的端口(对于 nginx 容器)。args: 提供给容器的启动参数(对于 busybox 容器),这里让 busybox 容器执行一个死循环命令,让它保持运行状态。保存这个文件,例如命名为two-containers-pod.yaml,然后可以使用kubectl工具来创建 Pod:
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 容器的作用包括:
为了实现这些功能,pause 容器通常是一个非常轻量级的容器,使用的镜像占用空间非常小,它不会执行任何实质性的程序,只是简单地在无限循环中休眠状态,等待被 Kubernetes 使用。
Pause 容器的使用是 Kubernetes 管理 Pod 内部容器的一个技术细节,并且对于大多数用户来说是透明的。然而,了解它的存在和作用可以帮助更好地理解 Kubernetes Pod 的内部工作原理。
在早期的Kubernetes介绍pod会直接引用pod的英文翻译豆荚来介绍什么是Pod,还是很贴切的,整个豆荚包括豆荚壳+豆子,其中豆荚壳可以理解为pause容器,每个豆荚都必须有一个,至于豆荚里面有几个豆子,其实就等效于里面有几个容器,他们共享了豆荚壳的空间等信息。
重点
1.理解这个pod的是个什么。
2.就是理解pause这个容器。