版本:
K8S:v1.16.9
metrics-server:v0.3.7
源码地址:https://github.com/kubernetes-sigs/metrics-server/
mkdir /data/metrics-server && cd /data/metrics-server
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml
cp components.yaml components.yaml.ori
vi components.yaml
# 修改3个地方:
image: juestnow/metrics-server:v0.3.7 # 改成国内源
args:
- --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP # 默认使用node的主机名,但是coredns里面没有物理机主机名的解析,部署的时候添加一个参数
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-insecure-tls # 直接通过InternalIP进行访问,忽略客户端证书。
docker pull juestnow/metrics-server:v0.3.7
kubectl apply -f components.yaml
kubectl get pods -n kube-system
# 检查是否正常启动
metrics-server-7d65b797b7-w8d5g 1/1 Running 0 36m
# metrics-server 需要一段时间才会收集数据。使用命令
kubectl -n kube-system top pod metrics-server-7d65b797b7-w8d5g
NAME CPU(cores) MEMORY(bytes)
metrics-server-7d65b797b7-w8d5g 1m 13Mi
获取 K8S pod 中的CPU,内存限制和实时资源使用率
vi k8s_pod_resource.sh
#!/bin/bash
PODFILE="/tmp/k8s-pod-tmp.txt"
LIMITSFILE="/tmp/k8s-pod-limits-tmp.txt"
NAMESPACE=$1
# 判断输入的 namespace 是否符正确
if [[ -z ${NAMESPACE} ]];then
echo "请输入一个 K8S namespace; 可参考命令 kubectl get ns"
exit 1
fi
K8SNS=$(kubectl get ns|awk 'NR> 1{print $1}')
result=$(echo ${K8SNS}|grep -w ${NAMESPACE})
if [[ $result = "" ]];then
echo "你输入的 namespace 不存在; 可参考命令 kubectl get ns"
exit 1
fi
# 获取指定 namespace 下所有的 pod 实时的指标
kubectl -n ${NAMESPACE} top pod > ${PODFILE}
get_limits()
{
# 获取CPU限制
CPU=$(kubectl -n ${NAMESPACE} describe pod $1 |grep -A 2 Limits|grep cpu |awk '{print $2}')
if [[ -z ${CPU} ]];then
CPU=0
fi
# 获取内存限制
MEM=$(kubectl -n ${NAMESPACE} describe pod $1 |grep -A 2 Limits|grep memory |awk '{print $2}')
if [[ -z ${MEM} ]];then
MEM=0
fi
printf "%7s %10s\n" ${CPU} ${MEM}
}
podlist=$(cat ${PODFILE}|awk 'NR>1 {print $1}')
# 结果输出到 ${LIMITSFILE}
printf "%s %s\n" CPU\(limits\) MEMORY\(limits\) > ${LIMITSFILE}
for l in ${podlist}
do
#kubectl -n ${NAMESPACE} describe pod ${l}
get_limits ${l} >> ${LIMITSFILE}
done
# 合并展示结果
paste ${PODFILE} ${LIMITSFILE}
# 测试
bash k8s_pod_resource.sh kube-system
NAME CPU(cores) MEMORY(bytes) CPU(limits) MEMORY(limits)
coredns-58cc8c89f4-5hvxg 4m 11Mi 0 170Mi
coredns-58cc8c89f4-frnpq 5m 10Mi 0 170Mi
etcd-k8s-master01 23m 54Mi 0 0
kube-apiserver-k8s-master01 57m 316Mi 0 0
kube-controller-manager-k8s-master01 29m 39Mi 0 0
kube-flannel-ds-amd64-z7ndv 2m 11Mi 100m 50Mi
kube-proxy-nnb4v 4m 15Mi 0 0
kube-scheduler-k8s-master01 2m 17Mi 0 0
metrics-server-7d65b797b7-5b82l 1m 15Mi 0 0
若你的 K8S 集群有容器注入了 istio 之类的,一个 pod 中有几个 container 则需要使用下面的脚本
cat k8s_pod_resource.sh
#!/bin/bash
PODFILE="/tmp/k8s-pod-tmp.txt"
LIMITSFILE="/tmp/k8s-pod-limits-tmp.txt"
NAMESPACE=$1
# 判断输入的 namespace 是否符正确
if [[ -z ${NAMESPACE} ]];then
echo "请输入一个 K8S namespace; 可参考命令 kubectl get ns"
exit 1
fi
K8SNS=$(kubectl get ns|awk 'NR> 1{print $1}')
result=$(echo ${K8SNS}|grep -w ${NAMESPACE})
if [[ $result = "" ]];then
echo "你输入的 namespace 不存在; 可参考命令 kubectl get ns"
exit 1
fi
# 获取指定 namespace 下所有的 pod 实时的指标
kubectl -n ${NAMESPACE} top pod > ${PODFILE}
get_limits()
{
# 获取CPU限制
CPU=$(kubectl -n ${NAMESPACE} describe pod $1 |awk '/^Containers/,/Conditions/{if(i>1)print x;x=$0;i++}'|grep -A 2 Limits|grep cpu |awk '{print $2}')
if [[ -z ${CPU} ]];then
CPU=0
elif [[ $(echo ${CPU}|wc -w) != 1 ]];then
CPU=$(echo ${CPU}|awk '{print $1}')
fi
# 获取内存限制
MEM=$(kubectl -n ${NAMESPACE} describe pod $1 |awk '/^Containers/,/Conditions/{if(i>1)print x;x=$0;i++}'|grep -A 2 Limits|grep memory |awk '{print $2}')
if [[ -z ${MEM} ]];then
MEM=0
elif [[ $(echo ${MEM}|wc -w) != 1 ]];then
MEM=$(echo ${MEM}|awk '{print $1}')
fi
printf "%7s %10s\n" ${CPU} ${MEM}
}
podlist=$(cat ${PODFILE}|awk 'NR>1 {print $1}')
# 结果输出到 ${LIMITSFILE}
printf "%s %s\n" CPU\(limits\) MEMORY\(limits\) > ${LIMITSFILE}
for l in ${podlist}
do
#kubectl -n ${NAMESPACE} describe pod ${l}
get_limits ${l} >> ${LIMITSFILE}
done
# 合并展示结果
paste ${PODFILE} ${LIMITSFILE}