Kubernetes 中的对象

  • 时间:
  • 来源:互联网
  • 文章标签:

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 内使用起来比较麻烦

本文链接http://www.taodudu.cc/news/show-1781771.html