kubectl 基础命令
按实际操作顺序,先确认环境,再查询资源、创建与更新、观察发布。遇到问题从日志与容器调试和基础排障顺序进入;清理前查看删除边界。
本文以一套占位符命令覆盖日常流程:将 <namespace>、<name> 等替换为已确认目标。Kubernetes 架构见 知识手册。
一、命令结构与环境确认
kubectl [command] [TYPE] [NAME] [flags]示例使用 Bash/Zsh;先确认客户端、集群与命名空间,再执行写操作。
kubectl version --client
kubectl version
kubectl cluster-info
kubectl config current-context
kubectl config view --minifykubectl version 需要连接 API Server,并显示客户端与服务端版本。版本偏差应遵循所用 Kubernetes 版本的官方 kubectl 兼容策略。
开启命令补全:
# Bash
source <(kubectl completion bash)
# Zsh
source <(kubectl completion zsh)临时缩写能减少输入,但脚本和文档中建议保留完整命令:
alias k=kubectl二、上下文、集群与命名空间
2.1 查看和切换上下文
kubectl config get-contexts
kubectl config current-context
kubectl config use-context <context>
kubectl config view --minify将当前上下文的默认命名空间设为指定值:
kubectl config set-context --current --namespace=<namespace>set-context 会修改 kubeconfig。共享终端或频繁跨环境时,仍建议每条命令显式写 -n <namespace>。
2.2 使用多个 kubeconfig
kubectl --kubeconfig <path> config get-contexts
KUBECONFIG=<path-a>:<path-b> kubectl config view --mergeKubeconfig 可能包含客户端证书或访问凭据,应设置最小文件权限且禁止提交到 Git:
chmod 600 <kubeconfig-path>三、发现 API 与查询字段
kubectl api-resources
kubectl api-resources --namespaced=true
kubectl api-resources --api-group=apps
kubectl api-versions
kubectl explain deployment
kubectl explain deployment.spec
kubectl explain deployment.spec.template.spec.containers --recursivekubectl explain 读取当前集群的 OpenAPI 信息,是确认字段含义和结构的首选入口。
常用资源简称包括 po(Pod)、deploy(Deployment)、sts(StatefulSet)、ds(DaemonSet)、svc(Service)、cm(ConfigMap)、secret、ing(Ingress)、pvc 和 ns。可用简称以 kubectl api-resources 输出为准。
四、查询资源
kubectl get namespaces
kubectl -n <namespace> get pods
kubectl -n <namespace> get pods -o wide
kubectl -n <namespace> get pods --show-labels
kubectl get pods -A
kubectl -n <namespace> get deployment <name>
kubectl -n <namespace> get deployment <name> -o yaml
kubectl -n <namespace> get pod <pod> -o json
kubectl -n <namespace> describe pod <pod>持续观察:
kubectl -n <namespace> get pods --watch
kubectl -n <namespace> get deployment <name> --watchdescribe 是客户端组织的可读摘要;自动化应使用 get -o json,不要解析 describe 的文本。
kubectl get all 只查询一组常见资源,并不代表命名空间里的所有资源;排查时不要依赖它做完整清单。
按字段找出非 Running Pod:
kubectl get pods -A --field-selector='status.phase!=Running'4.1 标签选择器
kubectl -n <namespace> get pods -l app=api
kubectl -n <namespace> get pods -l 'environment in (staging,production)'
kubectl -n <namespace> get pods -l app=api,tier=backend4.2 查看事件
kubectl -n <namespace> get events --sort-by=.metadata.creationTimestamp
kubectl -n <namespace> get events --field-selector type=Warning事件有保留时间且可能被聚合。生产排障应同时查看控制面、节点和应用的集中日志与监控。
4.3 输出与字段提取
kubectl -n <namespace> get pods -o name
kubectl -n <namespace> get pods -o custom-columns='NAME:.metadata.name,NODE:.spec.nodeName,PHASE:.status.phase'
kubectl -n <namespace> get pod <pod> -o jsonpath='{.status.podIP}{"\n"}'复杂筛选和脚本化输出见 kubectl 进阶。
五、声明式创建和更新
5.1 推荐工作流
# 客户端预检
kubectl apply --dry-run=client -f <manifest.yaml>
# 服务端准入、默认值和策略检查,不持久化
kubectl apply --dry-run=server -f <manifest.yaml>
# 查看与集群现状的差异;有差异时退出码通常为 1
kubectl diff -f <manifest.yaml>
# 应用变更
kubectl apply -f <manifest.yaml>目录和远端 URL:
kubectl apply -f <manifest-directory>/
kubectl apply -f https://<trusted-host>/<manifest.yaml>执行远端清单前先下载、审查并固定可信版本,避免 URL 内容变化或供应链风险。
临时检查或修改单个资源可使用编辑器:
kubectl -n <namespace> edit deployment/<name>保存后变更会直接提交到集群;后续仍应把有效修改同步到清单或 Git,避免下次 apply 覆盖。
5.2 快速生成 YAML
kubectl create deployment web \
--image=nginx:<pinned-version> \
--replicas=2 \
--dry-run=client -o yaml > deployment.yaml
kubectl create service clusterip web \
--tcp=80:80 \
--dry-run=client -o yaml > service.yaml生成后补充资源 requests/limits、健康检查、安全上下文、标签和镜像拉取策略,再进入评审和发布流程。不要在生产使用浮动的 latest 镜像标签。
六、Deployment 发布与伸缩
6.1 查看发布与更新镜像
kubectl -n <namespace> get deployment <name>
kubectl -n <namespace> rollout status deployment/<name> --timeout=5m
kubectl -n <namespace> rollout history deployment/<name>更新镜像:
kubectl -n <namespace> set image deployment/<name> \
<container>=<registry>/<image>:<version>
kubectl -n <namespace> rollout status deployment/<name> --timeout=5m滚动重启会创建新的 Pod,应先确认容量和 PodDisruptionBudget:
kubectl -n <namespace> rollout restart deployment/<name>
kubectl -n <namespace> rollout status deployment/<name> --timeout=5m6.2 调整环境变量与资源
kubectl -n <namespace> set env deployment/<name> APP_MODE=production
kubectl -n <namespace> set env deployment/<name> APP_MODE-
kubectl -n <namespace> set resources deployment/<name> -c <container> \
--requests=cpu=100m,memory=128Mi --limits=cpu=500m,memory=256Mi
kubectl -n <namespace> rollout status deployment/<name> --timeout=5mAPP_MODE- 删除该环境变量;数值仅为命令示例,应按实际负载设定。修改 Pod 模板通常会触发发布,应同步更新声明式清单。
6.3 手工伸缩与前置条件
kubectl -n <namespace> scale deployment/<name> --replicas=<count>需要避免覆盖他人的副本数变更时,可要求“当前副本数仍为 2”才改为 1;前置条件不符则拒绝:
kubectl -n <namespace> scale deployment/<name> --current-replicas=2 --replicas=1若 HPA 或 GitOps 控制相同字段,手工副本数可能很快被覆盖。先确认所有控制器和期望状态来源。
6.4 回滚到上一版本或指定修订
kubectl -n <namespace> rollout undo deployment/<name>
kubectl -n <namespace> rollout undo deployment/<name> --to-revision=<revision>
kubectl -n <namespace> rollout status deployment/<name> --timeout=5m回滚 Deployment 不会自动回滚外部数据库或不兼容配置,发布前必须单独设计数据迁移策略。
七、日志、执行命令与本地转发
7.1 Pod 日志
kubectl -n <namespace> logs <pod>
kubectl -n <namespace> logs <pod> -c <container>
kubectl -n <namespace> logs <pod> --all-containers=true --tail=200
kubectl -n <namespace> logs -f <pod> -c <container> --since=10m
kubectl -n <namespace> logs <pod> -c <container> --previous--previous 用于容器重启后的上一实例日志;如果日志已超过节点保留范围,应查集中日志系统。
按标签汇总多个 Pod 时限制并发和输出范围:
kubectl -n <namespace> logs -l app=api \
--all-containers=true --prefix --tail=100 --max-log-requests=107.2 在容器中执行命令
kubectl -n <namespace> exec <pod> -c <container> -- <command>
kubectl -n <namespace> exec -it <pod> -c <container> -- /bin/sh-- 分隔 kubectl 参数与容器内命令。生产容器可能没有 Shell 或诊断工具,此时使用 临时调试容器,不要把工具永久塞进业务镜像。
7.3 复制文件
kubectl -n <namespace> cp <pod>:<remote-path> <local-path> -c <container>
kubectl -n <namespace> cp <local-path> <pod>:<remote-path> -c <container>kubectl cp 通常依赖容器内存在 tar。复制日志或数据前确认内容不含秘密和个人数据。
7.4 端口转发
kubectl -n <namespace> port-forward pod/<pod> 8080:<container-port>
kubectl -n <namespace> port-forward service/<service> 8080:<service-port> --address=127.0.0.1默认只绑定本机环回地址。不要随意使用 --address 0.0.0.0,否则可能把集群内部服务暴露到所在网络。
八、Service 与访问路径
kubectl -n <namespace> get service
kubectl -n <namespace> describe service <service>
kubectl -n <namespace> get endpointslice -l kubernetes.io/service-name=<service>从已有 Deployment 创建 ClusterIP Service:
kubectl -n <namespace> expose deployment <name> \
--name=<service> --type=ClusterIP --port=<service-port> --target-port=<container-port>命令式创建适合学习和临时验证;长期资源应导出为清单并纳入版本控制。Service 没有后端时,依次比较 Service selector 与 Pod labels,并确认 Pod Ready。
九、ConfigMap 与 Secret
9.1 ConfigMap
kubectl -n <namespace> create configmap <name> \
--from-literal=LOG_LEVEL=info \
--dry-run=client -o yaml
kubectl -n <namespace> create configmap <name> \
--from-file=<config-file> \
--dry-run=client -o yaml | kubectl apply -f -9.2 Secret
chmod 600 <secret-file>
kubectl -n <namespace> create secret generic <name> \
--from-file=password=<secret-file> \
--dry-run=client -o yaml | kubectl apply -f -Secret 不是天然加密
Secret 的 data 只是 Base64 编码。不要把生成的 YAML、解码结果或命令行明文提交到 Git、终端历史和工单。集群应启用静态加密、最小 RBAC 和审计,优先通过组织批准的秘密管理系统交付凭据。
检查 Secret 元数据而不打印值:
kubectl -n <namespace> get secret <name>
kubectl -n <namespace> describe secret <name>ConfigMap 或 Secret 更新后,已通过环境变量注入的容器不会自动刷新;卷投影也有传播延迟,应用是否热加载取决于自身实现。
十、Job 与 CronJob
kubectl -n <namespace> create job <job-name> \
--image=busybox:<pinned-version> \
--dry-run=client -o yaml -- date
kubectl -n <namespace> create cronjob <cronjob-name> \
--image=busybox:<pinned-version> \
--schedule='*/5 * * * *' \
--dry-run=client -o yaml -- date查询执行情况:
kubectl -n <namespace> get jobs,cronjobs
kubectl -n <namespace> describe job <job-name>
kubectl -n <namespace> logs job/<job-name>从 CronJob 手工创建一次 Job:
kubectl -n <namespace> create job \
--from=cronjob/<cronjob-name> <manual-job-name>CronJob 应设置并发策略、历史保留、截止时间和时区策略;任务必须考虑重试导致的重复执行。
十一、标签与注解
kubectl -n <namespace> label deployment/<name> environment=staging
kubectl -n <namespace> annotate deployment/<name> owner='team-a'
# 覆盖已有键必须显式写 --overwrite
kubectl -n <namespace> label deployment/<name> environment=production --overwrite
# 键后加减号表示删除该标签或注解
kubectl -n <namespace> label deployment/<name> environment-
kubectl -n <namespace> annotate deployment/<name> owner-修改标签可能立即改变 Service、NetworkPolicy、监控或控制器的选择结果。变更前搜索所有依赖该标签的 selector。
十二、资源使用与自动伸缩
kubectl top nodes
kubectl -n <namespace> top pods
kubectl -n <namespace> top pod <pod> --containers这些命令需要集群安装并正常运行 Metrics API。创建基于 CPU 的 HPA:
kubectl -n <namespace> autoscale deployment/<name> \
--min=<min-replicas> --max=<max-replicas> --cpu-percent=<target-percent>
kubectl -n <namespace> get hpa
kubectl -n <namespace> describe hpa <name>HPA 的 CPU 利用率依赖容器 CPU request;生产 HPA 建议用清单管理并结合业务指标、扩缩容行为和容量测试。
十三、等待条件
kubectl -n <namespace> wait \
--for=condition=Available deployment/<name> --timeout=5m
kubectl -n <namespace> wait \
--for=condition=Ready pod -l app=<app> --timeout=5m
kubectl -n <namespace> wait \
--for=condition=complete job/<job-name> --timeout=10m脚本应先检查选择器是否匹配了目标,避免把空目标误判为等待成功。wait 超时只是说明条件未在期限内满足。接下来用 describe、事件和日志查原因,不应立即循环重试变更。
十四、删除资源
# 先确认精确目标
kubectl -n <namespace> get <resource> <name> -o wide
kubectl -n <namespace> delete <resource> <name> \
--wait=true --timeout=2m
# 删除清单声明的资源
kubectl delete -f <manifest.yaml>删除和强制删除
删除 Namespace 会级联删除其中大量资源。--grace-period=0 --force 只会强制移除 API 对象,不保证节点上的进程已停止,可能导致重复实例和数据损坏。仅在理解控制器、存储和终结器状态且完成审批后使用。
十五、基础排障顺序
kubectl config current-context
kubectl config view --minify
kubectl -n <namespace> get pod <pod> -o wide
kubectl -n <namespace> describe pod <pod>
kubectl -n <namespace> get events --sort-by=.metadata.creationTimestamp
kubectl -n <namespace> logs <pod> -c <container> --tail=200
kubectl -n <namespace> logs <pod> -c <container> --previous --tail=200进一步的 Pending、CrashLoopBackOff、ImagePull、Service 和节点排障见 Kubernetes 进阶命令。
继续阅读
- 命令
- 故障排查
- 故障排查