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/
作者:koktlzz
出处:https://www.cnblogs.com/koktlzz/p/14330351.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现