Kubernetes: 架构、资源与对象

架构#

基本特性#

  • 声明式:Kubernetes中常用yaml文件定义服务和资源的拓扑结构和状态,它是一种声明式的编程方式,更加关注状态和结果。其实我们最常接触的是命令式编程,它要求我们描述为了达到某一个效果或者目标所需要完成的指令。常见的编程语言 Go、Ruby、C++ 以及我们使用的kubectl工具其实都属于命令式的编程方法;
  • 显式接口:不存在内部的私有接口;
  • 无侵入:每一个应用或者服务一旦被打包成了镜像就可以直接在 Kubernetes 中无缝使用,不需要修改应用程序中的任何代码;
  • 可移植:支持有状态服务的迁移和持久化存储。

资源与对象#

Kubernetes中的所有内容都被抽象为“资源”,如 Pod、Service、Node 等都是资源。“对象”就是“资源”的实例,是持久化的实体。如某个具体的 Pod、某个具体的 Node。Kubernetes 使用这些实体去表示整个集群的状态。
对象的创建、删除、修改都是通过 “Kubernetes API”,也就是 “Api Server” 组件提供的 API 接口,这些是 RESTful 风格的 Api,与 k8s 的“万物皆对象”理念相符。命令行工具 “kubectl”,实际上也是调用 kubernetes api。
Kubernetes REST API中的所有对象都用Name和UID来明确地标识。

常见的资源配置信息有:

  • apiVersion:api版本
  • kind:类别
  • metadata:元数据,包含了资源的Name, UID和Label等
  • spec:规格
  • status:状态

使用kubectl get <resource> -o yaml命令即可在标准输出中看到某一种资源的yaml配置信息,如:

- apiVersion: v1
  kind: Pod
  metadata:
    annotations:
      openshift.io/deployment-config.latest-version: "2"
    labels:
      app: eureka-server
    name: eureka-server-2-lnbgl
    uid: *********
  spec:
    # ...
  status:
    # ...

Label#

apiVersion, kind和metadata是每个资源和对象都拥有的字段,而metadata中除了规定了每个对象所独有的Name和UID外,还声明了对象的Label,可以作为过滤项帮助我们选择和管理对象。

标签(Labels) 是附加到 Kubernetes 对象(比如 Pods)上的键值对。 标签旨在用于指定对用户有意义且相关的对象的标识属性,但不直接对核心系统有语义含义。 标签可以用于组织和选择对象的子集。标签可以在创建时附加到对象,随后可以随时添加和修改。 每个对象都可以定义一组键/值标签。每个键对于给定对象必须是唯一的。

如一个对象的Label配置信息如下:

kind: Pod 
metadata: {
  labels: {
    key1 : value1,
    key2 : value2
  }
}

我们就可以用命令kubectl get pods -l key1=value1,key2=value2准确的找到该对象。
给对象设置标签后,还可以在yaml文件中定义标签选择器过滤指定的标签。许多资源支持内嵌的标签选择器字段,如matchLabels和matchExpressions。一个常见的使用场景是指定某一Pod的节点选择准则,方便节点调度。例如让一个Pod选择标签为accelerator为"nvidia-tesla-p100"的节点:

apiVersion: v1
kind: Pod
metadata:
  name: cuda-test
spec:
  containers:
    - name: cuda-test
      image: "k8s.gcr.io/cuda-vector-add:v0.1"
  nodeSelector:
    accelerator: nvidia-tesla-p100

还可以通过Selector指定Service指向的一组Pod,以及ReplicationController应该管理的Pods的数量等。

Spec和Status#

  • Spec规定了对象的期望状态,不同对象的Spec几乎完全不同。
  • Status描述了对象的当前状态,是我们观察集群本身的一个接口。

在任何时刻,Kubernetes都一直积极地管理着对象的实际状态Status,以使之与期望状态Spec相匹配。

参考文献#

https://kubernetes.io/docs/home/
https://draveness.me/understanding-kubernetes/

posted @   koktlzz  阅读(117)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
主题色彩