2.10 kubectl命令行工具用法详解
kubectl作为客户端CLI工具,可以让用户通过命令行对Kubernetes集群进行操作。本节对kubectl的子命令和用法进行详细说明。
2.10.1 kubectl用法概述
kubectl命令行的语法如下:
$ kubectl [command] [TYPE] [NAME] [flags]
其中,command、TYPE、NAME、flags的含义如下。
(1)command:子命令,用于操作Kubernetes集群资源对象的命令,例如create、delete、describe、get、apply等。
(2)TYPE:资源对象的类型,区分大小写,能以单数、复数或者简写形式表示。例如以下3种TYPE是等价的。
$ kubectl get pod pod1 $ kubectl get pods pod1 $ kubectl get po pod1
(3)NAME:资源对象的名称,区分大小写。如果不指定名称,系统则将返回属于TYPE的全部对象的列表,例如$ kubectl get pods将返回所有Pod的列表。
(4)flags:kubectl子命令的可选参数,例如使用“-s”指定API Server的URL地址而不用默认值。
kubectl可操作的资源对象类型及其缩写如表2.9所示。
表2.9 kubectl可操作的资源对象类型及其缩写
在一个命令行中也可以同时对多个资源对象进行操作,以多个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
2.10.2 kubectl子命令详解
kubectl的子命令非常丰富,涵盖了对Kubernetes集群的主要操作,包括资源对象的创建、删除、查看、修改、配置、运行等。详细的子命令如表2.10所示。
表2.10 kubectl子命令详解
续表
续表
续表
2.10.3 kubectl参数列表
kubectl命令行的公共启动参数如表2.11所示。
表2.11 kubectl命令行的公共启动参数
每个子命令(如create、delete、get等)还有特定的flags参数,可以通过$ kubectl [command] --help命令进行查看。
2.10.4 kubectl输出格式
kubectl命令可以用多种格式对结果进行显示,输出的格式通过-o参数指定:
$ kubectl [command] [TYPE] [NAME] -o=<output_format>
根据不同子命令的输出结果,可选的输出格式如表2.12所示。
表2.12 kubectl命令的可选输出格式列表
常用的输出格式示例如下。
(1)显示Pod的更多信息:
$ kubectl get pod <pod-name> -o wide
(2)以YAML格式显示Pod的详细信息:
$ kubectl get pod <pod-name> -o yaml
(3)以自定义列名显示Pod的信息:
$ kubectl get pod <pod-name> -o=custom-columns=NAME:.metadata.name,RSRC:.metadata.resourceVersion
(4)基于文件的自定义列名输出:
$ kubectl get pods <pod-name> -o=custom-columns-file=template.txt
template.txt文件的内容为:
NAME RSRC metadata.name metadata.resourceVersion
输出结果为:
NAME RSRC pod-name 52305
另外,可以将输出结果按某个字段排序,通过--sort-by参数以jsonpath表达式进行指定:
$ kubectl [command] [TYPE] [NAME] --sort-by=<jsonpath_exp>
例如,按照名称进行排序:
$ kubectl get pods --sort-by=.metadata.name
2.10.5 kubectl操作示例
本节将一些常用的kubectl操作作为示例进行说明。
1.创建资源对象
根据YAML配置文件一次性创建Service和RC:
$ kubectl create -f my-service.yaml -f my-rc.yaml
根据<directory>目录下所有.yaml、.yml、.json文件的定义进行创建:
$ kubectl create -f <directory>
2.查看资源对象
查看所有Pod列表:
$ kubectl get pods
查看RC和Service列表:
$ kubectl get rc,service
3.描述资源对象
显示Node的详细信息:
$ kubectl describe nodes <node-name>
显示Pod的详细信息:
$ kubectl describe pods/<pod-name>
显示由RC管理的Pod的信息:
$ kubectl describe pods <rc-name>
4.删除资源对象
基于pod.yaml定义的名称删除Pod:
$ kubectl delete -f pod.yaml
删除所有包含某个Label的Pod和Service:
$ kubectl delete pods,services -l name=<label-name>
删除所有Pod:
$ kubectl delete pods --all
5.执行容器的命令
执行Pod的date命令,默认使用Pod中的第1个容器执行:
$ kubectl exec <pod-name> date
指定Pod中的某个容器执行date命令:
$ kubectl exec <pod-name> -c <container-name> date
通过bash获得Pod中某个容器的TTY,相当于登录容器:
$ kubectl exec -ti <pod-name> -c <container-name> /bin/bash
6.查看容器的日志
查看容器输出到stdout的日志:
$ kubectl logs <pod-name>
跟踪查看容器的日志,相当于tail -f命令的结果:
$ kubectl logs -f <pod-name> -c <container-name>
7.创建或更新资源对象
用法和kubectl create类似,逻辑稍有差异:如果目标资源对象不存在,则进行创建;否则进行更新,例如:
$ kubectl apply -f app.yaml
8.在线编辑运行中的资源对象
可以使用kubectl edit命令编辑运行中的资源对象,例如使用下面的命令编辑运行中的一个Deployment:
$ kubectl edit deploy nginx
在命令执行之后,会通过YAML格式展示该对象的定义和状态,用户可以对代码进行编辑和保存,从而完成对在线资源的直接修改。
9.将Pod的开放端口映射到本地
将集群上Pod的80端口映射到本地的8888端口,在浏览器http://127.0.0.1:8888中就能够访问到容器提供的服务了:
# kubectl port-forward --address 0.0.0.0 \ pod/nginx-6ddbbc47fb-sfdcv 8888:80
10.在Pod和本地之间复制文件
把Pod上的/etc/fstab复制到本地的/tmp目录:
# kubectl cp nginx-6ddbbc47fb-sfdcv:/etc/fstab /tmp
11.资源对象的标签设置
为default namespace设置testing=true标签:
# kubectl label namespaces default testing=true
12.检查可用的API资源类型列表
该命令经常用于检查特定类型的资源是否已经定义,列出所有资源对象类型:
# kubectl api-resources
13.使用命令行插件
为了扩展kubectl的功能,Kubernetes从1.8版本开始引入插件机制,在1.14版本时达到稳定版。
用户自定义插件的可执行文件名需要以“kubectl-”开头,复制到$PATH中的某个目录(如/usr/local/bin),然后就可以通过kubectl <plugin-name>运行自定义插件了。例如,实现一个名为hello的插件,其功能为在屏幕上输出字符串“hello world”:
新建名为kubectl-hello的可执行脚本文件,其内容为
echo "hello world"
复制kubectl-hello文件到/usr/local/bin/目录下,就完成了安装插件的工作。
然后在kubectl命令后带上插件名称就能使用这个插件了:
# kubectl hello hello world
使用kubectl plugin list命令可以查看当前系统中已安装的插件列表:
# 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
更完整的插件开发示例可以从https://github.com/kubernetes/sample-cli-plugin找到。