简介
什么是 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
| kubectl get pods --all-namespaces
kubectl get pods -n default
kubectl describe pod <pod-name>
|
创建资源
1 2 3 4 5
| kubectl create -f ./my-deployment.yaml
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
| 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
| 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
kubectl debug -it <pod-name> --image=busybox --target=<container-name>
|
资源管理
| 资源 | 作用 | 存储类型 | 使用场景 |
|---|
| Pod | 运行容器的最小单元 | 无 | 部署单个或多个容器 |
| Deployment | 管理 Pod 副本,实现自动扩缩容和更新 | 无 | 部署无状态应用 |
| Service | 提供稳定网络访问,负载均衡和发现 | 无 | 内部服务通信或对外暴露服务 |
| Secret | 存储敏感信息(加密) | 敏感数据 | 存储密码、密钥、证书 |
| ConfigMap | 存储非敏感配置信息 | 非敏感数据 | 管理应用配置文件、环境变量 |
资源类型与操作
Pod
1 2 3 4 5
| kubectl get pods
kubectl describe pod <pod-name>
|
Deployment
1 2 3 4 5 6 7 8 9 10 11
| 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
| kubectl expose deployment my-app --port=80 --type=NodePort
kubectl get services
|
Secret
1 2 3 4 5 6 7 8 9 10 11 12
| echo -n 'my-password' | base64 > password.txt kubectl create secret generic db-secret --from-file=password.txt
apiVersion: v1 kind: Secret metadata: name: my-secret type: Opaque data: username: dXNlcm5hbWU=
|
ConfigMap
1 2 3 4 5
| kubectl create configmap app-config --from-file=config.properties
kubectl apply -f configmap-pod.yaml
|
高级功能
自动补全
1 2 3 4 5
| source <(kubectl completion bash)
source <(kubectl completion zsh)
|
多文件操作
1 2
| kubectl apply -f ./k8s-manifests/
|
滚动更新与回滚
1 2 3 4 5
| 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
| 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 kubectl describe pod <pod-name>
|
查看集群事件
1
| kubectl get events --sort-by=.metadata.creationTimestamp
|
调试网络问题
1 2 3 4 5
| kubectl get endpoints <service-name>
kubectl get ingress
|
最佳实践
- 声明式配置:优先使用
kubectl apply -f 而非 create 或 replace。 - 命名空间隔离:避免使用
default 命名空间,按业务划分。 - 资源限制:为 Pod 设置
requests 和 limits。 - 标签管理:使用有意义的标签(如
app: frontend)。 - 生产安全:禁用
default Service Account 的自动挂载。
附录:常用命令速查表
| 基础命令 | 描述 | 命令示例 |
|---|
| create | 通过文件名或标准输入创建资源 | kubectl create -f <file-name>.yaml |
| expose | 将一个资源公开为一个新的Service | kubectl 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或Job | kubectl 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 | 转发一个或多个本地端口到一个pod | kubectl port-forward <pod-name> <local-port>:<pod-port> |
| proxy | 运行一个proxy到Kubernetes API server | kubectl 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/ 查询。