k8s 读书笔记 - kubectl 命令行工具用法详解

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s 读书笔记 - kubectl 命令行工具用法详解相关的知识,希望对你有一定的参考价值。

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
certificatesigningrequestscsr
clusters
clusterrolebindings
clusterroles
componentstatusescs
configmapscm
controllerrevisions
cronjobs
customresourcedefinitioncrd
daemonsetsds
deploymentsdeploy
endpointsep
eventsev
horizontalpodautoscalershpa
ingressesing
jobs
limitrangeslimits
namespacesns
networkpoliciesnetpol
nodesno
persistentvolumeclaimspvc
persistentvolumespv
poddisruptionbudgetpdb
podpreset
podspo
podsecuritypoliciespsp
podtemplates
replicasetsrs
replicationcontrollersrc
resourcequotasquota
rolebindings
roles
secrets
serviceaccountssa
servicessvc
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 stringTLS 使用的客户端证书路径
--client-key stringTLS 使用的客户端密钥文件路径
--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, --helpkubectl 操作的帮助命令
--insecure-skip-tls-verify设置为 true,则表示不会检查服务器证书的有效性。这样会导致你的 HTTPS 连接不安全。
--kubeconfig stringCLI 请求使用的 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 stringAPI 服务器进行基本身份验证的密码
--profile string 默认值: "none"要记录的性能指标的名称。可取 (none
--profile-output string 默认值: "profile.pprof"用于转储所记录的性能信息的文件名
--request-timeout string 默认值: "0"放弃单个服务器请求之前的等待时间,非零值需要包含相应时间单位(例如:1s、2m、3h)。零值则表示不做超时要求。
-s, --server stringKubernetes 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 设置列表,用于过滤文件的日志记录

环境变量

参数说明
KUBECONFIGkubectl 的配置 ("kubeconfig") 文件的路径。默认值: "$HOME/.kube/config"
KUBECTL_COMMAND_HEADERS设置为 false 时,关闭用于详细说明被调用的 kubectl 命令的额外 HTTP 标头 (Kubernetes 版本为 v1.22 或者更高)

kubectl 命令基本分类


命令补全配置:

  1. 1. 安装依赖包

yum install bash-completion
  1. 1. 重新载入下终端

bash
  1. 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. 1. 内联(Inline)方式:

kubectl get pods <pod-name> -o custom-columns=NAME:.metadata.name,RSRC:.metadata.resourceVersion
  1. 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. 1. 使用双引号将 JSONPath 表达式内的文本引起来。

  2. 2. 使用 range,end 运算符来迭代列表。

  3. 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. 1. 编辑 kubectl-hello.sh 文件

vi kubectl-hello.sh
  1. 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" ]]
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"

使用 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-bar

error: one plugin warning was found

你可以将插件视为在现有 kubectl 命令之上构建更复杂功能的一种方法。

关于 kubectl 插件的更多信息,请查看:

https://kubernetes.io/zh-cn/docs/tasks/extend-kubectl/kubectl-plugins/

以上是关于k8s 读书笔记 - kubectl 命令行工具用法详解的主要内容,如果未能解决你的问题,请参考以下文章

云原生k8s集群命令行工具kubectl基础操作命令实践详解

云原生k8s集群命令行工具kubectl之集群管理命令

部署k8s ssl集群实践3:部署kubectl命令工具行

k8s 读书笔记 - kubernetes 基本概念和术语(上)

Kubernetes(K8s) kubectl get 常用命令

K8s kubectl 常用命令总结,建议收藏!