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

2 kubectl子命令详解

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] 打印系统版本信息

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

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

4 kubectl输出格式

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

5 kubectl操作示例

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

你可能感兴趣的:(k8s)