kubernetes 集群命令行工具kubectl

简介

什么是 kubectl?

  • kubectl 是 Kubernetes 官方提供的命令行工具,用于与 Kubernetes 集群交互。它支持对集群、节点、Pod、服务等资源的创建、查询、更新和删除(CRUD)操作,是管理 Kubernetes 的核心工具。
  • 支持声明式和命令式两种资源管理方式:
    • 声明式:通过定义资源清单(YAML/JSON)描述期望状态,由 Kubernetes 自动调整。
    • 命令式:直接通过命令操作资源(如增删改查)。

kubectl 的核心功能

  • 查看资源状态(get, describe)。
  • 创建、更新、删除资源(create, apply, delete)。
  • 管理部署与滚动更新(rollout)。
  • 调试与日志查看(logs, exec)。
  • 配置多集群访问与上下文切换。

基础命令

命令结构

1
kubectl [command] [TYPE] [NAME] [flags]
  • command:指定要对资源执行的操作,例如get, describe, create, delete, apply 等。
  • TYPE:资源类型(如 pod, deployment, service)。
  • NAME:资源名称(可选,留空则列出所有资源)。
  • flags:指定可选的参数。例如,可用-s或者–server参数指定Kubernetes API server 的地址和端口。

集群管理

1
2
3
4
5
6
7
8
# 查看集群信息
kubectl cluster-info

# 检查节点状态
kubectl get nodes

# 查看组件健康状态
kubectl get componentstatuses

查看资源

1
2
3
4
5
6
7
8
# 查看所有命名空间中的 Pod
kubectl get pods --all-namespaces

# 查看特定命名空间中的资源(如 default)
kubectl get pods -n default

# 查看详细信息(如 Pod 的日志)
kubectl describe pod <pod-name>

创建资源

1
2
3
4
5
# 通过文件创建资源(YAML/JSON)
kubectl create -f ./my-deployment.yaml

# 直接创建 Deployment(示例)
kubectl create deployment my-nginx --image=nginx

删除资源

1
2
kubectl delete pod <pod-name> -n <namespace>
kubectl delete -f ./my-deployment.yaml # 通过文件删除

查看日志

1
2
3
4
5
# 查看 Pod 日志(指定容器)
kubectl logs <pod-name> -c <container-name>

# 实时跟踪日志
kubectl logs -f <pod-name>

调试与日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看 Pod 日志
kubectl logs <pod-name> -c <container-name> --tail=100

# 实时日志流
kubectl logs -f <pod-name>

# 进入容器执行命令
kubectl exec -it <pod-name> -- /bin/sh

# 端口转发
kubectl port-forward <pod-name> 8080:80

# 调试临时容器(需启用 Ephemeral Containers)
kubectl debug -it <pod-name> --image=busybox --target=<container-name>

资源管理

资源作用存储类型使用场景
Pod运行容器的最小单元部署单个或多个容器
Deployment管理 Pod 副本,实现自动扩缩容和更新部署无状态应用
Service提供稳定网络访问,负载均衡和发现内部服务通信或对外暴露服务
Secret存储敏感信息(加密)敏感数据存储密码、密钥、证书
ConfigMap存储非敏感配置信息非敏感数据管理应用配置文件、环境变量

资源类型与操作

Pod

1
2
3
4
5
# 查看 Pod 列表
kubectl get pods

# 查看 Pod 详细信息
kubectl describe pod <pod-name>

Deployment

1
2
3
4
5
6
7
8
9
10
11
# 创建 Deployment
kubectl create deployment my-app --image=my-image:v1

# 更新镜像版本
kubectl set image deployment/my-app my-app=my-image:v2

# 滚动更新状态
kubectl rollout status deployment/my-app

# 回滚到上一个版本
kubectl rollout undo deployment/my-app

Service

1
2
3
4
5
# 暴露 Deployment 为 Service(NodePort 类型)
kubectl expose deployment my-app --port=80 --type=NodePort

# 查看 Service 信息
kubectl get services

Secret

1
2
3
4
5
6
7
8
9
10
11
12
# 创建 Secret(通过文件)
echo -n 'my-password' | base64 > password.txt
kubectl create secret generic db-secret --from-file=password.txt

# 通过 YAML 定义 Secret
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
username: dXNlcm5hbWU= # base64 #编码后的值

ConfigMap

1
2
3
4
5
# 从文件创建 ConfigMap
kubectl create configmap app-config --from-file=config.properties

# 在 Pod 中挂载 ConfigMap
kubectl apply -f configmap-pod.yaml

高级功能

自动补全

1
2
3
4
5
# 启用 Bash 自动补全
source <(kubectl completion bash)

# 启用 Zsh 自动补全
source <(kubectl completion zsh)

多文件操作

1
2
# 通过目录批量创建资源
kubectl apply -f ./k8s-manifests/

滚动更新与回滚

1
2
3
4
5
# 滚动更新 Deployment
kubectl set image deployment/my-app my-app=my-image:v2

# 强制回滚到特定版本
kubectl rollout undo deployment/my-app --to-revision=2

环境变量与 Secret

1
2
3
4
5
6
7
# 在 Pod 中引用 Secret 作为环境变量(示例 YAML)
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password

故障排除

常见问题诊断

检查节点状态

1
2
kubectl get nodes   # 查看节点健康状态
kubectl describe node <node-name>

检查 Pod 异常

1
2
kubectl get pods --all-namespaces  # 查看所有 Pod 状态
kubectl describe pod <pod-name> # 查看事件日志

查看集群事件

1
kubectl get events --sort-by=.metadata.creationTimestamp

调试网络问题

1
2
3
4
5
# 检查 Service 的 Endpoints
kubectl get endpoints <service-name>

# 检查 Ingress 配置
kubectl get ingress

最佳实践

  1. 声明式配置:优先使用 kubectl apply -f 而非 createreplace
  2. 命名空间隔离:避免使用 default 命名空间,按业务划分。
  3. 资源限制:为 Pod 设置 requestslimits
  4. 标签管理:使用有意义的标签(如 app: frontend)。
  5. 生产安全:禁用 default Service Account 的自动挂载。

附录:常用命令速查表

基础命令描述命令示例
create通过文件名或标准输入创建资源kubectl create -f <file-name>.yaml
expose将一个资源公开为一个新的Servicekubectl expose deployment <deployment-name> --port=<port> --type=NodePort
run在集群中运行一个特定的镜像kubectl run <pod-name> --image=<image-name>
set在对象上设置特定的功能kubectl set image deployment/<deployment-name> <container-name>=<new-image>
get显示一个或多个资源kubectl get pods
get导出资源配置kubectl get deploy/<name> -o yaml > deploy.yaml
get资源排序kubectl get pods --sort-by=.metadata.creationTimestamp
explain文档参考资料kubectl explain pod
edit使用默认的编辑器编辑一个资源kubectl edit deployment/<deployment-name>
delete通过文件名、标准输入、资源名称或标签选择器来删除资源kubectl delete pod <pod-name>
部署命令描述命令示例
rollout管理资源的发布kubectl rollout status deployment/<deployment-name>
rolling-update对给定的复制控制器滚动更新kubectl rolling-update <rc-name> --image=<new-image>
scale扩容或缩容Pod数量,Deployment、ReplicaSet、RC或Jobkubectl scale deployment <deployment-name> --replicas=<number>
autoscale创建一个自动选择扩容或缩容并设置Pod数量kubectl autoscale deployment <deployment-name> --min=<min> --max=<max> --cpu-percent=<percent>
集群管理命令描述命令示例
certificate修改证书资源kubectl certificate approve <certificate-name>
cluster-info显示集群信息kubectl cluster-info
top显示资源(CPU/Memory/Storage)使用。需要Heapster运行kubectl top nodes
cordon标记节点不可调度kubectl cordon <node-name>
uncordon标记节点可调度kubectl uncordon <node-name>
drain驱逐节点上的应用,准备下线维护kubectl drain <node-name> --ignore-daemonsets
taint修改节点taint标志kubectl taint nodes <node-name> key=value:NoSchedule
故障诊断和调试命令描述命令示例
describe显示特定资源或资源组的详细信息kubectl describe pod <pod-name>
logs在一个Pod中打印一个容器日志。如果Pod只有一个容器,容器名称是可选的kubectl logs <pod-name>
attach附加到一个运行的容器kubectl attach <pod-name> -c <container-name>
exec执行命令到容器kubectl exec -it <pod-name> -- /bin/sh
port-forward转发一个或多个本地端口到一个podkubectl port-forward <pod-name> <local-port>:<pod-port>
proxy运行一个proxy到Kubernetes API serverkubectl proxy
cp拷贝文件或目录到容器中kubectl cp <local-file-path> <namespace>/<pod-name>:<container-path>
auth检查授权kubectl auth can-i <verb> <resource>
高级命令描述命令示例
apply通过文件名或标准输入对资源应用配置kubectl apply -f <file-name>.yaml
patch使用补丁修改、更新资源的字段kubectl patch deployment/<deployment-name> -p '{"spec": {"replicas": <new-replicas>}}'
replace通过文件名或标准输入替换一个资源kubectl replace -f <file-name>.yaml
convert不同的API版本之间转换配置文件kubectl convert -f <file-name>.yaml --output-version=<api-version>
设置命令描述命令示例
label更新资源上的标签kubectl label pod <pod-name> <label-key>=<label-value>
annotate更新资源上的注释kubectl annotate pod <pod-name> <annotation-key>=<annotation-value>
completion用于实现kubectl工具自动补全source <(kubectl completion bash)
其他命令描述命令示例
api-versions打印受支持的API版本kubectl api-versions
config修改kubeconfig文件(用于访问API,比如配置认证信息)kubectl config view
help所有命令帮助kubectl help
plugin运行一个命令行插件kubectl plugin list
version打印客户端和服务端版本信息kubectl version

备注:更多命令可通过 kubectl --help 或官方文档 kubernetes.io/docs/reference/kubectl/ 查询。