kubectl作为客户端CLI工具,可以让用户通过命令行对Kubernetes集群进行操作。
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 mypod
kubectl get pods mypod
kubectl get po mypod
(3)NAME:资源对象的名称,区分大小写。如果不指定名称,系统则将返回属于TYPE的全部对象的列表,例如:kubectl get pods将返回所有Pod的列表。
(4)flags:kubectl子命令的可选参数,例如使用“-s”指定API Server的URL地址而不用默认值。
kubectl可操作的资源对象类型及其缩写如下所示。
资源对象类型 | 缩写 |
---|---|
clustersx | |
componentstatuses | cs |
configmaps | cm |
daemonsets | ds |
deployments | deploy |
endpoints | ep |
events | ev |
horizontalpodautoscalers | hpa |
ingresses | ing |
jobs | |
limitranges | limits |
nodes | no |
namespaces | ns |
networkpolicies | |
statefulsets | |
persistentvolumeclaims | pvc |
persistentvolumes | pv |
pods | po |
podsecuritypolicies | psp |
podtemplates | |
replicasets|replicationcontrollers | rs|rc |
resourcequotas | quota |
cronjob | |
secrets | |
serviceaccounts | |
services | svc |
storageclassses | sc |
thirdpartyresources |
在一个命令行中也可以同时对多个资源对象进行操作,以多个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 pod2.yaml
kubectl的子命令非常丰富,涵盖了对Kubernetes集群的主要操作,包括资源对象的创建、删除、查看、修改、配置、运行等。详细的子命令如下所示:
子命令 | 语法 | 说明 |
---|---|---|
annotate | kubectl annotate (-f FILENAME|TYPE NAME|TYPE/NAME) KEY_1=VAL_1 … KEY_N=VAL_N [–overwrite] [–all] [–resource-version=version] [flags] | 添加或更新资源对象的annotation信息 |
api-versions | kubectl api-version [flags] | 列出当前系统支持的API版本列表,格式为“group/cersion” |
apply | kubectl apply -f FILENAME [flags] | 从配置文件或stdin中对资源对象进行配置更新 |
attach | kubectl attach POD -c CONTAINER [flags] | 附着到一个正在运行的容器上 |
auth | kubectl auth [flags] [options] | 检测RBAC权限设置 |
autoscale | kubectl autoscale (-f FILENAME|TYPE NAME|TYPE/NAME) [–min=MINPODS] [–max=MAXPODS] [–cpu-percent=CPU] [flags] | 对Deployment、ReplicaSet或ReplicationController进行水平自动扩容和缩容的设置 |
cluster-info | kubectl cluster-info [flags] | 显示集群master和内置服务的信息 |
completion | kubectl completion SHELL [flags] | 输出shell命令的执行结果码(bash或zsh) |
config | kubectl config SUBCOMMAND [flags] | 修改kubeconfig文件 |
convert | kubectl convert -f FILENAME [flags] | 转换配置文件为不同的API版本 |
cordon | kubectl cordon NODE [flags] | 将NODE标记为unschedulable,即“隔离”出集群调度范围 |
create | kubectl create -f FILENAME [flags] | 从配置文件或stdin中创建资源对象 |
delete | kubectl delete (-f FILENAME|TYPE [NAME| -l label|–all]) [flags] | 根据配置文件、stdin、资源名称或label selector删除资源对象 |
describe | kubectl describe (-f FILENAME|[NAME_PREFIX|NAME|-l label]) [flags] | 描述一个或多个资源对象的详细信息 |
diff | kubectl diff -f FILENAME [options] | 查看配置文件与当前系统中正在运行的资源对象的差异 |
drain | kubectl drain NODE [flags] | 首先将NODE设为unschedulable,然后删除在该NODE上运行的所有Pod,但不会删除不由API Server管理的Pod |
edit | kubectl edit (-f FILENAME|TYPE NAME|TYPE/NAME) [flags] | 编辑资源的对象属性,在线更新 |
exec | kubectl exec POD [-c CONTAINER] [-i] [-t] [flags] [–COMMAND [args…]] | 执行一个容器中的命令 |
explain | kubectl explain [–include-extend-apis=true] [–recursive=false] [flags] | 对资源对象属性的详细说明 |
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] | 将已经存在的RC、Service、Deployment或Pod暴露为一个新的Service |
get | kubectl get (-f FILENAME|TYPE NAME|TYPE [NAME|-l label]) [–watch] [–sort-by=FILED] [[-o|–output]=OUTPUT_FORMAT] | 显示一个或多个资源对象的概要信息 |
label | kubectl label (-f FILENAME|TYPE NAME|TYPE/NAME) KEY_1=VAL_1…KEY_N=VAL_N [–overwrite] [–all] [–resource-version=version] [flags] | 设置或更新资源对象的labels |
logs | kubectl logs POD [-c CONTAINER] [–fllow] [flags] | 在屏幕上打印一个容器的日志 |
patch | kubectl patch (-f FILENAME|TYPE NAME|TYPE/NAME) --patch PATCH [flags] | 以merge形式对资源对象的部分字段的值进行修改 |
plugin | kubectl plugin [flags] [options] | 在kubectl命令行使用用户自定义的插件 |
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] | 将本机某个端口映射给API Server |
replace | kubectl replace -f FILENAME [flags] | 从配置文件或stdin替换资源对象 |
rolling-update | kubectl rolling-update OLD_CONTROLLER_NAME ([NEW_CONTROLLER_NAME] --image=NEW_CONTROLLER_IMAGE|-f NEW_CONTROLLER_SPEC) [flags] | 对RC进行滚动升级 |
rollout | kubectl rollout SUBCOMMAND [flags] | 对Deployment进行管理,可用操作包括:history、pause、resume、undo、status |
run | kubectl run NAME --image=image [–env=“key=value”] [–port=port] [–replicas=replicas] [–dry-run=bool] [–overrides=inline-json] [flags] | 基于一个镜像在kubernetes集群上启动一个Deployment |
scale | kubectl scale (-f FILENAME|TYPE NAME|TYPE/NAME) --replicas=COUNT [–resource-version=version] [–current-repilcas=count] [flags] | 扩容或缩容一个Deployment、ReplicaSet、RC或Job中的Pod的数量 |
set | kubectl set SUBCOMMAND [flags] | 设置资源对象的某个特定信息。目前仅支持修改容器的镜像 |
taint | kubectl taint NODE NAME KEY_1=VAL_1:TAINT_EFFECT_1…KEY_N=VAL_N:TAINT_EFFECT_N [flags] | 设置NODE的taint信息,用于将特定的Pod调度到特定的Node的操作 |
top | kubectl top node kubectl top pod |
查看Node或Pod的资源使用情况需要在集群中运行Metrics Server |
uncordon | kubectl uncordon NODE [flags] | 将Node设置为schedulable |
version | kubectl version [–client] [flags] | 打印系统版本信息 |
kubectl命令行的公共启动参数如下所示:
参数名和取值示范 | 说明 | |
---|---|---|
–alsologtostderr=false | 设置为true表示将日志输出到文件的同时输出到stderr | |
–as=’’ | 设置本次操作的用户名 | |
–certificate-authority=’’ | 使用CA授权的cert文件路径 | |
–client-key=’’ | 用于TLS客户端文件路径 | |
–client-certificate=’’ | 用于TLS客户端证书文件路径 | |
–cluster=’’ | 设置使用的kubeconfig中的cluster名 | |
–context=’’ | 设置要使用的kubeconfig中的context名 | |
–insecure-skip-tls-verify=false | 设置为true表示跳过TLS安全验证模式,将使得HTTPS链接不安全 | |
–kubeconfig=’’ | kubeconfig配置文件路径,在配置文件中包括master的地址信息及必要的认证信息 | |
–log-backtrace-at=:0 | 记录日志每到‘file:行号’时打印stack trace | |
–log-dir=’’ | 日志文件路径 | |
–log-flush-frequency=5s | 设置flush日志文件的时间间隔 | |
–logtostderr=true | 设置为true表示将日志输出到stderr,不输出到日志文件 | |
–match-server-version=false | 设置为true表示客户端版本号需要与服务端一致 | |
–namespace=’’ | 设置本次操作所在的namespace | |
–password=’’ | 设置API server的basic authentication的密码 | |
-s,–server=’’ | 设置API server的URL地址,默认值为localhost:8080 | |
–stderrthreshold=2 | 在threshold级别之上的日志输出到stderr | |
–token=’’ | 设置访问API Server的安全token | |
–username=’’ | 设置API Server的basic authentication的用户名 | |
–v=0 | glog日志级别 | |
–vmodule= | glog基于模块的详细日志级别 | |
–user=’’ | 指定用户名 |
每个子命令(如create、delete、get等)还有特定的flags参数,可以通过 kubectl [command] --help命令进行查看。
kubectl命令可以用多种格式对结果进行显示,输出的格式通过-o参数指定:
kubectl [command] [TYPE] [NAME] -o=
根据不同子命令的输出结果,可选的输出格式如下所示。
输出格式 | 说明 | |
---|---|---|
-o=custom-columns= | 根据自定义列名进行输出,以逗号分隔 | |
-o=custom-columns-file= | 从文件中获取自定义列名进行输出 | |
-o=json -o=jsonpath= 以json格式显示结果 |
输出jsonpath表达式定义的字段信息
| |
-o=jsonpath-file= | 输出jsonpath表达式定义的字段信息,来源于文件 | |
-o=name | 仅输出资源对象的名称 | |
-o=wide | 输出额外信息,对于pod,将输出所在的node信息 | |
-o=yaml | 以yaml格式显示结果 |
常用的输出格式示例如下。
(1)显示Pod的更多信息:
kubectl get pod -o wide
(2) 以yaml格式显示pod的详细信息
kubectl get pod -o yaml
(3)以自定义列名显示Pod的信息:
kubectl get pod -o=custom-columns=NAME:.metadata.name,RSPC:.metadata.resourceVsersion
(4)基于文件的自定义列名输出:
kubectl get pod -o=custom-columns-file=template.txt
template.txt文件的内容为:
NAME RSRC
metadata.name metadata.resourceVersion
另外,可以将输出结果按某个字段排序,通过–sort-by参数以jsonpath表达式进行指定:
kubectl [command] [TYPE] [NAME] --sort-by=
例如,按照名称进行排序:
kubectl get pods --sort-by=.metadata.resourceVersion
(1)创建资源对象
根据YAML配置文件一次性创建Service和RC:
kubectl create -f my-service.yaml -f my-rc.yaml
根据目录下所有.yaml、.yml、.json文件的定义进行创建:
kubectl create -f
(2)查看资源对象
查看所有Pod列表:
kubectl get pods
查看RC和Service列表:
kubectl get service,rc
(3)描述资源对象
显示Node的详细信息:
kubectl describe node
显示Pod的详细信息:
kubectl describe pod
显示由RC管理的Pod的信息:
kubectl describe pods
(4)删除资源对象
基于pod.yaml定义的名称删除Pod:
kubectl delete -f pod.yaml
删除所有包含某个Label的Pod和Service:
kubectl delete pods,services -l name=
删除所有Pod:
kubectl delete pods --all
(5)执行容器的命令
执行Pod的date命令,默认使用Pod中的第1个容器执行:
kubectl exec dete
指定Pod中的某个容器执行date命令
kubectl exec -c date
通过bash获得Pod中某个容器的TTY,相当于登录容器:
kubectl exec -ti -c /bin/bash
(6)查看容器的日志
查看容器输出到stdout的日志:
kubectl logs
跟踪查看容器的日志,相当于tail -f命令的结果:
kubectl logs -f -c
(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/ 8888:80
(10)在Pod和本地之间复制文件
把Pod上的/etc/fstab复制到本地的/tmp目录:
kubectl cp :
(11)资源对象的标签设置
为default namespace设置testing=true标签:
kubectl label namespaces default testing=true
(12)检查可用的API资源类型列表
该命令经常用于检查特定类型的资源是否已经定义,列出所有资源对象类型:
kubectl api-resource
(13)使用命令行插件
用户自定义插件的可执行文件名需要以“kubectl-”开头,复制到$PATH中的某个目录(如/usr/local/bin),然后就可以通过kubectl 运行自定义插件了。例如,实现一个名为hello的插件,其功能为在屏幕上输出字符串“hello world”:
新建名为kubectl-hello的可执行脚本文件,其内容为
echo "hello world"
复制kubectl-hello文件到/usr/local/bin/目录下,就完成了安装插件的工作。然后在kubectl命令后带上插件名称就能使用这个插件了:
kubectl hello
使用kubectl plugin list命令可以查看当前系统中已安装的插件列表:
kubectl plugin list
参考书目:
(1)Kubernetes权威指南:kubectl命令行工具用法详解