目录
[Pod 和控制器](#Pod 和控制器)
[Pod 模板](#Pod 模板)
[Pod 更新与替换](#Pod 更新与替换)
[Pod 中的存储](#Pod 中的存储)
[Pod 联网](#Pod 联网)
[Pod 安全设置](#Pod 安全设置)
什么是pod
Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。
Pod(就像豌豆荚中)是一组(一个或多个) 容器; 这些容器共享存储、网络、以及怎样运行这些容器的规约。
Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。
Pod 所建模的是特定于应用的 "逻辑主机",其中包含一个或多个应用容器, 这些容器相对紧密地耦合在一起。
在非云环境中,在相同的物理机或虚拟机上运行的应用类似于在同一逻辑主机上运行的云应用。
Kubernetes 集群中的 Pod 主要有两种用法:
-
运行单个容器的 Pod。"每个 Pod 一个容器"模型是最常见的 Kubernetes 用例; 在这种情况下,可以将 Pod 看作单个容器的包装器,并且 Kubernetes 直接管理 Pod,而不是容器。
-
运行多个协同工作的容器的 Pod。 Pod 可以封装由紧密耦合且需要共享资源的多个并置容器组成的应用。 这些位于同一位置的容器构成一个内聚单元。
将多个并置、同管的容器组织到一个 Pod 中是一种相对高级的使用场景。 只有在一些容器之间紧密关联时的场景中才会使用这种模式。
启动一个pod
配置yaml文件并创建pod
[root@k8s-master-1 ~]# mkdir /pods
[root@k8s-master-1 ~]# cd /pods
[root@k8s-master-1 ~]# vim simple-pod.yaml
apiVersion: v1kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
以上是一个 Pod 示例,它由一个运行镜像 nginx:latest
的容器组成。
运行以下命令来创建刚刚配置的pod:
[root@k8s-master-1 ~]# kubectl apply -f /pods/simple-pod.yaml
此时已经成功创建了一个pod
说明
一般不会在 Kubernetes 中直接创建一个个的 Pod,甚至是单实例(Singleton)的 Pod。
Pod 和控制器
使用工作负载资源来创建和管理多个 Pod。
资源的控制器能够处理副本的管理、上线,并在 Pod 失效时提供自愈能力。 例如,如果一个节点失效,控制器注意到该节点上的 Pod 已经停止工作, 就可以创建替换性的 Pod。调度器会将替身 Pod 调度到一个健康的节点执行。
可以管理一个或者多个 Pod 的工作负载资源的控制器:
Deployment、StatefulSet、DaemonSet
Pod 模板
工作负载资源的控制器通常使用 Pod 模板(Pod Template) 来创建 Pod 并管理它们。
Pod 模板是包含在工作负载对象中的规范,用来创建 Pod。这类负载资源包括 Deployment、 Job和 DaemonSet等。
工作负载的控制器会使用负载对象中的 PodTemplate
来生成实际的 Pod。 PodTemplate
是你用来运行应用时指定的负载资源的目标状态的一部分。
创建 Pod 时,你可以在 Pod 模板中包含 Pod 中运行的容器的环境变量。
下面是一个简单的 Job 的配置示例,其中的 template
指示启动一个容器。 该 Pod 中的容器会打印一条消息之后暂停。
apiVersion: batch/v1
kind: Job
metadata:
name: hello
spec:
template:
这里是 Pod 模板
spec:
containers:
- name: hello
image: busybox:1.28
command: ['sh', '-c', 'echo "Hello, Kubernetes!" && sleep 3600']
restartPolicy: OnFailure
以上为 Pod 模板
修改 Pod 模板或者切换到新的 Pod 模板都不会对已经存在的 Pod 直接起作用。
如果改变工作负载资源的 Pod 模板,工作负载资源需要使用更新后的模板来创建 Pod, 并使用新创建的 Pod 替换旧的 Pod。
Pod 更新与替换
当某工作负载的 Pod 模板被改变时, 控制器会基于更新的模板创建新的 Pod 对象而不是对现有 Pod 执行更新或者修补操作。
Kubernetes 可以对运行中的 Pod 的某些字段执行更新操作:
-
Pod 的绝大多数元数据都是不可变的。
namespace
、name
、uid
或者creationTimestamp
字段不可更改;generation
字段比较特殊, 如果更新该字段,只能增加字段取值而不能减少。 -
如果
metadata.deletionTimestamp
已经被设置,则不可以向metadata.finalizers
列表中添加新的条目。 -
Pod 更新只能改变:
spec.containers[*].image
、spec.initContainers[*].image
、spec.activeDeadlineSeconds
、spec.tolerations
字段。 对于spec.tolerations
,只能添加新的条目到其中。 -
在更新
spec.activeDeadlineSeconds
字段时,只能进行以下两种操作:- 如果该字段尚未设置,可以将其设置为一个正数;
- 如果该字段已经设置为一个正数,可以将其设置为一个更小的、非负的整数
资源共享和通信
Pod 使它的成员容器间能够进行数据共享和通信。
Pod 中的存储
一个 Pod 可以设置一组共享的存储卷。 Pod 中的所有容器都可以访问该共享卷,从而允许这些容器共享数据。
卷还允许 Pod 中的持久数据保留下来,即使其中的容器需要重新启动。
Pod 联网
每个 Pod 都有一个唯一的 IP 地址。
Pod 中的每个容器共享网络命名空间,包括 IP 地址和网络端口。 Pod 内的容器可以使用 localhost 互相通信。 当 Pod 中的容器与 Pod 之外的实体通信时,它们必须协调如何使用共享的网络资源(例如端口)。
在同一个 Pod 内,所有容器共享一个 IP 地址和端口空间,并且可以通过 localhost 发现对方。它们也能通过如 SystemV 信号量或 POSIX 共享内存这类标准的进程间通信方式互相通信。 不同 Pod 中的容器的 IP 地址互不相同,如果没有特殊配置,就无法通过 OS 级 IPC 进行通信。 如果某容器希望与运行于其他 Pod 中的容器通信,可以通过 IP 联网的方式实现。
Pod 中的容器所看到的系统主机名与为 Pod 配置的 name 属性值相同。
Pod 安全设置
要对 Pod 和容器设置安全约束,请使用 Pod 配置项中的 securityContext
字段,例如:
runAsUser
:指定容器内进程运行的用户ID。runAsGroup
:指定容器内进程运行的主组ID(需要Kubernetes 1.20+版本)。runAsNonRoot
:强制容器以非root用户身份运行。allowPrivilegeEscalation
:控制容器内的进程是否可以获得更多权限。readOnlyRootFilesystem
:将容器的根文件系统挂载为只读,防止修改。