Kubernetes 中的对象
Kubernetes 里存在大量对象,基本上每个核心概念都对应有一个对象,这些对象除了在系统内部使用,也通过 API 开放给外部系统使用。
对象
对象类型
它们在 Kubernetes 配置文件中通过 kind 属性配置
- Pod
- Node
- Namespace
- Service
- Volume
- PersistentVolume
- Deployment
- Secret
- StatefulSet
- DaemonSet
- ServiceAccount
- ReplicationController
- ReplicaSet
- Job
- CronJob
- SecurityContext
- ResourceQuota
- LimitRange
- HorizontalPodAutoscaling
- Ingress
- ConfigMap
- Label
- ThirdPartyResources
对象含义
Kubernetes 中的对象表示的是整个集群的状态,对集群状态的改变通过操作对象来完成。这些对象描述的集群状态包括:
- 哪些应用运行在哪些节点上
- 有哪些资源可以被使用
- 应用运行策略,比如重启策略、升级策略等
Kubernetes 对象描述的是期望状态。一旦创建,系统将尽力保证达到和维持该操作。操作 Kubernetes 对象通过调用 Kubernetes API 完成,kubectl 命令就是这样实现的。Kubernetes 还提供了多种语言的客户端,包括 Go、Python、Java、.Net 和 JavaScript,来方便调用 API。
规范(Spec)
对象的期望状态通过对象的 spec 属性来描述,每个对象都具有该属性。而对象的当前状态则通过 status 属性来查看,Kubernetes 控制管理器会尽力保证 status 与 spec 一致。
对象配置文件
调用 Kubernetes API 时需要使用 JSON 格式传输数据,而对象配置文件通常使用可读性更好的 YAML 格式。kubectl 在执行 API 请求时,会将从配置文件中读取的 YAML 格式内容转换为 JSON 格式后再发送给 API Server
每种 Kubernetes 对象的配置文件中,都需要配置以下字段:
- apiVersion API 版本
- kind 对象类型
- metadata 元数据,比如 name、uid、namespace 等
- spec 随具体对象类型而不同
节点(Node)
Node 在 Kubernetes 中提供计算资源,它屏蔽了底层基础设施的细节,以方便在不同的基础设施之间迁移,比如从本地物理机迁移到云计算平台。Node 具有以下状态信息:
- Address
- HostName:主机名
- ExternalIP:可以从集群外部访问的 IP
- InternalIP:集群内部 IP,外部无法访问
- Condition
- OutOfDisk:磁盘空间状态,不足时为 True
- Ready:健康状态,一段时间没收到为 Unknown,健康为 True,否则为 False
- MemoryPressure:内存占用状态,有压力时为 True,否则为 False
- DiskPressure:磁盘使用状态,有压力时为 True,否则为 False
- Capacity
- CPU:CPU计算能力
- 内存:内存大小
- Pod 限制:最多可运行的 Pod 个数
- Info:节点信息,比如 OS、Kubernetes 版本信息等
当节点需要进行维护时,先使用 kubectl drain 驱逐其上的 Pod,Kubernetes 会将这些 Pod 调度到其他节点上运行,然后使用 kubectl cordon 来禁止新的 Pod 调度到其上。这些操作完成后就可以对节点进行维护。维护完成后,使用 kubectl uncordon 来重新启用节点。
命名空间(Namespace)
通过 namespace 可以在一个 Kubernetes 集群里虚拟出多个集群,每个集群都认为自己是独立存在的。如果需要的话,也可以让虚拟机群之间互相访问。可以根据项目来划分 namespace ,或者按部署环境来划分,比如为开发、测试和生产各自创建一个 namespace
可使用命令 kubectl get ns 来获取集群中的命名空间列表,默认存在 default 和 kube-system 两个命名空间。执行 kubectl 命令时可以通过 -n 选项指定命名空间,默认为 default。
标签(Label)
标签对系统而言没有任何特殊含义,仅仅是添加到对象上的键值对属性而已。这些键值对属性对用户来说没有特殊含义。标签通过 labels 属性来添加:
"labels": {
"release" : "stable",
"environment" : "production"
}
为了优化标签查询性能,Kubernetes 会对标签创建索引
标签 key 的 命名要求:
- 不超过 63 个字符
- 可以使用前缀,比如 “kubernetes.io/”,前缀必须是 DNS 子域,不得超过 253 个字符
- 可包含字母、数字、中划线、下划线和点,但必须以字母或数字打头
标签 value 的取值要求:
- 不超过 63 个字符
- 可包含字母、数字、下划线和点,但必须以字母或数字打头
对象打好标签后,可使用标签选择器(selector)来对对象进行筛选和过滤,以得到想要操作的对象集合。有以下几种选择器类型:
- 等于式:使用 =、==、!= 操作符
- 集合式:使用 in、notion、! 操作符
- 存在式:只有 key,没有 value,对象存在该 key 标签即可,不管 value
示例:
kubectl get pods -l environment=production,tier=frontend
kubectl get pods -l 'environment in (production),tier in (frontend)'
kubectl get pods -l 'environment in (production, qa)'
kubectl get pods -l 'environment,environment notin (frontend)'
注解(Annotation)
不像标签,注解用于给对象添加非标识性数据,虽然这些数据不能用于筛选和过滤对象,但工具和库可以使用这些数据来完成特定功能。相比于标签,注解没有字符类型限制,也可以存放较长的数据。类似于标签,注解也是键值对集合:
"annotations": {
"key1" : "value1",
"key2" : "value2"
}
以下是一些可以记录在注解中的信息:
- 创建信息、版本信息或镜像信息,比如时间戳、版本号、分支等
- 辅助 debug 库或工具的信息,比如版本
- 负责人联系方式,比如电话、邮箱、网站等
也可将这些信息存放在外部数据库里,但这样在 Kubernetes 内使用起来比较麻烦