Kubernetes资源管理与yaml文件详解
目录
kubenetes资源管理
一、Kubernetes 资源管理方法
二、基础信息查看命令
1. 集群与工具基础信息
2. 资源通用查询(kubectl get)
3. 资源详情查看(kubectl describe)
三、项目生命周期操作(完整流程)
1. 1. 创建(陈述式 / 声明式)
陈述式创建(快速创建)
声明式创建(基于 YAML)
2. 发布(暴露 Service 供访问)
陈述式发布(kubectl expose)
Service 类型说明
验证发布结果
3. 更新(升级应用版本)
陈述式更新(kubectl set)
声明式更新(修改 YAML)
4. 回滚(版本回退)
5. 删除(清理资源)
陈述式删除
声明式删除(基于 YAML)
强制删除(处理卡住的 Pod)
四、主流发布策略(金丝雀 / 蓝绿 / 滚动)
1. 滚动发布(Rolling Update)
2. 金丝雀发布(Canary Release)
3. 蓝绿发布(Blue-Green Deployment)
Kubernetes YAML 配置与端口详解
1. 查看 Kubernetes 版本信息
查看 kubectl 与集群版本
查看 API 资源版本标签
2. YAML 格式语法规则
3. 资源清单(YAML)编写详解
示例 1:Deployment 资源清单
示例 2:Service 资源清单
资源清单核心组成
4. 端口概念详解(port/nodePort/targetPort/containerPort)
端口映射流程
5. 快速编写 YAML 文件的方法
方法 1:使用 --dry-run 生成模板
方法 2:导出已有资源的配置
方法 3:使用 kubectl edit 复制配置
方法 4:查询字段帮助
简化模板技巧
kind的资源类型有:
一、核心资源(Core Resources)
二、工作负载资源(Workload Resources)
三、服务发现与负载均衡(Service Discovery & Load Balancing)
四、配置与存储(Configuration & Storage)
五、集群资源(Cluster Resources)
六、其他常用资源
查看所有资源类型
kubenetes资源管理
一、Kubernetes 资源管理方法
K8s 资源管理分为陈述式和声明式两大类,核心差异在于操作逻辑与适用场景:
维度 | 陈述式管理(Imperative) | 声明式管理(Declarative) |
---|---|---|
核心逻辑 | 直接执行 “做什么” 的命令(如创建、删除) | 通过配置文件定义 “要什么状态”,K8s 自动实现 |
适用场景 | 简单操作(查、临时创建、删除) | 复杂操作(修改、批量管理、长期维护) |
依赖载体 | 命令行参数 | YAML/JSON 配置清单 |
典型命令 | kubectl create /delete /get | kubectl apply /edit /delete -f |
优势 | 操作直观、无需写配置,适合新手 | 可版本控制、支持批量操作、修改追溯性强 |
劣势 | 修改复杂(需先删后改)、无配置记录 | 需熟悉 YAML 语法、初期学习成本高 |
二、基础信息查看命令
1. 集群与工具基础信息
操作目标 | 命令 | 说明 |
---|---|---|
查看 kubectl 版本 | kubectl version | 显示客户端(kubectl)与服务端(APIServer)版本 |
查看资源对象简写 | kubectl api-resources | 快速了解资源别名(如 pod 简写 po ) |
查看集群整体信息 | kubectl cluster-info | 显示 APIServer、etcd 等核心组件地址 |
配置 kubectl 自动补全 | source <(kubectl completion bash) | 需重启终端生效,支持命令 / 资源名补全 |
查看 Node 节点日志 | journalctl -u kubelet -f | 实时查看 kubelet 运行日志(定位节点故障) |
2. 资源通用查询(kubectl get
)
通用语法:kubectl get <资源类型> [-o 格式] [-n 命名空间] [参数]
操作目标 | 命令 | 说明 |
---|---|---|
查看 Master 组件状态 | kubectl get cs | 简写 cs = componentstatuses ,查 etcd、scheduler 等 |
查看命名空间 | kubectl get ns | 简写 ns = namespace ,显示所有命名空间 |
查看指定命名空间资源 | kubectl get pods -n kube-public | 仅显示 kube-public 命名空间的 Pod |
查看所有命名空间资源 | kubectl get pods -A | -A = --all-namespaces ,全局资源查询 |
显示资源标签 | kubectl get pods --show-labels | 查看 Pod 关联的所有标签(用于筛选) |
按标签筛选资源 | kubectl get pods -l app=nginx | 仅显示标签 app=nginx 的 Pod |
查看资源详细信息 | kubectl get pods -o wide | 显示 Pod IP、所在 Node、镜像版本等额外信息 |
查看资源 YAML 配置 | kubectl get deployment nginx -o yaml | 导出资源的完整配置(用于声明式管理) |
3. 资源详情查看(kubectl describe
)
语法:kubectl describe <资源类型>/<资源名> [-n 命名空间]
# 查看 Deployment 详情(含事件、Pod 模板)
kubectl describe deployment nginx-wl -n kube-public# 查看 Pod 详情(含容器日志、事件、挂载信息)
kubectl describe pod nginx-wl-d47f99cb6-hv6gz -n kube-public
三、项目生命周期操作(完整流程)
项目生命周期:创建 → 发布 → 更新 → 回滚 → 删除,以下以 Nginx 为例演示完整操作。
1. 1. 创建(陈述式 / 声明式)
陈述式创建(快速创建)
# 1. 创建命名空间(可选,默认用 default)
kubectl create ns app# 2. 创建 Deployment(管理 Pod 副本)
# --image:指定容器镜像;--replicas:指定副本数;-n:指定命名空间
kubectl create deployment nginx --image=nginx:1.14 --replicas=3 -n app# 3. 查看创建结果
kubectl get deployment,pods -n app
声明式创建(基于 YAML)
- 编写 YAML 文件(如
nginx-deploy.yaml
):
apiVersion: apps/v1
kind: Deployment
metadata:name: nginxnamespace: app
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14ports:- containerPort: 80
- 应用 YAML 创建资源:
kubectl apply -f nginx-deploy.yaml
2. 发布(暴露 Service 供访问)
发布核心是创建 Service
,实现 Pod 访问入口(解决 Pod IP 动态变化问题)。
陈述式发布(kubectl expose
)
# 为 Deployment nginx 创建 Service
# --port:Service 集群内端口;--targetPort:Pod 容器端口;--type:Service 类型
kubectl expose deployment nginx \--port=80 \--targetPort=80 \--name=nginx-service \--type=NodePort \-n app# 查看发布结果(获取 NodePort 端口,如 30080)
kubectl get svc -n app -o wide
Service 类型说明
类型 | 作用 | 访问方式 | 适用场景 |
---|---|---|---|
ClusterIP | 集群内访问(默认类型) | ClusterIP:port | 集群内部服务间通信 |
NodePort | 外部访问(节点端口映射) | NodeIP:NodePort | 测试环境、小型服务 |
LoadBalancer | 公有云负载均衡(依赖云厂商) | 云厂商提供的公网 IP:port | 生产环境外部访问 |
ExternalName | 映射到外部 DNS(无 Pod 关联) | 域名访问(如 mysql.xxx.com ) | 访问集群外服务(如数据库) |
验证发布结果
# 1. 查看 Service 后端关联的 Pod(Endpoints)
kubectl get endpoints nginx-service -n app# 2. 外部访问测试(NodeIP:NodePort)
curl http://192.168.80.11:30080 # 192.168.80.11 为 Node 节点 IP# 3. 查看负载均衡规则(Node 节点上执行)
yum install -y ipvsadm
ipvsadm -Ln # 查看 Service 端口转发规则
3. 更新(升级应用版本)
陈述式更新(kubectl set
)
# 1. 查看当前版本(外部访问测试)
curl -I http://192.168.80.11:30080 # 响应头含 nginx/1.14.0# 2. 更新 Nginx 版本到 1.15
kubectl set image deployment/nginx nginx=nginx:1.15 -n app# 3. 实时监控更新过程(滚动更新:先增新 Pod,再删旧 Pod)
kubectl get pods -n app -w# 4. 验证更新结果
curl -I http://192.168.80.11:30080 # 响应头变为 nginx/1.15.0
声明式更新(修改 YAML)
- 编辑 YAML 文件(修改
image: nginx:1.15
); - 应用更新:
kubectl apply -f nginx-deploy.yaml -n app
; - 在线编辑(无需 YAML 文件):
kubectl edit deployment nginx -n app
(实时生效,不修改本地文件)。
4. 回滚(版本回退)
# 1. 查看更新历史(每个版本有 revision 编号)
kubectl rollout history deployment/nginx -n app# 2. 回滚到上一个版本
kubectl rollout undo deployment/nginx -n app# 3. 回滚到指定版本(如 revision=1)
kubectl rollout undo deployment/nginx --to-revision=1 -n app# 4. 查看回滚状态(确认回滚完成)
kubectl rollout status deployment/nginx -n app# 5. 验证回滚结果
curl -I http://192.168.80.11:30080 # 恢复为 nginx/1.14.0
5. 删除(清理资源)
陈述式删除
# 1. 删除 Service
kubectl delete svc nginx-service -n app# 2. 删除 Deployment(关联的 Pod 会自动删除)
kubectl delete deployment nginx -n app# 3. 删除命名空间(会删除命名空间内所有资源)
kubectl delete ns app
声明式删除(基于 YAML)
# 删除 YAML 文件中定义的所有资源
kubectl delete -f nginx-deploy.yaml
强制删除(处理卡住的 Pod)
当 Pod 处于 Terminating
状态无法删除时:
kubectl delete pod <pod-name> -n app --force --grace-period=0
# --grace-period=0:立即终止,不等待容器优雅退出
四、主流发布策略(金丝雀 / 蓝绿 / 滚动)
K8s 支持多种发布策略,核心目标是降低更新风险,以下为三种常用策略的操作实现:
1. 滚动发布(Rolling Update)
- 原理:逐步替换旧 Pod(先创建新 Pod → 确认健康 → 删除旧 Pod),默认无停机。
- 适用场景:无状态服务(如 Web 应用),对可用性要求高。
- 操作实现:Deployment 默认采用滚动发布,无需额外配置:
# 更新时自动触发滚动发布 kubectl set image deployment/nginx nginx=nginx:1.15 -n app # 实时查看滚动过程 kubectl get pods -n app -w
- 优势:无停机、资源占用低;劣势:新旧版本共存期可能有兼容性问题。
2. 金丝雀发布(Canary Release)
- 原理:先发布少量新版本 Pod(如 1/10 副本),仅让部分用户访问,验证无问题后全量更新。
- 适用场景:新版本风险高(如重大功能迭代),需灰度验证。
- 操作实现:
# 1. 更新版本并暂停发布(仅创建少量新 Pod) kubectl set image deployment/nginx nginx=nginx:1.15 -n app && \ kubectl rollout pause deployment/nginx -n app# 2. 查看状态(新 Pod 已创建,旧 Pod 未删除) kubectl get pods -n app -w # 此时仅少量用户访问新版本,验证功能/性能# 3. 验证无问题,继续发布(完成剩余 Pod 替换) kubectl rollout resume deployment/nginx -n app# 4. 若验证失败,立即回滚 kubectl rollout undo deployment/nginx -n app
- 优势:风险可控;劣势:需手动控制节奏,验证周期长。
3. 蓝绿发布(Blue-Green Deployment)
- 原理:同时部署 “蓝环境”(旧版本)和 “绿环境”(新版本),验证通过后切换流量。
- 适用场景:对稳定性要求极高(如金融服务),需秒级切换。
- 操作实现(基于两个 Deployment + 一个 Service):
- 部署蓝环境(旧版本):
kubectl create deployment nginx-blue --image=nginx:1.14 -n app kubectl expose deployment nginx-blue --port=80 --name=nginx-service --type=NodePort -n app
- 部署绿环境(新版本):
kubectl create deployment nginx-green --image=nginx:1.15 -n app
- 验证绿环境(直接访问绿环境 Pod IP):
GREEN_POD_IP=$(kubectl get pod -l app=nginx-green -n app -o jsonpath='{.items[0].status.podIP}') curl http://$GREEN_POD_IP
- 切换流量(修改 Service 标签选择器,指向绿环境):
kubectl edit svc nginx-service -n app # 将 selector 从 app: nginx-blue 改为 app: nginx-green
- 回滚(若绿环境异常,将 Service 切回蓝环境):
kubectl edit svc nginx-service -n app # 改回 app: nginx-blue
- 部署蓝环境(旧版本):
- 优势:切换无停机、回滚简单;劣势:需双倍资源,成本高。
Kubernetes YAML 配置与端口详解
1. 查看 Kubernetes 版本信息
查看 kubectl 与集群版本
kubectl version
- 输出包含客户端(kubectl)和服务端(APIServer)版本信息
- 客户端版本是本地 kubectl 工具版本
- 服务端版本是 Kubernetes 集群的版本
查看 API 资源版本标签
kubectl api-versions
- 显示集群支持的所有 API 版本
- 生产环境建议使用稳定版本(如
apps/v1
),避免使用带beta
标记的测试版本 - 不同资源类型可能对应不同的 API 版本(如 Deployment 使用
apps/v1
,Service 使用v1
)
2. YAML 格式语法规则
YAML 是 Kubernetes 主要的配置文件格式,语法规则如下:
- 大小写敏感
- 使用空格缩进表示层级关系(不支持 Tab 键)
- 缩进空格数不固定,但相同层级元素必须左对齐(通常使用 2 个空格)
- 特殊符号后需空格,如冒号
:
、逗号,
、短横线-
等 ---
表示文件开始,可用于分隔多个 YAML 文档#
表示注释,从#
到行尾均为注释内容
示例:
---
# 这是一个注释
apiVersion: v1
kind: Pod
metadata:name: example-podlabels:app: demo
spec:containers:- name: webimage: nginx
3. 资源清单(YAML)编写详解
资源清单是 Kubernetes 声明式管理的核心,以 Deployment 和 Service 为例说明:
示例 1:Deployment 资源清单
apiVersion: apps/v1 # API 版本(Deployment 常用 apps/v1)
kind: Deployment # 资源类型
metadata: # 元数据name: nginx-deployment # 资源名称(命名空间内唯一)labels: # 资源标签app: nginx
spec: # 规格配置replicas: 3 # 期望副本数selector: # 标签选择器(匹配 Pod 标签)matchLabels:app: nginxtemplate: # Pod 模板metadata:labels: # Pod 标签(需与 selector.matchLabels 一致)app: nginxspec:containers: # 容器配置- name: nginx # 容器名称image: nginx:1.15.4 # 容器镜像ports:- containerPort: 80 # 容器暴露端口
示例 2:Service 资源清单
apiVersion: v1 # API 版本(Service 常用 v1)
kind: Service # 资源类型
metadata:name: nginx-service # Service 名称labels:app: nginx
spec:type: NodePort # Service 类型(NodePort 允许外部访问)ports:- port: 80 # Service 集群内部端口targetPort: 80 # 映射到 Pod 的端口selector: # 关联 Pod 的标签选择器app: nginx
资源清单核心组成
apiVersion
:指定 API 版本,不同资源对应不同版本kind
:指定资源类型(如 Pod、Deployment、Service 等)metadata
:资源元数据(名称、标签、命名空间等)spec
:资源规格(核心配置,不同资源有不同字段)
4. 端口概念详解(port/nodePort/targetPort/containerPort)
Kubernetes 中的端口各司其职,形成完整的端口映射链:
端口类型 | 作用说明 | 示例值 |
---|---|---|
containerPort | 容器内部监听的端口(容器内应用实际运行的端口) | 80 |
targetPort | Pod 上的端口,映射到容器的 containerPort (Service 转发的目标端口) | 80 |
port | Service 暴露的集群内部端口(集群内通过 ClusterIP:port 访问) | 80 |
nodePort | 节点上开放的端口(外部通过 NodeIP:nodePort 访问,范围 30000-32767) | 30080 |
端口映射流程
外部访问 → NodeIP:nodePort
→ Service → ClusterIP:port
→ 转发到 → PodIP:targetPort
→ 容器 → containerPort
5. 快速编写 YAML 文件的方法
方法 1:使用 --dry-run
生成模板
# 生成 Pod 模板
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o yaml > nginx-pod.yaml# 生成 Deployment 模板
kubectl create deployment nginx-deploy --image=nginx --replicas=3 --dry-run=client -o yaml > nginx-deploy.yaml
方法 2:导出已有资源的配置
# 导出现有 Service 的配置
kubectl get svc nginx-service -o yaml > my-svc.yaml# 导出后可修改该文件,用于创建新资源
方法 3:使用 kubectl edit
复制配置
# 编辑现有资源,复制配置后粘贴到新文件
kubectl edit deployment nginx-deployment
方法 4:查询字段帮助
# 查看资源字段说明(可逐层查询)
kubectl explain pods.spec.containers # 查看 Pod 容器配置字段
kubectl explain deployments.spec.replicas # 查看 Deployment 副本数字段
简化模板技巧
生成模板后,可删除不必要的字段:
creationTimestamp: null
status: {}
- 空的
resources: {}
通过以上方法,可快速编写和理解 Kubernetes YAML 配置,掌握资源声明式管理的核心技能。实际使用中,建议结合官方示例和 kubectl explain
命令,逐步熟悉各类资源的配置规范。
在 Kubernetes 中,kind
字段用于指定资源类型,Kubernetes 提供了丰富的资源类型,可大致分为核心资源、工作负载资源、服务发现与负载均衡资源、配置与存储资源、集群资源等类别。以下是常见的资源类型分类及说明:
kind的资源类型有:
一、核心资源(Core Resources)
属于 v1
API 组,是 Kubernetes 最基础的资源:
- Pod:最小部署单元,包含一个或多个容器。
- Service:定义 Pod 的访问方式,提供固定访问点(如
ClusterIP
、NodePort
等)。 - Namespace:用于资源隔离,实现多环境(如开发、测试)资源分离。
- Node:表示集群中的节点(物理机或虚拟机)。
- ConfigMap:存储非敏感配置数据,供 Pod 挂载使用。
- Secret:存储敏感信息(如密码、Token),以加密方式存储。
- PersistentVolume(PV):集群级别的持久化存储资源。
- PersistentVolumeClaim(PVC):用户对 PV 的请求(声明需要的存储资源)。
- ServiceAccount:为 Pod 提供访问集群 API 的身份凭证。
二、工作负载资源(Workload Resources)
用于管理 Pod 的生命周期和运行方式,主要属于 apps/v1
API 组:
- Deployment:最常用的工作负载,管理无状态应用,支持滚动更新、回滚。
- StatefulSet:管理有状态应用(如数据库),确保 Pod 名称、网络标识稳定。
- DaemonSet:在集群所有节点(或匹配标签的节点)上运行一个 Pod 副本(如日志收集、监控代理)。
- Job:管理一次性任务(如批处理),任务完成后 Pod 终止。
- CronJob:定时执行的 Job(如定时备份、定时任务)。
- ReplicaSet:维护指定数量的 Pod 副本(通常由 Deployment 自动管理,无需手动创建)。
三、服务发现与负载均衡(Service Discovery & Load Balancing)
- Ingress:管理外部访问集群内服务的规则(如域名路由、SSL 终结),属于
networking.k8s.io/v1
。 - EndpointSlice:跟踪 Service 关联的 Pod 端点信息(IP + 端口),优化服务发现性能。
- IngressClass:定义 Ingress 控制器的配置(如不同环境使用不同控制器)。
四、配置与存储(Configuration & Storage)
- ConfigMap / Secret:(见核心资源,用于配置管理)。
- PersistentVolume(PV) / PersistentVolumeClaim(PVC):(见核心资源,用于持久化存储)。
- StorageClass:动态创建 PV 的模板,定义存储类型(如 SSD、HDD)和供应方式。
五、集群资源(Cluster Resources)
- Namespace:(见核心资源,用于集群内资源隔离)。
- Node:(见核心资源,集群节点)。
- CustomResourceDefinition(CRD):允许用户定义自定义资源(扩展 Kubernetes API)。
- ClusterRole / ClusterRoleBinding:集群级别的 RBAC 权限配置(跨命名空间)。
- Role / RoleBinding:命名空间内的 RBAC 权限配置。
六、其他常用资源
- LimitRange:限制命名空间内资源的默认请求和限制(如 CPU、内存)。
- ResourceQuota:限制命名空间内资源的总使用量(如最大 Pod 数量、总内存)。
- NetworkPolicy:定义 Pod 间的网络访问规则(允许 / 禁止特定流量)。
- PodDisruptionBudget(PDB):确保集群扰动(如节点维护)时,最少可用的 Pod 数量。
查看所有资源类型
通过以下命令可查看集群支持的所有资源类型及对应 kind
:
kubectl api-resources
输出结果包含资源名称、简称、API 组、是否命名空间隔离等信息,例如:
NAME SHORTNAMES APIVERSION NAMESPACED KIND
pods po v1 true Pod
services svc v1 true Service
deployments deploy apps/v1 true Deployment
statefulsets sts apps/v1 true StatefulSet
ingresses ing networking.k8s.io/v1 true Ingress
configmaps cm v1 true ConfigMap
secrets sec v1 true Secret
nodes no v1 false Node
namespaces ns v1 false Namespace
不同 Kubernetes 版本支持的资源类型可能略有差异,核心资源保持稳定,扩展资源会随版本迭代更新。