Kubernetes工作实用命令集结号

一、kubectl 命令概述

kubectl 作为客户端CLI工具,可以让用户通过命令行对 Kubernetes 集群进行操作。在实际工作中熟练的使用这些命令去定位 K8s 集群问题时是我们爱不释手的好伴侣,来和我们相互认识下吧。

二、kubectl 用法概述

1、kubectl命令行语法

kubectl [command] [Type] [NAME] [flas]
  1. command:子命令,用于操作Kubernetes集群资源对象的命 令,例如create、delete、describe、get、apply等。
  2. TYPE:资源对象的类型,区分大小写,能以单数、复数或者 简写形式表示。
  3. NAME:资源对象的名称,区分大小写。如果不指定名称, 系统则将返回属于TYPE的全部对象的列表,例如$ kubectl get pods将返 回所有Pod的列表。
  4. 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找到。

上一篇:Kubernetes 集群可视化监控之Weave Scope


下一篇:CMake使用入门