导语:记录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飙升。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐