Administrator
发布于 2025-10-23 / 2 阅读
0
0

Kubernetes kubectl 常用命令指南

1. 基础操作

查看资源信息

# 查看所有命名空间
kubectl get namespaces

# 查看特定命名空间下的所有资源
kubectl get all -n <namespace>

# 查看所有 Pod
kubectl get pods -A
kubectl get pods                              # 列出当前命名空间下的全部 Pods
kubectl get pods -o wide                      # 查看更详细的信息,比如Pod所在的节点
kubectl get pods --show-labels                # 获取pod并查看pod的标签

# 查看特定资源的详细信息
kubectl describe pod <pod-name> -n <namespace>
kubectl describe nodes <node-name>            # 显示 Node 的详细信息

# 查看其他资源
kubectl get services                          # 列出当前命名空间下的所有 services
kubectl get deployments -n <namespace>        # 查看 Deployment
kubectl get rc,svc                           # 查看 RC 和 service 列表
kubectl get pod,svc -o wide                  # 查看详细信息

# 获取资源的 YAML 定义
kubectl get pod <pod-name> -n <namespace> -o yaml
kubectl get pod <pod-name> -o yaml

创建和删除资源

# 从 YAML 文件创建资源
kubectl apply -f <file.yaml>
kubectl apply -f ./my1.yaml -f ./my2.yaml     # 使用多个文件创建
kubectl apply -f ./dir                        # 基于目录下的所有清单文件创建资源
kubectl apply -f https://git.io/vPieo         # 从 URL 中创建资源
kubectl apply -k <directory/>                 # 应用配置变更 (自动检测文件变化)

# 创建资源的其他方式
kubectl create -f pod.yaml                    # create 不能重复执行,apply 可以
kubectl create deployment nginx --image=nginx # 启动单实例 nginx

# 删除资源
kubectl delete -f <file.yaml>
kubectl delete pod <pod-name> -n <namespace>  # 按名称删除
kubectl delete pod,svc -l name=<label-name>   # 删除所有包含某个 label 的pod 和 service
kubectl delete pod --all                      # 删除默认命名空间下的所有 Pod
kubectl delete pods,services -l name=myLabel  # 删除包含 name=myLabel 标签的 pods 和服务
kubectl delete -n my-ns pod,svc --all         # 删除在 my-ns 名字空间中全部的 Pods 和服务

# 强制删除卡住的 Pod
kubectl delete pod <pod-name> --grace-period=0 --force -n <namespace>

2. Pod 操作

执行命令和日志查看

# 进入 Pod 执行命令
kubectl exec -it <pod-name> -n <namespace> -- /bin/bash
kubectl exec -it <pod-name> -n <namespace> -- /bin/sh
kubectl exec -it <pod-name> -c <container-name> -- bash  # 多容器场景
kubectl exec <pod-name> -- date                          # 执行单个命令
kubectl exec <pod-name> -- ping 10.24.51.9

# 查看 Pod 日志
kubectl logs <pod-name> -n <namespace>
kubectl logs -f <pod-name> -n <namespace>                # 查看实时日志
kubectl logs <pod-name> -c <container-name>              # 多容器场景
kubectl logs <pod-name> --previous                       # 获取上个容器实例的日志
kubectl logs -l app=frontend                             # 返回所有标记为 app=frontend 的 pod 的合并日志
kubectl logs -f -l name=myLabel --all-containers         # 流式输出含标签的 Pod 的所有日志

# 其他 Pod 操作
kubectl attach my-pod -i                                 # 挂接到一个运行的容器中
kubectl port-forward <pod-name> <local-port>:<pod-port> -n <namespace>  # 端口转发

# 重启 Pod
kubectl get pod <pod-name> -n <namespace> -o yaml | kubectl replace --force -f -

临时 Pod 和调试

# 创建临时 Pod
kubectl run -i --tty busybox --image=busybox -- sh       # 以交互式 Shell 运行 Pod
kubectl run nginx --image=nginx -n mynamespace           # 在指定名字空间中运行 nginx Pod
kubectl run nginx --image=nginx --dry-run=client -o yaml > pod.yaml  # 生成 YAML 文件
kubectl run -it --rm --restart=Never busybox --image=busybox -- <command>  # 执行临时命令
kubectl run curl-test --image=curlimages/curl -it --rm -- sh  # 创建临时 Pod 测试服务

3. Deployment 管理

# 更新 Deployment (触发滚动更新)
kubectl set image deployment/<deployment-name> <container-name>=<new-image>:<tag> -n <namespace>

# 回滚操作
kubectl rollout undo deployment/<deployment-name> -n <namespace>                    # 回滚到上一个版本
kubectl rollout undo deployment/<deployment-name> --to-revision=<revision> -n <namespace>  # 回滚到指定版本
kubectl rollout history deployment/<deployment-name>                                # 检查历史记录
kubectl rollout status deployment/<deployment-name> -n <namespace>                 # 查看滚动更新状态
kubectl rollout restart deployment/<deployment-name>                               # 重启 deployment

# 修改 Deployment 配置
kubectl patch deployment xxx --patch '{"spec":{"template":{"spec":{"imagePullSecrets":[{"name":"registry-key"}]}}}}'
kubectl patch deployment admin-web --patch '{"spec": {"template": {"spec": {"containers": [{"name": "admin-web", "imagePullPolicy": "Always"}]}}}}'

# 环境变量和副本数设置
kubectl set env deployment/<deployment-name> KEY=VALUE
kubectl scale --replicas=<number> deployment/<deployment-name>

# 自动伸缩(自动创建HPA)
kubectl autoscale deployment <deployment-name> --min=2 --max=10 --cpu-percent=80

4. Service 管理

# 创建 Service
kubectl expose deployment/<deployment-name> --type=NodePort --port=80 --target-port=8080 -n <namespace>
kubectl expose rc nginx --port=80 --target-port=8000      # 为多副本的 nginx 创建服务

# 查看和删除 Service
kubectl get services -n <namespace>
kubectl delete service <service-name> -n <namespace>

5. 配置和上下文管理

# 上下文操作
kubectl config current-context                           # 查看当前上下文
kubectl config use-context <context-name>                # 切换上下文
kubectl config get-contexts                              # 查看所有上下文

# 集群配置
kubectl config set-credentials <user> --username=<user> --password=<password>
kubectl config set-cluster <cluster> --server=<server-url> --certificate-authority=<ca-file>
kubectl config set-context <context> --cluster=<cluster> --user=<user>

# 集群信息
kubectl cluster-info                                     # 显示主控节点和服务的地址
kubectl cluster-info dump                                # 将当前集群状态转储到标准输出
kubectl cluster-info dump --output-directory=/path/to/cluster-state

6. 高级查询和格式化输出

JSONPath 和模板查询

# 使用 JSONPath 查询特定字段
kubectl get pods -n <namespace> -o jsonpath='{.items[*].metadata.name}'
kubectl get pods -n <namespace> -o jsonpath='{..image}' | tr ' ' '\n'  # 查看 Pod 使用的镜像
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'

# 使用 Go 模板格式化输出
kubectl get pods -n <namespace> -o go-template='{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}'

# 选择器查询
kubectl get pods --selector=app=cassandra -o jsonpath='{.items[*].metadata.labels.version}'
kubectl get node --selector='!node-role.kubernetes.io/master'        # 获取所有工作节点
kubectl get pods --field-selector=status.phase=Running               # 获取正在运行的 Pods

排序和过滤

# 排序输出
kubectl get services --sort-by=.metadata.name                        # 按名称排序
kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'  # 按重启次数排序
kubectl get pods -n <namespace> --sort-by=.metadata.creationTimestamp # 按创建时间排序
kubectl get pv --sort-by=.spec.capacity.storage                      # 按容量排序
kubectl get events --sort-by=.metadata.creationTimestamp              # 事件按时间戳排序

格式化输出选项

# 输出格式
-o=custom-columns=<spec>                    # 使用逗号分隔的自定义列来打印表格
-o=custom-columns-file=<filename>           # 使用文件中的自定义列模板打印表格
-o=json                                     # 输出 JSON 格式的 API 对象
-o=jsonpath=<template>                      # 使用 JSONPath 表达式
-o=yaml                                     # 输出 YAML 格式
-o=wide                                     # 输出额外信息

7. 资源更新和修补

标签和注解管理

# 标签操作
kubectl label pods <pod-name> <label-key>=<label-value> -n <namespace>  # 添加标签
kubectl label pods <pod-name> <label-key>- -n <namespace>               # 删除标签

# 注解操作
kubectl annotate pods <pod-name> icon-url=http://goo.gl/XXBTWq          # 添加注解

Patch 操作

# 部分更新资源
kubectl patch node <node-name> -p '{"spec":{"unschedulable":true}}'
kubectl patch pod <pod-name> -p '{"spec":{"containers":[{"name":"container-name","image":"new-image"}]}}'

# JSON patch 操作
kubectl patch pod <pod-name> --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new-image"}]'
kubectl patch deployment <deployment-name> --type json -p='[{"op": "remove", "path": "/spec/template/spec/containers/0/livenessProbe"}]'
kubectl patch sa default --type='json' -p='[{"op": "add", "path": "/secrets/1", "value": {"name": "whatever"}}]'

# 替换操作
kubectl replace --force -f ./pod.json                    # 强制替换,删除后重建资源
cat pod.json | kubectl replace -f -                      # 通过标准输入替换

在线编辑

# 在线编辑资源
kubectl edit deployment/<deployment-name> -n <namespace>

8. 节点操作

# 节点调度管理
kubectl cordon <node-name>                              # 标记节点为不可调度
kubectl drain <node-name>                               # 清空节点,为维护做准备
kubectl uncordon <node-name>                            # 标记节点为可调度

# 节点信息
kubectl get nodes --show-labels                         # 查看节点标签
kubectl top node <node-name>                            # 显示节点的度量值

# 污点管理
kubectl taint nodes <node-name> dedicated=special-user:NoSchedule  # 添加污点

9. 权限管理

# RBAC 权限检查
kubectl auth can-i <verb> <resource> -n <namespace>     # 查看特定权限
kubectl auth can-i '*' '*' -n <namespace>               # 查看当前用户的所有权限

10. 存储和密钥管理

# 创建 Secret
kubectl create secret docker-registry registry-key --docker-server=registry.cn-shenzhen.aliyuncs.com --docker-username='username' --docker-password='password'

# Secret 示例 YAML
# apiVersion: v1
# kind: Secret
# metadata:
#   name: mysecret
# type: Opaque
# data:
#   password: $(echo -n "s33msi4" | base64 -w0)
#   username: $(echo -n "jane" | base64 -w0)

11. 监控和资源使用

# 资源使用情况 (需要 Metrics Server)
kubectl top pods -n <namespace>
kubectl top nodes
kubectl top pod <pod-name> --containers                 # 显示 Pod 和容器的监控数据

12. 实用工具命令

# 文档和帮助
kubectl explain pods,svc                                # 获取资源清单的文档说明

# 比较和差异
kubectl diff -f ./my-manifest.yaml                      # 比较当前状态和清单文件的差异

# 复杂查询示例
# 列出属于某个特定 RC 的 Pods 的名称 (需要 jq 工具)
sel=${$(kubectl get rc my-rc --output=json | jq -j '.spec.selector | to_entries | .[] | "\(.key)=\(.value),"')%?}
echo $(kubectl get pods --selector=$sel --output=jsonpath={.items..metadata.name})

# 列出被 Pod 使用的所有 Secret
kubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq

# 列举所有 Pods 中初始化容器的容器 ID
kubectl get pods --all-namespaces -o jsonpath='{range .items[*].status.initContainerStatuses[*]}{.containerID}{"\n"}{end}' | cut -d/ -f3

# 检查哪些节点处于就绪状态
JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}' && kubectl get nodes -o jsonpath="$JSONPATH" | grep "Ready=True"

# 删除匹配模式的 Pods
kubectl get pods -n mynamespace --no-headers=true | awk '/pattern1|pattern2/{print $1}' | xargs kubectl delete -n mynamespace pod

这些命令涵盖了 kubectl 的大部分日常使用场景。根据你的具体需求,可以进一步学习和使用更高级的功能。建议将常用命令制作成别名或脚本,提高工作效率。


评论