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 插件。