kubectl 在 k8s 集群中作为 客户端 CLI 工具,可以让用户使用 kubectl 工具执行命令行,并通过使用 k8s API 与 k8s 集群的控制面(kube-controller-manager)进行通信。

kubectl 语法格式
kubectl 命令行的语法格式如下:
kubectl [command] [TYPE] [NAME] [flags]其中 command、TYPE、NAME 和 flags 的含义分别如下:
•
command:子命令,用于操作 k8s 集群资源对象的命令,例如create、get、describe、delete。•
TYPE:k8s 集群中资源对象的类型,区分大小写,能以单数、复数或者简写形式表示。例如以下三种类型是等效的。
kubectl get pod pod1
kubectl get pods pod1
kubectl get po pod1•
NAME:k8s 集群中资源对象的名称,区分大小写。如果不指定名称,系统则返回属于TYPE的全部资源对象列表,例如:
# 返回所有 Pod 列表
kubectl get pods•
flags:kubectl 子命令的可选参数。例如使用"-s"指定API Server的URL地址而不用默认值。
kubectl 可操作资源对象类型
kubectl 可操作的资源对象类型和缩写别名,如下清单所示:
| Resource type,资源类型 | Abbreviated alias,缩写别名 |
| apiservices | |
| certificatesigningrequests | csr |
| clusters | |
| clusterrolebindings | |
| clusterroles | |
| componentstatuses | cs |
| configmaps | cm |
| controllerrevisions | |
| cronjobs | |
| customresourcedefinition | crd |
| daemonsets | ds |
| deployments | deploy |
| endpoints | ep |
| events | ev |
| horizontalpodautoscalers | hpa |
| ingresses | ing |
| jobs | |
| limitranges | limits |
| namespaces | ns |
| networkpolicies | netpol |
| nodes | no |
| persistentvolumeclaims | pvc |
| persistentvolumes | pv |
| poddisruptionbudget | pdb |
| podpreset | |
| pods | po |
| podsecuritypolicies | psp |
| podtemplates | |
| replicasets | rs |
| replicationcontrollers | rc |
| resourcequotas | quota |
| rolebindings | |
| roles | |
| secrets | |
| serviceaccounts | sa |
| services | svc |
| statefulsets | |
| storageclasses |
在一个命令行中也可以同时操作多个资源对象,以多个 TYPE 和 NAME 的组合表示,例如:
• 获取多个Pod的信息
kubectl get pods pod1 pod2• 获取多种对象的信息
kubectl get pod/pod1 rc/rc1• 同时应用多个 yaml 文件,以多个 -f file 参数表示
kubectl get pod -f pod1.yaml -f pod2.yaml
kubectl create -f pod1.yaml -f rc1.yaml -f service1.yaml
kubectl apply -f pod1.yaml -f rc1.yaml -f service1.yamlkubectl 连接到 k8s 集群环境
kubectl 想要连接到 k8s 集群,必须有 kubeconfig 配置文件的,里面配置了连接哪个集群,以什么身份进入等信息。
拷贝 kubectl 工具用的 kubeconfig 到默认路径下:
# 在当前目录($HOME)下创建子目录 "/.kube" ,参数-p 确保目录名称存在,不存在的就建一个。
mkdir -p $HOME/.kube
# 拷贝文件到目标目录,并提示用户是否覆盖文件,输入 y 时目标文件将被覆盖。
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 给目标文件目录设定权限
sudo chown $(id -u):$(id -g) $HOME/.kube/configkubeconfig.yaml 文件结构如下:

多个 k8s 集群环境切换,只需把【集群】、【上下文】和【客户认证】信息配置好,然后调整【当前上下文】确定使用哪个集群环境。
• 【集群,cluster】配置集群的相关信息,集群服务器访问IP地址,集群名称;
• 【上下文,contexts】集群名称,进入的用户名,用户角色;
• 【当前上下文,current-context】确定使用哪个集群环境。
• 【客户认证】用户的名称,CA 证书配置。
使用 --kubeconfig 指定该 config 文件,即可使用 kubectl 查看对应的集群信息,如下所示:
kubectl --kubeconfig=/config get node
kubectl 子命令操作(Operations)详解
kubectl 的子命令非常丰富,涵盖了对 k8s 集群的主要操作,包括资源对象的创建、删除、查看、配置、运行等,详细命令如下表:

kubectl 子命令参数列表
kubectl 每个子命令(如 create,delete,get 等)还有特定的 flags 参数,可以通过 kubectl [command] --help 命令查看。
参数列表
| 参数名称 | 说明 |
| --add-dir-header | 设置为 true 表示添加文件目录到日志信息头中 |
| --alsologtostderr | 表示将日志输出到文件的同时输出到 stderr |
| --as string | 以指定用户的身份执行操作 |
| --as-group stringArray | 模拟指定的组来执行操作,可以使用这个标志来指定多个组。 |
| --azure-container-registry-config string | 包含 Azure 容器仓库配置信息的文件的路径。 |
| --cache-dir string | 默认值: "$HOME/.kube/cache" 默认缓存目录 |
| --certificate-authority string | 指向证书机构的 cert 文件路径 |
| --client-certificate string | TLS 使用的客户端证书路径 |
| --client-key string | TLS 使用的客户端密钥文件路径 |
| --cloud-provider-gce-l7lb-src-cidrs cidrs 默认值: 130.211.0.0/22,35.191.0.0/16 | 在 GCE 防火墙中开放的 CIDR,用来进行 L7 LB 流量代理和健康检查。 |
| --cloud-provider-gce-lb-src-cidrs cidrs 默认值: 130.211.0.0/22,209.85.152.0/22,209.85.204.0/22,35.191.0.0/16 | 在 GCE 防火墙中开放的 CIDR,用来进行 L4 LB 流量代理和健康检查。 |
| --cluster string | 要使用的 kubeconfig 集群的名称 |
| --context string | 要使用的 kubeconfig 上下文的名称 |
| --default-not-ready-toleration-seconds int 默认值: 300 | 表示 notReady 状态的容忍度秒数:默认情况下,NoExecute 被添加到尚未具有此容忍度的每个 Pod 中。 |
| --default-unreachable-toleration-seconds int 默认值: 300 | 表示 unreachable 状态的容忍度秒数:默认情况下,NoExecute 被添加到尚未具有此容忍度的每个 Pod 中。 |
| -h, --help | kubectl 操作的帮助命令 |
| --insecure-skip-tls-verify | 设置为 true,则表示不会检查服务器证书的有效性。这样会导致你的 HTTPS 连接不安全。 |
| --kubeconfig string | CLI 请求使用的 kubeconfig 配置文件的路径。 |
| --log-backtrace-at traceLocation 默认值: 0 | 当日志机制运行到指定文件的指定行(file:N)时,打印调用堆栈信息 |
| --log-dir string | 如果不为空,则将日志文件写入此目录 |
| --log-file string | 如果不为空,则将使用此日志文件 |
| --log-file-max-size uint 默认值: 1800 | 定义日志文件的最大尺寸。单位为兆字节。如果值设置为 0,则表示日志文件大小不受限制。 |
| --log-flush-frequency duration 默认值: 5s | 两次日志刷新操作之间的最长时间(秒) |
| --logtostderr 默认值: true | 日志输出到 stderr 而不是文件中 |
| --match-server-version | 要求客户端版本和服务端版本相匹配 |
| -n, --namespace string | 如果存在,CLI 请求将使用此命名空间 |
| --one-output | 如果为 true,则只将日志写入初始严重级别(而不是同时写入所有较低的严重级别)。 |
| --password string | API 服务器进行基本身份验证的密码 |
| --profile string 默认值: "none" | 要记录的性能指标的名称。可取 (none |
| --profile-output string 默认值: "profile.pprof" | 用于转储所记录的性能信息的文件名 |
| --request-timeout string 默认值: "0" | 放弃单个服务器请求之前的等待时间,非零值需要包含相应时间单位(例如:1s、2m、3h)。零值则表示不做超时要求。 |
| -s, --server string | Kubernetes API 服务器的地址和端口 |
| --skip-headers | 设置为 true 则表示跳过在日志消息中出现 header 前缀信息 |
| --skip-log-headers | 设置为 true 则表示在打开日志文件时跳过 header 信息 |
| --stderrthreshold severity 默认值: 2 | 等于或高于此阈值的日志将输出到标准错误输出(stderr) |
| --token string | 用于对 API 服务器进行身份认证的持有者令牌 |
| --user string | 指定使用 kubeconfig 配置文件中的用户名 |
| --username string | 用于 API 服务器的基本身份验证的用户名 |
| -v, --v Level | 指定输出日志的日志详细级别 |
| --version version[=true] | 打印 kubectl 版本信息并退出 |
| --vmodule moduleSpec | 以逗号分隔的 pattern=N 设置列表,用于过滤文件的日志记录 |
环境变量
| 参数 | 说明 |
| KUBECONFIG | kubectl 的配置 ("kubeconfig") 文件的路径。默认值: "$HOME/.kube/config" |
| KUBECTL_COMMAND_HEADERS | 设置为 false 时,关闭用于详细说明被调用的 kubectl 命令的额外 HTTP 标头 (Kubernetes 版本为 v1.22 或者更高) |
kubectl 命令基本分类

命令补全配置:
1. 安装依赖包
yum install bash-completion1. 重新载入下终端
bash1. 执行指令
source <(kubectl completion bash)输出选项(Output options)
格式化输出(Formatting output)
所有 kubectl 命令的默认输出格式都是人类可读的纯文本格式。要以特定格式在终端窗口输出详细信息, 可以将 -o 或 --output 参数添加到受支持的 kubectl 命令中。
语法:
kubectl [command] [TYPE] [NAME] -o <output_format>取决于具体的 kubectl 操作,支持的输出格式如下:

示例
在此示例中,以下命令将单个 Pod 的详细信息输出为 YAML 格式的对象:
kubectl get pod web-pod-13je7 -o yaml提示,有关每个命令支持哪种输出格式的详细信息,请参阅 kubectl 参考文:
https://kubernetes.io/zh-cn/docs/reference/kubectl/kubectl/
自定义列(Custom columns)
要定义自定义列并仅将所需的详细信息输出到表中,可以使用 custom-columns 选项。你可以选择内联定义自定义列或使用模板文件:-o custom-columns=<spec> 或 -o custom-columns-file=<filename>。
示例
1. 内联(Inline)方式:
kubectl get pods <pod-name> -o custom-columns=NAME:.metadata.name,RSRC:.metadata.resourceVersion1. 模板文件方式:
kubectl get pods <pod-name> -o custom-columns-file=template.txt其中,template.txt 文件包含:
NAME RSRC
metadata.name metadata.resourceVersion上面这两个命令的运行结果类似如下:
NAME RSRC
submit-queue 610995Server-side 列
kubectl 支持从服务器接收关于对象的特定列信息。这意味着对于任何给定的资源,服务器将返回与该资源相关的列和行,以便客户端打印。通过让服务器封装打印的细节,这允许在针对同一集群使用的客户端之间提供一致的人类可读输出。
此功能默认启用。要禁用它,请将该 --server-print=false 参数添加到 kubectl get 命令中。
例子
要打印有关 Pod 状态的信息,请使用如下命令:
kubectl get pods <pod-name> --server-print=false输出信息:
NAME AGE
pod-name 1m排序列表对象(Sorting list objects)
要将对象排序后输出到终端窗口,可以将 --sort-by 参数添加到支持的 kubectl 命令。通过使用 --sort-by 参数指定任何数字或字符串字段来对对象进行排序。要指定字段,请使用 jsonpath 表达式。
语法
kubectl [command] [TYPE] [NAME] --sort-by=<jsonpath_exp>示例
要打印按名称排序的 Pod 列表,请运行:
kubectl get pods --sort-by=.metadata.nameJSONPath 支持
kubectl 支持 JSONPath 模板。JSONPath 模板由 {} 包起来的 JSONPath 表达式组成。kubectl 使用 JSONPath 表达式来过滤 JSON 对象中的特定字段并格式化输出。除了原始的 JSONPath 模板语法,以下函数和语法也是有效的:
1. 使用双引号将 JSONPath 表达式内的文本引起来。
2. 使用 range,end 运算符来迭代列表。
3. 使用负片索引后退列表。负索引不会“环绕”列表,并且只要 -index + listLength> = 0 就有效。
说明:
• $ 运算符是可选的,因为默认情况下表达式总是从根对象开始。
• 结果对象将作为其 String() 函数输出。
关于 JSONPath 更多的信息,请查看:
https://kubernetes.io/zh-cn/docs/reference/kubectl/jsonpath/
kubectl 常用命令操作
使用以下示例集来帮助你熟悉运行常用 kubectl 操作:
•
kubectl apply- 以文件或标准输入为准应用或更新资源。
# 使用 example-service.yaml 中的定义创建服务。
kubectl apply -f example-service.yaml# 使用 example-controller.yaml 中的定义创建 replication controller。
kubectl apply -f example-controller.yaml# 使用 <directory> 路径下的任意 .yaml、.yml 或 .json 文件 创建对象。
kubectl apply -f <directory>•
kubectl get- 列出一个或多个资源。
# 以纯文本输出格式列出所有 Pod。
kubectl get pods# 以纯文本输出格式列出所有 Pod,并包含附加信息(如节点名)。
kubectl get pods -o wide# 以纯文本输出格式列出具有指定名称的副本控制器。提示:你可以使用别名 'rc' 缩短和替换 'replicationcontroller' 资源类型。
kubectl get replicationcontroller <rc-name># 以纯文本输出格式列出所有副本控制器和服务。
kubectl get rc,services# 以纯文本输出格式列出所有守护程序集,包括未初始化的守护程序集。
kubectl get ds --include-uninitialized# 列出在节点 server01 上运行的所有 Pod
kubectl get pods --field-selector=spec.nodeName=server01•
kubectl describe- 显示一个或多个资源的详细状态,默认情况下包括未初始化的资源。
# 显示名为 <pod-name> 的 Pod 的详细信息。
kubectl describe nodes <node-name># 显示名为 <pod-name> 的 Pod 的详细信息。
kubectl describe pods/<pod-name># 显示由名为 <rc-name> 的副本控制器管理的所有 Pod 的详细信息。
# 记住:副本控制器创建的任何 Pod 都以副本控制器的名称为前缀。
kubectl describe pods <rc-name># 描述所有的 Pod
kubectl describe pods说明:
kubectl get命令通常用于检索同一资源类别的一个或多个资源。它具有丰富的参数,允许你使用-o 或 --output参数自定义输出格式。你可以指定-w 或 --watch参数以开始监测特定对象的更新。kubectl describe命令更侧重于描述指定资源的许多相关方面。它可以调用对 API 服务器 的多个 API 调用来为用户构建视图。例如,该kubectl describe node命令不仅检索有关节点的信息,还检索在其上运行的 Pod 的摘要,为节点生成的事件等。
•
kubectl delete- 基于文件、标准输入或通过指定标签选择器、名称、资源选择器或资源来删除资源。
# 使用 pod.yaml 文件中指定的类型和名称删除 Pod。
kubectl delete -f pod.yaml# 删除所有带有 '<label-key>=<label-value>' 标签的 Pod 和服务。
kubectl delete pods,services -l <label-key>=<label-value># 删除所有 Pod,包括未初始化的 Pod。
kubectl delete pods --all•
kubectl exec- 对 Pod 中的容器执行命令。
# 从 Pod <pod-name> 中获取运行 'date' 的输出。默认情况下,输出来自第一个容器。
kubectl exec <pod-name> -- date# 运行输出 'date' 获取在 Pod <pod-name> 中容器 <container-name> 的输出。
kubectl exec <pod-name> -c <container-name> -- date# 获取一个交互 TTY 并在 Pod <pod-name> 中运行 /bin/bash。默认情况下,输出来自第一个容器。
kubectl exec -ti <pod-name> -- /bin/bash•
kubectl logs- 打印 Pod 中容器的日志。
# 返回 Pod <pod-name> 的日志快照。
kubectl logs <pod-name># 从 Pod <pod-name> 开始流式传输日志。这类似于 'tail -f' Linux 命令。
kubectl logs -f <pod-name>•
kubectl diff- 查看集群建议更新的差异。
# “pod.json”中包含的差异资源。
kubectl diff -f pod.json# 从标准输入读取的差异文件。
cat service.yaml | kubectl diff -f -关于 kubectl 更多的信息,请查看:
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
kubectl 插件的创建和使用
使用以下示例来帮助你熟悉编写和使用 kubectl 插件。
Linux 环境下 .sh 可执行文件
创建 kubectl 插件之前,先了解下 linux下执行 .sh 文件的方法,举个例子:
• 创建文件
kubectl-hello.sh(以前缀 "kubectl-" 开始,为 kubectl 创建插件铺垫),里面输入下面信息:
1. 编辑
kubectl-hello.sh文件
vi kubectl-hello.sh2. 添加如下内容
#!/bin/sh
# 打印单词 "hello world"
echo "hello world"• 查看 kubectl-hello.sh 文件内容
cat ./kubectl-hello• 给 kubectl-hello.sh 可执行权限
sudo chmod a+x kubectl-hello.sh• 执行命令,本身目录下运行
sh kubectl-hello.sh• 输出信息
hello world编写 kubectl 插件
你可以用任何编程语言或脚本编写插件,允许你编写命令行命令。
不需要安装插件或预加载,插件可执行程序从 kubectl 二进制文件接收继承的环境, 插件根据其名称确定它希望实现的命令路径。例如,名为 kubectl-foo 的插件提供了命令 kubectl foo。必须将插件的可执行文件安装在 PATH 中的某个位置。
kubectl 插件编写示例
通过上面的例子,接下来我们继续修改 kubectl-hello.sh 文件(为了区分 kubectl-hello.sh,新建一个 kubectl-foo 文件步骤和上面类似),在 kubectl-foo 文件中编写如下信息:
#!/bin/bash# 可选的参数处理
if [[ "$1" == "version" ]]
thenecho "1.0.0"exit 0
fi# 可选的参数处理
if [[ "$1" == "config" ]]
thenecho $KUBECONFIGexit 0
fiecho "I am a plugin named kubectl-foo"使用 kubectl 插件
• 授权可执行文件,要使用某插件,先要使其可执行:
sudo chmod +x ./kubectl-foo• 设置环境变量,并将它放在你的
PATH中的任何地方:
sudo mv ./kubectl-foo /usr/local/bin•
kubectl插件调用
kubectl foo输出信息:
I am a plugin named kubectl-foo查看所有可用的 kubectl 插件
查看可用的所有 kubectl 插件:
kubectl plugin list输出类似信息:
The following kubectl-compatible plugins are available:/usr/local/bin/kubectl-hello
/usr/local/bin/kubectl-foo
/usr/local/bin/kubectl-barkubectl plugin list 指令也可以向你告警哪些插件被运行,或是被其它插件覆盖了,例如:
sudo chmod -x /usr/local/bin/kubectl-foo # 删除执行权限
kubectl plugin listThe following kubectl-compatible plugins are available:/usr/local/bin/kubectl-hello
/usr/local/bin/kubectl-foo- warning: /usr/local/bin/kubectl-foo identified as a plugin, but it is not executable
/usr/local/bin/kubectl-barerror: one plugin warning was found你可以将插件视为在现有 kubectl 命令之上构建更复杂功能的一种方法。
关于 kubectl 插件的更多信息,请查看:
https://kubernetes.io/zh-cn/docs/tasks/extend-kubectl/kubectl-plugins/