导语:记录k8s开启swap后先后做的调整
测试版本
k8s1.20版本
使用参数--fail-swap-on=false
Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"
使用测试 可以开启swap不报错 但是pod使用swap不太理想。且无法实现在使用swap的时候限制pod的内存。会造成内存打满,服务器io打满,导致一些组件和pod重启。
k8s1.22.15版本
使用参数--fail-swap-on=false
Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"
使用配置/var/lib/kubelet/config.yaml 添加最后4行
也可以在kubeadm初始化的时候 修改对应的configmap kubelet-config
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
anonymous:
enabled: false
webhook:
cacheTTL: 0s
enabled: true
x509:
clientCAFile: /etc/kubernetes/pki/ca.crt
authorization:
mode: Webhook
webhook:
cacheAuthorizedTTL: 0s
cacheUnauthorizedTTL: 0s
cgroupDriver: systemd
clusterDNS:
- 100.64.0.10
clusterDomain: cluster.local
cpuManagerReconcilePeriod: 0s
evictionPressureTransitionPeriod: 0s
fileCheckFrequency: 0s
healthzBindAddress: 127.0.0.1
healthzPort: 10248
httpCheckFrequency: 0s
imageMinimumGCAge: 0s
kind: KubeletConfiguration
logging: {}
#memorySwap: {}
nodeStatusReportFrequency: 0s
nodeStatusUpdateFrequency: 0s
rotateCertificates: true
runtimeRequestTimeout: 0s
shutdownGracePeriod: 0s
shutdownGracePeriodCriticalPods: 0s
staticPodPath: /etc/kubernetes/manifests
streamingConnectionIdleTimeout: 0s
syncFrequency: 0s
volumeStatsAggPeriod: 0s
featureGates:
NodeSwap: true
memorySwap:
swapBehavior: UnlimitedSwap
注意如果需要调整swap使用的阀值,需要先配置vm.swap,再安装docker,再安装k8s。否则容器内的swap限制需要重启服务器才能生效。
用于大致查看swap使用的脚本swap.sh
#!/bin/bash
#script name: swap_check.sh
#description: 这是一个检查哪些进程使用了SWAP分区的脚本
do_swap () {
SUM=0
OVERALL=0
java_sum=0
lung_sum=0
aiclass_sum=0
#获取进程目录
for DIR in `find /proc/ -maxdepth 1 -type d|egrep "^/proc/[0-9]"`;do
#获取进程PID
PID=`echo $DIR | cut -d / -f 3`
#获取进程名称
PROGNAME=`ps -p $PID -o comm --no-headers`
#获取进程的所有分区中SWAP值
# echo PROGNAME $PROGNAME
# if [[ "$PROGNAME" =~ "java" ]] ; then
# echo 1 java
# elif [[ "$PROGNAME" =~ "aiclassifier" ]] ; then
# echo 2 aiclass
# else
# echo 3 lung
# fi
for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'`
do
#进程swap值求和 这里取的是km换算成M 除以2是因为统计的时候重复了
let SUM=$SUM+$SWAP/1024/2
# echo PROGNAME $PROGNAME
if [[ "$PROGNAME" =~ "java" ]] ; then
# echo 1 java
let java_sum=$java_sum+$SWAP/1024/2
elif [[ "$PROGNAME" =~ "aiclassifier" ]] ; then
# echo 2 aiclass
let aiclass_sum=$aiclass_sum+$SWAP/1024/2
else
# echo 3 lung
let lung_sum=$lung_sum+$SWAP/1024/2
fi
# echo 4
done
echo "PID=$PID - Swap used: ${SUM}M - $PROGNAME"
#总共swap分区值求和
let OVERALL=$OVERALL+$SUM
SUM=0
done
echo "Overall swap used: ${OVERALL}M"
echo "java swap used:${java_sum}M"
echo "aiclass swap used:${aiclass_sum}M"
echo "lung swap used:${lung_sum}M"
}
do_swap > tmp.txt
#查询结果排序并截取top10
cat tmp.txt |grep used |awk -F[\ \(] '{print $5,$1,$7}' | sort -n | tail -10
cat tmp.txt |grep -v used |awk -F[\ \(] '{print $5,$1,$7}' | sort -n | tail -10
cat tmp.txt |tail -4
rm -rf tmp.txt
除以2是因为有重复统计
也可以安装netdata查看
wget -c https://github.com/netdata/netdata/releases/download/v1.36.1/netdata-latest.tar.gz
tar zxvf netdata-latest.tar.gz
cd netdata-v1.36.1/
# 安装所需依赖
apt-get install zlib1g-dev uuid-dev libmnl-dev gcc make git autoconf autoconf-archive autogen automake pkg-config curl -y
apt-get install libuv1-dev -y
./netdata-installer.sh
可在opt/netdata/usr/lib/netdata/conf.d/apps_groups.conf
中添加对应的进程名和command名
AI: AI*
重启之后就可以监控到带AI字符的进程占用的swap的使用量。不过偶尔会出现进程重复计算的情况,直接削峰查看会比较精确。
效果如下
结论:高内存pod如果在开启swap时不限制内存,仍旧会将物理内存吃完,导致组件一直重启,服务器负载和io飙升。