kubectl 命令
一、概述
kubectl
是最常用的客户端工具之一,它提供了基于命令行访问kubernetes api的简洁方式,能够满足对kubernetes的绝大部分的操作需求。
例如,需要创建资源对象时,kubectl会将json格式的清单内容以post方法提交至api server。
二、语法
kubectl [command] [TYPE] [NAME] [flags]
- command:对资源执行相应操作的子命令,如
get
、create
、delete
、run
、describe
等 - TYPE:要操作的资源对象的类型,如pods、services等,类型名称区分大小写,但支持使用简写格式
- NAME:对象名称,区分字符大小写;省略时,则表示指定TYPE的所有资源对象
- flags:命令行选项,-o 用于指定输出格式,-s 指定Kubernetes API 服务器的地址和端口。
从命令行指定的参数会覆盖默认值1和任何相应的环境变量
三、操作
下表包含所有 kubectl 操作的简短描述和普通语法
操作 | 语法 | 描述 |
---|---|---|
alpha |
kubectl alpha SUBCOMMAND [flags] |
列出与 alpha 特性对应的可用命令,这些特性在 Kubernetes 集群中默认情况下是不启用的。 |
annotate |
kubectl annotate (-f FILENAME TYPE NAME TYPE/NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--overwrite] [--all] [--resource-version=version] [flags] |
添加或更新一个或多个资源的注解。 |
api-resources |
kubectl api-resources [flags] |
列出可用的 API 资源。 |
api-versions |
kubectl api-versions [flags] |
列出可用的 API 版本。 |
apply |
kubectl apply -f FILENAME [flags] |
从文件或 stdin 对资源应用配置更改。 |
attach |
kubectl attach POD -c CONTAINER [-i] [-t] [flags] |
附加到正在运行的容器,查看输出流或与容器(stdin)交互。 |
auth |
kubectl auth [flags] [options] |
检查授权。 |
autoscale |
kubectl autoscale (-f FILENAME TYPE NAME TYPE/NAME) [--min=MINPODS] --max=MAXPODS [--cpu-percent=CPU] [flags] |
自动伸缩由副本控制器管理的一组 pod。 |
certificate |
kubectl certificate SUBCOMMAND [options] |
修改证书资源。 |
cluster-info |
kubectl cluster-info [flags] |
显示有关集群中主服务器和服务的端口信息。 |
completion |
kubectl completion SHELL [options] |
为指定的 shell (bash 或 zsh)输出 shell 补齐代码。 |
config |
kubectl config SUBCOMMAND [flags] |
修改 kubeconfig 文件。有关详细信息,请参阅各个子命令。 |
convert |
kubectl convert -f FILENAME [options] |
在不同的 API 版本之间转换配置文件。配置文件可以是 YAML 或 JSON 格式。 |
cordon |
kubectl cordon NODE [options] |
将节点标记为不可调度。 |
cp |
kubectl cp <file-spec-src> <file-spec-dest> [options] |
在容器之间复制文件和目录。 |
create |
kubectl create -f FILENAME [flags] |
从文件或 stdin 创建一个或多个资源。 |
delete |
kubectl delete (-f FILENAME TYPE [NAME /NAME -l label --all]) [flags] |
从文件、标准输入或指定标签选择器、名称、资源选择器或资源中删除资源。 |
describe |
kubectl describe (-f FILENAME TYPE [NAME_PREFIX /NAME -l label]) [flags] |
显示一个或多个资源的详细状态。 |
diff |
kubectl diff -f FILENAME [flags] |
将 live 配置和文件或标准输入做对比 (BETA) |
drain |
kubectl drain NODE [options] |
腾空节点以准备维护。 |
edit |
kubectl edit (-f FILENAME TYPE NAME TYPE/NAME) [flags] |
使用默认编辑器编辑和更新服务器上一个或多个资源的定义。 |
exec |
kubectl exec POD [-c CONTAINER] [-i] [-t] [flags] [-- COMMAND [args...]] |
对 pod 中的容器执行命令。 |
explain |
kubectl explain [--recursive=false] [flags] |
获取多种资源的文档。例如 pod, node, service 等。 |
expose |
kubectl expose (-f FILENAME TYPE NAME TYPE/NAME) [--port=port] [--protocol=TCP UDP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type] [flags] |
将副本控制器、服务或 pod 作为新的 Kubernetes 服务暴露。 |
get |
kubectl get (-f FILENAME TYPE [NAME /NAME -l label]) [--watch] [--sort-by=FIELD] [[-o --output]=OUTPUT_FORMAT] [flags] |
列出一个或多个资源。 |
kustomize |
kubectl kustomize <dir> [flags] [options] |
列出从 kustomization.yaml 文件中的指令生成的一组 API 资源。参数必须是包含文件的目录的路径,或者是 git 存储库 URL,其路径后缀相对于存储库根目录指定了相同的路径。 |
label |
kubectl label (-f FILENAME TYPE NAME TYPE/NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--overwrite] [--all] [--resource-version=version] [flags] |
添加或更新一个或多个资源的标签。 |
logs |
kubectl logs POD [-c CONTAINER] [--follow] [flags] |
在 pod 中打印容器的日志。 |
options |
kubectl options |
全局命令行选项列表,适用于所有命令。 |
patch |
kubectl patch (-f FILENAME TYPE NAME TYPE/NAME) --patch PATCH [flags] |
使用策略合并 patch 程序更新资源的一个或多个字段。 |
plugin |
kubectl plugin [flags] [options] |
提供用于与插件交互的实用程序。 |
port-forward |
kubectl port-forward POD [LOCAL_PORT:]REMOTE_PORT [...[LOCAL_PORT_N:]REMOTE_PORT_N] [flags] |
将一个或多个本地端口转发到一个 pod。 |
proxy |
kubectl proxy [--port=PORT] [--www=static-dir] [--www-prefix=prefix] [--api-prefix=prefix] [flags] |
运行 Kubernetes API 服务器的代理。 |
replace |
kubectl replace -f FILENAME |
从文件或标准输入中替换资源。 |
rollout |
kubectl rollout SUBCOMMAND [options] |
管理资源的部署。有效的资源类型包括:Deployments, DaemonSets 和 StatefulSets。 |
run |
kubectl run NAME --image=image [--env="key=value"] [--port=port] [--dry-run=server client none] [--overrides=inline-json] [flags] |
在集群上运行指定的镜像。 |
scale |
kubectl scale (-f FILENAME TYPE NAME TYPE/NAME) --replicas=COUNT [--resource-version=version] [--current-replicas=count] [flags] |
更新指定副本控制器的大小。 |
set |
kubectl set SUBCOMMAND [options] |
配置应用程序资源。 |
taint |
kubectl taint NODE NAME KEY_1=VAL_1:TAINT_EFFECT_1 ... KEY_N=VAL_N:TAINT_EFFECT_N [options] |
更新一个或多个节点上的污点。 |
top |
kubectl top [flags] [options] |
显示资源(CPU/内存/存储)的使用情况。 |
uncordon |
kubectl uncordon NODE [options] |
将节点标记为可调度。 |
version |
kubectl version [--client] [flags] |
显示运行在客户端和服务器上的 Kubernetes 版本。 |
wait |
kubectl wait ([-f FILENAME] resource.group/resource.name resource.group [(-l label --all)]) [--for=delete --for condition=available] [options] |
实验性:等待一种或多种资源的特定条件。 |
了解更多有关命令操作的信息,请参阅kubectl参考文档。
四、资源类型
下表列出所有受支持的资源类型及其缩写别名。
(以下输出可以通过 kubectl api-resources
获取,内容以 Kubernetes 1.25.0 版本为准。)
资源名 | 缩写名 | API 版本 | 按命名空间 | 资源类型 |
---|---|---|---|---|
bindings |
v1 | true | Binding | |
componentstatuses |
cs |
v1 | false | ComponentStatus |
configmaps |
cm |
v1 | true | ConfigMap |
endpoints |
ep |
v1 | true | Endpoints |
events |
ev |
v1 | true | Event |
limitranges |
limits |
v1 | true | LimitRange |
namespaces |
ns |
v1 | false | Namespace |
nodes |
no |
v1 | false | Node |
persistentvolumeclaims |
pvc |
v1 | true | PersistentVolumeClaim |
persistentvolumes |
pv |
v1 | false | PersistentVolume |
pods |
po |
v1 | true | Pod |
podtemplates |
v1 | true | PodTemplate | |
replicationcontrollers |
rc |
v1 | true | ReplicationController |
resourcequotas |
quota |
v1 | true | ResourceQuota |
secrets |
v1 | true | Secret | |
serviceaccounts |
sa |
v1 | true | ServiceAccount |
services |
svc |
v1 | true | Service |
mutatingwebhookconfigurations |
admissionregistration.k8s.io/v1 | false | MutatingWebhookConfiguration | |
validatingwebhookconfigurations |
admissionregistration.k8s.io/v1 | false | ValidatingWebhookConfiguration | |
customresourcedefinitions |
crd,crds |
apiextensions.k8s.io/v1 | false | CustomResourceDefinition |
apiservices |
apiregistration.k8s.io/v1 | false | APIService | |
controllerrevisions |
apps/v1 | true | ControllerRevision | |
daemonsets |
ds |
apps/v1 | true | DaemonSet |
deployments |
deploy |
apps/v1 | true | Deployment |
replicasets |
rs |
apps/v1 | true | ReplicaSet |
statefulsets |
sts |
apps/v1 | true | StatefulSet |
tokenreviews |
authentication.k8s.io/v1 | false | TokenReview | |
localsubjectaccessreviews |
authorization.k8s.io/v1 | true | LocalSubjectAccessReview | |
selfsubjectaccessreviews |
authorization.k8s.io/v1 | false | SelfSubjectAccessReview | |
selfsubjectrulesreviews |
authorization.k8s.io/v1 | false | SelfSubjectRulesReview | |
subjectaccessreviews |
authorization.k8s.io/v1 | false | SubjectAccessReview | |
horizontalpodautoscalers |
hpa |
autoscaling/v2 | true | HorizontalPodAutoscaler |
cronjobs |
cj |
batch/v1 | true | CronJob |
jobs |
batch/v1 | true | Job | |
certificatesigningrequests |
csr |
certificates.k8s.io/v1 | false | CertificateSigningRequest |
leases |
coordination.k8s.io/v1 | true | Lease | |
endpointslices |
discovery.k8s.io/v1 | true | EndpointSlice | |
events |
ev |
events.k8s.io/v1 | true | Event |
flowschemas |
flowcontrol.apiserver.k8s.io/v1beta2 | false | FlowSchema | |
prioritylevelconfigurations |
flowcontrol.apiserver.k8s.io/v1beta2 | false | PriorityLevelConfiguration | |
ingressclasses |
networking.k8s.io/v1 | false | IngressClass | |
ingresses |
ing |
networking.k8s.io/v1 | true | Ingress |
networkpolicies |
netpol |
networking.k8s.io/v1 | true | NetworkPolicy |
runtimeclasses |
node.k8s.io/v1 | false | RuntimeClass | |
poddisruptionbudgets |
pdb |
policy/v1 | true | PodDisruptionBudget |
podsecuritypolicies |
psp |
policy/v1beta1 | false | PodSecurityPolicy |
clusterrolebindings |
rbac.authorization.k8s.io/v1 | false | ClusterRoleBinding | |
clusterroles |
rbac.authorization.k8s.io/v1 | false | ClusterRole | |
rolebindings |
rbac.authorization.k8s.io/v1 | true | RoleBinding | |
roles |
rbac.authorization.k8s.io/v1 | true | Role | |
priorityclasses |
pc |
scheduling.k8s.io/v1 | false | PriorityClass |
csidrivers |
storage.k8s.io/v1 | false | CSIDriver | |
csinodes |
storage.k8s.io/v1 | false | CSINode | |
csistoragecapacities |
storage.k8s.io/v1 | true | CSIStorageCapacity | |
storageclasses |
sc |
storage.k8s.io/v1 | false | StorageClass |
volumeattachments |
storage.k8s.io/v1 | false | VolumeAttachment |
五、输出选项
1、格式化输出
所有 kubectl
命令的默认输出格式都是人类可读的纯文本格式。要以特定格式在终端窗口输出详细信息, 可以将 -o
或 --output
参数添加到受支持的 kubectl
命令中。
1.1、语法
kubectl [command] [TYPE] [NAME] -o <output_format>
1.2、支持的输出格式
输出格式 | 描述 |
---|---|
-o custom-columns=<spec> |
使用逗号分隔的自定义列列表打印表。 |
-o custom-columns-file=<filename> |
使用 <filename> 文件中的自定义列模板打印表。 |
-o json |
输出 JSON 格式的 API 对象 |
-o jsonpath=<template> |
打印 jsonpath 表达式定义的字段 |
-o jsonpath-file=<filename> |
打印 <filename> 文件中 jsonpath 表达式定义的字段。 |
-o name |
仅打印资源名称而不打印任何其他内容。 |
-o wide |
以纯文本格式输出,包含所有附加信息。对于 Pod 包含节点名。 |
-o yaml |
输出 YAML 格式的 API 对象。 |
六、kubectl 自动补全
1、检查/安装bash-completion包(BASH中)
kubectl 的 Bash 补全脚本可以用命令 kubectl completion bash 生成。 在 Shell 中导入(Sourcing)补全脚本,将启用 kubectl 自动补全功能。
然而,补全脚本依赖于工具 bash-completion, 所以要先安装它
1.1、检查是否安装
type _init_completion
1.2、安装bash-completion
yum install -y bash-completion
apt-get install bash-completion
上述命令将创建文件
/usr/share/bash-completion/bash_completion
,它是 bash-completion 的主脚本。
2、在当前的bash会话中启用kubectl自动补全功能
source <(kubectl completion bash)
3、在bash shell中永久的添加自动补全
echo "source <(kubectl completion bash)" >> ~/.bashrc
4、设置别名
alias k=kubectl
complete -o default -F __start_kubectl k
- 创建了一个别名
k
,使其等同于kubectl
-o default
: 参数告诉 Bash 在补全选项时,除了特定的补全函数外,还应该包括默认的文件名补全-F __start_kubectl
: 指定补全函数__start_kubectl
,负责处理kubectl
命令及其子命令、选项和资源的补全逻辑k
: 指定上述补全规则应用到的命令别名
七、基本使用
1、kubectl 创建对象
1.1、使用一个资源清单创建资源
[root@k8s-master ~]# cat httpdpod.yaml
apiVersion: v1
kind: Namespace
metadata:
name: httpd
---
apiVersion: v1
kind: Pod
metadata:
name: httpdpod
namespace: httpd
spec:
containers:
- name: httpd-containers
image: nginx:latest
[root@k8s-master ~]# kubectl apply -f httpdpod.yaml
namespace/httpd created
pod/httpdpod created
1.2、使用多个资源清单创建资源
[root@k8s-master ~]# cat dev2.yaml
---
apiVersion: v1
kind: Namespace
metadata:
name: dev2
[root@k8s-master ~]# cat dev3.yaml
---
apiVersion: v1
kind: Namespace
metadata:
name: dev3
[root@k8s-master ~]# kubectl apply -f ./dev2.yaml -f ./dev3.yaml
namespace/dev2 created
namespace/dev3 created
1.3、使用目录下所有的资源清单创建资源
[root@k8s-master ~]# cat /tmp/svc-nginx.yaml
apiVersion: v1
kind: Service
metadata:
name: svc-nginx
namespace: dev1
spec:
clusterIP: 172.16.100.100 #固定svc的内网ip
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: ClusterIP
[root@k8s-master ~]# cat /tmp/svc-nginx2.yaml
apiVersion: v1
kind: Service
metadata:
name: svc-nginx1
namespace: dev1
spec:
clusterIP: 172.16.200.200 #固定svc的内网ip
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
app: nginx
type: NodePort
[root@k8s-master ~]# kubectl apply -f /tmp/
service/svc-nginx created
service/svc-nginx1 created
1.4、使用url创建资源
https://raw.githubusercontent.com/kubernetes/kubernetes/release-1.4/hack/testdata/recursive/pod/busybox.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox0
labels:
app: busybox0
spec:
containers:
- image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
[root@k8s-master ~]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/release-1.4/hack/testdata/recursive/pod/busybox.yaml
pod/busybox0 created
1.5、从标准输入创建多个YAML对象
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: busybox-sleep
spec:
containers:
- name: busybox
image: busybox:1.28
args:
- sleep
- "1000000"
---
apiVersion: v1
kind: Pod
metadata:
name: busybox-sleep-less
spec:
containers:
- name: busybox
image: busybox:1.28
args:
- sleep
- "1000"
EOF
1.6、启动一个nginx实例
[root@k8s-master ~]# kubectl run nginx --image=nginx
pod/nginx created
1.7、获取pod和svc的文档
kubectl explain pods
2、查看和查找资源
2.1、列出namespace中所有的pod
kubectl get pods -A
kubectl get pods --all-namespaces
2.2、列出pod并显示详细信息
kubectl get pods -o wide
2.3、列出指定的deployment
[root@k8s-master ~]# kubectl create deploy nginx-deploy --image=nginx --port=8082 --replicas=5 -n dev1
deployment.apps/nginx-deploy created
[root@k8s-master ~]# kubectl get deploy nginx-deploy -n dev1
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deploy 5/5 5 5 4m5s
2.4、查看node节点信息
kubectl describe nodes
2.5、查看pod详细信息
kubectl describe pods
2.6、列出所有的Service并按照名称排列
kubectl get svc --sort-by=.metadata.name -A
kubectl get svc --sort-by=.metadata.name --all-namespaces
2.7、根据重启次数排序列出pod
kubectl get pods --sort-by='.status.containerStatuses[0].restartCount' --all-namespaces
2.8、获取所有节点的ExternalIP
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternlIP")].address}'
2.9、 列举所有 PV 持久卷,按容量排序
kubectl get pv --sort-by=.spec.capacity.storage
3、编辑资源
3.1、edit编辑
#编辑dev1命名空间下名称为svc-nginx1的Service
kubectl edit svc/svc-nginx1 -n dev1
3.2、使用其他编辑器
#使用vim编辑API资源
KUBE_EDITOR="vim" kubectl edit svc/svc-nginx1 -n dev1
4、对资源进行扩缩
4.1、对资源进行扩缩
#将名为nginx-deploy的deployment副本数缩为3个
kubectl scale --replicas=3 deploy/nginx-deploy -n dev1
4.2、同时扩展多个资源
kubectl scale --replicas=5 rc/foo rc/bar rc/baz
4.3、根据判断条件扩展
#如果名为 mysql 的 Deployment 的副本当前是 2,那么将它扩缩到 3
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql
5、删除资源
5.1、删除指定的资源
#删除deploy-nginx控制器
[root@k8s-master ~]# kubectl delete deploy nginx-deploy -n dev1
deployment.apps "nginx-deploy" deleted
5.2、删除在资源清单指定的资源
[root@k8s-master ~]# kubectl delete -f dev3.yaml
namespace "dev3" deleted
6、kubectl与运行中的pod交互
6.1、获取pod日志
#持续查看Pod kube-flannel-ds-mn2bs的日志
kubectl logs -f kube-flannel-ds-mn2bs -n kube-system
6.2、获取含 name=myLabel 标签的 Pod 的日志(标准输出)
kubectl logs -l name=myLabel
6.3、交互式的进入容器
kubectl exec -it pod1 -n dev1 -- /bin/bash
6.4、显示默认命名空间中所有 Pod 的度量值
kubectl top pod
7、从容器中复制文件和目录
7.1、将本地/tmp/test文件复制到dev1命名空间中pod1的/tmp/下
7.2、将/tmp/test从远程pod1复制到本地的/etc/bar
kubectl cp dev1/pod1:/tmp/test etc/bar
kubectl cp
要求容器镜像中存在 “tar” 二进制文件。如果 “tar” 不存在,kubectl cp
将失败。对于进阶用例,例如符号链接、通配符扩展或保留文件权限,需要考虑使用
kubectl exec
。
8、与Deployments进行交互
8.1、获取一个Deployment的Pod的日志
#获取dev2命名空间下nginx-deploy的Deployment的Pod日志
kubectl logs deploy/nginx-deploy -n dev2
8.2、获取一个 Deployment 的 Pod 的日志(多容器例子)
kubectl logs <pod-name> -c <container-name> -n namespace
kubectl logs nginx-deploy-66b77cb96d-49lcw -c nginx -n dev2
9、与节点和集群进行交互
9.1、显示主控节点和服务的地址
kubectl cluster-info
9.2、将当前集群状态转储到标准输出
kubectl clutser-info dump
9.3、将当前集群状态输出到指定位置
kubectl cluster-info dump --output-directory=/tmp/cluster-state
9.4、显示所有节点的度量值
kubectl top node
9.5、查看当前节点上存在的现有污点
kubectl get nodes -o='custom-columns=NodeName:.metadata.name,TaintKey:.spec.taints[*].key,TaintValue:.spec.taints[*].value,TaintEffect:.spec.taints[*].effect'
10、搜索API资源
10.1、列出所支持的全部资源类型
kubectl api-resources
NAME、SHORTNAMES、APIVERSION、NAMESPACED、KIND
10.2、所有命名空间作用域的资源
kubectl api-resources --namespaced=true
10.3、所有非命名空间作用域的资源
kubectl api-resources --namespaced=false
10.4、用简单格式列举所有资源(仅显示资源名称)
kubectl api-resources -o name
10.5、用扩展格式列举所有资源
kubectl api-resources -o wide
10.6、支持 "list" 和 "get" 请求动词的所有资源
kubectl api-resources --verbs=list,get
11、格式化输出
要以特定格式将详细信息输出到终端窗口,将
-o
(或者--output
)参数添加到支持的kubectl
命令中。
输出格式 | 描述 |
---|---|
-o=custom-columns=<spec> |
使用逗号分隔的自定义列来打印表格 |
-o=custom-columns-file=<filename> |
使用 <filename> 文件中的自定义列模板打印表格 |
-o=go-template=<template> |
打印在 golang 模板中定义的字段 |
-o=go-template-file=<filename> |
打印在 <filename> 文件中由 golang 模板定义的字段 |
-o=json |
输出 JSON 格式的 API 对象 |
-o=jsonpath=<template> |
打印 jsonpath 表达式中定义的字段 |
-o=jsonpath-file=<filename> |
打印在 <filename> 文件中定义的 jsonpath 表达式所指定的字段 |
-o=name |
仅打印资源名称而不打印其他内容 |
-o=wide |
以纯文本格式输出额外信息,对于 Pod 来说,输出中包含了节点名称 |
-o=yaml |
输出 YAML 格式的 API 对象 |
以使用
-o=custom-columns
为例
11.1、查看集群中运行着的所有镜像
kubectl get pods -A -o=custom-columns='DATA:spec.containers[*].image'
11.2、列举 default 名字空间中运行的所有镜像,按 Pod 分组
kubectl get pods --namespace default --output=custom-columns="NAME:.metadata.name,IMAGE:.spec.containers[*].image"
11.3、输出 metadata 下面的所有字段
kubectl get pods -A -o=custom-columns='DATA:metadata.*'
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了