# kubectl 概述

kubectl 用于运行 k8s 集群命令的管理工具。本文概述涵盖了 kubectl 语法,对命令操作的描述,并列举的常见例子。有关每个命令的详细信息,包括支持的所有 flags 和子命令,请查阅 kubectl 命令参考文档。有关安装说明,请参阅安装 kubectl。

# 语法

在管理工具界面使用 kubectl 语法运行如下命令:

kubectl [command] [TYPE] [NAME] [flags]

其中 command,TYPE,NAME,和 flags 都是:* command:指定要在一个或多个资源执行的操作,例如操作 create,get,describe,delete。* TYPE:指定资源类型 Resource types。Resource types 会区分大小写,也可以指定单数,复数或缩写的形式。例如,以下命令将输出相同的结果:

shell $ kubectl get pod pod1 $ kubectl get pods pod1 $ kubectl get po pod1
  • NAME:指定 Resource 的 Name。Name 区分大小写,如果省略 Name,则显示所有资源的详细信息,例如:
$ kubectl get pods

当在多个资源上执行操作时,可以通过 type 和 name 指定每个资源,或者指定一个或多个 file:通过 type 和 name 指定的资源:如果它们都是相同的 type,就可以对资源进行分组 TYPE1 name1 name2 name<#>

  • 例:$ kubectl get pod example-pod1 example-pod2 *单独指定多种资源type:TYPE1/name1 TYPE1/name2 TYPE2/name3 TYPE<#>/name<#>
  • 例:$ kubectl get pod/example-pod1 replicationcontroller/example-rc1 *使用一个或多个 file 来指定资源:-f file1 -f file2 -f file<#> 使用 YAML 而不是 JSON,因为 YAML 往往更容易掌握也对用户更友好,特别是对于配置文件。
  • 例:$ kubectl get pod -f ./pod.yaml * flags:指定可选 flags。例如,你可以使用-s--server flag来指定 k8s API Server 的地址和端口。

提示:命令行指定的 flags 将覆盖默认值和任何相应的环境变量。

如果需要更多相关帮助,只需从终端命令窗口运行 kubectl help

# Operations

下表包括了所有 kubectl 操作简短描述和通用语法:

Operation Syntax Description
annotate kubectl annotate (-f FILENAME | TYPE NAME | TYPE/NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--overwrite] [--all] [--resource-version=version] [flags] 为一个或多个资源添加注释
api-versions kubectl api-versions [flags] 列出支持的 API 版本。
apply kubectl apply -f FILENAME [flags] 对文件或 stdin 的资源进行配置更改。
attach kubectl attach POD -c CONTAINER [-i] [-t] [flags] 连接到一个运行的容器,既可以查看 output stream,也可以与容器(stdin)进行交互。
autoscale kubectl autoscale (-f FILENAME | TYPE NAME | TYPE/NAME) [--min=MINPODS] --max=MAXPODS [--cpu-percent=CPU] [flags] 自动扩容/缩容由 replication controller 管理的一组 pod。
cluster-info kubectl cluster-info [flags] 显示有关集群中 master 和 services 的终端信息。
config kubectl config SUBCOMMAND [flags] 修改 kubeconfig 文件。有关详细信息,请参阅各个子命令。
create kubectl create -f FILENAME [flags] 从 file 或 stdin 创建一个或多个资源。
delete kubectl delete (-f FILENAME | TYPE [NAME | /NAME | -l label | --all]) [flags] 从 file,stdin 或指定 label 选择器,names,resource 选择器或 resources 中删除 resources。
describe kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | /NAME | -l label]) [flags] 显示一个或多个 resources 的详细状态。
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 [--include-extended-apis=true] [--recursive=false] [flags] 获取各种资源的文档。例如 pod,node,services 等
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] 将 replication controller,service 或 pod 作为一个新的 k8s service 显示。
get kubectl get (-f FILENAME | TYPE [NAME | /NAME | -l label]) [--watch] [--sort-by=FIELD] [[-o | --output]=OUTPUT_FORMAT] [flags] 列出一个或多个资源。
label kubectl label (-f FILENAME | TYPE NAME | TYPE/NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--overwrite] [--all] [--resource-version=version] [flags] 添加或更新一个或多个资源的 flags。
logs kubectl logs POD [-c CONTAINER] [--follow] [flags] 在 pod 中打印容器的日志。
patch kubectl patch (-f FILENAME | TYPE NAME | TYPE/NAME) --patch PATCH [flags] 使用 strategic merge 补丁程序更新资源的一个或多个字段。
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] 在 k8s API 服务器运行代理。
replace kubectl replace -f FILENAME 从 file 或 stdin 替换资源。
rolling-update kubectl rolling-update OLD_CONTROLLER_NAME ([NEW_CONTROLLER_NAME] --image=NEW_CONTAINER_IMAGE | -f NEW_CONTROLLER_SPEC) [flags] 通过逐步替换指定的 replication controller 及其 pod 来执行滚动更新。
run kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [flags] 在集群上运行指定的镜像。
scale kubectl scale (-f FILENAME | TYPE NAME | TYPE/NAME) --replicas=COUNT [--resource-version=version] [--current-replicas=count] [flags] 更新指定 replication controller 的大小。
stop kubectl stop 已弃用:请参阅 kubectl delete。
version kubectl version [--client] [flags] 显示客户端和服务器上运行的 k8s 版本。

提示:有关更多命令信息,请参阅 kubectl 参考文档。

# Resource types

下表列出了所有支持的资源类型及其缩写:

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

# 输出选项 Output options

使用以下部分来了解如何格式化或对某些命令的输出进行排序。关于哪些命令支持什么输出选项,请查阅 kubectl 参考文档。

# 格式化输出 Formatting output

所有 kubectl 命令输出的默认格式是可读的纯文本格式。要以特定的格式向终端窗口输出详细信息,可以将-o 或-output flags 添加到支持的 kubectl 命令中。

语法:

kubectl [command] [TYPE] [NAME] -o=<output_format>

根据 kubectl 操作,支持以下输出格式:

输出格式 描述
-o=custom-columns=<spec> 使用逗号分隔的 custom columns 列表打印一个表。
-o=custom-columns-file=<filename> 使用文件中的 custom columns 模板打印表<filename>
-o=json 输出 JSON 格式的 API 对象。
-o=jsonpath=<template> 打印在 jsonpath 表达式中定义的字段。
-o=jsonpath-file=<filename> 打印由 file 中的 jsonpath 表达式定义的字段<filename>
-o=name 仅打印资源名称,而不打印其他内容。
-o=wide 以纯文本格式输出任何附加信息。对于 pod,包括 node 名称。
-o=yaml 输出 YAML 格式的 API 对象。

例如:

在此示例中,以下命令将单个 pod 的详细信息作为 YAML 格式化对象输出:

$ kubectl get pod web-pod-13je7 -o=yaml

注意:有关每个命令支持哪种输出格式的详细信息,请参阅 kubectl 参考文档。

# Custom columns

要定义 custom columns 并仅将所需的详细信息输出,可以使用该 custom-columns 选项,选择 Inline 定义 custom columns 或使用模板文件定义:-o=custom-columns=<spec>-o=custom-columns-file=<filename>

例如

Inline 方式:

$ 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

# 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

# 示例:常用操作

使用以下一组示例来帮助你熟悉运行 kubectl 常用操作:

kubectl create - 从 file 或 stdin 中创建资源。

// Create a service using the definition in example-service.yaml.
$ kubectl create -f example-service.yaml

// Create a replication controller using the definition in example-controller.yaml.
$ kubectl create -f example-controller.yaml

// Create the objects that are defined in any .yaml, .yml, or .json file within the <directory> directory.
$ kubectl create -f <directory>

kubectl get 列出一个或多个资源。

// List all pods in plain-text output format.
$ kubectl get pods

// List all pods in plain-text output format and includes additional information (such as node name).
$ kubectl get pods -o wide

// List the replication controller with the specified name in plain-text output format. Tip: You can shorten and replace the 'replicationcontroller' resource type with the alias 'rc'.
$ kubectl get replicationcontroller <rc-name>

// List all replication controllers and services together in plain-text output format.
$ kubectl get rc,services

kubectl describe - 显示一个或多个资源的详细状态。

// Display the details of the node with name <node-name>.
$ kubectl describe nodes <node-name>

// Display the details of the pod with name <pod-name>.
$ kubectl describe pods/<pod-name>

// Display the details of all the pods that are managed by the replication controller named <rc-name>.
// Remember: Any pods that are created by the replication controller get prefixed with the name of the replication controller.
$ kubectl describe pods <rc-name>

kubectl delete - 从 file、stdin 或指定 label 选择器,names,resource 选择器或 resources 中删除 resources 资源。

// Delete a pod using the type and name specified in the pod.yaml file.
$ kubectl delete -f pod.yaml

// Delete all the pods and services that have the label name=<label-name>.
$ kubectl delete pods,services -l name=<label-name>

// Delete all pods.
$ kubectl delete pods --all

kubectl exec - 对 pod 中的容器执行命令。

// Get output from running 'date' from pod <pod-name>. By default, output is from the first container.
$ kubectl exec <pod-name> date

// Get output from running 'date' in container <container-name> of pod <pod-name>.
$ kubectl exec <pod-name> -c <container-name> date

// Get an interactive TTY and run /bin/bash from pod <pod-name>. By default, output is from the first container.
$ kubectl exec -ti <pod-name> /bin/bash

kubectl logs - 打印 pod 中的容器的日志。

// Return a snapshot of the logs from pod <pod-name>.
$ kubectl logs <pod-name>

// Start streaming the logs from pod <pod-name>. This is similar to the 'tail -f' Linux command.
$ kubectl logs -f <pod-name>
Last Updated: 4/15/2023, 8:33:17 PM