Pod
pod是一个逻辑单位,由多个容器组合,是kubernetes原子调度单位,Pod 的共享上下文包括一组 Linux 名字空间、控制组(cgroup)等
特点
- Pod是调度的原子单位。这意味着调度器会设法找到一个满足该Pod中所有的容器要求的主机,如果需要创建的Pod需要很多资源(比如包含很多容器),那么调度器会设法找到一个拥有足量资源以满足所有容器需求总和的主机
- Pod需要确保容器都放在同一处,因此同一个Pod中的容器间就有了额外的交互手段。包括共享文件、localhost网络接口以及主机间进程通信(IPC)等机制,可以进行高效的交互
- Pod拥有一个IP地址、名称和端口范围,可供Pod中的所有容器共享。因此必须要保持Pod中的容器的端口不起冲突
Service
动机
Pod的生命很短暂,随时可能由于种种原因被添加或者移除,比如扩大或缩小规模,容器运行状态检查失败,以及节点迁移等。只有当Pod调度到某个节点上并启动后,才能知道Pod的IP,因此Pod的网络地址可能会中应用容器的生命周期内发生变化,因此需要引入Service实现Pod的服务注册发现以及负载均衡
Service
K8s Service负责将服务名称永久地绑定到IP地址和端口号。因此Service代表访问应用程序的入口。在绝大多数情况下,Service就相当于一组Pod的入口,但也有例外。Service也可以指向Kubernetes集群外部提供的接口。因此,可以利用Service提供服务注册发现以及负载均衡
labels
labels是用于组织 Kubernetes API 对象的一个非常强大且简单的功能。 labels是附加到对象的键值对,利用labels可以识别一组Pod
常见用法
- statefulset使用labels来保持特定Pod的一些实例处于运行状态,这意味着每一个Pod定义都需要拥有一套唯一的labels,供调度使用
- scheduler也会使用大量的labels,scheduler使用labels将pod统一调度到满足要求的节点上
- labels可以代表一组Pod的逻辑分组,并为它们提供应用程序标识
annotations
annotations和labels一样采用映射形式,它们不存储标识信息,不能用于过滤对象。与标签不同,注释值可以更长并且可以包含任何字符
特点
annotations的信息不能用于查询和匹配,它的目的是为我们使用的各种工具和库中的对象额外提供的元数据,例如,构建ID,版本ID,镜像信息、时间戳、Git分支名、拉取请求编号、镜像哈希、注册表地址、作者姓名,工具信息等。labels主要用于查询资源以及针对匹配的资源执行操作,而注释则是用于添加机器使用的元数据
namespace
在 Kubernetes 中,Namespace提供一种机制,将同一集群中的资源划分为相互隔离的组。 同一命名空间内的资源名称要唯一,但跨命名空间时没有这个要求。 命名空间作用域仅针对带有命名空间的对象,例如 Deployment、Service 等, 这种作用域对集群访问的对象不适用,例如 StorageClass、Node、PersistentVolume 等
特性&用途
- 利用命名空间管理kubernetes的资源
- 利用命名空间管理为容器、Pod、Service或statefulset等资源提供作用域。在同一个namespace中资源名称必须是唯一的,但不同namespace中的资源可以同名
- 有些资源,例如namespace本身、node、持久卷等,不属于namespace,而且它们在集群范围内的名称必须唯一
- ResourceQuotas提供了约束,可以用来限制每个命名空间上资源消耗的总和,例如限制每种类型允许的对象数量,或者限制请求计算资源总和