0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Kubernetes kubectl命令行工具详解

马哥Linux运维 来源:马哥Linux运维 2026-02-02 16:40 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

kubectl命令实战宝典:Kubernetes集群管理与故障排查200+命令

一、概述

1.1 背景介绍

kubectl是Kubernetes官方提供的命令行工具,作为与Kubernetes集群交互的主要接口,它通过调用Kubernetes API Server实现对集群资源的全面管理。在生产环境中,运维工程师需要熟练掌握kubectl命令来完成日常的集群运维、应用部署、故障排查和性能优化等工作。

随着容器化和云原生技术的普及,Kubernetes已成为容器编排的事实标准。然而,Kubernetes的复杂性也给运维人员带来了挑战。kubectl命令体系庞大,涵盖资源管理、网络配置、存储编排、权限控制等多个维度,掌握这些命令对于高效运维至关重要。

本文档系统整理了200+个kubectl实战命令,涵盖从基础操作到高级技巧的完整知识体系,旨在帮助运维工程师快速定位问题、提升工作效率,并建立完善的Kubernetes运维能力。

1.2 技术特点

声明式管理:支持通过YAML/JSON配置文件进行资源的声明式管理,实现基础设施即代码(IaC

多集群支持:通过context机制实现多集群、多环境的统一管理,支持快速切换操作目标

丰富的输出格式:提供JSON、YAML、wide、custom-columns等多种输出格式,便于数据提取和自动化处理

强大的过滤能力:支持label selector、field selector、JSONPath等多种过滤方式,精确定位目标资源

实时监控能力:通过watch机制实时监控资源状态变化,支持日志流式输出和事件追踪

插件扩展机制:支持通过插件(kubectl plugins)扩展功能,与生态工具无缝集成

1.3 适用场景

日常运维管理:集群节点管理、资源配额设置、命名空间隔离、RBAC权限配置等常规运维操作

应用生命周期管理:应用部署、滚动更新、版本回滚、弹性伸缩、灰度发布等应用管理场景

故障诊断排查:Pod异常排查、网络连通性测试、日志分析、事件追踪、资源瓶颈定位等故障处理

性能优化调优:资源使用率分析、性能指标采集、容器资源限制调整、HPA/VPA配置优化

安全审计合规:Secret管理、网络策略配置、Pod安全策略、审计日志查询、漏洞扫描集成

自动化运维:CI/CD流水线集成、批量操作脚本、资源自动化巡检、备份恢复自动化

1.4 环境要求

组件 版本要求 说明
Kubernetes集群 v1.20+ (推荐v1.24+) 本文档命令基于v1.24+版本,部分新特性需要更高版本支持
kubectl客户端 与集群版本差异不超过1个minor版本 建议kubectl版本与集群版本保持一致,避免API兼容性问题
操作系统 Linux/macOS/Windows 跨平台支持,Linux环境下功能最完整
网络连接 可访问API Server(默认6443端口 需要配置kubeconfig文件,确保网络连通性
权限要求 根据操作需求配置相应RBAC权限 建议生产环境使用最小权限原则,避免使用cluster-admin
依赖工具 jq、yq、grep、awk等(可选) 用于高级数据处理和自动化脚本编写

二、详细步骤

2.1 准备工作

2.1.1 kubectl安装与版本检查

# 检查kubectl版本(客户端和服务端)
kubectl version --short

# 查看详细版本信息
kubectl version --output=yaml

# 检查kubectl配置是否正确
kubectl cluster-info

# 查看API Server地址和健康状态
kubectl cluster-info dump | grep -i"cluster-info"

说明:kubectl版本应与Kubernetes集群版本保持兼容,版本差异不应超过一个minor版本。例如,kubectl 1.24可以与1.23、1.24、1.25版本的集群通信

2.1.2 kubeconfig配置管理

# 查看当前kubeconfig文件路径
echo$KUBECONFIG

# 查看kubeconfig配置内容
kubectl config view

# 查看原始配置(包含敏感信息)
kubectl config view --raw

# 查看当前使用的context
kubectl config current-context

# 列出所有可用的context
kubectl config get-contexts

# 列出所有集群配置
kubectl config get-clusters

说明:kubeconfig文件默认位于~/.kube/config,包含集群连接信息、认证凭据和上下文配置。生产环境建议对该文件设置严格的权限控制(chmod 600)。

2.2 核心配置

2.2.1 多集群Context管理

# 切换到指定context
kubectl config use-context production-cluster

# 创建新的context
kubectl configset-context dev-context 
 --cluster=dev-cluster 
 --user=dev-admin 
 --namespace=development

# 修改context的默认命名空间
kubectl configset-context --current --namespace=kube-system

# 删除指定context
kubectl config delete-context old-context

# 重命名context
kubectl config rename-context old-name new-name

说明:Context是集群、用户和命名空间的组合,通过切换context可以快速在不同环境间切换。建议为不同环境(开发、测试、生产)配置独立的context,避免误操作。

2.2.2 集群凭据配置

# 设置集群信息
kubectl configset-cluster prod-cluster 
 --server=https://k8s-api.example.com:6443 
 --certificate-authority=/path/to/ca.crt 
 --embed-certs=true

# 设置用户凭据(证书认证)
kubectl configset-credentials admin-user 
 --client-certificate=/path/to/admin.crt 
 --client-key=/path/to/admin.key 
 --embed-certs=true

# 设置用户凭据(Token认证)
kubectl configset-credentials token-user 
 --token=eyJhbGciOiJSUzI1NiIsImtpZCI6...

# 取消TLS验证(仅用于测试环境)
kubectl configset-clustertest-cluster 
 --server=https://test-api:6443 
 --insecure-skip-tls-verify=true

说明:生产环境必须使用TLS加密通信,并验证证书有效性。Token认证适用于ServiceAccount场景,证书认证适用于管理员用户。--embed-certs=true会将证书内容嵌入kubeconfig文件,便于文件传输。

2.2.3 kubectl命令行补全配置

# Bash环境配置自动补全
echo'source <(kubectl completion bash)' >> ~/.bashrc
echo'alias k=kubectl'>> ~/.bashrc
echo'complete -F __start_kubectl k'>> ~/.bashrc
source~/.bashrc

# Zsh环境配置自动补全
echo'source <(kubectl completion zsh)' >> ~/.zshrc
echo'alias k=kubectl'>> ~/.zshrc
echo'compdef __start_kubectl k'>> ~/.zshrc
source~/.zshrc

# 验证补全功能
kubectl get po # 应自动补全为 pods

说明:命令行补全可以大幅提升工作效率,减少输入错误。配置别名k可以简化日常操作,在生产环境中已成为事实标准。

2.3 启动和验证

2.3.1 集群连接验证

# 验证集群连接状态
kubectl cluster-info

# 查看集群组件状态
kubectl get componentstatuses
kubectl get cs # 简写形式

# 检查API Server健康状态
kubectl get --raw /healthz
kubectl get --raw /livez
kubectl get --raw /readyz

# 查看API资源列表
kubectl api-resources

# 查看API版本
kubectl api-versions

2.3.2 权限验证

# 检查当前用户权限
kubectl auth can-i create deployments
kubectl auth can-i delete pods --namespace=production
kubectl auth can-i'*''*'# 检查是否有集群管理员权限

# 模拟其他用户权限检查
kubectl auth can-i list secrets --as=systemdefault:myapp

# 查看当前用户可访问的资源
kubectl auth can-i --list

# 查看指定命名空间的权限
kubectl auth can-i --list --namespace=kube-system

说明:权限验证是运维操作前的必要步骤,可以避免因权限不足导致的操作失败。生产环境应遵循最小权限原则,定期审计用户权限配置。

三、示例代码和配置

3.1 集群管理命令(50+)

3.1.1 节点管理命令

# 查看所有节点
kubectl get nodes
kubectl get nodes -o wide # 显示更多信息(IP、OS、内核版本等)

# 查看节点详细信息
kubectl describe node node-name

# 查看节点资源使用情况
kubectl top nodes
kubectl top nodes --sort-by=cpu
kubectl top nodes --sort-by=memory

# 标记节点为不可调度(维护模式)
kubectl cordon node-name

# 恢复节点为可调度状态
kubectl uncordon node-name

# 驱逐节点上的所有Pod(优雅驱逐)
kubectl drain node-name --ignore-daemonsets --delete-emptydir-data

# 强制驱逐(跳过PDB限制)
kubectl drain node-name --ignore-daemonsets --force --grace-period=0

# 给节点打标签
kubectl label nodes node-name env=production
kubectl label nodes node-name disktype=ssd

# 删除节点标签
kubectl label nodes node-name env-

# 修改节点标签
kubectl label nodes node-name env=staging --overwrite

# 查看带特定标签的节点
kubectl get nodes -l env=production
kubectl get nodes -l disktype=ssd,env=production

# 给节点添加污点(Taint)
kubectl taint nodes node-name key=value:NoSchedule
kubectl taint nodes node-name dedicated=gpu:NoExecute

# 删除节点污点
kubectl taint nodes node-name key:NoSchedule-

# 查看节点污点信息
kubectl describe node node-name | grep -i taint

说明:节点管理是集群运维的基础操作。cordon用于临时禁止调度,drain用于节点维护前的Pod迁移。污点(Taint)和容忍(Toleration)机制用于控制Pod调度到特定节点。

3.1.2 命名空间管理命令

# 查看所有命名空间
kubectl get namespaces
kubectl get ns # 简写形式

# 创建命名空间
kubectl create namespace development
kubectl create ns staging

# 查看命名空间详细信息
kubectl describe namespace production

# 删除命名空间(会删除该命名空间下所有资源)
kubectl delete namespace old-project

# 给命名空间打标签
kubectl label namespace production env=prod
kubectl label namespace production team=backend

# 查看命名空间标签
kubectl get namespace --show-labels

# 设置默认命名空间(当前context)
kubectl configset-context --current --namespace=production

# 查看命名空间资源配额
kubectl get resourcequota -n production
kubectl describe resourcequota -n production

# 查看命名空间限制范围
kubectl get limitrange -n production
kubectl describe limitrange -n production

说明:命名空间是Kubernetes中的逻辑隔离单元,用于多租户环境的资源隔离。删除命名空间会级联删除其下所有资源,操作需谨慎。

3.1.3 资源配额管理命令

# 创建资源配额
kubectl create quota dev-quota 
 --hard=cpu=10,memory=20Gi,pods=20 
 -n development

# 查看所有资源配额
kubectl get resourcequota --all-namespaces
kubectl get quota -A # 简写形式

# 查看资源配额详情
kubectl describe quota dev-quota -n development

# 通过YAML文件创建资源配额
cat <

说明:ResourceQuota用于限制命名空间的资源使用量,防止资源过度消耗。生产环境建议为每个命名空间配置合理的资源配额。

3.1.4 RBAC权限管理命令

# 查看所有角色(Role)
kubectl get roles -A
kubectl get role -n kube-system

# 查看集群角色(ClusterRole)
kubectl get clusterroles
kubectl get clusterrole admin -o yaml

# 查看角色绑定(RoleBinding)
kubectl get rolebindings -A
kubectl get rolebinding -n production

# 查看集群角色绑定(ClusterRoleBinding)
kubectl get clusterrolebindings

# 创建角色
kubectl create role pod-reader 
 --verb=get,list,watch 
 --resource=pods 
 -n development

# 创建集群角色
kubectl create clusterrole deployment-manager 
 --verb=get,list,create,delete 
 --resource=deployments

# 创建角色绑定
kubectl create rolebinding dev-pod-reader 
 --role=pod-reader 
 --user=john 
 -n development

# 创建集群角色绑定
kubectl create clusterrolebinding cluster-admin-binding 
 --clusterrole=cluster-admin 
 --user=admin@example.com

# 将角色绑定到ServiceAccount
kubectl create rolebinding app-reader 
 --role=pod-reader 
 --serviceaccount=default:myapp 
 -n production

# 查看角色详细权限
kubectl describe role pod-reader -n development
kubectl describe clusterrole admin

说明:RBAC是Kubernetes的核心安全机制,通过Role/ClusterRole定义权限,通过RoleBinding/ClusterRoleBinding将权限授予用户或ServiceAccount。生产环境应避免直接使用cluster-admin角色。

3.1.5 ServiceAccount管理命令

# 查看所有ServiceAccount
kubectl get serviceaccounts -A
kubectl get sa -n default # 简写形式

# 创建ServiceAccount
kubectl create serviceaccount myapp -n production

# 查看ServiceAccount详情
kubectl describe sa myapp -n production

# 获取ServiceAccount的Token
kubectl create token myapp -n production
kubectl create token myapp --duration=8760h -n production # 指定有效期

# 查看ServiceAccount关联的Secret
kubectl get sa myapp -n production -o jsonpath='{.secrets[0].name}'

# 删除ServiceAccount
kubectl delete sa myapp -n production

说明:ServiceAccount是Pod访问API Server的身份凭证。Kubernetes 1.24+版本不再自动创建长期有效的Token Secret,需要使用kubectl create token命令动态生成。

3.2 工作负载管理命令(50+)

3.2.1 Pod管理命令

# 查看所有Pod
kubectl get pods -A
kubectl get po -n production # 简写形式

# 查看Pod详细信息
kubectl get pods -o wide
kubectl describe pod nginx-pod -n production

# 创建Pod(命令行方式)
kubectl run nginx --image=nginx:1.21 --port=80

# 创建Pod并设置资源限制
kubectl run nginx --image=nginx:1.21 
 --requests='cpu=100m,memory=256Mi'
 --limits='cpu=200m,memory=512Mi'

# 创建临时调试Pod
kubectl run debug-pod --image=busybox --rm -it -- sh

# 查看Pod日志
kubectl logs nginx-pod -n production
kubectl logs nginx-pod -n production --tail=100
kubectl logs nginx-pod -n production --since=1h
kubectl logs nginx-pod -n production -f # 实时查看

# 查看多容器Pod的特定容器日志
kubectl logs nginx-pod -c sidecar-container -n production

# 查看Pod的前一个实例日志(Pod重启后)
kubectl logs nginx-pod --previous -n production

# 进入Pod执行命令
kubectlexec-it nginx-pod -n production -- bash
kubectlexecnginx-pod -n production -- ls /var/log

# 多容器Pod指定容器执行命令
kubectlexec-it nginx-pod -c nginx-container -n production -- sh

# 复制文件到Pod
kubectl cp /local/file.txt production/nginx-pod:/tmp/file.txt

# 从Pod复制文件
kubectl cp production/nginx-pod:/var/log/nginx/access.log ./access.log

# 查看Pod资源使用情况
kubectl top pod -n production
kubectl top pod --sort-by=cpu -A
kubectl top pod --sort-by=memory -n production

# 删除Pod
kubectl delete pod nginx-pod -n production

# 强制删除Pod
kubectl delete pod nginx-pod -n production --force --grace-period=0

# 根据标签删除Pod
kubectl delete pods -l app=nginx -n production

说明:Pod是Kubernetes中最小的调度单元。kubectl logs和kubectl exec是日常运维中最常用的命令。强制删除Pod可能导致数据丢失,仅在必要时使用。

3.2.2 Deployment管理命令

# 查看所有Deployment
kubectl get deployments -A
kubectl get deploy -n production # 简写形式

# 创建Deployment
kubectl create deployment nginx --image=nginx:1.21 --replicas=3

# 查看Deployment详情
kubectl describe deployment nginx -n production

# 扩缩容Deployment
kubectl scale deployment nginx --replicas=5 -n production

# 自动扩缩容(HPA)
kubectl autoscale deployment nginx --min=3 --max=10 --cpu-percent=80

# 更新镜像(滚动更新)
kubectlsetimage deployment/nginx nginx=nginx:1.22 -n production

# 查看滚动更新状态
kubectl rollout status deployment/nginx -n production

# 查看滚动更新历史
kubectl rollouthistorydeployment/nginx -n production

# 回滚到上一个版本
kubectl rollout undo deployment/nginx -n production

# 回滚到指定版本
kubectl rollout undo deployment/nginx --to-revision=2 -n production

# 暂停滚动更新
kubectl rollout pause deployment/nginx -n production

# 恢复滚动更新
kubectl rollout resume deployment/nginx -n production

# 重启Deployment(重建所有Pod)
kubectl rollout restart deployment/nginx -n production

说明:Deployment是最常用的工作负载控制器,支持滚动更新和版本回滚。rollout命令是管理应用发布的核心工具,生产环境建议保留足够的历史版本用于快速回滚。

3.2.3 StatefulSet和DaemonSet管理命令

# 查看StatefulSet
kubectl get statefulsets -A
kubectl get sts -n production # 简写形式

# 创建StatefulSet(需要YAML文件)
kubectl apply -f mysql-statefulset.yaml

# 扩缩容StatefulSet
kubectl scale statefulset mysql --replicas=5 -n production

# 查看StatefulSet滚动更新状态
kubectl rollout status statefulset/mysql -n production

# 删除StatefulSet但保留Pod
kubectl delete statefulset mysql --cascade=orphan -n production

# 查看DaemonSet
kubectl get daemonsets -A
kubectl get ds -n kube-system # 简写形式

# 查看DaemonSet详情
kubectl describe daemonset fluentd -n kube-system

# 更新DaemonSet镜像
kubectlsetimage daemonset/fluentd fluentd=fluentd:v1.15 -n kube-system

# 查看DaemonSet滚动更新状态
kubectl rollout status daemonset/fluentd -n kube-system

说明:StatefulSet用于有状态应用(如数据库),提供稳定的网络标识和持久化存储。DaemonSet确保每个节点运行一个Pod副本,常用于日志收集、监控代理等场景。

3.2.4 Job和CronJob管理命令

# 创建一次性Job
kubectl create job backup --image=backup-tool:latest

# 查看Job
kubectl getjobs-A
kubectl describe job backup -n production

# 查看Job的Pod
kubectl get pods --selector=job-name=backup -n production

# 删除Job及其Pod
kubectl delete job backup -n production

# 创建CronJob
kubectl create cronjob daily-backup 
 --image=backup-tool:latest 
 --schedule="0 2 * * *"

# 查看CronJob
kubectl get cronjobs -A
kubectl get cj -n production # 简写形式

# 手动触发CronJob
kubectl create job manual-backup --from=cronjob/daily-backup -n production

# 暂停CronJob
kubectl patch cronjob daily-backup -p'{"spec":{"suspend":true}}'-n production

# 恢复CronJob
kubectl patch cronjob daily-backup -p'{"spec":{"suspend":false}}'-n production

说明:Job用于一次性任务,CronJob用于定时任务。CronJob的schedule格式遵循标准Cron表达式。生产环境建议设置合理的successfulJobsHistoryLimit和failedJobsHistoryLimit。

3.3 网络和服务管理命令(40+)

3.3.1 Service管理命令

# 查看所有Service
kubectl get services -A
kubectl get svc -n production # 简写形式

# 创建ClusterIP类型Service
kubectl create service clusterip nginx --tcp=80:80

# 创建NodePort类型Service
kubectl create service nodeport nginx --tcp=80:80 --node-port=30080

# 创建LoadBalancer类型Service
kubectl create service loadbalancer nginx --tcp=80:80

# 通过Deployment暴露Service
kubectl expose deployment nginx --port=80 --target-port=8080 --type=ClusterIP

# 查看Service详情
kubectl describe service nginx -n production

# 查看Service的Endpoints
kubectl get endpoints nginx -n production
kubectl get ep nginx -n production # 简写形式

# 编辑Service
kubectl edit service nginx -n production

# 删除Service
kubectl delete service nginx -n production

说明:Service是Kubernetes中的服务发现和负载均衡机制。ClusterIP用于集群内部访问,NodePort用于外部访问,LoadBalancer用于云环境的负载均衡器集成。

3.3.2 Ingress管理命令

# 查看所有Ingress
kubectl get ingress -A
kubectl get ing -n production # 简写形式

# 查看Ingress详情
kubectl describe ingress web-ingress -n production

# 创建Ingress(需要YAML文件)
kubectl apply -f ingress.yaml

# 查看Ingress Controller
kubectl get pods -n ingress-nginx
kubectl logs -f deployment/ingress-nginx-controller -n ingress-nginx

# 编辑Ingress
kubectl edit ingress web-ingress -n production

# 删除Ingress
kubectl delete ingress web-ingress -n production

说明:Ingress提供HTTP/HTTPS路由功能,是集群外部访问服务的标准方式。需要先部署Ingress Controller(如Nginx Ingress、Traefik等)才能使用Ingress资源。

3.3.3 NetworkPolicy和DNS命令

# 查看网络策略
kubectl get networkpolicies -A
kubectl get netpol -n production # 简写形式

# 查看网络策略详情
kubectl describe networkpolicy deny-all -n production

# 创建网络策略(需要YAML文件)
kubectl apply -f network-policy.yaml

# 删除网络策略
kubectl delete networkpolicy deny-all -n production

# 查看CoreDNS配置
kubectl get configmap coredns -n kube-system -o yaml

# 查看CoreDNS Pod
kubectl get pods -n kube-system -l k8s-app=kube-dns

# 测试DNS解析
kubectl run dnsutils --image=tutum/dnsutils --rm -it -- nslookup kubernetes.default

# 查看Service的DNS记录
kubectl run dnsutils --image=tutum/dnsutils --rm -it -- nslookup nginx.production.svc.cluster.local

说明:NetworkPolicy用于实现Pod级别的网络隔离,需要CNI插件支持(如Calico、Cilium)。DNS是服务发现的基础,Service的完整域名格式为..svc.cluster.local。

3.4 存储管理命令(30+)

3.4.1 PersistentVolume和PVC命令

# 查看PersistentVolume
kubectl get persistentvolumes
kubectl get pv # 简写形式

# 查看PV详情
kubectl describe pv pv-name

# 查看PersistentVolumeClaim
kubectl get persistentvolumeclaims -A
kubectl get pvc -n production # 简写形式

# 查看PVC详情
kubectl describe pvc data-pvc -n production

# 创建PVC(需要YAML文件)
kubectl apply -f pvc.yaml

# 删除PVC
kubectl delete pvc data-pvc -n production

# 查看PVC使用情况
kubectl get pvc -o custom-columns=NAME:.metadata.name,STATUS:.status.phase,VOLUME:.spec.volumeName,CAPACITY:.status.capacity.storage,STORAGECLASS:.spec.storageClassName -n production

说明:PV是集群级别的存储资源,PVC是命名空间级别的存储请求。PVC与PV通过StorageClass动态绑定,或通过标签选择器静态绑定。

3.4.2 StorageClass命令

# 查看StorageClass
kubectl get storageclasses
kubectl get sc # 简写形式

# 查看StorageClass详情
kubectl describe storageclass standard

# 设置默认StorageClass
kubectl patch storageclass standard -p'{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

# 取消默认StorageClass
kubectl patch storageclass standard -p'{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

说明:StorageClass定义了动态存储供应的参数,包括存储提供者、回收策略、卷绑定模式等。集群可以有多个StorageClass,但只能有一个默认StorageClass。

3.4.3 ConfigMap和Secret管理命令

# 查看ConfigMap
kubectl get configmaps -A
kubectl get cm -n production # 简写形式

# 创建ConfigMap(从文字)
kubectl create configmap app-config 
 --from-literal=database.host=mysql.prod 
 --from-literal=database.port=3306

# 创建ConfigMap(从文件)
kubectl create configmap nginx-config --from-file=nginx.conf

# 创建ConfigMap(从目录)
kubectl create configmap app-configs --from-file=./configs/

# 查看ConfigMap内容
kubectl get configmap app-config -o yaml
kubectl describe configmap app-config -n production

# 编辑ConfigMap
kubectl edit configmap app-config -n production

# 删除ConfigMap
kubectl delete configmap app-config -n production

# 查看Secret
kubectl get secrets -A
kubectl get secret -n production

# 创建Generic类型Secret
kubectl create secret generic db-secret 
 --from-literal=username=admin 
 --from-literal=password=P@ssw0rd

# 创建TLS类型Secret
kubectl create secret tls tls-secret 
 --cert=path/to/tls.crt 
 --key=path/to/tls.key

# 创建Docker Registry类型Secret
kubectl create secret docker-registry regcred 
 --docker-server=registry.example.com 
 --docker-username=user 
 --docker-password=password 
 --docker-email=user@example.com

# 查看Secret内容(Base64编码)
kubectl get secret db-secret -o yaml

# 解码Secret内容
kubectl get secret db-secret -o jsonpath='{.data.password}'| base64 -d

# 删除Secret
kubectl delete secret db-secret -n production

说明:ConfigMap用于存储非敏感配置数据,Secret用于存储敏感信息(密码、Token、证书等)。Secret数据以Base64编码存储,但并非加密,生产环境建议使用外部密钥管理系统(如Vault、Sealed Secrets)。

3.5 高级命令和技巧(30+)

3.5.1 资源查询和过滤命令

# 使用Label Selector查询
kubectl get pods -l app=nginx
kubectl get pods -l'env in (prod,staging)'
kubectl get pods -l app=nginx,tier=frontend

# 使用Field Selector查询
kubectl get pods --field-selector status.phase=Running
kubectl get pods --field-selector metadata.namespace=production
kubectl get events --field-selector involvedObject.kind=Pod

# 查看所有命名空间的资源
kubectl get pods --all-namespaces
kubectl get pods -A # 简写形式

# 按时间排序
kubectl get pods --sort-by=.metadata.creationTimestamp
kubectl get pods --sort-by=.status.startTime

# 自定义列输出
kubectl get pods -o custom-columns=NAME:.metadata.name,STATUS:.status.phase,NODE:.spec.nodeName,IP:.status.podIP

# 查看资源的特定字段
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="InternalIP")].address}'

# 查看Pod的容器镜像
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"	"}{.spec.containers[*].image}{"
"}{end}'

说明:Label Selector和Field Selector是资源过滤的核心机制。JSONPath提供了强大的数据提取能力,适用于自动化脚本和数据分析场景。

3.5.2 资源管理和调试命令

# 查看资源定义(Dry Run)
kubectl create deployment nginx --image=nginx --dry-run=client -o yaml

# 应用资源配置
kubectl apply -f deployment.yaml
kubectl apply -f ./manifests/ # 应用目录下所有YAML文件

# 声明式管理(记录变更历史)
kubectl apply -f deployment.yaml --record

# 查看资源变更差异
kubectl diff -f deployment.yaml

# 替换资源(强制更新)
kubectl replace -f deployment.yaml --force

# 修补资源(Patch)
kubectl patch deployment nginx -p'{"spec":{"replicas":5}}'
kubectl patch deployment nginx --type='json'-p='[{"op":"replace","path":"/spec/replicas","value":5}]'

# 实时监控资源变化
kubectl get pods -w
kubectl get events -w

# 查看资源使用的API版本
kubectl explain pod
kubectl explain deployment.spec.strategy

说明:apply是声明式管理的推荐方式,支持增量更新。patch用于局部修改资源,支持strategic、merge、json三种策略。--dry-run=client可以预览资源定义而不实际创建。

3.5.3 事件和调试命令

# 查看集群事件
kubectl get events -A
kubectl get events --sort-by=.metadata.creationTimestamp

# 查看特定资源的事件
kubectl get events --field-selector involvedObject.name=nginx-pod

# 查看最近的事件
kubectl get events --sort-by='.lastTimestamp'| tail -20

# 使用kubectl debug调试Pod(需要Kubernetes 1.23+)
kubectl debug nginx-pod -it --image=busybox --target=nginx-container

# 创建调试副本Pod
kubectl debug nginx-pod -it --copy-to=nginx-debug --container=debugger --image=busybox

说明:Events是故障排查的重要信息源,记录了资源的状态变化和异常情况。kubectl debug是Kubernetes 1.23+引入的新特性,提供了更便捷的Pod调试能力。

四、最佳实践和注意事项

4.1 最佳实践

4.1.1 性能优化

使用资源限制和请求:为所有Pod设置合理的resources.requests和resources.limits,避免资源争抢

# 查看未设置资源限制的Pod
kubectl get pods -A -o json | jq'.items[] | select(.spec.containers[].resources.limits == null) | .metadata.name'

启用HPA自动扩缩容:根据CPU/内存使用率自动调整副本数

kubectl autoscale deployment nginx --min=3 --max=10 --cpu-percent=70

使用亲和性和反亲和性:优化Pod调度分布,提高可用性

Pod反亲和性:确保同一应用的Pod分散在不同节点

节点亲和性:将Pod调度到特定类型的节点(如SSD节点)

优化镜像拉取策略:使用imagePullPolicy: IfNotPresent减少镜像拉取时间

# 查看Pod的镜像拉取策略
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"	"}{.spec.containers[*].imagePullPolicy}{"
"}{end}'

4.1.2 安全加固

最小权限原则:避免使用cluster-admin角色,为每个应用创建专用ServiceAccount

# 检查使用cluster-admin的绑定
kubectl get clusterrolebindings -o json | jq'.items[] | select(.roleRef.name=="cluster-admin") | .metadata.name'

启用Pod安全策略:限制特权容器、主机网络、主机路径挂载等高危操作

# 查看以特权模式运行的Pod
kubectl get pods -A -o json | jq'.items[] | select(.spec.containers[].securityContext.privileged==true) | .metadata.name'

使用NetworkPolicy隔离网络:实现命名空间级别的网络隔离

# 检查是否配置了网络策略
kubectl get networkpolicies -A

定期轮换Secret和证书:避免使用长期有效的凭证

# 查看Secret的创建时间
kubectl get secrets -A -o json | jq'.items[] | {name: .metadata.name, age: .metadata.creationTimestamp}'

4.1.3 高可用配置

配置PodDisruptionBudget:保证滚动更新和节点维护时的最小可用副本数

# 创建PDB
kubectl create pdb nginx-pdb --selector=app=nginx --min-available=2

# 查看PDB状态
kubectl get pdb -A

使用多副本部署:生产环境至少3个副本,跨多个可用区部署

配置健康检查:设置livenessProbe和readinessProbe确保服务可用性

# 查看未配置健康检查的Pod
kubectl get pods -A -o json | jq'.items[] | select(.spec.containers[].livenessProbe == null) | .metadata.name'

4.2 注意事项

4.2.1 配置注意事项

警告:以下操作可能导致服务中断或数据丢失,操作前务必做好备份和验证。

删除命名空间前确认:删除命名空间会级联删除所有资源,无法恢复

# 删除前先查看命名空间下的所有资源
kubectl get all -n namespace-name

谨慎使用强制删除:--force --grace-period=0可能导致数据不一致

# 仅在Pod长时间处于Terminating状态时使用
kubectl delete pod stuck-pod --force --grace-period=0

生产环境禁用--insecure-skip-tls-verify:会导致中间人攻击风险

注意资源配额限制:超出配额会导致Pod无法创建

# 检查命名空间配额使用情况
kubectl describe quota -n production

4.2.2 常见错误

错误现象 原因分析 解决方案
ImagePullBackOff 镜像不存在或无权限拉取 检查镜像名称、标签和imagePullSecrets配置
CrashLoopBackOff 容器启动后立即退出 查看日志排查应用错误,检查启动命令和健康检查配置
Pending状态 资源不足或调度失败 检查节点资源、污点容忍、亲和性配置
OOMKilled 内存超限被杀死 增加内存限制或优化应用内存使用
Evicted 节点资源压力导致驱逐 检查节点磁盘和内存使用,调整资源配置

五、故障排查和监控

5.1 故障排查

5.1.1 日志查看

# 查看Pod日志(最近100行)
kubectl logs nginx-pod --tail=100 -n production

# 查看最近1小时的日志
kubectl logs nginx-pod --since=1h -n production

# 实时查看日志
kubectl logs -f nginx-pod -n production

# 查看所有容器日志(多容器Pod)
kubectl logs nginx-pod --all-containers=true-n production

# 查看崩溃前的日志
kubectl logs nginx-pod --previous -n production

# 导出日志到文件
kubectl logs nginx-pod -n production > pod.log

5.1.2 常见问题排查

问题一:Pod一直处于Pending状态

# 查看Pod详情和事件
kubectl describe pod nginx-pod -n production

# 检查节点资源
kubectl top nodes

# 查看调度失败原因
kubectl get events --field-selector involvedObject.name=nginx-pod -n production

解决方案

检查节点是否有足够资源(CPU、内存)

检查Pod的nodeSelector、亲和性、污点容忍配置

确认PVC是否成功绑定

问题二:Service无法访问

# 检查Service配置
kubectl describe service nginx-svc -n production

# 检查Endpoints是否正常
kubectl get endpoints nginx-svc -n production

# 测试Service连通性
kubectl runtest-pod --image=busybox --rm -it -- wget -O- http://nginx-svc.production.svc.cluster.local

解决方案

确认Service的selector与Pod标签匹配

检查Pod是否处于Ready状态

验证网络策略是否阻止了流量

问题三:PVC无法绑定

症状:PVC一直处于Pending状态

排查:检查StorageClass是否存在,PV容量是否满足要求

解决:创建匹配的PV或调整PVC的存储请求大小

5.2 性能监控

5.2.1 关键指标监控

# 查看节点资源使用
kubectl top nodes

# 查看Pod资源使用
kubectl top pods -A --sort-by=cpu
kubectl top pods -A --sort-by=memory

# 查看容器资源使用
kubectl top pod nginx-pod --containers -n production

# 查看集群资源分配情况
kubectl describe nodes | grep -A 5"Allocated resources"

5.2.2 监控指标说明

指标名称 正常范围 告警阈值 说明
CPU使用率 <70% >85% 持续高CPU可能导致性能下降
内存使用 <80% >90% 接近限制可能触发OOM
Pod重启次数 0 >5次/小时 频繁重启表明应用不稳定
磁盘使用率 <80% >85% 磁盘满会导致Pod驱逐

六、总结

6.1 技术要点回顾

kubectl基础配置:掌握kubeconfig管理、context切换、命令行补全等基础技能

资源管理命令:熟练使用200+命令管理集群、工作负载、网络、存储等各类资源

故障排查技巧:掌握日志查看、事件分析、调试工具等故障诊断方法

最佳实践:遵循安全加固、性能优化、高可用配置等生产环境最佳实践

6.2 进阶学习方向

Kubernetes高级特性:深入学习Operator、CRD、Admission Webhook等扩展机制

学习资源:Kubernetes官方文档、《Kubernetes Operators》

实践建议:尝试开发自定义Operator,实现业务自动化

云原生生态工具:掌握Helm、Kustomize、ArgoCD等配置管理和GitOps工具

学习资源:CNCF项目文档、云原生社区

实践建议:构建完整的CI/CD流水线,实现自动化部署

可观测性体系:建立Prometheus+Grafana+Loki+Jaeger完整监控体系

学习资源:Prometheus官方文档、Grafana教程

实践建议:搭建生产级监控告警系统

6.3 参考资料

Kubernetes官方文档- 最权威的Kubernetes学习资源

kubectl命令参考- kubectl完整命令手册

Kubernetes GitHub仓库- 源码和Issue追踪

CNCF云原生社区- 云原生技术生态和最佳实践

Kubernetes中文社区- 中文学习资源和技术交流

附录

A. 命令速查表

# 资源简写对照
po  # pods
svc # services
deploy# deployments
rs  # replicasets
ds  # daemonsets
sts # statefulsets
cm  # configmaps
ns  # namespaces
pv  # persistentvolumes
pvc # persistentvolumeclaims
sa  # serviceaccounts
ing # ingresses
netpol# networkpolicies

# 常用命令组合
kubectl get pods -A -o wide --sort-by=.metadata.creationTimestamp # 查看所有Pod并按创建时间排序
kubectl get events --sort-by='.lastTimestamp'-A # 查看所有事件按时间排序
kubectl top pods -A --sort-by=cpu # 查看Pod CPU使用率排序
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"	"}{.status.phase}{"
"}{end}'# 自定义输出格式

B. 配置参数详解

资源限制参数

requests.cpu: CPU请求量,调度时保证的最小CPU资源(如100m表示0.1核)

requests.memory: 内存请求量,调度时保证的最小内存资源(如256Mi)

limits.cpu: CPU限制量,容器可使用的最大CPU资源

limits.memory: 内存限制量,超出会触发OOM Kill

健康检查参数

initialDelaySeconds: 容器启动后首次探测延迟时间

periodSeconds: 探测间隔时间

timeoutSeconds: 探测超时时间

successThreshold: 连续成功次数阈值

failureThreshold: 连续失败次数阈值

C. 术语表

术语 英文 解释
命名空间 Namespace Kubernetes中的逻辑隔离单元,用于多租户环境
工作负载 Workload 在Kubernetes上运行的应用程序,包括Deployment、StatefulSet等
服务发现 Service Discovery 通过Service资源实现的Pod间通信机制
持久化卷 Persistent Volume 集群级别的存储资源,独立于Pod生命周期
标签选择器 Label Selector 通过标签筛选资源的机制
污点容忍 Taint/Toleration 控制Pod调度到特定节点的机制
亲和性 Affinity Pod或节点间的调度偏好规则
滚动更新 Rolling Update 逐步替换Pod实现零停机更新
水平扩缩容 HPA 根据指标自动调整Pod副本数
准入控制 Admission Control API请求的验证和变更机制

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 集群
    +关注

    关注

    0

    文章

    151

    浏览量

    17684
  • 命令
    +关注

    关注

    5

    文章

    758

    浏览量

    23914
  • kubernetes
    +关注

    关注

    0

    文章

    273

    浏览量

    9530

原文标题:kubectl命令实战宝典:Kubernetes集群管理与故障排查200+命令

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    在STM32实现命令行

    工作中的开发环境都是基于linux命令行交互,作为命令行的重度使用者,玩单片机也要使用命令行工具,百度了一些命令行
    发表于 12-09 11:32 3686次阅读

    Linux命令行工具

    Linux 新手往往对命令行心存畏惧。部分原因是因为需要记忆大量的命令,毕竟掌握命令是高效使用命令行的前提不幸的是,学习这些命令并无捷径,
    发表于 07-25 08:10

    caxa命令行中的应用

    caxa命令行中的应用 命令行对于大多用户来说往往只是输入数据的作用,但是其中的奥妙还有很多,下面就给大家
    发表于 10-18 18:18 2666次阅读

    CMD的命令行高级教程

    CMD的命令行高级教程
    发表于 10-24 08:31 30次下载
    CMD的<b class='flag-5'>命令行</b>高级教程

    监控jvm常用的5个命令行工具

    常用的几个命令行工具有jps、jstat、jinfo、jmap、jstack等。这几个工具可以安装openjdk-devel-debug包。
    的头像 发表于 02-06 14:47 6586次阅读
    监控jvm常用的5个<b class='flag-5'>命令行</b><b class='flag-5'>工具</b>

    Xilinx软件命令行工具:XSCT开发和调试

    了解如何使用XSCT,Xilinx软件命令行工具进行开发和调试。 该视频演示了XSCT如何充当Xilinx SDK的命令行控制台。
    的头像 发表于 11-21 06:02 1.6w次阅读

    Xilinx软件命令行工具进行开发和调试

    了解如何使用XSCT,Xilinx软件命令行工具进行开发和调试。 该视频演示了XSCT如何充当Xilinx SDK的命令行控制台。
    的头像 发表于 11-22 06:53 7825次阅读

    Git常见的误区和命令行工具等综述

    Git常见的误区和命令行工具等综述
    发表于 08-31 09:51 0次下载

    命令行工具Kubectl的别样用法

      kubectl 是 K8s 官方附带的命令行工具,可以方便的操作 K8s 集群。这篇文章主要介绍一些 kubectl 的别样用法,希望读者有一定基础的 K8s 使用经验。   有一
    的头像 发表于 10-12 09:31 2716次阅读

    Golang基于flag库实现一个命令行工具

    Golang 标准库中的 flag 库提供了解析命令行选项的能力,我们可以基于此来开发命令行工具
    的头像 发表于 10-28 09:26 2278次阅读

    新的开源命令行工具west

    电子发烧友网站提供《新的开源命令行工具west.zip》资料免费下载
    发表于 11-11 09:25 0次下载
    新的开源<b class='flag-5'>命令行</b><b class='flag-5'>工具</b>west

    介绍Go里面经常使用到的命令行工具

    优秀的工具配合熟练的使用,往往可以让开发效率大幅度提升,本小节介绍 Go 里面经常使用到的命令行工具
    的头像 发表于 05-22 16:58 2295次阅读
    介绍Go里面经常使用到的<b class='flag-5'>命令行</b><b class='flag-5'>工具</b>

    PetaLinux工具文档:命令行参考指南

    电子发烧友网站提供《PetaLinux工具文档:命令行参考指南.pdf》资料免费下载
    发表于 09-15 14:52 0次下载
    PetaLinux<b class='flag-5'>工具</b>文档:<b class='flag-5'>命令行</b>参考指南

    HarmonyOS开发:【基于命令行(安装库和工具集)】

    使用命令行进行设备开发时,可以通过以下步骤安装编译OpenHarmony需要的库和工具
    的头像 发表于 04-25 21:03 1345次阅读
    HarmonyOS开发:【基于<b class='flag-5'>命令行</b>(安装库和<b class='flag-5'>工具</b>集)】

    详解kubectl常用命令

    详解kubectl常用命令
    的头像 发表于 11-05 15:39 3598次阅读
    <b class='flag-5'>详解</b><b class='flag-5'>kubectl</b>常用<b class='flag-5'>命令</b>