Kubernetes(K8s)常用命令全解析:从基础到进阶

发布于:2025-08-19 ⋅ 阅读:(11) ⋅ 点赞:(0)

Kubernetes(K8s)常用命令全解析:从基础到进阶

引言:为什么掌握K8s命令是云原生时代的必备技能?

Kubernetes(简称K8s)作为容器编排的事实标准,已成为云原生应用部署、扩展和管理的核心平台。其命令行工具kubectl是与集群交互的主要入口,掌握其常用命令不仅能提高日常运维效率,更能深入理解K8s的资源模型(如声明式API、控制器模式)和调度逻辑。

本文将系统梳理kubectl命令,按资源管理集群运维部署与伸缩故障排查高级操作五大维度分类,涵盖高频使用、易混淆及进阶命令,补充场景化示例与注意事项。

一、资源管理基础命令

1.1 资源查看(kubectl get

最常用的命令之一,用于查询集群中各类资源的状态,支持多种输出格式和过滤条件。

命令 作用 示例 补充说明
kubectl get pods 查看当前命名空间的所有Pod kubectl get pods(简写成po 输出包含名称、就绪数、状态、重启次数、年龄
kubectl get pods -n <namespace> 查看指定命名空间的Pod kubectl get po -n kube-system -n指定命名空间,如kube-system是系统组件所在命名空间
kubectl get pods --all-namespaces 查看所有命名空间的Pod kubectl get po -A-A是简写) 适合全局排查跨命名空间问题
kubectl get pods -o wide 查看Pod的详细信息 kubectl get po -o wide 额外显示Pod的IP、所在节点、镜像等
kubectl get pods -l <label> 按标签过滤Pod kubectl get po -l app=nginx 标签是K8s资源关联的核心,如Service通过标签关联Pod
kubectl get deployments 查看Deployment kubectl get deploy(简写deploy Deployment是无状态应用的主要控制器
kubectl get services 查看Service kubectl get svc(简写svc 输出包含ClusterIP、端口映射等网络信息
kubectl get nodes 查看集群节点 kubectl get no(简写no 显示节点状态(Ready/NotReady)、角色、版本等
kubectl get namespaces 查看命名空间 kubectl get ns(简写ns 命名空间用于资源隔离,默认有defaultkube-system
kubectl get <resource> -o yaml/json 以YAML/JSON格式输出资源详情 kubectl get pod nginx -o yaml 用于查看资源的完整配置(如标签、注解、调度策略等)

1.2 资源创建(kubectl createkubectl apply

用于创建或更新集群资源,两者的核心区别在于:create是"命令式创建"(已存在则报错),apply是"声明式更新"(存在则更新,不存在则创建)。

命令 作用 示例 适用场景
kubectl create -f <file> 通过配置文件创建资源 kubectl create -f nginx-deploy.yaml 仅用于新资源创建,重复执行会报错
kubectl create <resource> <name> 直接创建资源(简单场景) kubectl create deployment nginx --image=nginx:1.23 快速创建测试资源,不适合复杂配置
kubectl apply -f <file> 通过配置文件创建或更新资源 kubectl apply -f nginx-deploy.yaml 生产环境推荐,支持增量更新(仅修改配置文件中变化的字段)
kubectl apply -f <dir> 批量处理目录下的所有配置文件 kubectl apply -f ./k8s-configs 适合多资源协同部署(如Deployment+Service+ConfigMap)

1.3 资源删除(kubectl delete

用于删除集群中的资源,支持按名称、标签、配置文件等方式删除。

命令 作用 示例 注意事项
kubectl delete <resource> <name> 删除指定名称的资源 kubectl delete pod nginx-7f9f6f5c9d-2xqkf 仅删除单个资源,需准确指定名称
kubectl delete <resource> -l <label> 按标签删除资源 kubectl delete deploy -l app=nginx 批量删除同一标签的资源,适合清理测试环境
kubectl delete -f <file> 删除配置文件定义的资源 kubectl delete -f nginx-deploy.yaml apply -f对应,确保资源完整删除
kubectl delete <resource> --all 删除当前命名空间的所有该类型资源 kubectl delete pods --all 谨慎使用,可能误删重要资源
kubectl delete pod <name> --grace-period=0 --force 强制删除Pod kubectl delete pod nginx --grace-period=0 --force 仅用于异常卡住的Pod(如状态为Terminating但无法退出),可能导致数据不一致

1.4 资源详情查看(kubectl describe

用于查看资源的详细状态(如事件、关联资源、配置细节等),是故障排查的核心命令。

命令 作用 示例 关键输出解读
kubectl describe <resource> <name> 查看指定资源的详细信息 kubectl describe pod nginx 重点关注Events部分(如调度失败、镜像拉取错误原因)
kubectl describe node <node-name> 查看节点详情 kubectl describe node node-1 关注Conditions(节点健康状态)、Allocatable(可分配资源)、Taints(污点,影响调度)
kubectl describe svc <service-name> 查看Service详情 kubectl describe svc nginx-svc 关注Endpoints(后端Pod的IP:Port,为空则说明Pod未匹配标签)

1.5 配置资源修改(kubectl edit

用于在线编辑集群中已存在的资源配置(等效于修改YAML后apply)。

kubectl edit deployment nginx  # 编辑Deployment配置(自动打开默认编辑器)
kubectl edit svc nginx-svc -n dev  # 编辑指定命名空间的Service

注意:编辑后需确保语法正确(如YAML缩进),保存后配置会自动生效(触发滚动更新等操作)。

二、集群管理命令

2.1 集群信息查看

用于了解集群的基本状态、版本及节点信息。

命令 作用 示例 输出解读
kubectl cluster-info 查看集群核心组件地址 kubectl cluster-info 显示API Server、ETCD、CoreDNS等组件的访问地址,若某组件未就绪会提示错误
kubectl cluster-info dump 导出集群详细信息 kubectl cluster-info dump > cluster-dump.log 包含所有资源配置、事件、日志片段,用于离线诊断
kubectl version 查看版本信息 kubectl version --short 显示客户端(kubectl)和服务端(API Server)版本,需确保版本兼容(客户端与服务端版本差不超过1个大版本)
kubectl api-versions 查看支持的API版本 kubectl api-versions apps/v1(Deployment所在API组)、v1(Pod、Service所在API组),不同资源可能属于不同API组
kubectl api-resources 查看支持的资源类型 kubectl api-resources 包含资源名称、简写、API组、命名空间范围(是否集群级)等,如pods是命名空间级,nodes是集群级

2.2 节点管理

用于节点的调度控制(如维护时标记不可调度)。

命令 作用 示例 场景说明
kubectl cordon <node-name> 标记节点为"不可调度" kubectl cordon node-1 阻止新Pod调度到该节点,但不影响已运行的Pod(用于临时维护)
kubectl uncordon <node-name> 解除"不可调度"标记 kubectl uncordon node-1 允许新Pod调度到该节点
kubectl drain <node-name> --ignore-daemonsets 排空节点(驱逐所有Pod) kubectl drain node-1 --ignore-daemonsets 用于节点下线维护,--ignore-daemonsets跳过DaemonSet管理的Pod(DaemonSet要求所有节点运行)
kubectl top node 查看节点资源使用情况 kubectl top node 需部署metrics-server,显示CPU/内存使用率,用于识别节点过载

2.3 命名空间管理

命名空间用于隔离集群资源(如开发、测试、生产环境分离)。

命令 作用 示例 注意事项
kubectl create namespace <name> 创建命名空间 kubectl create ns dev 命名空间名称需符合DNS-1123规范(小写字母、数字、-)
kubectl delete namespace <name> 删除命名空间 kubectl delete ns dev 会递归删除命名空间内所有资源,操作不可逆
kubectl config set-context --current --namespace=<name> 切换默认命名空间 kubectl config set-context --current --namespace=dev 避免每次命令加-n <namespace>,通过kubectl config view查看当前上下文

三、部署与伸缩命令

3.1 Deployment管理

Deployment是最常用的无状态应用部署控制器,支持滚动更新、回滚等功能。

命令 作用 示例 核心逻辑
kubectl create deployment <name> --image=<image> 创建Deployment kubectl create deployment nginx --image=nginx:1.23 自动创建ReplicaSet和Pod,默认1个副本
kubectl scale deployment <name> --replicas=<num> 调整副本数 kubectl scale deploy nginx --replicas=3 扩缩容时通过ReplicaSet控制Pod数量,确保服务不中断
kubectl rollout status deployment <name> 查看滚动更新状态 kubectl rollout status deploy nginx 显示更新进度(如"3 out of 3 new replicas have been updated")
kubectl rollout history deployment <name> 查看更新历史 kubectl rollout history deploy nginx 每个版本(revision)对应一次配置变更,包含变更时间、原因
kubectl rollout undo deployment <name> --to-revision=<num> 回滚到指定版本 kubectl rollout undo deploy nginx --to-revision=2 回滚会创建新ReplicaSet,逐步替换旧Pod,确保零 downtime

3.2 自动伸缩(HPA)

Horizontal Pod Autoscaler(HPA)可根据CPU使用率、自定义指标自动调整副本数。

命令 作用 示例 配置说明
kubectl autoscale deployment <name> --min=<min> --max=<max> --cpu-percent=<percent> 创建HPA kubectl autoscale deploy nginx --min=2 --max=5 --cpu-percent=80 当平均CPU使用率超过80%时扩容(最多5副本),低于阈值时缩容(最少2副本)
kubectl get hpa 查看HPA状态 kubectl get hpa 显示当前副本数、目标指标(如targets: 50%/80%)、最小/最大副本数

注意:HPA依赖metrics-server收集指标,需先部署(kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml)。

3.3 StatefulSet与DaemonSet

  • StatefulSet:用于部署有状态应用(如数据库、分布式系统),提供稳定的网络标识(固定域名)和存储(PVC模板)。

    kubectl get statefulsets  # 查看StatefulSet(简写sts)
    kubectl scale statefulset <name> --replicas=<num>  # 调整副本数(需确保存储可用)
    
  • DaemonSet:确保所有(或指定)节点运行相同的Pod(如日志收集器、监控代理、网络插件)。

    kubectl get daemonsets  # 查看DaemonSet(简写ds)
    kubectl describe ds <name>  # 查看调度节点选择器(如通过标签限制仅在特定节点运行)
    

四、故障排查命令

4.1 Pod诊断

Pod是K8s的最小部署单元,其故障排查是日常运维的重点。

命令 作用 示例 排查场景
kubectl logs <pod-name> -f 查看Pod日志(实时跟踪) kubectl logs nginx-7f9f6f5c9d-2xqkf -f 定位应用运行时错误(如日志中的Exception)
kubectl logs <pod-name> -c <container-name> 查看指定容器的日志 kubectl logs nginx-pod -c sidecar -f 多容器Pod(如主应用+sidecar)需指定容器,否则默认第一个容器
kubectl exec -it <pod-name> -- <command> 进入容器执行命令 kubectl exec -it nginx-pod -- /bin/bash 检查容器内文件、网络(如pingcurl)、环境变量
kubectl cp <pod-name>:<path> <local-path> 从Pod拷贝文件到本地 kubectl cp nginx-pod:/etc/nginx/nginx.conf ./nginx.conf 提取配置文件或日志文件离线分析
kubectl cp <local-path> <pod-name>:<path> 从本地拷贝文件到Pod kubectl cp ./index.html nginx-pod:/usr/share/nginx/html/ 临时替换应用文件(如调试静态页面)
kubectl get events -n <namespace> --sort-by=.metadata.creationTimestamp 查看命名空间事件 kubectl get events -n dev --sort-by=.metadata.creationTimestamp 定位Pod启动失败原因(如"FailedScheduling"调度失败、"ErrImagePull"镜像拉取失败)

4.2 网络诊断

网络问题是K8s中最常见的故障类型,需检查Service、网络策略、DNS等。

命令 作用 示例 排查逻辑
kubectl get svc <name> -o wide 查看Service网络信息 kubectl get svc nginx-svc -o wide 确认ClusterIP、端口映射是否正确(如80:30080/TCP表示集群内80端口映射到节点30080端口)
kubectl describe svc <name> 查看Service关联的Endpoints kubectl describe svc nginx-svc Endpoints为空→检查Pod标签是否与Service的selector匹配
kubectl port-forward <pod-name> <local-port>:<pod-port> 本地端口转发 kubectl port-forward nginx-pod 8080:80 绕过Service直接访问Pod,验证Pod本身是否正常(排除Service配置问题)
kubectl run -it --rm --image=busybox:1.35 dns-test -- nslookup <service-name> 测试DNS解析 kubectl run -it --rm --image=busybox:1.35 dns-test -- nslookup nginx-svc 解析失败→检查CoreDNS是否正常(`kubectl get po -n kube-system
kubectl get networkpolicies -n <namespace> 查看网络策略 kubectl get networkpolicies -n dev 若Pod间无法通信,检查是否有网络策略(NetworkPolicy)阻止流量

4.3 存储诊断

存储相关故障(如PVC绑定失败、挂载异常)需检查PV、PVC、存储类等。

命令 作用 示例 排查方向
kubectl get pv 查看持久卷(PV) kubectl get pv 关注PV的STATUS(Available/ Bound/ Released),若PVC未绑定,检查是否有匹配的PV(容量、访问模式、存储类一致)
kubectl get pvc -n <namespace> 查看持久卷声明(PVC) kubectl get pvc -n dev Pending状态→PV不足或不匹配;Bound状态→正常绑定
kubectl describe pvc <name> -n <namespace> 查看PVC绑定失败原因 kubectl describe pvc nginx-pvc -n dev 事件中可能提示"no persistent volumes available for this claim and no storage class is set"(未指定存储类且无可用PV)
kubectl get storageclasses 查看存储类(StorageClass) kubectl get sc 存储类用于动态创建PV,若PVC指定了存储类,需确保该存储类存在且可用

五、高级操作命令

5.1 标签与注解管理

标签(Label)用于资源分组和选择(如Service关联Pod),注解(Annotation)用于存储非标识性元数据(如构建信息、运维说明)。

命令 作用 示例 规范说明
kubectl label <resource> <name> <key>=<value> 为资源添加标签 kubectl label pod nginx-pod env=dev 标签键需符合[a-z0-9A-Z_-],长度≤63字符
kubectl label <resource> <name> <key>=<new-value> --overwrite 更新标签 kubectl label pod nginx-pod env=prod --overwrite 必须加--overwrite,否则无法更新已有标签
kubectl label <resource> <name> <key>- 删除标签 kubectl label pod nginx-pod env- 标签键后加-表示删除
kubectl annotate <resource> <name> <key>=<value> 为资源添加注解 kubectl annotate pod nginx-pod build-id=12345 注解可存储长文本(如JSON),不用于资源选择,仅用于描述

5.2 配置与密钥管理(ConfigMap/Secret)

  • ConfigMap:存储非敏感配置(如应用参数),通过环境变量或文件挂载注入Pod。

    kubectl create configmap nginx-conf --from-file=nginx.conf  # 从文件创建
    kubectl get configmaps  # 查看ConfigMap(简写cm)
    kubectl describe cm nginx-conf  # 查看配置内容
    
  • Secret:存储敏感信息(如密码、证书),默认base64编码(非加密,需配合RBAC或外部密钥管理)。

    kubectl create secret generic db-creds --from-literal=username=admin --from-literal=password=123456  # 创建密钥
    kubectl get secrets  # 查看Secret(简写secret)
    kubectl describe secret db-creds  # 查看密钥结构(值隐藏)
    kubectl get secret db-creds -o jsonpath='{.data.password}' | base64 -d  # 解码查看值(谨慎操作)
    

5.3 权限管理(RBAC)

基于角色的访问控制(RBAC)用于管理集群资源的访问权限,核心是"谁(Subject)能对什么资源(Resource)执行什么操作(Verb)"。

命令 作用 示例 权限范围
kubectl get roles -n <namespace> 查看命名空间内的角色 kubectl get roles -n dev 角色(Role)仅作用于所在命名空间
kubectl get rolebindings -n <namespace> 查看角色绑定 kubectl get rolebindings -n dev 角色绑定(RoleBinding)将角色与用户(如ServiceAccount)关联
kubectl get clusterroles 查看集群级角色 kubectl get clusterroles 集群角色(ClusterRole)作用于全集群
kubectl get clusterrolebindings 查看集群角色绑定 kubectl get clusterrolebindings 绑定集群角色与用户
kubectl auth can-i <action> <resource> --as=<user> 验证用户权限 kubectl auth can-i get pods --as=dev-user 快速确认权限配置是否生效(如返回yes/no

5.4 作业与定时任务

  • Job:用于执行一次性任务(如数据备份、初始化),确保任务成功完成(即使节点故障)。

    kubectl get jobs  # 查看Job
    kubectl describe job <name>  # 查看任务执行状态(如成功的Pod数、失败原因)
    kubectl delete job <name>  # 删除Job(会保留已完成的Pod,需手动删除)
    
  • CronJob:用于执行定时任务(如日志清理、周期性报表生成),基于Cron表达式调度。

    kubectl get cronjobs  # 查看CronJob(简写cj)
    kubectl describe cronjob <name>  # 查看调度规则(如`Schedule: 0 3 * * *`表示每天凌晨3点执行)
    kubectl create cronjob cleanup --image=busybox --schedule="0 3 * * *" -- rm -rf /tmp/*  # 创建定时任务
    

六、易错点与最佳实践

  1. 命令缩写与复数形式
    资源简写需用复数(如kubectl get po正确,kubectl get pod错误),常见简写:pod→podeployment→deployservice→svcnode→nonamespace→ns

  2. 命名空间上下文
    未指定-n时默认操作default命名空间,切换默认命名空间后(kubectl config set-context),所有命令默认在该命名空间执行,避免跨命名空间误操作。

  3. create vs apply的选择

    • 临时测试用create(如kubectl create deployment test --image=nginx);
    • 生产环境用apply(配合Git管理配置文件,支持版本控制和增量更新)。
  4. 强制删除的风险
    --grace-period=0 --force会跳过K8s的优雅终止流程,可能导致数据丢失(如数据库未完成事务提交),仅用于Pod长时间卡在Terminating状态的极端场景。

  5. 日志查看技巧

    • 多容器Pod必须用-c指定容器(如kubectl logs <pod> -c <container>);
    • 实时日志加-f,配合--tail=<num>查看最近N行(如kubectl logs <pod> -f --tail=100);
    • 查看历史日志可用--previous(如kubectl logs <pod> --previous查看崩溃容器的日志)。
  6. 资源依赖关系
    部署时需注意资源依赖顺序:先创建ConfigMap/Secret,再创建Deployment(避免Pod启动时配置文件不存在);先创建Deployment,再创建Service(确保Endpoints能关联Pod)。

  7. HPA不生效排查

    • 检查metrics-server是否运行(kubectl get po -n kube-system | grep metrics-server);
    • 确保Pod设置了资源请求(resources.requests.cpu),HPA基于请求值计算使用率;
    • 查看HPA事件(kubectl describe hpa <name>),可能提示"missing request for cpu"(未设置CPU请求)。

总结

Kubernetes命令的本质是与声明式API交互的工具,掌握命令的同时需理解其背后的资源模型(如控制器模式、标签选择器、命名空间隔离)。高频命令(getdescribeapply)是日常运维的基石,而故障排查命令(logsexecevents)则是定位问题的关键。

建议通过实际场景练习(如部署Nginx→暴露Service→配置HPA→模拟故障排查)加深理解,并善用kubectl --help官方 cheatsheet 快速查询。随着实践深入,命令会逐渐内化为运维直觉,助力高效管理K8s集群。


网站公告

今日签到

点亮在社区的每一天
去签到