• [kubernetes]-k8s开启swap


    导语:记录k8s开启swap后先后做的调整

    测试版本

    k8s1.20版本

    使用参数--fail-swap-on=false

    Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"
    
    • 1

    使用测试 可以开启swap不报错 但是pod使用swap不太理想。且无法实现在使用swap的时候限制pod的内存。会造成内存打满,服务器io打满,导致一些组件和pod重启。

    k8s1.22.15版本

    使用参数--fail-swap-on=false

    Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"
    
    • 1

    使用配置/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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    注意如果需要调整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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    除以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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    可在opt/netdata/usr/lib/netdata/conf.d/apps_groups.conf中添加对应的进程名和command名

    AI: AI*
    
    • 1

    重启之后就可以监控到带AI字符的进程占用的swap的使用量。不过偶尔会出现进程重复计算的情况,直接削峰查看会比较精确。

    效果如下

    结论:高内存pod如果在开启swap时不限制内存,仍旧会将物理内存吃完,导致组件一直重启,服务器负载和io飙升。

  • 相关阅读:
    算法通关村——数字中的统计、溢出、进制转换处理模板
    ActiveMQ Artemis与SpringBoot整合
    python项目练习——28.自动抢火车票脚本
    智慧工地扬尘监测系统
    2242902-55-0_Desthiobiotin-phenol_脱硫生物素价格
    【LeetCode】Day169-子数组的最小值之和
    利用背景渐变实现边框样式
    R语言删除data.table数据中的指定数据列(单个或者多个数据列)
    轻断食原理:胰岛素水平
    C# Nuget项目A引用的另一个项目C怎么被安装Nuget的项目B使用
  • 原文地址:https://blog.csdn.net/xujiamin0022016/article/details/128071461