本文主要介绍kubernetes排查问题时常常用到的命令。这里主要借助kubectl命令来实现。如下列出经常使用命令,后面会对每一个命令进行详细解释,并举例:node
get 获取列出一个或多个资源的信息。(资源分为pod、instance、service等不少种)
describe 输出指定的一个/多个资源的详细信息。(通常describe状态有问题节点,如Pending等)
logs 输出pod中一个容器的日志。(若是pod只包含一个容器则能够省略容器名)
apply 指定Yaml或Json,建立资源。(经过文件或者控制台输入)
edit
编辑服务器上定义的资源。(文件默认输出格式为YAML。要以JSON格式编辑,请指定“-o json”选项。)json
rolling-update 执行指定ReplicationController的滚动更新。(不中断业务的更新方式)
delete 删除一个资源(能够是pod、instance等)
exec 在容器内部执行命令
bash
获取全部namespace:服务器
kubectl get ns
在指定的namespace下获取资源:app
kubectl -n {$nameSpace} get pods
以yaml格式输出资源:less
kubectl -n {$nameSpace} -o yaml
通用格式:分布式
kubectl get {$sourceType} --all-namespaces
经常使用的资源类型({$resourceType})有:ide
-o支持的格式有微服务
custom-columns=<spec> 根据自定义列名进行输出,逗号分隔
custom-columns-
file
=<filename> 从文件中获取自定义列名进行输出
json 以JSON格式显示结果
jsonpath=<template> 输出jasonpath表达式定义的字段信息
jasonpath-
file
=<filename> 输出jsonpath表达式定义的字段信息,来源于文件
name 仅输出资源对象的名称
wide 输出更多信息,好比会输出node名
yaml 以yaml格式输出
描述一个资源:oop
kubectl -n {$nameSpace} describe {$resourceType} {$resourceName}
查看日志,--tail指定只看最后1000行:
kubectl -n {$nameSpace} logs --tail=1000 {$podName} | less
经过配置文件名建立一个集群资源对象。
kubectl apply -f {$yamlorJsonFilePath}
编辑一个资源文件,这里以编辑configMap资源对象为例(yaml格式):
kubectl -n {$nameSpace} edit {$resourceType} {$resourceName} -o yaml
执行指定ReplicationController的滚动更新。该命令会建立一个新的RC,等新pod彻底起来后删除一个旧的pod,以后重复操做,直到替换掉全部的pod。
kubectl rolling-update {$resourceName} -f {$yamlFile}
指定资源类型和名字删除一个资源:
kubectl -n {$nameSpace} delete {$resourceType} {$resourceName}
批量删除资源:
kubectl -n {$nameSpace} delete {$resourceType} -l {$label}={$labelValue}
exec主要做用是在容器内部执行命令(通常为查看容器内部日志),这里以一个小例子说明kubectl exec命令的做用。
场景描述:当咱们用命令行,以root用户身份登陆机器,要修改HDFS某个目录权限。
此状况通常是不容许的,由于在HDFS中,最高权限并非root用户,而是hdfs用户,这个时候若是更改,会提示权限不足。以下咱们以root用户登陆机器,想修改HDFS的/tmp/jbw目录权限为777,发现此目录并不属于root组,没权限修改。
查看/tmp/jbw目录,发现其属于hdfs组的hadoop用户。
尝试着用hdfs用户去执行命令,发现本机上并无hdfs用户,由于真正的hdfs用户只存在于真实部署HDFS的容器内部。
但咱们若是非要想改其权限应该怎么办呢?那就用kubectl的exec命令,进入HDFS的任意一个namenode容器内部去更改就好(前提是以容器化方式部署HDFS)。
一、获取namenode的pod
kubectl get pods | grep namenode
结果如图所示:
二、任选一个pod进入(利用kubectl exec命令)
kubectl exec -it hadoop-hdfs-namenode-hdfs1-765788744-21mft bash
以下已经进入所选pod:
若看到~,表示进入成功(由于当前目录有所变化,如果在不放心df -h看一下文件系统是否有变化也可)。
若是进入部署HDFS的容器pod内部(这里是进入了部署namenode的一个pod,理论上datenode也能够),这些pod里固然就有hdfs用户了,接下来以hdfs用户执行相应修改目录权限命令便可。
sudo -u hdfs hadoop fs -chmod 777 /tmp/jbw
下图即执行修改目录权限命令结果:
exit退出当前pod,再查看一下HDFS上的/tmp/jbw目录,就会发现,权限已修改!以下图所示: