Kubectl常用命令

Kubectl 是一个命令行接口,用于对 Kubernetes 集群运行命令。kubectl 在 $HOME/.kube 目录中寻找一个名为 config 的文件。

kubectl语法

kubectl基本语法如下、我们可以从终端窗口运行下面的命令:

# kubectl 语法格式
kubectl [command] [TYPE] [NAME] [flags]

其中 command、TYPE、NAME 和 flags 分别是:

  • command:指定要对一个或多个资源执行的操作,例如 create、get、describe、delete;
  • TYPE:指定资源类型。资源类型不区分大小写,可以指定单数、复数或缩写形式;
  • NAME:指定资源的名称。名称区分大小写。如果省略名称,则显示所有资源的详细信息 kubectl get pods。 在对多个资源执行操作时,可以按类型和名称指定每个资源,或指定一个或多个文件;
  • flags:指定可选的参数。例如,可以使用 -s 或 -server 参数指定 Kubernetes API 服务器的地址和端口;

注:从命令行指定的参数会覆盖默认值和任何相应的环境变量。

kubectl基本操作

# 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 列出可用的API版本
kubectl api-versions [flags]

# apply 从文件或stdin对资源应用配置更改
kubectl apply -f FILENAME [flags]

# attach 附加到正在运行的容器,查看输出流或与容器(stdin)交互
kubectl attach POD -c CONTAINER [-i] [-t] [flags]

# autoscale 自动伸缩由副本控制器管理的一组pod
kubectl autoscale (-f FILENAME | TYPE NAME | TYPE/NAME) [–min=MINPODS] –max=MAXPODS [–cpu-percent=CPU] [flags]

# cluster-info 显示有关集群中主服务器和服务的端口信息
kubectl cluster-info [flags]

# config 修改kubeconfig文件,有关详细信息,可以参考子命令
kubectl config SUBCOMMAND [flags]

# create 从文件或 stdin 创建一个或多个资源
kubectl create -f FILENAME [flags]

# delete 从文件、标准输入或指定标签选择器、名称、资源选择器或资源中删除资源
kubectl delete (-f FILENAME | TYPE [NAME | /NAME | -l label | –all]) [flags]

# describe 显示一个或多个资源的详细状态
kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | /NAME | -l label]) [flags]

# diff 将 live 配置和文件或标准输入做对比 (BETA)
kubectl diff -f FILENAME [flags]

# edit 使用默认编辑器编辑和更新服务器上一个或多个资源的定义
kubectl edit (-f FILENAME | TYPE NAME | TYPE/NAME) [flags]

# exec 对 pod 中的容器执行命令
kubectl exec POD [-c CONTAINER] [-i] [-t] [flags] [-- COMMAND [args...]]

# explain 获取多种资源的文档。例如 pod, node, service 等
kubectl explain [--recursive=false] [flags]

# expose 将副本控制器、服务或 pod 作为新的 Kubernetes 服务暴露
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]

# 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]

# logs 在 pod 中打印容器的日志
kubectl logs POD [-c CONTAINER] [--follow] [flags]  

# patch 使用策略合并 patch 程序更新资源的一个或多个字段
kubectl patch (-f FILENAME | TYPE NAME | TYPE/NAME) –patch PATCH [flags]

# port-forward 将一个或多个本地端口转发到一个 pod
kubectl port-forward POD [LOCAL_PORT:]REMOTE_PORT [...[LOCAL_PORT_N:]REMOTE_PORT_N] [flags]

# proxy 运行 Kubernetes API 服务器的代理
kubectl proxy [--port=PORT] [--www=static-dir] [--www-prefix=prefix] [--api-prefix=prefix] [flags]

# replace 从文件或标准输入中替换资源
kubectl replace -f FILENAME

# rolling-update 通过逐步替换指定的副本控制器及其 pod 来执行滚动更新
kubectl rolling-update OLD_CONTROLLER_NAME ([NEW_CONTROLLER_NAME] –image=NEW_CONTAINER_IMAGE | -f NEW_CONTROLLER_SPEC) [flags]

# run 在集群上运行指定的镜像
kubectl run NAME –image=image [–env="key=value”] [–port=port] [–dry-run=server | client | none] [–overrides=inline-json] [flags]

# scale 更新指定副本控制器的大小
kubectl scale (-f FILENAME | TYPE NAME | TYPE/NAME) –replicas=COUNT [–resource-version=version] [–current-replicas=count] [flags]

# stop 不推荐:相反,请参阅 kubectl delete
kubectl stop

# version 显示运行在客户端和服务器上的 Kubernetes 版本
kubectl version [--client] [flags]

注:有关命令操作的更多信息,请参阅 kubectl 参考文档。

kubectl资源类型

资源名 缩写名 API分组 按命名空间 资源类型
componentstatuses cs false ComponentStatus
configmaps cm true ConfigMap
endpoints ep true Endpoints
limitranges limits true LimitRange
namespaces ns false Namespace
nodes no false Node
persistentvolumeclaims pvc true PersistentVolumeClaim
persistentvolumes pv false PersistentVolume
pods po true Pod
podtemplates true PodTemplate
replicationcontrollers rc true ReplicationController
resourcequotas quota true ResourceQuota
secrets true Secret
serviceaccounts sa true ServiceAccount
services svc true Service
mutatingwebhookconfigurations admissionregistration.k8s.io false MutatingWebhookConfiguratio
validatingwebhookconfigurations admissionregistration.k8s.io false ValidatingWebhookConfiguration
customresourcedefinitions crd,crds apiextensions.k8s.io false CustomResourceDefinition
apiservices apiregistration.k8s.io false APIService
controllerrevisions apps true ControllerRevision
daemonsets ds apps true DaemonSet
deployments deploy apps true Deployment
replicasets rs apps true ReplicaSet
statefulsets sts apps true StatefulSet
tokenreviews authentication.k8s.io false TokenReview
localsubjectaccessreviews authentication.k8s.io true LocalSubjectAccessReview
selfsubjectaccessreviews authentication.k8s.io false SelfSubjectAccessReview
selfsubjectrulesreviews authentication.k8s.io false SelfSubjectRulesReview
subjectaccessreviews authentication.k8s.io false SubjectAccessReview
horizontalpodautoscalers hpa autoscaling true HorizontalPodAutoscaler
cronjobs cj batch true CronJob
jobs batch true Job
certificatesigningrequests csr certificates.k8s.io false CertificateSigningRequest
leases coordination.k8s.io true Lease
events ev events.k8s.io true Event
ingresses ing extensions true Ingress
networkpolicies netpol networking.k8s.io true NetworkPolicy
poddisruptionbudgets pdb policy true PodDisruptionBudget
podsecuritypolicies psp policy false PodSecurityPolicy
clusterrolebindings rbac.authorization.k8s.io false ClusterRoleBinding
clusterroles rbac.authorization.k8s.io false ClusterRole
rolebindings rbac.authorization.k8s.io true RoleBinding
roles rbac.authorization.k8s.io true Role
priorityclasses pc scheduling.k8s.io false PriorityClass
storageclasses sc storage.k8s.io false StorageClass
volumeattachments storage.k8s.io false VolumeAttachment

kubectl输出选项

格式化输出

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

基本语法

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

kubectl 支持以下输出格式:

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

例如我们将下面的单个Pod详细信息输出为Yaml格式的对象:

[root@kubernetes-01 work]# kubectl get pod
NAME                         READY   STATUS    RESTARTS   AGE
dnsutils-ds-bc44j            1/1     Running   1          101m
dnsutils-ds-dclhq            1/1     Running   1          101m
dnsutils-ds-p449h            1/1     Running   1          101m
my-nginx-86575b68dc-8qvhs    1/1     Running   0          110m
my-nginx-86575b68dc-nq9fc    1/1     Running   0          110m
nginx-ds-99ck8               1/1     Running   0          13h
nginx-ds-ccx7s               1/1     Running   0          13h
nginx-ds-xz4ft               1/1     Running   0          13h
[root@kubernetes-01 work]# kubectl get pod nginx-ds-99ck8 -o yaml
apiVersion: v1
kind: Pod
metadata:
  annotations:
    cni.projectcalico.org/podIP: 172.30.31.66/32
  creationTimestamp: "2020-05-18T14:46:41Z"
  generateName: nginx-ds-
  labels:
    app: nginx-ds
    controller-revision-hash: 5c55d4f86d
    pod-template-generation: "1"
  name: nginx-ds-99ck8
  namespace: default
  ownerReferences:
  - apiVersion: apps/v1
    blockOwnerDeletion: true
    controller: true
    kind: DaemonSet
    name: nginx-ds
......

排序列表对象

如果我们要将对象排序后输出到终端窗口,可以将 –sort-by 参数添加到支持的 kubectl 命令。通过使用 –sort-by 参数指定任何数字或字符串字段来对对象进行排序。

基本语法

kubectl [command] [TYPE] [NAME] --sort-by=<jsonpath_exp>

例如我们要打印按名称排序的 pod 列表,可以运行下面的命令:

[root@kubernetes-01 work]# kubectl get pods --sort-by=.metadata.name
NAME                         READY   STATUS    RESTARTS   AGE
dnsutils-ds-bc44j            1/1     Running   1          111m
dnsutils-ds-dclhq            1/1     Running   1          111m
dnsutils-ds-p449h            1/1     Running   1          111m
my-nginx-86575b68dc-8qvhs    1/1     Running   0          120m
my-nginx-86575b68dc-nq9fc    1/1     Running   0          120m
nginx-ds-99ck8               1/1     Running   0          13h
nginx-ds-ccx7s               1/1     Running   0          13h
nginx-ds-xz4ft               1/1     Running   0          13h
wordpress-5b886cf59b-5gglp   0/1     Pending   0          129m
[root@kubernetes-01 work]# 

kubectl操作示例

在了解了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 – 显示一个或多个资源的详细状态,默认情况下包括未初始化的资源:

# 显示名称为 <node-name> 的节点的详细信息。
kubectl describe nodes <node-name>

# 显示名为 <pod-name> 的 pod 的详细信息。
kubectl describe pods/<pod-name>

# 显示由名为 <rc-name> 的副本控制器管理的所有 pod 的详细信息。
# 记住:副本控制器创建的任何 pod 都以复制控制器的名称为前缀。
kubectl describe pods <rc-name>

# 描述所有的 pod,不包括未初始化的 pod
kubectl describe pods --include-uninitialized=false

注: kubectl get 命令通常用于检索同一资源类型的一个或多个资源。 它具有丰富的参数,允许您使用 -o–output 参数自定义输出格式。您可以指定 -w–watch 参数以开始观察特定对象的更新。 kubectl describe 命令更侧重于描述指定资源的许多相关方面。它可以调用对 API 服务器 的多个 API 调用来为用户构建视图。 例如,该 kubectl describe node 命令不仅检索有关节点的信息,还检索在其上运行的 pod 的摘要,为节点生成的事件等。

kubectl delete – 从文件、stdin 或指定标签选择器、名称、资源选择器或资源中删除资源:

# 从 pod <pod-name> 中获取运行 'date' 的输出。默认情况下,输出来自第一个容器。
kubectl exec <pod-name> date

# 运行输出 'date' 获取在容器的 <container-name> 中 pod <pod-name> 的输出。
kubectl exec <pod-name> -c <container-name> date

# 获取一个交互 TTY 并运行 /bin/bash <pod-name >。默认情况下,输出来自第一个容器。
kubectl exec -ti <pod-name> /bin/bash

kubectl exec – 对 pod 中的容器执行命令:

# 从 pod 返回日志快照。
kubectl logs <pod-name>

# 从 pod <pod-name> 开始流式传输日志。这类似于 'tail -f' Linux 命令。
kubectl logs -f <pod-name>

创建和使用插件

我们也使用以下示例来编写和使用 kubectl 插件:

# 用任何语言创建一个简单的插件,并为生成的可执行文件命名
# 以前缀 "kubectl-" 开始
cat ./kubectl-hello
#!/bin/bash

# 这个插件打印单词 "hello world"
echo "hello world"

# 我们的插件写好了,让我们把它变成可执行的
sudo chmod +x ./kubectl-hello

# 并将其移动到路径中的某个位置
sudo mv ./kubectl-hello /usr/local/bin

# 我们现在已经创建并"安装"了一个 kubectl 插件。
# 我们可以开始使用我们的插件,从 kubectl 调用它,就像它是一个常规命令一样
kubectl hello

# 我们可以"卸载"一个插件,只需从我们的路径中删除它
sudo rm /usr/local/bin/kubectl-hello

为了查看可用的所有 kubectl 插件,我们可以使用 kubectl plugin list 子命令:

kubectl plugin list

以下 kubectl-适配 的插件是可用的:
/usr/local/bin/kubectl-hello
/usr/local/bin/kubectl-foo
/usr/local/bin/kubectl-bar
# 这个指令也可以警告我们哪些插件
# 被运行,或是被其它插件覆盖了
# 例如
sudo chmod -x /usr/local/bin/kubectl-foo
kubectl plugin list
以下 kubectl-适配 的插件是可用的:

/usr/local/bin/kubectl-hello
/usr/local/bin/kubectl-foo
  - 警告: /usr/local/bin/kubectl-foo 被识别为一个插件,但是它并不可以执行
/usr/local/bin/kubectl-bar

# 错误: 发现了一个插件警告

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

cat ./kubectl-whoami
#!/bin/bash

# 这个插件借用 `kubectl config` 指令来输出
# 当前用户的信息,基于当前指定的 context
kubectl config view --template='{{ range .contexts }}{{ if eq .name "'$(kubectl config current-context)'" }}Current user: {{ .context.user }}{{ end }}{{ end }}'

运行上面的插件为我们提供了一个输出,其中包含我们 KUBECONFIG 文件中当前所选定上下文对应的用户:

# 使文件成为可执行的
sudo chmod +x ./kubectl-whoami

# 然后移动到我们的路径中
sudo mv ./kubectl-whoami /usr/local/bin

kubectl whoami
Current user: plugins-user

当然、要了解关于插件的更多信息,请查看示例 cli 插件

推荐文章