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)
- 工作负载型资源负责应用编排
- 服务发现和负载均衡型资源完成服务注册、发现及流量调度
资源类型是指 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-podnamespace: default
spec:containers:- name: nginx-containerimage: nginx:1.21.6ports:- containerPort: 80
在这个例子中:
- Pod 是资源类型。
- nginx-pod 是资源对象。
总结:
- 资源类型:描述了 Kubernetes 中可以管理的一类实体,例如 Pod、Service、Deployment 等。它是一个通用的概念。
- 资源对象:是具体的、实际存在的 Kubernetes 实体,基于某种资源类型定义。例如,一个具体的 Pod、Service 或 Deployment 实例。
3. API资源规范
资源规范
- 绝大多数的Kubernetes对象都包含spec和status两个嵌套字段
- spec字段存储对象的期望状态(或称为应有状态)
- 由用户在创建时提供,随后也可按需进行更新(但有些属性并不支持就地更新机制)
- 不同资源类型的spec格式不尽相同
- status字段存储对象的实际状态(或称为当前状态)
- 由Kubernetes系统控制平面相关的组件负责实时维护和更新
- spec字段存储对象的期望状态(或称为应有状态)
- 对象元数据(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后由其自行完成格式转换
资源规范的具体格式
- https://kubernetes.io/zh-cn/docs/reference/kubernetes-api
- 内建文档:kubectl explain 命令获取
- 参考现有资源对象:kubectl get TYPE/NAME -o
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对象提供固定的访问入口
6.指令式命令
6.1编排应用
仅打印资源清单
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对象
#仅打印资源清单
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 statefulsetkubectl scale TYPE/NAME ... --replicas=COUNT