赞
踩
kubectl
在 k8s 集群中作为 客户端 CLI
工具,可以让用户使用 kubectl 工具执行命令行,并通过使用 k8s API 与 k8s 集群的控制面(kube-controller-manager
)进行通信。
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 可操作的资源对象类型和缩写别名,如下清单所示:
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 的组合表示,例如:
kubectl get pods pod1 pod2
kubectl get pod/pod1 rc/rc1
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 集群,必须有 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 集群环境切换,只需把【集群】、【上下文】和【客户认证】信息配置好,然后调整【当前上下文】确定使用哪个集群环境。
使用 --kubeconfig
指定该 config 文件,即可使用 kubectl 查看对应的集群信息,如下所示:
kubectl --kubeconfig=/config get node
kubectl 的子命令非常丰富,涵盖了对 k8s 集群的主要操作,包括资源对象的创建、删除、查看、配置、运行等,详细命令如下表:
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 或者更高) |
命令补全配置:
yum install bash-completion
bash
source <(kubectl completion bash)
所有 kubectl
命令的默认输出格式都是人类可读的纯文本格式。要以特定格式在终端窗口输出详细信息, 可以将 -o 或 --output
参数添加到受支持的 kubectl
命令中。
语法:
kubectl [command] [TYPE] [NAME] -o <output_format>
取决于具体的 kubectl 操作,支持的输出格式如下:
示例
在此示例中,以下命令将单个 Pod 的详细信息输出为 YAML 格式的对象:
kubectl get pod web-pod-13je7 -o yaml
提示,有关每个命令支持哪种输出格式的详细信息, 请参阅 kubectl 参考文档。
要定义自定义列并仅将所需的详细信息输出到表中,可以使用 custom-columns
选项。 你可以选择内联定义自定义列或使用模板文件:-o custom-columns=<spec>
或 -o custom-columns-file=<filename>
。
示例
kubectl get pods <pod-name> -o custom-columns=NAME:.metadata.name,RSRC:.metadata.resourceVersion
kubectl get pods <pod-name> -o custom-columns-file=template.txt
其中,template.txt
文件包含:
NAME RSRC
metadata.name metadata.resourceVersion
上面这两个命令的运行结果类似如下:
NAME RSRC
submit-queue 610995
kubectl
支持从服务器接收关于对象的特定列信息。 这意味着对于任何给定的资源,服务器将返回与该资源相关的列和行,以便客户端打印。 通过让服务器封装打印的细节,这允许在针对同一集群使用的客户端之间提供一致的人类可读输出。
此功能默认启用。要禁用它,请将该 --server-print=false
参数添加到 kubectl get
命令中。
例子
要打印有关 Pod 状态的信息,请使用如下命令:
kubectl get pods <pod-name> --server-print=false
输出信息:
NAME AGE
pod-name 1m
要将对象排序后输出到终端窗口,可以将 --sort-by
参数添加到支持的 kubectl
命令。 通过使用 --sort-by
参数指定任何数字或字符串字段来对对象进行排序。 要指定字段,请使用 jsonpath
表达式。
语法
kubectl [command] [TYPE] [NAME] --sort-by=<jsonpath_exp>
示例
要打印按名称排序的 Pod 列表,请运行:
kubectl get pods --sort-by=.metadata.name
kubectl 支持 JSONPath
模板。JSONPath
模板由 {}
包起来的 JSONPath
表达式组成。kubectl
使用 JSONPath
表达式来过滤 JSON
对象中的特定字段并格式化输出。 除了原始的 JSONPath
模板语法,以下函数和语法也是有效的:
说明:
关于 JSONPath 更多信息,请查看:https://kubernetes.io/zh-cn/docs/reference/kubectl/jsonpath/
使用以下示例集来帮助你熟悉运行常用 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-hello.sh
(以前缀 “kubectl-” 开始,为 kubectl 创建插件铺垫),里面输入下面信息:kubectl-hello.sh
文件vi kubectl-hello.sh
#!/bin/sh
# 打印单词 "hello world"
echo "hello world"
cat ./kubectl-hello
sudo chmod a+x kubectl-hello.sh
sh kubectl-hello.sh
hello world
你可以用任何编程语言或脚本编写插件,允许你编写命令行命令
。
不需要安装插件或预加载,插件可执行程序从 kubectl
二进制文件接收继承的环境, 插件根据其名称确定它希望实现的命令路径。 例如,名为 kubectl-foo
的插件提供了命令 kubectl foo
。 必须将插件的可执行文件安装在 PATH
中的某个位置。
kubectl 插件编写示例
通过上面的例子,接下来我们继续修改 kubectl-hello.sh
文件(为了区分 kubectl-hello.sh
,新建一个 kubectl-foo
文件步骤和上面类似),在 kubectl-foo
文件中编写如下信息:
#!/bin/bash # 可选的参数处理 if [[ "$1" == "version" ]] then echo "1.0.0" exit 0 fi # 可选的参数处理 if [[ "$1" == "config" ]] then echo $KUBECONFIG exit 0 fi echo "I am a plugin named kubectl-foo"
sudo chmod +x ./kubectl-foo
PATH
中的任何地方:sudo mv ./kubectl-foo /usr/local/bin
kubectl foo
输出信息:
I am a plugin named kubectl-foo
查看可用的所有 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-bar
error: one plugin warning was found
你可以将插件视为在现有 kubectl
命令之上构建更复杂功能的一种方法。
关于 kubectl 插件的更多信息,请查看:https://kubernetes.io/zh-cn/docs/tasks/extend-kubectl/kubectl-plugins/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。