前言

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. 常用命令

  1. 集群信息查看

kubectl get nodes:查看集群所有节点状态,包括节点名称、角色、状态、年龄和版本
kubectl describe node <节点名>:查看指定节点的详细信息,包括资源使用情况、标签、污点等
kubectl cluster-info:显示集群控制平面的地址信息

  1. 工作负载管理

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) 列表

  1. 服务与网络

kubectl get services:查看所有服务 (Service)
kubectl get ingresses:查看 ingress 资源
kubectl get endpoints:查看服务对应的端点信息

  1. 配置与存储

kubectl get configmaps:查看配置映射 (ConfigMap)
kubectl get secrets:查看密钥 (Secret)
kubectl get persistentvolumes:查看持久卷 (PV)
kubectl get persistentvolumeclaims:查看持久卷声明 (PVC)

  1. 资源操作

kubectl create -f <yaml文件>:根据 YAML 文件创建资源
kubectl apply -f <yaml文件>:创建或更新资源(推荐使用)
kubectl delete pod <Pod名称>:删除指定 Pod
kubectl delete deployment <部署名称>:删除指定部署
kubectl edit deployment <部署名称>:编辑部署的配置
kubectl scale deployment <部署名称> --replicas=<数量>:调整部署的副本数量

  1. 命名空间管理

kubectl get namespaces:查看所有命名空间
kubectl create namespace <命名空间名>:创建新的命名空间
kubectl delete namespace <命名空间名>:删除命名空间

  1. 其他常用命令

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 replacekubectl 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

本文的引用仅限自我学习如有侵权,请联系作者删除。
参考知识


更多推荐