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.yaml
kubectl 连接到 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/config
kubeconfig.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-completion
1. 重新载入下终端
bash
1. 执行指令
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.resourceVersion
1. 模板文件方式:
kubectl get pods <pod-name> -o custom-columns-file=template.txt
其中,template.txt
文件包含:
NAME RSRC
metadata.name metadata.resourceVersion
上面这两个命令的运行结果类似如下:
NAME RSRC
submit-queue 610995
Server-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.name
JSONPath 支持
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.sh
2. 添加如下内容
#!/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-bar
kubectl plugin list
指令也可以向你告警哪些插件被运行,或是被其它插件覆盖了,例如:
sudo chmod -x /usr/local/bin/kubectl-foo # 删除执行权限
kubectl plugin list
The 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/