1. 查看资源 - 看东西
Pod 相关操作
# 查Pod,带IP和节点信息,这个最常用
kubectl get pod -o wide -n <namespace>
# 看所有命名空间的Pod
kubectl get pod -A
# 筛选某个节点上的Pod
kubectl get pod -A --field-selector spec.nodeName=node-01
# 查看Pod详情,排查问题必备
kubectl describe pod <pod-name> -n <namespace>
# 看Pod日志,加-f实时刷新
kubectl logs <pod-name> -n <namespace> -f
# 多容器Pod看指定容器日志
kubectl logs <pod-name> -c <container-name> -n <namespace>
# 看之前挂掉的容器日志
kubectl logs <pod-name> --previous
2. 进容器 - 调试
# 进Pod执行命令,最常用sh或bash
kubectl exec -it <pod-name> -n <namespace> -- /bin/sh
# 多容器指定进哪个
kubectl exec -it <pod-name> -c <container-name> -n <namespace> -- /bin/bash
# 不进容器直接执行命令
kubectl exec <pod-name> -n <namespace> -- ls -la /app
3. 删除重建 - 常规操作
# 删Pod,ReplicaSet会自动重建
kubectl delete pod <pod-name> -n <namespace>
# 强制删除卡住的Pod
kubectl delete pod <pod-name> -n <namespace> --force --grace-period=0
# 删除deployment(慎用)
kubectl delete deployment <deployment-name> -n <namespace>
# 批量删除某个标签的Pod
kubectl delete pod -l app=<app-name> -n <namespace>
4. 扩缩容 - 调资源
# 手动扩容到3个副本
kubectl scale deployment <deployment-name> --replicas=3 -n <namespace>
# 缩到0,相当于停服务
kubectl scale deployment <deployment-name> --replicas=0 -n <namespace>
5. 滚动更新 - 发版
# 更新镜像版本
kubectl set image deployment/<deployment-name> <container-name>=<new-image> -n <namespace>
# 例子
kubectl set image deployment/<deployment-name> nginx=nginx:1.21 -n prod
# 查看发布状态
kubectl rollout status deployment/<deployment-name> -n <namespace>
# 看发布历史
kubectl rollout history deployment/<deployment-name> -n <namespace>
# 回滚到上一版本
kubectl rollout undo deployment/<deployment-name> -n <namespace>
# 回滚到指定版本
kubectl rollout undo deployment/<deployment-name> --to-revision=2 -n <namespace>
# 暂停发布
kubectl rollout pause deployment/<deployment-name> -n <namespace>
# 恢复发布
kubectl rollout resume deployment/<deployment-name> -n <namespace>
6. 配置管理 - 改配置
# 编辑deployment配置
kubectl edit deployment <deployment-name> -n <namespace>
# 查看ConfigMap
kubectl get cm -n <namespace>
kubectl describe cm <configmap-name> -n <namespace>
# 查看Secret(base64编码的)
kubectl get secret -n <namespace>
kubectl get secret <secret-name> -n <namespace> -o yaml
7. 资源导出 - 备份配置
# 导出yaml,方便备份或迁移
kubectl get deployment <deployment-name> -n <namespace> -o yaml > backup.yaml
# 导出所有deployment
kubectl get deployment -n <namespace> -o yaml > all-deployments.yaml
# 不要status和一些无用信息
kubectl get deployment <deployment-name> -n <namespace> -o yaml --export > clean.yaml
8. 应用配置 - 部署
# 从yaml创建资源
kubectl apply -f deployment.yaml
# 从目录批量创建
kubectl apply -f ./<config-directory>/
# 从URL直接部署
kubectl apply -f https://xxx.com/deploy.yaml
# 删除yaml定义的资源
kubectl delete -f deployment.yaml
9. 端口转发 - 本地调试
# 把Pod端口转发到本地,调试神器
kubectl port-forward <pod-name> 8080:80 -n <namespace>
# 转发Service
kubectl port-forward service/<service-name> 8080:80 -n <namespace>
# 监听所有网卡(可以让局域网其他机器访问)
kubectl port-forward --address 0.0.0.0 <pod-name> 8080:80 -n <namespace>
10. 复制文件 - 传文件
# 从Pod复制文件到本地
kubectl cp <namespace>/<pod-name>:/path/to/file ./local-file
# 从本地复制到Pod
kubectl cp ./local-file <namespace>/<pod-name>:/path/to/file
# 多容器指定容器
kubectl cp <namespace>/<pod-name>:/path/to/file ./local-file -c <container-name>
11. 节点操作 - 维护
# 查看节点
kubectl get nodes -o wide
# 查看节点详情(能看到资源使用)
kubectl describe node <node-name>
# 标记节点不可调度,要维护时用
kubectl cordon <node-name>
# 恢复节点调度
kubectl uncordon <node-name>
# 驱逐节点上的Pod(维护前操作)
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
12. 资源使用 - 看监控
# 看Pod资源占用(需要metrics-server)
kubectl top pod -n <namespace>
# 看所有命名空间
kubectl top pod -A
# 看节点资源
kubectl top node
# 按CPU排序
kubectl top pod -n <namespace> --sort-by=cpu
# 按内存排序
kubectl top pod -n <namespace> --sort-by=memory
13. 标签操作 - 打标签
# 给Pod打标签
kubectl label pod <pod-name> env=<environment> -n <namespace>
# 修改标签(覆盖)
kubectl label pod <pod-name> env=test --overwrite -n <namespace>
# 删除标签
kubectl label pod <pod-name> env- -n <namespace>
# 查询带标签的资源
kubectl get pod -l env=prod -n <namespace>
# 多个标签条件
kubectl get pod -l 'env=prod,app=<app-name>' -n <namespace>
14. 事件查看 - 排查问题
# 查看命名空间事件,找问题先看这个
kubectl get events -n <namespace> --sort-by='.lastTimestamp'
# 看所有命名空间事件
kubectl get events -A --sort-by='.lastTimestamp'
# 监控事件(实时)
kubectl get events -n <namespace> -w
15. 常用组合技 - 实战
# 批量重启某个deployment的所有Pod
kubectl rollout restart deployment/<deployment-name> -n <namespace>
# 找出不在Running状态的Pod
kubectl get pod -A --field-selector=status.phase!=Running
# 找出重启次数多的Pod(可能有问题)
kubectl get pod -A --sort-by='.status.containerStatuses[0].restartCount'
# 看某个Pod的完整yaml(调试配置问题)
kubectl get pod <pod-name> -n <namespace> -o yaml | less
# 临时起个Pod测试网络(用完自动删)
kubectl run <test-pod-name> --rm -i --tty --image=nicolaka/netshoot -- /bin/bash
# 查看集群信息
kubectl cluster-info
# 查看API资源类型
kubectl api-resources
16. 命名空间操作
# 列出所有命名空间
kubectl get ns
# 创建命名空间
kubectl create ns <namespace>
# 删除命名空间(小心,会删里面所有东西)
kubectl delete ns <namespace>
# 切换默认命名空间(需要kubens工具)
kubens <namespace>
17. 小技巧
设置别名,省时间
添加到 ~/.bashrc 或 ~/.zshrc:
alias k='kubectl'
alias kgp='kubectl get pod'
alias kgpa='kubectl get pod -A'
alias kd='kubectl describe'
alias ke='kubectl edit'
alias kdel='kubectl delete'
alias kl='kubectl logs'
alias kx='kubectl exec -it'
自动补全(强烈推荐)
Bash:
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
切换上下文
# 查看所有集群上下文
kubectl config get-contexts
# 切换集群
kubectl config use-context <context-name>
# 切换集群(推荐使用kubectx工具)
kubectx prod-cluster
# 查看当前上下文
kubectl config current-context