当前位置: 首页 > news >正文

Kubernetes资源管理全解析

Kubernetes资源管理全解析

一、资源管理介绍

在Kubernetes(简称K8s)生态体系中,所有集群内的实体都被抽象化为“资源”,用户对K8s集群的管理本质上就是通过操作这些资源来实现的。K8s作为一个强大的集群管理系统,其核心功能围绕资源的创建、调度、维护和访问展开,具体可从以下四个关键维度理解:

(一)集群与服务部署本质

K8s的核心定位是集群系统,用户在集群中部署各类服务的过程,本质是在K8s集群的节点(Node)上运行容器,并将业务程序部署在这些容器中。容器作为轻量级虚拟化技术,确保了程序运行环境的一致性,而K8s则负责协调集群内所有节点的容器,实现服务的高效部署与扩展。

(二)最小管理单元与控制器

K8s的最小管理单元是Pod,而非单独的容器。这意味着所有容器必须被封装在Pod中才能在K8s集群中运行。但K8s通常不直接对Pod进行手动管理(如创建、扩容、故障恢复),而是通过Pod控制器间接管理Pod。Pod控制器能够根据用户定义的“期望状态”(如Pod副本数、运行规则等)自动维护Pod的生命周期,例如当某个Pod因节点故障停止运行时,控制器会自动在其他健康节点上重建新的Pod,保障服务可用性。常见的Pod控制器包括Deployment、ReplicaSet、DaemonSet等。

(三)Pod服务的访问方式

当Pod中的程序正常运行并对外提供服务时,面临一个关键问题:Pod的IP地址会随着Pod的重建(如故障恢复、扩容)而动态变化,直接通过Pod IP访问服务会导致“服务不可达”。为解决这一问题,K8s提供了Service资源。Service相当于一个“固定访问入口”,它通过标签(Label)与Pod关联,即使Pod的IP发生变化,Service的IP(ClusterIP)始终保持不变。外部或集群内其他服务只需访问Service的IP和端口,即可间接访问到后端的Pod服务,实现服务访问的稳定性。

(四)数据持久化存储方案

容器本身具有“临时性”——当容器删除或重建时,容器内部的数据会随之丢失。若Pod中的程序(如数据库、日志服务)需要长期保存数据,K8s提供了多种存储资源来实现数据持久化,核心包括:

  • Volume:与Pod生命周期绑定的存储卷,可挂载本地磁盘、网络存储(如NFS)等,Pod删除时Volume中的数据是否保留取决于存储类型(本地存储会丢失,网络存储可保留)。
  • PersistentVolume(PV):集群级别的“存储资源池”,由管理员提前创建,独立于Pod生命周期,可跨Pod、跨命名空间使用。
  • PersistentVolumeClaim(PVC):用户向集群“申请存储”的请求,PVC会自动绑定到满足条件的PV,用户无需关心底层存储细节,实现“存储解耦”。

核心学习目标

学习K8s的核心在于掌握对以下关键资源的操作能力:

  • 基础资源:Pod(容器载体)、Node(集群节点)、Namespace(资源隔离)。
  • 控制资源:Pod控制器(Deployment、ReplicaSet、DaemonSet等)。
  • 访问资源:Service、Ingress(对外暴露服务的高级方式)。
  • 存储资源:Volume、PV、PVC。
  • 配置资源:ConfigMap(配置管理)、Secret(敏感信息管理,如密码、证书)。

二、资源管理方式

K8s提供了三种主流的资源管理方式,分别适用于不同的场景(测试、开发、生产),每种方式各有优缺点,用户需根据实际需求选择。三种方式的核心差异在于“操作入口”(命令直接操作/命令+配置文件/声明式配置文件)和“状态管理逻辑”(手动控制/基于文件定义状态/基于文件声明最终状态)。

三种管理方式对比

类型操作对象适用环境优点缺点
命令式对象管理直接操作资源对象测试环境、临时操作操作简单直观,无需编写配置文件,适合快速验证无法留存操作记录,不支持审计与跟踪;无法批量操作
命令式对象配置基于配置文件(如YAML)开发环境、小规模项目配置文件可版本控制(如Git),支持审计与跟踪;可重复执行项目规模扩大后,配置文件数量激增,管理与维护成本高
声明式对象配置基于配置文件目录开发环境、生产环境支持目录级批量操作;仅需定义资源“最终状态”,K8s自动协调故障排查难度高,需熟悉K8s状态协调逻辑;配置冲突时需手动处理

(一)命令式对象管理

命令式对象管理是通过kubectl命令直接对K8s资源执行创建、查询、删除等操作,无需依赖配置文件,是最直接的资源操作方式。

1. kubectl命令基础

kubectl是K8s集群的官方命令行工具,用于与K8s API Server交互,实现对集群资源的管理。其语法结构固定,需严格遵循参数顺序:

kubectl [command] [type] [name] [flags]

各参数含义如下:

  • command:指定对资源执行的操作,如create(创建)、get(查询)、delete(删除)、edit(编辑)等。
  • type:指定资源类型,如pod(Pod)、deployment(Deployment控制器)、service(Service)等,支持缩写(如po代表pod)。
  • name:指定资源的名称,K8s中资源名称大小写敏感,且在同一命名空间下同一类型资源名称唯一。
  • flags:可选参数,用于补充配置,如-n(指定命名空间)、-o yaml(以YAML格式输出结果)、--image(指定容器镜像)等。
2. 常用kubectl命令实操
(1)资源查询命令
  • 查看集群中所有Pod:

    kubectl get pods
    

    输出结果包含Pod名称、就绪状态(Ready)、运行状态(Status)、重启次数(Restarts)、运行时长(Age)等关键信息。

  • 查看指定名称的Pod(需替换pod_name为实际Pod名称):

    kubectl get pod pod_name
    
  • 查看指定Pod的详细信息(以YAML格式输出,包含Pod的完整配置、状态、挂载存储等):

    kubectl get pod pod_name -o yaml
    

    YAML格式输出适合深入分析Pod配置问题,如容器镜像是否正确、资源限制是否配置等。

  • 查看Pod的实时运行状态(包含事件日志,如调度失败、镜像拉取错误等):

    kubectl describe pod pod_name
    

    该命令是故障排查的核心工具,例如当Pod处于CrashLoopBackOff状态时,可通过describe查看“Events”部分,定位错误原因(如容器启动命令错误、资源不足)。

(2)资源创建与删除命令
  • 创建命名空间(Namespace,用于资源隔离,替换ycy为自定义命名空间名称):

    kubectl create namespace ycy
    

    命名空间的核心作用是将集群资源划分为独立的“虚拟集群”,避免不同项目的资源(如Pod、Service)重名冲突,同时便于权限控制(如仅允许特定用户操作某命名空间资源)。

  • 查看所有命名空间:

    kubectl get ns  # ns是namespace的缩写
    

    K8s默认包含4个系统命名空间,各自功能如下:

    • default:未指定命名空间的资源默认分配到此空间。
    • kube-node-lease:用于集群节点间的心跳检测(K8s 1.13+版本引入),节点通过向此空间的Lease对象发送心跳,证明自身健康。
    • kube-public:公共命名空间,所有用户(包括未认证用户)均可访问此空间的资源,通常用于存储集群公开信息(如集群配置地图)。
    • kube-system:K8s系统组件(如kube-apiserver、kube-controller-manager、kube-proxy)所在的命名空间,禁止用户随意修改此空间的资源,以免影响集群正常运行。
  • 在指定命名空间下创建Pod(以Nginx为例,-n ycy指定命名空间为ycy):

    kubectl run pod1 --image=nginx -n ycy
    

    该命令会创建一个名为pod1的Pod,Pod内运行nginx镜像(默认拉取最新版本,可通过:版本号指定具体版本,如nginx:1.25)。

  • 查询创建的pod需要指定的命名空间

    kubectl get pod pod1 -n ycy
    
  • 删除指定Pod(需替换pod-xxxxxx为实际Pod名称):

    kubectl delete pod pod-xxxxxx
    

    若Pod由控制器(如Deployment)管理,直接删除Pod后,控制器会自动重建新的Pod,需删除控制器才能彻底删除Pod。

  • 删除指定命名空间(删除命名空间会同时删除该空间下的所有资源,操作需谨慎):

    kubectl delete ns ycy
    
3. K8s核心资源类型与缩写

K8s支持的资源类型繁多,可通过以下命令查看所有资源类型及描述:

kubectl api-resources

常用资源类型及功能如下表所示,掌握资源缩写可大幅提高命令操作效率:

资源分类资源名称缩写资源作用
集群基础资源nodesno集群的节点(物理机或虚拟机),Pod运行在Node上
namespacesns资源隔离与权限控制单元,划分集群资源到不同“虚拟集群”
Pod资源podspo容器的载体,一个Pod可包含多个容器,共享网络和存储
Pod资源控制器replicationcontrollersrc早期Pod控制器,用于确保Pod副本数稳定,目前已被ReplicaSet替代
replicasetsrs维护Pod副本数的核心控制器,Deployment会自动创建ReplicaSet来管理Pod
deploymentsdeploy最常用的Pod控制器,支持滚动更新、版本回滚,通过ReplicaSet间接管理Pod
daemonsetsds确保所有(或指定)Node上运行一个Pod副本,适合日志收集、监控代理等场景
jobs-一次性任务控制器,Pod执行完任务后自动停止,不重启
cronjobscj定时任务控制器,基于Cron表达式触发Job,适合周期性任务(如数据备份)
horizontalpodautoscalershpa水平Pod自动扩缩容控制器,根据CPU使用率、内存使用率等指标自动调整Pod副本数
statefulsetssts管理有状态应用的控制器,确保Pod名称、网络标识、存储的稳定性(如数据库)
服务发现资源servicessvc为Pod提供固定访问入口,通过标签关联Pod,实现负载均衡
ingressing对外暴露服务的高级方式,支持HTTP/HTTPS路由、域名转发,统一管理外部访问
存储资源volumeattachements-记录存储卷与Node的绑定关系,由K8s存储插件自动创建和维护
persistentvolumespv集群级存储资源池,管理员创建,独立于Pod生命周期
persistentvolumeclaimspvc用户对存储的申请请求,自动绑定满足条件的PV,实现存储“按需分配”
配置资源configmapscm存储非敏感配置信息(如数据库地址、端口),可挂载到Pod中作为环境变量或文件
secrets-存储敏感信息(如密码、API密钥、证书),数据以Base64编码存储,需注意权限控制
4. kubectl常用操作命令分类

kubectl支持的操作命令丰富,可通过kubectl --help查看所有命令,核心操作命令分类如下:

命令分类命令功能描述
基本命令create创建指定资源(如Pod、Namespace、Deployment)
edit在线编辑资源的配置(默认打开Vi编辑器),修改后立即生效
get查询资源列表或单个资源详情,支持多种输出格式(-o yaml/json/wide
patch部分更新资源配置(无需编辑完整YAML),适合快速修改少量参数(如Pod标签)
delete删除指定资源,支持通过名称、标签(-l key=value)批量删除
explain查看资源的API文档(如字段含义、可选值),例如kubectl explain pod.spec
run快速创建Pod并运行容器,简化Pod创建流程(如kubectl run nginx --image=nginx
expose将现有Pod或Deployment暴露为Service,自动生成Service配置(如kubectl expose deploy nginx --port=80
describe查看资源的详细运行状态,包括事件日志,是故障排查核心命令
logs查看Pod中容器的日志,支持-f参数实时跟踪日志(类似tail -f
attach进入运行中的容器(类似docker attach),共享容器的标准输入输出
exec在运行中的容器内执行命令(如kubectl exec -it pod1 -- /bin/bash进入容器交互模式)
cp在Pod与本地主机之间复制文件,例如kubectl cp localfile.txt pod1:/tmp/
rollout管理资源的发布过程,支持Deployment的版本回滚(rollout undo)、查看发布历史(rollout history
scale手动调整Pod控制器的副本数,例如kubectl scale deploy nginx --replicas=3
autoscale为Pod控制器配置HPA,实现自动扩缩容,例如kubectl autoscale deploy nginx --min=2 --max=5 --cpu-percent=80
高级命令apply声明式配置命令,基于配置文件创建或更新资源(核心命令,见“声明式对象配置”)
label为资源添加或删除标签(标签用于资源关联、筛选),例如kubectl label pod pod1 env=prod
其他命令cluster-info查看集群信息(如API Server地址、etcd集群地址、KubeDNS地址)
version查看K8s集群(server)和kubectl工具(client)的版本信息

(二)命令式对象配置

命令式对象配置是“kubectl命令 + 配置文件(如YAML)”的组合方式,通过配置文件定义资源的详细参数,再通过命令执行资源的创建、更新或删除操作。这种方式的核心优势是配置文件可版本控制(如存入Git仓库),便于团队协作、审计和重复部署。

1. 配置文件格式与核心字段

K8s配置文件通常采用YAML格式(部分场景用JSON),YAML具有简洁、易读的特点,核心字段需包含以下三部分(所有资源的配置文件均需指定):

  • apiVersion:资源对应的K8s API版本(不同资源的API版本不同,如Pod的API版本为v1,Deployment的API版本为apps/v1)。
  • kind:资源类型(如PodNamespaceDeployment)。
  • metadata:资源的元数据,包括name(资源名称)、namespace(所属命名空间,默认default)、labels(资源标签,用于关联其他资源)等。
  • spec:资源的“期望状态”定义,不同资源的spec字段差异较大(如Pod的spec.containers定义容器信息,Deployment的spec.replicas定义副本数)。
2. 实操案例:创建Namespace与Pod

以创建命名空间ycy和Podnginxpod为例,完整配置文件(nginxpod.yaml)如下:

# 第一部分:创建命名空间ycy
apiVersion: v1  # Namespace的API版本为v1
kind: Namespace  # 资源类型为Namespace
metadata:name: ycy  # 命名空间名称,需唯一---  # 分隔符,用于在一个YAML文件中定义多个资源# 第二部分:在ycy命名空间下创建Pod
apiVersion: v1  # Pod的API版本为v1
kind: Pod  # 资源类型为Pod
metadata:name: nginxpod  # Pod名称,在ycy命名空间下唯一namespace: ycy  # 指定Pod所属命名空间为ycylabels:app: nginx  # 为Pod添加标签app=nginx,便于Service关联
spec:containers:  # 定义Pod中的容器列表(一个Pod可包含多个容器)- name: nginx-containers  # 容器名称,在Pod内唯一image: nginx:latest  # 容器使用的镜像(nginx最新版本,建议指定具体版本如nginx:1.25以确保稳定性)ports:  # 容器暴露的端口(仅为声明,不自动暴露到集群外)- containerPort: 80  # Nginx默认监听80端口
3. 命令执行流程
(1)创建资源

通过kubectl create -f命令执行配置文件,创建文件中定义的所有资源:

kubectl create -f nginxpod.yaml

执行后会输出以下结果,表明命名空间ycy和Podnginxpod已成功创建:

namespace/ycy created
pod/nginxpod created
(2)查询资源

通过kubectl get -f命令查看配置文件中定义的资源状态,无需逐个指定资源名称:

kubectl get -f nginxpod.yaml

输出结果包含两个资源的关键信息(状态、就绪数、运行时长等):

NAME            STATUS   AGE
namespace/ycy    Active   10sNAME         READY   STATUS    RESTARTS   AGE
pod/nginxpod 1/1     Running   0          10s
(3)更新资源

若需修改资源配置(如将Pod的Nginx镜像版本从latest改为1.25),可直接编辑nginxpod.yaml文件,再通过kubectl replace -f命令执行更新:

kubectl replace -f nginxpod.yaml

注意:replace命令要求资源已存在,且配置文件需包含资源的完整定义(不可缺失核心字段)。

(4)删除资源

通过kubectl delete -f命令删除配置文件中定义的所有资源,操作会同时删除命名空间ycy和Podnginxpod

kubectl delete -f nginxpod.yaml

输出结果如下:

namespace "ycy" deleted
pod "nginxpod" deleted
4. 核心特点总结

命令式对象配置的本质是“命令驱动配置文件”,可理解为“将命令的参数提前写在YAML文件中,通过命令批量执行”。其核心优势是配置文件可追溯、可重复执行,适合开发环境中需要稳定复现的部署场景;但当项目规模扩大(如包含上百个资源)时,配置文件的管理会变得复杂,需引入声明式对象配置或Kustomize、Helm等工具辅助管理。

(三)声明式对象配置

声明式对象配置是K8s推荐的生产级资源管理方式,其核心思想是“通过配置文件声明资源的最终状态”,K8s会自动对比资源的“当前状态”与“期望状态”,并通过API Server协调差异(如资源不存在则创建,存在则更新)。这种方式仅需使用kubectl apply命令,无需区分“创建”或“更新”操作。

1. 核心原理

声明式对象配置的关键在于K8s的“状态协调机制”:

  • 用户通过YAML文件定义资源的“期望状态”(如Pod副本数=3、镜像版本=nginx:1.25)。
  • kubectl apply命令将配置文件提交给K8s API Server。
  • API Server对比资源的“当前状态”(如集群中实际运行的Pod副本数=2)与“期望状态”,自动执行协调操作(如创建1个新Pod,使副本数达到3)。
  • 若资源已存在且配置无变化,kubectl apply会提示“no change”,不执行任何操作。
2. 实操案例

以“创建/更新命名空间ycy和Podnginxpod”为例,使用与命令式对象配置相同的nginxpod.yaml文件(见上文),执行以下操作:

(1)首次创建资源

执行kubectl apply -f命令,K8s检测到资源不存在,自动创建资源:

kubectl apply -f nginxpod.yaml

输出结果如下,表明资源已创建:

namespace/ycy created
pod/nginxpod created
(2)更新资源

修改nginxpod.yaml文件中的Pod配置(如将容器镜像改为nginx:1.24),再次执行kubectl apply -f命令:

kubectl apply -f nginxpod.yaml

K8s检测到资源已存在且配置有变化,自动更新资源:

namespace/ycy unchanged  # 命名空间配置无变化,不更新
pod/nginxpod configured  # Pod配置已更新,执行更新操作
(3)无变化时执行

若未修改配置文件,再次执行kubectl apply -f命令,K8s会提示资源状态无变化:

kubectl apply -f nginxpod.yaml

输出结果:

namespace/ycy unchanged
pod/nginxpod unchanged
3. 目录级批量操作

声明式对象配置支持对目录下的所有YAML文件进行批量操作,只需将-f参数指定为目录路径即可。例如,将所有微服务的配置文件放在./k8s-config目录下,执行以下命令可批量创建/更新所有资源:

kubectl apply -f ./k8s-config/

这种方式非常适合管理包含多个资源(如Deployment、Service、PVC)的复杂应用,大幅提高部署效率。

4. 与命令式对象配置的核心差异
对比维度命令式对象配置(create/replace/delete -f声明式对象配置(apply -f
操作命令需区分create(创建)、replace(更新)仅需apply,自动判断“创建”或“更新”
状态协调逻辑严格按照命令执行,用户需手动确保状态一致K8s自动对比“当前状态”与“期望状态”,协调差异
配置文件依赖执行replace时需提供资源完整配置支持增量配置(可只定义需要修改的字段)
批量操作支持支持单个文件多资源,不支持目录批量操作支持单个文件多资源和目录批量操作
适用场景小规模、简单资源的固定部署大规模、复杂应用的生产级部署

三、关键补充说明

(一)kubectl在Node节点的运行配置

默认情况下,kubectl仅在K8s集群的Master节点(控制平面节点)配置,Node节点(工作节点)未配置kubectl的访问权限。若需在Node节点使用kubectl,需将Master节点的kubectl配置文件复制到Node节点,具体步骤如下:

  1. Master节点操作kubectl的配置文件存储在$HOME/.kube目录下(默认文件名为config),该文件包含访问K8s API Server的证书、密钥等认证信息。执行以下命令将配置文件复制到目标Node节点(替换node1为Node节点的主机名或IP,HOME为当前用户的家目录,如/root):

    scp -r $HOME/.kube node1:$HOME/
    
  2. Node节点验证:在Node节点执行kubectl get nodes命令,若能正常输出集群节点列表,说明配置成功:

    kubectl get nodes
    

注意:$HOME/.kube/config文件包含敏感认证信息,需严格控制文件权限(建议设置为600,即仅当前用户可读写),避免泄露导致集群安全风险。

(二)三种管理方式的推荐使用场景

在实际生产和开发中,建议结合三种方式的优势,按以下原则使用:

  1. 创建/更新资源:优先使用声明式对象配置(kubectl apply -f XXX.yaml,尤其是生产环境。这种方式可确保资源状态的一致性,配置文件可版本控制,便于团队协作和故障恢复。

  2. 删除资源:优先使用命令式对象配置(kubectl delete -f XXX.yaml。相比kubectl delete 资源类型 资源名称,通过配置文件删除可确保删除的资源与创建的资源完全匹配,避免误删其他资源。

  3. 查询资源:优先使用命令式对象管理(kubectl get/describe 资源类型 资源名称。查询操作无需配置文件,命令直观且支持灵活筛选(如通过标签筛选Pod:kubectl get pods -l app=nginx),适合日常运维排查。

  4. 临时测试:仅在测试环境或临时验证场景下使用命令式对象管理(如kubectl run nginx --image=nginx,避免在生产环境使用此类无配置文件的操作,以防资源状态无法追溯。

四、总结

Kubernetes资源管理是掌握K8s的核心,其核心逻辑是“通过操作资源实现集群与服务的管理”。本文详细介绍了K8s的核心资源类型(Pod、控制器、Service、存储等)及三种资源管理方式(命令式对象管理、命令式对象配置、声明式对象配置),并提供了丰富的实操命令和配置案例。

在实际应用中,需根据场景选择合适的管理方式:测试环境用命令式对象管理快速验证,开发环境用命令式对象配置管理配置文件,生产环境用声明式对象配置确保状态一致。同时,需熟练掌握kubectl命令的使用,尤其是资源查询(get/describe)和故障排查(logs/explain)命令,为K8s集群的稳定运行提供保障。

http://www.dtcms.com/a/550161.html

相关文章:

  • 郑州企业型网站建设怎么做可以访问网站
  • 网站制作前必须做的事情有哪些网站行业
  • TC3xx芯片ACCEN寄存器保护详解
  • Linux上如何挂载磁盘
  • 卫星轨道计算中的数值精度陷阱:第三体引力摄动的稳定性优化
  • 白山网站seoe网站的图标怎么做
  • RHSCA---用户和组管理
  • 温州网站域名注册服务公司易语言如何做浏网站
  • 仿糗事百科网站源码dede二次开发分享+评论+互动国外网站域名
  • 仓颉语言中String的内存表示深度解析
  • NetSuite 中自定义基础打印模板的调整方法分享
  • 东城企业网站开发什么网站能免费做简历
  • “调用销毁者置于末尾”原则
  • GRPO相关优化论文
  • Openvins学习---ov_msckf中的State.h
  • 有什么网站可以做数学题项目建设全过程
  • 德庆网站建设良精企业网站管理系统
  • dz网站自己做的模板放在哪里小说网站建设的支柱
  • idea中Docker一键自动化部署
  • faster-whisper热词详解与程序设计
  • 电子电力技术的控制电路学习分享1
  • 原生JS实现虚拟列表:从基础到性能优化的完整实践
  • 万全网站建设Myeclipse怎么做网站
  • C#: Contains 方法
  • .NET 泛型编程(泛型类、泛型方法、泛型接口、泛型委托、泛型约束)
  • 网站建设研究方法建筑图纸字母代表大全图解
  • PocketBase轻量级后端解决方案
  • 【JavaWeb|day19 Web后端进阶 SpringAOP、SpringBoot原理、自定义Starter、Maven高级】
  • 织梦可以放两个网站网站内容架构
  • ENSP Pro Lab笔记:配置STP/RSTP/MSTP(4)