kubectl 就是 kube-apiserver 的客户端程序,是通过连接 master 节点的 apiserver 上实现各种 k8s 相关对象资源的增删改查
k8s 可管理对象资源:
资源分类 | 资源名称 | 缩写 | 资源作用 |
---|---|---|---|
集群级别资源 | nodes | no | 集群组成部分 |
namespaces | ns | 隔离 pod | |
pod资源 | pods | po | 装载容器 |
pod资源控制器 | ReplicationController | rc | 比较原始的 pod 控制器,已经被废弃,由 ReplicaSet 替代 |
replicasets | rs | 保证副本数量一直维持在期望值,并支持 pod 数量扩缩容,镜像版本升级 | |
deployments | deploy | 通过控制 ReplicaSet 来控制 Pod,并支持滚动升级、回退版本(如:nginx、tomcat) | |
daemonsets | ds | 在集群中的指定 Node 上运行且仅运行一个副本,一般用于守护进程类的任务 比如收集日志进程 filebeat、监控进程 node-exporter | |
jobs | 它创建出来的 pod 只要完成任务就立即退出,不需要重启或重建,用于执行一次性任务(比如一次性计算类任务) | ||
cronjobs | cj | 它创建的 Pod 负责周期性任务控制,不需要持续后台运行(比如每天的定时备份) | |
horizontalpodautoscalers | hpa | 可以根据集群负载自动水平调整 Pod 的数量,实现削峰填谷 | |
statefulsets | sts | 管理有状态应用(如:redis mysql nacos es zookeeper mq MongoDB Sentinel) | |
服务发现资源 | services | svc | 四层代理,统一 pod 对外接口 |
ingress | ing | 七层代理,统一 pod 对外接口 | |
存储资源 | volumeattachments | 存储 | |
persistentvolumes | pv | PV(Persistent Volume):持久化卷 | |
persistentvolumeclaims | pvc | PVC(Persistent Volume Claim):持久卷声明 | |
配置资源 | configmaps | cm | 配置文件 |
secrets | secrets | 秘钥文件 |
1 基础命令
命令 | 描述 |
---|---|
create | 通过文件或 stdin(标准输入)创建资源kubectl create deployment my-test --image=busybox |
expose | 将rs、service、deploy 或 pod 发布出来kubectl expose deployment dev-dmp --port=8000 --target-port=80 --type=ClusterIP |
run | 在集群中运行一个指定的镜像 |
set | 在对象上设置特定的功能 |
get | 显示一个或多个资源 -n namespace:指定命名空间 -A:显示所有的命名空间中的对象(生产中慎用) kubectl get pod -A -o wide 示例: kubectl -n kube-system get po -o wide kubectl -n kube-system get po -o name kubectl -n kube-system get po -o json kubectl -n kube-system get deploy dev-nginx -o yaml kubectl -n kube-system get svc kubectl -n kube-system get po -l app=auto kubectl get ns kubectl -n logs get ds kubectl -n logs get sts |
explain | 文档的参考资料kubectl explain deployment.spec.template.spec.imagePullSecrets |
edit | 在服务器上使用默认的编辑器编辑一个资源 例1:修改名字为 nginx-svc 的 service: kubectl edit svc nginx-svc 例2:修改名字为 nginx-dep 的 deployment: kubectl edit deploy nginx-dep edit 编辑修改配置文件后,不需要重启服务,改完后即可生效 |
delete | 按文件名、标准输入、资源名称或标签选择器删除资源 |
2 部署命令
命令 | 描述 |
---|---|
rollout | 管理资源的回滚kubectl rollout pause deploy/myapp-v1 -n ml kubectl rollout resume deploy/myapp-v1 -n ml |
rolling-update | 对给定的复制控制器滚动更新 |
scale | 为部署、副本集、复制控制器或作业设置新大小,即手动改变应用程序的规模(size) 扩容或缩容 Pod 数量,Deployment、ReplicaSet、RC 或 Job kubectl scale deployment ngx-1 -n test --replicas=3 |
autoscale | 创建一个自动选择扩容或缩容并设置 Pod 数量 自动伸缩部署、副本集或副本控制器,即自动改变应用程序的规模 |
3 集群管理命令
命令 | 描述 |
---|---|
certificate | 修改证书资源 |
cluster-info | 显示集群信息 kubectl cluster-info |
top | 显示资源(CPU/Memory/Storage)使用,需要 Heapster 运行kubectl top node kubectl top pod -n bi |
cordon | 将节点标记为不可调度kubectl cordon node名字 |
uncordon | 将节点标记为可调度kubectl uncordon node名字 |
drain | 驱逐节点上的应用,准备下线维护kubectl drain node名字 --delete-local-data --ignore-daemonsets --force |
taint | 更新一个或多个节点上的污点,和高级调度相关的,给节点增加污点后, 能容忍污点的pod就可以调度上来,否则就不能调度上来 其实当前的master就有很多污点,这也就是为什么很多创建的pod不会调度到master上, 因为默认创建的所有pod都无法容忍master的污点, 这样确保了master只运行apiserver、controller-manager、schedulable和etcd等几个重要的系统级资源 示例: kubectl taint nodes node1 key=xsj:NoSchedule |
4 故障诊断和调试命令
命令 | 描述 |
---|---|
describe | 显示特定资源或资源组的详细信息kubectl describe pod pod名字 kubectl describe node node名字 (可以查看污点等信息)kubectl describe deploy deploy名字 kubectl describe cm configMap名字 |
logs | 在一个 Pod 中打印一个容器日志,如果 Pod 只有一个容器,容器名称是可选的 如果 Pod 有两个以上的容器,需要添加 -c 参数指定容器名称 |
attach | 附加到正在运行的 pod 上,实时查看 pod 消息 |
exec | 在 pod 中执行命令kubectl exec -it nginx-xxx -n web -- /bin/bash |
port-forward | 将一个或多个本地端口转发到一个 pod |
proxy | 运行 Kubernetes API 服务器的代理 运行一个 proxy 到 Kubernetes API Server |
cp | 从 pod 中复制文件和目录,或者向 pod 中拷贝文件 |
auth | 检查授权 |
debug | 调试,对 pod 和 node 进行故障排除 |
5 高级命令
命令 | 描述 |
---|---|
diff | 区分实时版本和潜在应用版本 |
apply | 通过文件名或标准输入创建(更改)配置信息 示例: kubectl apply -f test-deploy.yaml 示例: kubectl apply -f test-deploy.yaml --dry-run |
patch | 使用策略合并补丁部分更新资源的相关信息 |
replace | 通过文件名或标准输入,使用 yaml 配置文件来替换正在运行中的配置参数 |
convert | 在不同的 API 版本之间转换配置文件 |
wait | 实验性:在一个或多个资源上等待特定条件 |
kustomize | 从目录或URL构建 kustomization 目标 |
6 设置命令
命令 | 描述 |
---|---|
label | 更新资源上的标签,注意:lable 有长度限制 示例: kubectl label nodes node1 airflow=true |
annotate | 更新资源上的注释,注释没有长度限制,可以打上任何的 kv 数据 |
completion | 用于实现 kubectl 工具自动补全,指定shell的输出shell完成代码(bash 或 zsh) |
7 其他命令
命令 | 描述 |
---|---|
api-resources | 在服务器上打印支持的API资源kubectl api-resources |
api-versions | 在服务器上以“组/版本”的形式打印支持的 API 版本kubectl api-versions |
config | 修改 kubeconfig 文件(用于访问 API,比如配置认证信息)kubectl config -h 示例: https://blog.csdn.net/weixin_56752399/article/details/124374683?spm=1001.2014.3001.5501 |
help | 关于任何命令的帮助 kubectl logs -h |
plugin | 运行一个命令行插件 |
version | 打印客户端和服务器版本信息kubectl version 打印 kube-controller-manager 版本信息 kube-controller-manager --version kubectl version |
8 排查 Pod 异常的常用命令:
查看 Pod 状态
kubectl get pods <pod-name> -n <namespace> -o wide
查看 Pod 的 yaml 配置
kubectl get pods <pod-name> -n <namespace> -o yaml
查看 pod 的事件
kubectl describe pods <pod-name> -n <namespace>
查看 node 的事件
kubectl describe node <node-name> -n <namespace>
查看 deploy 的事件
kubectl describe deploy <deploy-name> -n <namespace>
查看 Pod 容器日志
kubectl logs -n <namespace> <pod-name> [-c <container-name>]
# 可以 tailf 该 Pod 的日志观察进度
kubectl logs -f -n kube-system kibana-logging-7445dc9757-pvpcv
查看 kube-system 命名空间下的所有服务
kubectl get svc -n kube-system
在 pod 中执行一条命令
kubectl exec -it nginx-xxxx -n web /bin/bash
cat /etc/nginx.conf
# 或者直接查看
kubectl exec -it nginx-xxxx -n web cat /etc/nginx.conf
从 nginx-xxxx 的 pod 中将数据拷贝到物理机的 /tmp/ 中
kubectl cp nginx-xxxx:/etc/nginx.conf /tmp/
# 如果拷贝失败,请检查是否安装 tar 包,如果没有请安装
kubectl exec -it nginx-xxxx -n web /bin/bash
yum -y install tar # 可能需要修改 yum 源
从物理机的 /tmp/test.conf 中将数据拷贝到 nginx-xxxx 的 pod 中
kubectl cp /tmp/test.conf nginx-xxxx:/tmp/
9 pod排错步骤:
查看 kube-system 命名空间下的所有pod状态
kubectl -n kube-system get pods
kubectl -n kube-system get pods -o wide(显示IP信息和运行的node信息)
查看pod的事件
kubectl -n kube-system describe pod metrics-server-v0.2.1-5988c5d6b8-8x4l2
查看pod metrics-server-v0.2.1-5988c5d6b8-8x4l2,容器名是metrics-server的日志,因为metrics-server-v0.2.1-5988c5d6b8-8x4l2有两个容器
kubectl -n kube-system logs metrics-server-v0.2.1-5988c5d6b8-8x4l2 metrics-server