11. 容器化 vs 虚拟化-K8s-kubectl命令
前言
kubectl
使用kubectl命令操作集群。
一、kubectl
1. 概念
kubectl是Kubernetes集群的命令行工具,您可以将kubectl安装在任意一台机器上,通过kubectl命令操作Kubernetes集群。
华为云CCE集群的kubectl安装请参见通过kubectl连接集群。连接后您可以执行kubectl cluster-info查看集群的信息,如下所示。
# kubectl cluster-info
Kubernetes master is running at https://*.*.*.*:5443
CoreDNS is running at https://*.*.*.*:5443/api/v1/namespaces/kube-system/services/coredns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
执行kubectl get nodes可以查看集群中的节点信息。
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.0.153 Ready <none> 7m v1.15.6-r1-20.3.0.2.B001-15.30.2
192.168.0.207 Ready <none> 7m v1.15.6-r1-20.3.0.2.B001-15.30.2
192.168.0.221 Ready <none> 7m v1.15.6-r1-20.3.0.2.B001-15.30.2
更多kubectl命令请参考kubectl 快速参考。
2. 常用命令
- 集群信息查看
kubectl get nodes:查看集群所有节点状态,包括节点名称、角色、状态、年龄和版本
kubectl describe node <节点名>:查看指定节点的详细信息,包括资源使用情况、标签、污点等
kubectl cluster-info:显示集群控制平面的地址信息
- 工作负载管理
kubectl get pods:查看当前命名空间的所有 Pod 状态
kubectl get pods -n <命名空间>:查看指定命名空间的 Pod
kubectl get pods -o wide:查看 Pod 的详细信息,包括所在节点、IP 等
kubectl describe pod <Pod名称>:查看指定 Pod 的详细信息和事件
kubectl logs <Pod名称>:查看 Pod 的日志
kubectl logs -f <Pod名称>:实时查看 Pod 的日志
kubectl exec -it <Pod名称> – /bin/bash:进入 Pod 内部执行命令
kubectl get deployments:查看部署 (Deployment) 列表
kubectl get statefulsets:查看有状态集 (StatefulSet) 列表
kubectl get daemonsets:查看守护进程集 (DaemonSet) 列表
- 服务与网络
kubectl get services:查看所有服务 (Service)
kubectl get ingresses:查看 ingress 资源
kubectl get endpoints:查看服务对应的端点信息
- 配置与存储
kubectl get configmaps:查看配置映射 (ConfigMap)
kubectl get secrets:查看密钥 (Secret)
kubectl get persistentvolumes:查看持久卷 (PV)
kubectl get persistentvolumeclaims:查看持久卷声明 (PVC)
- 资源操作
kubectl create -f <yaml文件>:根据 YAML 文件创建资源
kubectl apply -f <yaml文件>:创建或更新资源(推荐使用)
kubectl delete pod <Pod名称>:删除指定 Pod
kubectl delete deployment <部署名称>:删除指定部署
kubectl edit deployment <部署名称>:编辑部署的配置
kubectl scale deployment <部署名称> --replicas=<数量>:调整部署的副本数量
- 命名空间管理
kubectl get namespaces:查看所有命名空间
kubectl create namespace <命名空间名>:创建新的命名空间
kubectl delete namespace <命名空间名>:删除命名空间
- 其他常用命令
kubectl get all:查看当前命名空间的所有资源
kubectl explain <资源类型>:查看资源类型的详细说明,如
kubectl explain pods
kubectl top pods:查看 Pod 的资源使用情况
kubectl top nodes:查看节点的资源使用情况
kubectl rollout history deployment <部署名称>:查看部署的历史版本
kubectl rollout undo deployment <部署名称>:回滚到上一个版本的部署
这些命令覆盖了 K8s 日常运维的大部分场景,掌握它们可以高效地管理和排查 Kubernetes 集群问题。实际使用时,可以通过
kubectl --help或kubectl <命令> --help获取更详细的帮助信息。
二、基础命令
1. get
get命令用于获取集群的一个或一些资源的详细信息。
该命令可以列出集群所有资源的详细信息,包括集群节点、运行的Pod、Deployment、Service等。
须知:
集群中可以创建多个命名空间,未指定命名空间的情况下,默认指定为–namespace=default,即查询default命名空间下的资源。
获取该节点的所有命名空间:
kubectl get namespace
获取pod列表:
kubectl -n prj-uat get pods
获取所有namespace下的运行的所有pod的标签:
kubectl -n prj-uat get pod --show-labels
获取指定关键字的pod
kubectl -n prj-uat get pod | grep loader
kubectl -n prj-prd get pod | grep -E 'demo|frame|loader'
查询其他节点需要加-s指定节点,类似可以使用“kubectl get svc”,“kubectl get nodes”,“kubectl get deploy”等获取其他资源的信息。
获取所有命名空间下的运行的所有Pod:
kubectl get pod --all-namespaces
获取所有Pod的详细信息:
kubectl -n prj-uat get pod -o wide
以YAML格式输出Pod的详细信息:
kubectl -n prj-uat get pod <podname> -o yaml
以JSON格式输出Pod的详细信息:
kubectl -n prj-uat get pod <podname> -o json
kubectl -n prj-uat get pod <podname> -o=custom-columns=LABELS:.metadata.labels.app
其中LABELS为显示的列标题,可以自己设置,“.metadata.labels.app”为查询的数据需要按照之前的YAML或JSON获取。
获取configmap列表
kubectl -n prj-uat get configmap
获取指定configmap,以json格式输出
kubectl -n prj-uat get configmap config-bff-pro-demo-652gm68c5c -o json
获取ingress
kubectl get ing pro-demo -o yaml -n prj-uat
获取指定service
kubectl -n prj-uat get svc com-pro-demo
获取Deployment
kubectl -n prj-prd get deploy
kubectl -n prj-prd edit deploy xxx
获取指定关键字的Deployment
kubectl -n prj-prd get deploy | grep -E 'demo|frame|loader'
查看Deployment
kubectl -n prj-prd get deploy -owide
kubectl -n prj-uat get deploy -owide | grep loader
2. create
create命令用于根据文件或输入创建集群资源。
如果已经定义了相应资源的YAML或JSON文件,直接使用以下命令即可创建文件内定义的资源。
kubectl create -f <filename>
3. expose
expose将一个资源包括Pod、Deployment等公开为一个新的Service。
kubectl expose deployment <deployname> --port=81 --type=NodePort --target-port=80 --node-port=31000 --name=<service-name>
以上命令会给Deployment创建一个NodePort类型服务,–port为服务端口(用于集群访问),–type为服务类型,–target-port为服务对应后端Pod的端口,–node-port表示NodePort端口(用于集群外访问)。其中–node-port为可选参数,未指定时,集群将在30000~32767范围内随机分配。
4. run
创建单Pod或Deployment的快捷命令,适合测试环境。
例如:
kubectl run <deployname> --image=nginx:latest
同时,可以在创建Pod或Deployment时指定运行的命令:
kubectl run <deployname> --image=busybox --command -- ping example.com
5. set
在对象上设置特定功能。
例如:
滚动更新一个Deployment的容器镜像改为1.0版本:
kubectl set image deployment/<deployname> <containername>=<containername>:1.0
6. edit
edit提供了另一种更新资源的操作。
例如:
使用edit直接更新Pod的命令为:
kubectl -n prj-uat edit pod po-nginx-btv4j
上面命令的效果等效于:
kubectl -n prj-uat get pod po-nginx-btv4j -o yaml >> /tmp/nginx-tmp.yaml
vim /tmp/nginx-tmp.yaml
# do some changes here
kubectl replace -f /tmp/nginx-tmp.yaml
实战如下:
✅ 正确且安全的操作流程(推荐方式)
场景:你想修改一个已存在的 Pod(或其他资源)的配置
⚠️ 注意:Pod 是不可变的(immutable)!
一旦创建,不能修改其 spec(如镜像、环境变量、命令等)。
所以对 Pod 使用replace通常会失败,除非你删除重建。
建议:如果是 Deployment/StatefulSet 管理的 Pod,请修改控制器,而不是直接改 Pod。
但为了教学目的,我们仍以 Pod 为例,并给出通用方法。
✅ 推荐做法(适用于可更新资源,如 Deployment、Service、Ingress 等)
# 1. 导出当前资源配置(去掉只读字段)
kubectl -n prj-uat get pod po-nginx-btv4j -o yaml \
| grep -v '^\s*resourceVersion:' \
| grep -v '^\s*uid:' \
> /tmp/nginx-tmp.yaml
# 2. 用 vim 编辑(只修改 spec 部分,不要改 metadata.name/namespace)
vim /tmp/nginx-tmp.yaml
# 3. 应用更改(优先使用 apply,而非 replace)
kubectl apply -f /tmp/nginx-tmp.yaml
❓ 为什么不用 kubectl replace?
| 对比项 | kubectl replace | kubectl apply |
|---|---|---|
| 是否保留字段 | ❌ 必须提供完整 spec,否则会清空未声明字段 | ✅ 基于 last-applied-configuration 合并变更 |
| 是否需要清理元数据 | ✅ 必须手动删除 resourceVersion 等字段 | ✅ 自动处理 |
| 适合场景 | 替换整个对象(强制覆盖) | 声明式更新(推荐) |
| 对 Pod 是否有效 | ❌ 大多数字段不可变,会报错 | ❌ 同样无效(Pod 不可变) |
📌 结论:日常更新请用
kubectl apply,不是replace
7. explain
查看文档或参考资料。
例如:
查看Pod的相关文档:
kubectl -n prj-uat explain pod
8. delete
根据资源名或标签删除资源。
例如:
立刻删除该Pod:
kubectl -n prj-uat delete pod <podname> --now
kubectl -n prj-uat delete -f nginx.yaml
kubectl -n prj-uat delete deployment <deployname>
三、部署命令
1. rollout
管理资源的发布。
例如:
查看指定资源的部署状态:
kubectl rollout status deployment/<deployname>
查看指定资源的发布历史:
kubectl rollout history deployment/<deployname>
回滚指定资源,默认回滚至上一个版本:
kubectl rollout undo deployment/test-nginx
2. scale
scale用于程序在负载加重或缩小时将副本进行扩容或缩小。
kubectl -n prj-uat scale deployment <deployname> --replicas=<newnumber>
3. autoscale
autoscale命令提供了自动根据工作负载的CPU利用率对其副本进行扩缩的功能。autoscale命令会给工作负载(Deployment、ReplicaSet、StatefulSet)指定一个副本数的范围,在实际运行中根据所有Pod的平均CPU利用率自动在指定的范围内对Pod进行扩容或缩容。如果未指定目标利用率或设置为负数,将使用默认的自动扩缩策略。
kubectl autoscale deployment <deployname> --min=<minnumber> --max=<maxnumber> --cpu-percent=<cpu>
四、集群管理命令
1. cordon、drain、uncordon
有时候会遇到这样一个场景,一个节点需要升级,但是在该节点上又有许多运行的Pod,或者该节点已经瘫痪,需要保证业务功能的完善,则需要使用这组命令将该节点上运行的Pod调度到其他节点上。使用步骤如下:
(1) 使用cordon命令将一个节点标记为不可调度。这意味着新的Pod将不会被调度到该节点上。
kubectl cordon <nodename>
CCE中默认为节点私网IP。
(2) 使用drain命令,驱逐该节点上的Pod,将运行在该节点上运行的Pod平滑的搬迁到其他节点上。
kubectl drain <nodename> --ignore-daemonsets --delete-emptydir-data
–ignore-daemonsets表示忽略DaemonSet所控制的Pod,–delete-emptydir-data表示即使存在使用emptyDir(腾空节点时将删除本地数据)的Pod也会继续腾空节点。
(3) 对该节点进行一些节点维护的操作,如重置节点等。
(4) 节点维护完后,使用uncordon命令解锁该节点,使其重新变得可调度。
kubectl uncordon <nodename>
2. cluster-info
查看在集群中运行的插件:
kubectl cluster-info
查看详细信息:
kubectl cluster-info dump
3. top
显示资源(CPU/Memory/Storage)使用,该命令需要集群中的Metrics Server正常运行。
4. taint
修改一个或多个节点上的污点。
5. certificate
修改证书资源。
五、故障诊断和调试命令
1. describe
describe命令类似于get,同样用于获取资源的相关信息。不同的是,get获得的是定义该资源的详细信息,而describe获得的是资源在集群内相关的状态信息。describe命令同get类似,但是describe命令不支持-o选项,对于同一类型的资源,describe命令输出的信息格式,内容域相同。
kubectl -n prj-uat describe pod <podname>
如果发现是查询某个资源的信息,使用get命令能够获取更加详尽的信息。但是如果想要查询某个资源的状态,如某个Pod并不是在running状态,这时需要获取更详尽的状态信息时,就应该使用describe命令。
2. logs
logs命令用于显示Pod运行中,容器内程序输出到标准输出的内容。如果要获得tail -f的方式,需使用-f选项。
kubectl -n prj-uat logs <podname> --previous
3. exec
与Docker的exec用法相似,如果一个Pod中,有多个容器,需要使用-c选项指定容器。
kubectl -n prj-uat exec -it <podname> -- /bin/bash
kubectl -n prj-uat exec -it <podname> -c <containername> -- bash
4. port-forward
转发一个或多个本地端口至一个Pod。
例如:
侦听本地端口5000并转发到创建的Pod里的端口6000:
kubectl port-forward deploy/my-deployment 5000:6000
5. cp
复制文件或目录到容器:
kubectl cp /tmp/foo <podname>:/tmp/bar -c <containername>
将/tmp/foo本地文件复制到远程Pod中特定容器的/tmp/bar下。
6. auth
检查授权。
7. attach
attach命令效果类似于logs -f,退出查看使用ctrl-c。如果一个Pod中有多个容器,要查看具体的某个容器的输出,需要在Pod名后使用-c containername指定运行的容器。
kubectl attach <podname> -c <containername>
六、高级命令
1. replace
replace命令用于对已有资源进行更新、替换。当需要更新资源的一些属性的时候,如果修改副本数量,增加、修改标签,更改镜像版本,修改端口等,都可以直接修改原YAML文件,然后执行replace命令。
kubectl replace -f <filename>
资源名称不能被更新。
2. apply
apply命令提供了比patch,edit等更严格的更新资源的方式。通过apply,用户可以将资源的configuration使用source control的方式维护在版本库中。每次有更新时,将配置文件推送server,然后使用kubectl apply将更新应用到资源。Kubernetes会在应用更新前将当前配置文件中的配置同已经应用的配置做比较,并只更新更改的部分,而不会主动更改任何用户未指定的部分。apply命令的使用方式同replace相同,不同的是,apply不会删除原有资源,然后创建新的。apply直接在原有资源的基础上进行更新。同时kubectl apply还会在资源中添加一条注释,标记当前的apply,类似于git操作。
kubectl apply -f <filename>
3. patch
如果一个容器已经在运行,这时需要对一些容器属性进行修改,又不想删除容器,或不方便通过replace的方式进行更新。Kubernetes还提供了一种在容器运行时,直接对容器进行修改的方式,就是patch命令。 例如已存在一个Pod的标签为app=nginx1,如果需要在运行过程中,将其修改为app=nginx2。
kubectl patch pod <podname> -p '{"metadata":{"labels":{"app":"nginx2"}}}'
4. convert
不同的API版本之间转换配置文件。
七、设置命令
1. label
更新资源上的标签:
kubectl label pods my-pod new-label=newlabel
2. annotate
更新资源上的注释:
kubectl annotate pods my-pod icon-url=http://*****
3. completion
用于实现kubectl工具自动补全。
八、其他命令
1. api-versions
打印受支持的API版本:
kubectl api-versions
2. api-resources
打印支持的API资源:
kubectl api-resources
3. config
修改kubeconfig文件:用于访问API,比如配置认证信息。
4. help
所有命令帮助。
5. version
打印客户端和服务版本信息。
kubectl version
更多推荐



所有评论(0)