一、kubectl 命令概述
kubectl 作为客户端CLI工具,可以让用户通过命令行对 Kubernetes 集群进行操作。在实际工作中熟练的使用这些命令去定位 K8s 集群问题时是我们爱不释手的好伴侣,来和我们相互认识下吧。
二、kubectl 用法概述
1、kubectl命令行语法
kubectl [command] [Type] [NAME] [flas]
- command:子命令,用于操作Kubernetes集群资源对象的命 令,例如create、delete、describe、get、apply等。
- TYPE:资源对象的类型,区分大小写,能以单数、复数或者 简写形式表示。
- NAME:资源对象的名称,区分大小写。如果不指定名称, 系统则将返回属于TYPE的全部对象的列表,例如$ kubectl get pods将返 回所有Pod的列表。
- flags:kubectl子命令的可选参数,例如使用“-s”指定API Server的URL地址而不用默认值。
2、kubectl 可操作资源对象及其缩写
资源对象类型 | 缩写 |
---|---|
clusters | |
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 |
persistenvolumes | pv |
pods | po |
podsecuritypolicies | psp |
podtemplates | |
replicasets | rs |
replicationcontrollers | rc |
resourcequotas | quota |
cronjob | |
secrets | |
serviceaccounts | |
services | svc |
storageclasses | sc |
thirdpartyresources |
kubectl在一条命令中操作多个对象示例
#获取多个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
3、kubectl 子命令详解
kubectl 的子命令非常丰富,涵盖了对 Kubernetes 集群的主要操作, 包括资源对象的创建、删除、查看、修改、配置、运行等
子命令 | 语法 | 说明 |
---|---|---|
api-versions | kubectl api-versions [flags] | 列出当前系统支持的API版本列表,格式为group/version |
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)[--min=minPods]--max=maxPods --cpu-percent=CPU | 对Deployment、RelicaSet或ReplicationController进行水平自动扩容或缩容设置 |
cluster-info | kubectl cluster-info [flags] | 显示集群Master和内置服务的信息 |
completion | kubectl completion SHELL[flags] | 输出shell命令的执行结果码 |
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] | 从配置文件中创建资源对象 |
delete | kubectl delete (-f FileName|TYPE NAME|-l label|--all)[flags] | 根据配置文件、资源对象名称或label selector删除资源对象 |
diff | kubectl diff -f FileName[options] | 查看配置文件与当前系统中正在运行的资源对象的差异 |
drain | kubectl drain Node[flags] | 首先将Node设置为unschedulabel,然后删除在该node上运行的所有Pod,但不会删除不由APIServer管理的Pod |
edit | kubectl edit (-f FileName|TYPE NAME)[flags] | 编辑资源对象的属性,在线更新 |
exec | kubectl exec Pod [-c container] -iflags[args...] | 执行一个容器中的命令 |
explain | kubectl explain --include-extended-apis=true[flags] | 对资源对象属性的详细说明 |
expose | kubectl expose(-f FileName|TYPE NAME)--port=port--target-port=number-or-name [----extemal-ip=extemal-ip-of-service] [--type=type] [flags] | 将已经存在的一个 RC、Service、Deployment或Pod暴露为一个新的Service |
get | kubectl get (-f FileName|TYPE NAME|-l label)[--watch] --sort-by=FIELD=OUTPUT_FORMAT] [flags] | 显示一个或多个资源对象的概要信息 |
label | kubectl label (-f FileName|TYPE NAME)Key_1=Val_1 [--overwrite] --all[flags] | 设置或更新资源对象的labels |
logs | kubectl logs Pod[-c container] [--follow] [flags] | 在屏幕上打印一个容器的日志 |
patch | kubectl patch (-f FileName|TYPE NAME)--patch PATCH [flags] | 以merge形式对资源对象的部分字段的值进行修改 |
plugin | kubectl plugin flags | 在kubectl 命令行使用用户自定义的插件 |
port-forward | kubectl port-forward Pod [LOCAL_PORT:]REMOTE_PORT | 将本机的某个端口映射到Pod的端口,通常用于测试 |
replace | kubectl replace -f FileName [flags] | 从配置文件替换资源对象 |
rolling-update | kubectl rolling-update Old_controller_name ([new_controller_name]--image=new_contrainer_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 FileNale|TYPE NAME) --replicas=count [resource-version=version] [--current-replicas=count] [flags] | 扩容、缩容一个Deployment、ReplicaSet、RC或Job中Pod的数量 |
set | kubectl set SUBCOMMAND [flags] | 设置资源对象的某个特定信息,目前仅支持修改容器的镜像 |
taint | kubectl taint NodeName key_1=val_1:taint_effect_1 [flags] | 设置Node的taint信息,用于将特定的Pod调度到特定的Node的操作。 |
top | kubectl top node |kubectl top pod | 查看Node或Pod的资源使用情况,需要在集群中运行Metrics Service |
uncordon | kubectl uncordon Node [flags] | 将Node设置为sechedulable |
version | kubectl version [--client] [flags] | 打印系统版本信息 |
4、kubectl 参数列表
kubectl命令行的公共启动参数如下表格整理
参数名和取值示例 | 说明 |
---|---|
- -alsologtostderr=false | 设置为true表示将日志输出到文件的同时输出到stderr |
-- as= | 设置本次操作的用户名 |
--certificate-authority= | 用于CA授权的cert文件路径 |
--client-certificate= | 用于TLS的客户端证书文件路径 |
--client-key= | 用于TLS的客户端key文件路径 |
--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= | 设置APIServer的basic authentication的密码 |
-s,--server= | 设置API Server的URL地址,默认值为localhost:8080 |
--token= | 设置访问APIServer的安全token |
--user= | 指定用户名(应在kubeconfig配置文件中设置过) |
--username= | 设置APIServer的basic authentication 的用户名 |
--v=0 | glog日志级别 |
--vmodule= | glog基于模块的详细日志级别 |
5、kubectl 输出格式
kubectl 命令可以用多种格式对结果进行显示,输出的格式通过-o参 数指定:
kubectl [command] [type] [name] -o=<output_format>
输出格式 | 说明 |
---|---|
-o=custom-columns= | 根据自定义列名进行输出,以逗号分隔 |
-o=custom-file= | 从文件中获取自定义列名进行输出 |
-o=json | 以json格式显示结果 |
-o=name | 仅输出资源对象名称 |
-o=wide | 输出额外信息,对于pod、将输出所在Node名称 |
-o=yaml | 以YAML格式显示结果 |
- 常用输出格式示例
#显示Pod的更多信息
kubectl get pod <pod-name> -o wide
#以YAML格式显示Pod的详细信息
kubectl get pod <pod-name> -o yaml
#以自定义列名显示Pod的信息
kubectl get pod <pod-name> -o =custom-columns=name:.metadata.name,RSRC:.metadata.resourceVersion
#基于文件的自定义列名输出
kubectl get pods <pod-name> -o=custom-file=template.txt
#将输出结果按某个字段排序
kubectl get pods --sort-by=.metadata.name
kubectl 操作示例
1、创建资源对象
# 根据YAML配置文件一次性创建Service和RC
kubectl create -f my-service.yaml -f my-rc.yaml
2、查看资源对象
#查看所有Pod列表
kubectl get pods
#查看RC和Service列表
kubectl get rc,service
3、描述资源对象
#显示Node的详细信息
kubectl describe nodes <node-name>
#显示Pod的详细信息
kubectl get 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> data
#指定Pod中的某个容器执行date命令
kubectl exec <pod-name> -c <container-name> data
#通过bash获得Pod中某个容器的TTY,相当于登录容器
kubectl exec -it <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、在线编辑运行中的资源对象
在命令执行之后,会通过YAML格式展示该对象的定义和状态,用户可以对代码进行编辑和保存,从而完成对在线资源的直接修改。
#可以使用kubectl edit命令编辑运行中的资源对象,例如使用下面的 命令编辑运行中的一个Deployment
kubectl edit deploy nginx
9、将Pod的开放端口映射到本地
#将集群上Pod的80端口映射到本地的8888端口,在浏览器 http://127.0.0.1:8888中就能够访问到容器提供的服务了
kubectl port-forward --address 0.0.0.0. pod/nginx-6ddbbc47-sfdcv 8888:80
10、在Pod和本地之间复制文件
#把Pod上的/etc/fstab复制到本地的/tmp目录
kubectl cp nginx-6ddbbc47-sfdcv:/etc/fstab /tmp
11、资源对象的标签设置
#为default namespace设置testing=true标签
kubectl label namespaces default testing=true
12、检查可用的API资源类型列表
#该命令经常用于检查特定类型的资源是否已经定义,列出所有资源 对象类型
kubectl api-resources
13、使用命令行插件
用户自定义插件的可执行文件名需要以“kubectl-”开头,复制到 $PATH中的某个目录(如/usr/local/bin),然后就可以通过kubectl运行自定义插件了。例如,实现一个名为hello的插件,其 功能为在屏幕上输出字符串“hello world”
新建名为kubectl-hello的可执行脚本文件,其内容为
echo "hello world"
复制kubectl-hello文件到/usr/local/bin/目录下,就完成了安装插件的 工作。然后在kubectl命令后带上插件名称就能使用这个插件了:
kubectl hello
hello world
使用 kubectl plugin list 命令可以查看当前系统中已安装的插件列 表:
kubectl plugin list
更完整的插件开发示例可以从https://github.com/kubernetes/sample- cli-plugin找到。