k8s系列之:kubectl子命令详解二
1)Top
显示资源(CPU、内存、存储)的使用情况。top命令用于查看节点或Pod的资源消耗。此命令需要Heapster正确配置并在服务器上正常工作。
Node
#显示所有节点
kubectl top node
#显示指定节点
kubectl top node <NODE_NAME>
pod
显示指定pod的信息
#显示默认命名空间中所有pod的资源使用状态
kubectl top pod
#显示指定命名空间中所有pod的资源使用状态
kubectl top pod --namespace=NAMESPACE
#显示指定Pod以及其容器的资源使用状态
kubectl top pod POD_NAME --containers
#显示所有标签name=myLabel的pod的资源使用状态
kubectl top pod -l name=myLabel
2)cordon
标记节点不可调度,不可调度的节点将从集群的调度列表中删除,不会调度任何资源到该节点中,一般用于节点维护升级任务。标记为不可调度并不会删除节点上的pod,但是失联的Pod也无法与集群通信。
# 标记bigdata1节点为不可调度
kubectl cordon bigdata1
3)uncordon
标记节点为可调度
#标记bigdata1节点为可调度
kubectl uncordon bigdata1
4)drain
drain标记节点,表示准备维护,该命令会删除该节点上的所有Pod(DaemonSet除外,K8s会在其他node上重新启动这些Pod),通常用于节点维护。
直接使用该命令会自动调用kubectl cordon 命令,先标记为不可用,然后删除节点上的Pod。当该节点维护完成后,启动了kubelet后,再使用kubectl uncordon 即可将该节点添加到K8s集群中,重新接受调度。
# 强制删除
kubectl drain bigdata1 --force
#宽限15分钟
#--grace-period会标记节点为不可调度,拒绝新的调度请求,同时等待节点当前任务完成,待节点任务全部完成后才删除Pod
kubectl drain bigdata1 --grace-period=900
5)taint
当节点被标记为taint(变质)时,除非Pod被标识为可以忍受污染(toleration),否则不会有任何Pod被调度到该节点上。用户可能希望把Master节点保留给K8s系统组件使用,或者把一部分节点保留给一组用户,或者把一组具有特殊硬件的服务器(例如GPU)保留给有需求的Pod(例如深度学习)。
taint和toleration用于保证Pod不被调度到不合适的节点上,taint应用于Node上,而toleration则应用于Pod上(toleration是可选的)。
可以用kubectl taint命令为Node设置Taints信息:
kubectl taint nodes node1 key=value:NoSchedule
- 这个设置为node1加上一个Taint,该Taint的键为key,值为value,Taint的效果是NoSchedule
- 除非Pod明确声明可以容忍这个Taint,否则就不会被调度到node1上去
被打上taint标记的节点,需要在Pod上声明Toleration,才能被调度到该节点,下面的两个Toleration都设置为可以容忍(Tolerate)具有该Taint的Node,使得Pod能够被调度到node1上:
tolerations:
- key: "key"
operator: "Equal"
value: "Value"
effect: "NoSchedule"
或
tolerations:
- key: "key"
operator: "Exists"
effect: "NoSchedule"
effect选项有:
- NoSchedule:新的Pod不调度到该Node上,不影响正在运行的Pod
- PreferNoSchedule:soft版的NoSchedule,尽量不调度到该Node上
- NoExecute:新的Pod不调度到该Node上,并且驱逐(evict)已在运行的Pod
Pod的Toleration声明中的key和effect需要与Taint的设置保持一致,并且满足以下条件之一。
- operator的值是Exists(无需指定value)
- operator的值是Equal并且value相等
NoExecute意味着taint生效之时,如果该节点内正在运行的Pod没有对应的tolerate设置,会被直接逐出这个节点。Pod可以增加一个忍受污染的时间(toleration seconds),用来应对被驱逐时有足够时间保存数据。
6)describe
显示特定资源或资源组的详细信息。
kubectl describe TYPE NAME_PREFIX
- 该命令首先匹配资源类型,才匹配名称
# 显示一个节点描述
kubectl describe nodes node1
# 显示一个Pod描述
kubectl describe pods nginx
# 指定包含特定标签的Pod描述
kubectl describe po -l name=myLabel
# 描述由frontend RC管理的所有Pod(rc创建的Pod)
kubectl describe pods frontend
7)logs
打印指定资源中容器的日志。
# 从pod nginx中读取日志
kubectl logs nginx
#打印包含标签app=nginx的Pod的日志
kubectl logs -l app=nginx
# 持续不断打印web-1这个Pod中的ruby容器的日志
kubectl logs -f web-1 -c ruby
# 仅显示pod nginx中最近的20行输出
kubectl logs --tail=20 nginx
# 显示最近一个小时的日志
kubectl logs --since=1h nginx
8)attach
附加到已经在现有容器中运行的进程。
#从指定的Pod中获取里面特定容器的输出
kubectl attach frontend-pod -c nginx
#添加一个交互模式
kubectl attach frontend-pod -c nginx -i -t
9)exec
在容器中执行命令
#默认使用指定Pod的第一个容器
#date是一个命令,返回当前时间
kubectl exec frontend-pod date
# 指定容器
kubectl attach frontend-pod -c nginx date
#添加交互
#--表示返回一个raw terminal
kubectl exec frontend-pod -c nginx -i -t -- bash -il
10)port-forward
将一个或多个本地端口转发到Pod。
kubectl port-forward mypod 8888:5000
11)cp
将文件和目录复制到容器中。cp命令要求容器中存在tar命令,如果tar不存在,kubectl cp将执行失败。
#将/tmp/foo_dir本地目录复制到默认名称空间的远程Pod中的/tmp/bar_dir下
kubectl cp /tmp/foo_dir <podname>:/tmp/bar_dir
#将本地/tmp/foo文件复制到远程Pod中特定容器的/tmp/bar下
kubectl cp /tmp/foo <podname>:/tmp/bar -c <specific-container>
#将本地/tmp/foo文件复制到指定namespace的远程Pod中的/tmp/bar下
kubectl cp /tmp/foo <namespace>/<podname>:/tmp/bar
#将远程Pod的/tmp/foo复制到本地/tmp/bar下
kubectl cp <namespace>/<podname>:/tmp/foo /tmp/bar
12)proxy
在localhost和K8s API Server之间创建代理服务器或应用层网关。proxy允许通过指定的HTTP路径提供静态内容。所有传入数据通过一个端口进入,并被转发到远程K8s API服务器端口中。
设置API server接收所有主机的请求:
(base) [root@bigdata1 data]# kubectl proxy --address='0.0.0.0' --accept-hosts='^*$' --port=8009
Starting to serve on [::]:8009
在bigdata3上访问bigdata1的API server
[root@bigdata3 data]# curl -X GET -L http://bigdata1:8009
{
"paths": [
"/api",
"/apis/admissionregistration.k8s.io",
"/apis/admissionregistration.k8s.io/v1",
...
"/readyz/poststarthook/start-kube-aggregator-informers",
"/readyz/poststarthook/start-kube-apiserver-admission-initializer",
"/readyz/shutdown",
"/version"
]