首页 > 其他分享 >Kubernetes API资源规范

Kubernetes API资源规范

时间:2024-08-26 15:21:25浏览次数:8  
标签:kubectl Kubernetes 对象 规范 API Pod 资源

1. 资源类型和资源对象

1.1 资源类型 (Resource Types)

1.1.1 核心资源类型

  • Kubernetes API Primitive
    • 用于描述在Kubernetes上运行应用程序的基本组件,即俗称的Kubernetes对象(Object)
    • 它们持久存储于API Server上,用于描述集群的状态
  • 依据资源的主要功能作为分类标准,Kubernetes的API对象大体可分为如下几个类别
    • 工作负载(Workload)
    • 服务发现和负载均衡(Discovery & LB)
    • 配置和存储(Config & Storage)
    • 集群(Cluster)
    • 元数据(Metadata)
  • “以应用为中心”
    • Kubernetes API Primitive基本都是围绕一个核心目的而设计:如何更好地运行和丰富Pod资源,从而为容器化
    • 应用提供更灵活和更完善的操作与管理组件

1.1.2 核心资源类型(2)

  • 工作负载型资源负责应用编排
  • 服务发现和负载均衡型资源完成服务注册、发现及流量调度
    image

资源类型是指 Kubernetes API 中定义的一类资源。这些资源类型描述了 Kubernetes 集群中可以管理的各种实体或对象。这些类型都是 Kubernetes 的核心构建块,并且通过 API 提供相应的管理操作。

常见的资源类型包括:

  • Pod:最小的可部署单元,通常包含一个或多个容器。
  • Service:定义了一组 Pod 的访问策略,并提供负载均衡功能。
  • Deployment:用于声明应用的期望状态,管理 Pod 的副本集和滚动更新。
  • ConfigMap:用于存储非敏感配置信息,以便 Pod 可以使用。
  • Secret:用于存储敏感数据(如密码、密钥等),并保证其安全性。
  • Namespace:用于将资源分组和隔离,以便不同的团队或项目在同一集群中独立工作。
  • Node:Kubernetes 集群中的一个工作节点,运行 Pod 并由 Kubernetes 管理。
  • Job:一次性任务的控制器,确保指定数量的 Pod 成功完成任务。

2.资源对象 (Resource Objects)

资源对象是特定的 Kubernetes 资源类型的实例。每个资源对象都是集群中一个实际存在的实体,具有唯一的标识符,并且包含具体的配置、状态和元数据。

举例说明:

  • Pod 是一种资源类型,而一个具体名为 nginx-pod 的 Pod 是一个资源对象。
  • Service 是一种资源类型,而一个名为 frontend-service 的 Service 是一个资源对象。

资源对象的组成:

  • Metadata:每个资源对象都有元数据,包括 name(资源对象的名称)、namespace(资源所属的命名空间)、labels(标签)、annotations(注解)等。
  • Spec:spec 字段定义了资源对象的期望状态。例如,Pod 的 spec 中定义了容器的镜像、端口等。
  • Status:status 字段反映了资源对象的实际运行状态,如 Pod 是否正在运行、Service 的端点列表等。

YAML 文件示例:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: default
spec:
  containers:
  - name: nginx-container
    image: nginx:1.21.6
    ports:
    - containerPort: 80

在这个例子中:

  • Pod 是资源类型。
  • nginx-pod 是资源对象。

总结:

  • 资源类型:描述了 Kubernetes 中可以管理的一类实体,例如 Pod、Service、Deployment 等。它是一个通用的概念。
  • 资源对象:是具体的、实际存在的 Kubernetes 实体,基于某种资源类型定义。例如,一个具体的 Pod、Service 或 Deployment 实例。

3. API资源规范

资源规范

  • 绝大多数的Kubernetes对象都包含spec和status两个嵌套字段
    • spec字段存储对象的期望状态(或称为应有状态)
      • 由用户在创建时提供,随后也可按需进行更新(但有些属性并不支持就地更新机制)
      • 不同资源类型的spec格式不尽相同
    • status字段存储对象的实际状态(或称为当前状态)
      • 由Kubernetes系统控制平面相关的组件负责实时维护和更新
  • 对象元数据(metadata)
    • 名称、标签、注解和隶属的名称空间(不包括集群级别的资源)等
  • kind和apiVersion两个字段负责指明对象的类型(资源类型)元数据
    • 前者用于指定类型标识
    • 后者负责标明该类型所隶属的API群组(API Group)
     #显示 Kubernetes 集群支持的所有 API 版本
     ~# kubectl api-versions
     #列出 Kubernetes 集群中可用的所有资源类型及其对应的 API 组、简写、命名空间范围等信息
     ~# kubectl api-resources
     #查看指定 Kubernetes 资源类型(KIND)中 spec 字段的详细说明,例如 Pod、Deployment、Service,包括该字段的结构、可选项以及具体含义。
     ~# kubectl explain KIND.spec 
     
    

API Server

  • 基于HTTP(S)协议暴露了一个RESTful风格的API
  • kubectl命令或其它UI通过该API查询或请求变更API对象的状态
    • 施加于对象之上的基本操作包括增、删、改、查等
    • 通过HTTP协议的GET、POST、DELETE和PUT等方法完成,而对应于kubectl命令,它们则是create、get、describe、delete、patch和edit等子命令
  • 资源对象管理的基本操作:CRUD
    • Create: kubectl create
    • Read: kubectl get/describe
    • Update: kubectl edit/patch/replace/set
    • Delete: kubectl delete

API对象管理

  • 创建对象时,必须向API Server提供描述其所需状态的对象规范、对象元数据及类型元数据
  • 需要在请求报文的body中以JSON格式提供
    • 用户也能够以YAML格式定义对象,提交给API Server后由其自行完成格式转换

资源规范的具体格式

4. API资源对象管理

使用客户端程序,对API Server的REST服务端点发请求,请求的body部分要遵循API资源规范

kubectl命令提供了三种类型的对象管理机制

  • 指令式命令(Imperative commands)
    • 直接作用于集群上的活动对象(Live objects)
    • 适合在开发环境中完成一次性的操作任务
  • 指令式对象配置(Imperative object configuration)
    • 基于资源配置文件执行对象管理操作,但只能独立引用每个配置清单文件
    • 可用于生产环境的管理任务
  • 声明式对象配置(Declarative object configuration)
    • 基于配置文件执行对象管理操作
    • 可直接引用目录下的所有配置清单文件,也可直接作用于单个配置文件

4.1 指令式命令 (Imperative Commands)

特点:

  • 直接通过命令行操作来创建、更新或删除资源。
  • 不需要配置文件,操作更快捷和简单,适用于快速操作和实验场景。

适用场景:

  • 快速创建或更新单个资源,或者执行简单的管理任务。
  • 常用于临时性的操作或者当你不需要保存操作的历史记录时。

示例:
创建一个 Pod:

#指定nginx镜像创建一个名为nginx的pod
kubectl run nginx --image=nginx

暴露一个 Pod 作为 Service:

kubectl expose pod nginx --port=80 --target-port=80
#expose 是一个指令式命令,用于为现有的 Pod、Deployment 或 ReplicaSet 创建一个 Service。
#pod nginx 表示要暴露的对象是名称为 nginx 的 Pod。
#--port=80 指定 Service 应该监听的端口号(Service 的端口)。
#--target-port=80 指定 Service 将流量转发到 Pod 内部容器的端口号(容器的端口)。

更新一个 Deployment 的镜像:

kubectl set image deployment/my-deployment nginx=nginx:1.21.6
#更新 my-deployment Deployment 中 nginx 容器的镜像版本为 nginx:1.21.6

4.2 指令式对象配置 (Imperative Object Configuration)

特点:

  • 使用配置文件创建或更新资源,但通过命令行执行命令以立即应用这些更改。
  • 需要配置文件,但执行的方式仍然是指令式的。

适用场景:

  • 当你希望保留资源的配置文件,但仍然想要通过命令行的方式来控制操作时。

示例:
创建或更新资源:

kubectl create -f pod.yaml
#指定从pod.yaml文件中创建资源对象

替换现有资源的配置:

kubectl replace -f pod.yaml
#replace 是一个指令式命令,用于替换现有资源的配置。使用 pod.yaml 文件中的配置替换已有的资源对象(如 Pod),旧资源对象将被删除并重新创建。

4.3 声明式对象配置 (Declarative Object Configuration)

特点:

  • 通过配置文件定义资源的期望状态,并使用 kubectl apply 命令将配置文件应用到集群中。
  • 配置文件成为唯一的真实来源(source of truth),适合持续交付和集成 (CI/CD) 流程。
  • 支持资源的部分更新 (Patch),即只修改配置文件中变化的部分,而保留其他部分不变。

适用场景:

  • 更复杂的部署场景,尤其是在需要版本控制和持续集成的环境中。
  • 保留资源的历史记录,并能够轻松进行版本回滚。

示例:
声明式地创建或更新资源:

kubectl apply -f pod.yaml
#这个命令会将pod文件中的配置与集群中的现有资源进行对比,只应用文件中不同的部分(即支持部分更新)

更新多个资源:

kubectl apply -f ./configs/
#这种方式常用于一次性应用多个资源配置,特别是在 CI/CD 流程中。-f ./configs/ 指定了包含多个配置文件的目录。Kubernetes 将递归读取该目录下的所有 YAML 文件,并根据文件中的定义创建或更新相应的资源。这种方式常用于一次性应用多个资源配置,特别是在 CI/CD 流程中。

总结

  • 指令式命令:适合临时的、简单的管理操作。操作较为简单和快捷,但不适合复杂的场景。
  • 指令式对象配置:适合需要通过配置文件管理但又希望通过命令行快速操作的场景。
  • 声明式对象配置:最适合需要版本控制、持续交付、复杂环境中的场景。操作更为规范和稳定,适合生产环境。

5. 部署并访问应用

部署应用

  • 依照编排需求,选定合适类型的工作负载型控制器
  • 创建工作负载型控制器对象,由其确保运行合适数量的Pod对象
  • 创建Service对象,为该组Pod对象提供固定的访问入口
    image

6.指令式命令

6.1编排应用

image

仅打印资源清单

kubectl create deployment demoapp --image=ikubernetes/demoapp:v1.0 --port=80 --dry-run=client --replicas=3 -o yaml
#--dry-run=client: 表示在客户端执行“模拟运行”,即生成配置文件而不提交到 API 服务器,确保不会实际创建任何资源。
#-o yaml: 指定输出格式为 YAML,方便用户查看或进一步修改。

创建deployment对象,Deployment控制器确保deployment/demoapp中定义

kubectl create deployment demoapp --image=ikubernetes/demoapp:v1.0 --port=80 --replicas=3
#Deployment: 是一种 Kubernetes 控制器,用于管理一组 Pod 的部署和生命周期。它提供滚动更新、回滚、扩缩容等功能。
#replicas=3: 指定该 Deployment 将维护三个运行中的 Pod 副本。
#image=ikubernetes/demoapp:v1.0: 定义容器使用的镜像版本。
#port=80: 指定容器将监听的端口号。

了解完整的资源规范及状态
kubectl get deployments [-o yaml|json]
了解Pod对象的相关信息
kubectl get pods -l app=demoapp -o wide

6.2 创建Service对象

image

#仅打印资源清单
kubectl create service clusterip demoapp --tcp=80:80 --dry-run=client -o yaml
#创建Service对象
kubectl create service clusterip demoapp --tcp=80:80
#了解Service的相关信息
kubectl get services demoapp -o wide
#访问Service
demoappIP=$(kubectl get services demoapp -o jsonpath={.spec.clusterIP})
curl $demoappIP

kubectl常用命令

显示资源

kubectl get TYPE [NAME ...] -o {wide|yaml|json}
kubectl get TYPE/NAME ... -o {wide|yaml|json}

删除资源:

kubectl delete TYPE [NAME ...] 
kubectl delete TYPE/NAME ...

详细的状态描述:

kubectl describe TYPE [NAME ...]
kubectl describe TYPE/NAME ...  

在Pod的某容器内部执行命令:

kubectl exec [-it] POD [-c CONTAINER]  -- COMMAND [args...] [options]

查看容器日志:

kubectl logs [-it] POD [-c CONTAINER]  

命令总结:

kubectl scale 
 deployment, replicaset, or statefulset

kubectl scale TYPE/NAME ... --replicas=COUNT

标签:kubectl,Kubernetes,对象,规范,API,Pod,资源
From: https://www.cnblogs.com/Dxj01/p/18360625

相关文章

  • kubernetes版本回滚
    1.创建待测试的Deployment。echo"---#DeploymentapiVersion:apps/v1kind:Deploymentmetadata: name:rollback-test labels:  app:rollback-testspec: replicas:1 selector:  matchLabels:   app:rollback-test template:  ......
  • 在使用FastAPI处理数据输入的时候,对模型数据和路径参数的一些转换处理
    在开发Python的后端API平台的时候,为了兼容我SqlSugar开发的一些Winform端、BS端、UniApp端、WPF端等接入,由于部分是基于.net的处理,因此可能对于接入对象的属性为常见的Camel的驼峰命名规则,但是Python一般约定属性名称为小写,因此需要对这个模型进行兼容;另外默认FastAPI路由路径也是......
  • Java 入门指南:异常处理的实践规范
    在Java中处理异常并不是一个简单的事情。需要花费很多时间来思考如何处理异常,包括需要处理哪些异常,怎样处理等等。抛出或捕获异常的时候,有很多不同的情况需要考虑,而且大部分事情都是为了改善代码的可读性或者API的可用性。异常不仅仅是一个错误控制机制,也是一个通信媒......
  • 根据销售订单创建交货单(BAPI_DELIVERYPROCESSING_EXEC)
    可以指定对应的仓库和销售订单创建交货单 创建交货单:BAPI_DELIVERYPROCESSING_EXEC交货单过账:WS_DELIVERY_UPDATE 创建交货单:functionZTEST1.*"----------------------------------------------------------------------*"*"本地接口:*"IMPORTING*"VALUE(IV_W......
  • Api中子类继承父类后,子类设置JsonIgnore失效的补救
    如publicclassPerson{publicstringName{get;set;}publicintAge{get;set;}}publicclassStudent:Person{publicstringGrade{get;set;}[Newtonsoft.Json.JsonIgnore]publicnewintAge{get;set;}}序列化Student,Age还是一......
  • 【K8s】专题十二(3):Kubernetes 存储之 PersistentVolumeClaim
    本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发、订阅专栏!专栏订阅入口Linux专栏 | Docker专栏 | Kubernetes专栏往期精彩文章【Docker】(全网首发)KylinV10下MySQL容器内存占用异常的解决方法【Docker】(全网首发)Kyli......
  • 在NextChat中接入SiliconCloud API 体验不同的开源先进大语言模型
    NextChat介绍One-Clicktogetawell-designedcross-platformChatGPTwebUI,withGPT3,GPT4&GeminiProsupport.一键免费部署你的跨平台私人ChatGPT应用,支持GPT3,GPT4&GeminiPro模型。主要功能在1分钟内使用Vercel免费一键部署提供体积极小(~5MB)的跨......
  • fastapi 跨域请求
    问题描述在前后端开发中遇到一个问题,前端发送请求后,后端报'OPTIONS/mock/user/loginHTTP/1.1'405MethodNotAllowed,如下图:但用fastapi自带的swagger或postman测试又是可以的。 定位原因这是因为在跨域的情况下,在浏览器发起"复杂请求"时主动发起的。跨域共享标准规范......
  • Web API 学习笔记 第四弹
    1.时间戳获取时间戳的方法①date.getTime()②+newDate()2.定时器console.log(111)setTimeout(()=>{console.log(222)},1000)console.log(333)console.log(111)setTimeout(()=>{console.log(222)},0)console.log(333)这两段代码打印结果分......
  • 使用钉钉Stream模式和API实现简单的考勤效果
    前期准备创建企业/组织。通讯录->右上角人型标志->创建或加入企业/团队。教程组织绑定考勤机。录入人脸信息。通讯录->更多->智能办公硬件->智能前台->选择对应的考勤机。为应用接入Stream模式重点:官方文档创建企业内部应用。进入钉钉开放平台->主管理员登录->右上角我的......