kubectl命令行工具用法

kubectl命令行工具用法

kubectl作为客户端CLI工具,可以让用户通过命令行对Kubernetes集群进行操作。

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 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
componentstatusescs
configmapscm
daemonsetsds
deploymentsdeploy
endpointsep
eventsev
horizontalpodautoscalershpa
ingressesing
jobs
limitrangeslimits
nodesno
namespacesns
networkpolicies
statefulsets
persistentvolumeclaimspvc
persistentvolumespv
podspo
podsecuritypoliciespsp
podtemplates
replicasets|replicationcontrollersrs|rc
resourcequotasquota
cronjob
secrets
serviceaccounts
servicessvc
storageclasssessc
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

2 kubectl子命令详解

kubectl的子命令非常丰富,涵盖了对Kubernetes集群的主要操作,包括资源对象的创建、删除、查看、修改、配置、运行等。详细的子命令如下所示:

子命令语法说明
annotatekubectl annotate (-f FILENAME|TYPE NAME|TYPE/NAME) KEY_1=VAL_1 … KEY_N=VAL_N [–overwrite] [–all] [–resource-version=version] [flags]添加或更新资源对象的annotation信息
api-versionskubectl api-version [flags]列出当前系统支持的API版本列表,格式为“group/cersion”
applykubectl apply -f FILENAME [flags]从配置文件或stdin中对资源对象进行配置更新
attachkubectl attach POD -c CONTAINER [flags]附着到一个正在运行的容器上
authkubectl auth [flags] [options]检测RBAC权限设置
autoscalekubectl autoscale (-f FILENAME|TYPE NAME|TYPE/NAME) [–min=MINPODS] [–max=MAXPODS] [–cpu-percent=CPU] [flags]对Deployment、ReplicaSet或ReplicationController进行水平自动扩容和缩容的设置
cluster-infokubectl cluster-info [flags]显示集群master和内置服务的信息
completionkubectl completion SHELL [flags]输出shell命令的执行结果码(bash或zsh)
configkubectl config SUBCOMMAND [flags]修改kubeconfig文件
convertkubectl convert -f FILENAME [flags]转换配置文件为不同的API版本
cordonkubectl cordon NODE [flags]将NODE标记为unschedulable,即“隔离”出集群调度范围
createkubectl create -f FILENAME [flags]从配置文件或stdin中创建资源对象
deletekubectl delete (-f FILENAME|TYPE [NAME| -l label|–all]) [flags]根据配置文件、stdin、资源名称或label selector删除资源对象
describekubectl describe (-f FILENAME|[NAME_PREFIX|NAME|-l label]) [flags]描述一个或多个资源对象的详细信息
diffkubectl diff -f FILENAME [options]查看配置文件与当前系统中正在运行的资源对象的差异
drainkubectl drain NODE [flags]首先将NODE设为unschedulable,然后删除在该NODE上运行的所有Pod,但不会删除不由API Server管理的Pod
editkubectl edit (-f FILENAME|TYPE NAME|TYPE/NAME) [flags]编辑资源的对象属性,在线更新
execkubectl exec POD [-c CONTAINER] [-i] [-t] [flags] [–COMMAND [args…]]执行一个容器中的命令
explainkubectl explain [–include-extend-apis=true] [–recursive=false] [flags]对资源对象属性的详细说明
exposekubectl 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
getkubectl get (-f FILENAME|TYPE NAME|TYPE [NAME|-l label]) [–watch] [–sort-by=FILED] [[-o|–output]=OUTPUT_FORMAT]显示一个或多个资源对象的概要信息
labelkubectl label (-f FILENAME|TYPE NAME|TYPE/NAME) KEY_1=VAL_1…KEY_N=VAL_N [–overwrite] [–all] [–resource-version=version] [flags]设置或更新资源对象的labels
logskubectl logs POD [-c CONTAINER] [–fllow] [flags]在屏幕上打印一个容器的日志
patchkubectl patch (-f FILENAME|TYPE NAME|TYPE/NAME) --patch PATCH [flags]以merge形式对资源对象的部分字段的值进行修改
pluginkubectl plugin [flags] [options]在kubectl命令行使用用户自定义的插件
port-forwardkubectl port-forward POD [LOCAL_PORT:]REMOTE_PORT […[LOCAL_PORT_N:]REMOTE_PORT_N] [flags]将本地的某个端口号映射到Pod的端口号,通常用于测试
proxykubectl proxy [–port=PORT] [–www=static-dir] [–www-prefix=prefix] [–api-prefix=prefix] [flags]将本机某个端口映射给API Server
replacekubectl replace -f FILENAME [flags]从配置文件或stdin替换资源对象
rolling-updatekubectl rolling-update OLD_CONTROLLER_NAME ([NEW_CONTROLLER_NAME] --image=NEW_CONTROLLER_IMAGE|-f NEW_CONTROLLER_SPEC) [flags]对RC进行滚动升级
rolloutkubectl rollout SUBCOMMAND [flags]对Deployment进行管理,可用操作包括:history、pause、resume、undo、status
runkubectl run NAME --image=image [–env=“key=value”] [–port=port] [–replicas=replicas] [–dry-run=bool] [–overrides=inline-json] [flags]基于一个镜像在kubernetes集群上启动一个Deployment
scalekubectl scale (-f FILENAME|TYPE NAME|TYPE/NAME) --replicas=COUNT [–resource-version=version] [–current-repilcas=count] [flags]扩容或缩容一个Deployment、ReplicaSet、RC或Job中的Pod的数量
setkubectl set SUBCOMMAND [flags]设置资源对象的某个特定信息。目前仅支持修改容器的镜像
taintkubectl taint NODE NAME KEY_1=VAL_1:TAINT_EFFECT_1…KEY_N=VAL_N:TAINT_EFFECT_N [flags]设置NODE的taint信息,用于将特定的Pod调度到特定的Node的操作
topkubectl top node
kubectl top pod
查看Node或Pod的资源使用情况需要在集群中运行Metrics Server
uncordonkubectl uncordon NODE [flags]将Node设置为schedulable
versionkubectl version [–client] [flags]打印系统版本信息

3 kubectl参数列表

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=0glog日志级别
–vmodule=glog基于模块的详细日志级别
–user=’’指定用户名

每个子命令(如create、delete、get等)还有特定的flags参数,可以通过 kubectl [command] --help命令进行查看。

4 kubectl输出格式

kubectl命令可以用多种格式对结果进行显示,输出的格式通过-o参数指定:

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

根据不同子命令的输出结果,可选的输出格式如下所示。

输出格式说明
-o=custom-columns=根据自定义列名进行输出,以逗号分隔
-o=custom-columns-file=从文件中获取自定义列名进行输出
-o=json
-o=jsonpath=<template
以json格式显示结果
输出jsonpath表达式定义的字段信息
-o=jsonpath-file=输出jsonpath表达式定义的字段信息,来源于文件
-o=name仅输出资源对象的名称
-o=wide输出额外信息,对于pod,将输出所在的node信息
-o=yaml以yaml格式显示结果

常用的输出格式示例如下。

(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,RSPC:.metadata.resourceVsersion

(4)基于文件的自定义列名输出:

kubectl get pod <pod_name> -o=custom-columns-file=template.txt

template.txt文件的内容为:

NAME               RSRC
metadata.name      metadata.resourceVersion

另外,可以将输出结果按某个字段排序,通过–sort-by参数以jsonpath表达式进行指定:

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

例如,按照名称进行排序:

kubectl get pods --sort-by=.metadata.resourceVersion

5 kubectl操作示例

(1)创建资源对象

根据YAML配置文件一次性创建Service和RC:

kubectl create -f my-service.yaml -f my-rc.yaml

根据目录下所有.yaml、.yml、.json文件的定义进行创建:

kubectl create -f <directory>

(2)查看资源对象

查看所有Pod列表:

kubectl get pods

查看RC和Service列表:

kubectl get service,rc

(3)描述资源对象

显示Node的详细信息:

kubectl describe node <node-name>

显示Pod的详细信息:

kubectl describe pod <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> dete

指定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/<pod-name> 8888:80

(10)在Pod和本地之间复制文件

把Pod上的/etc/fstab复制到本地的/tmp目录:

kubectl cp <pod-name>:<remote-filepath> <local-filepath>

(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命令行工具用法详解


版权声明:本文为weixin_42143049原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。