具體告警判斷條件
#!/bin/bash # This plugin checks for common network issues. # Currently only checks if conntrack table is more than 90% used. readonly OK=0 readonly NONOK=1 readonly UNKNOWN=2 # "nf_conntrack" replaces "ip_conntrack" - support both readonly NF_CT_COUNT_PATH='/proc/sys/net/netfilter/nf_conntrack_count' readonly NF_CT_MAX_PATH='/proc/sys/net/netfilter/nf_conntrack_max' readonly IP_CT_COUNT_PATH='/proc/sys/net/ipv4/netfilter/ip_conntrack_count' readonly IP_CT_MAX_PATH='/proc/sys/net/ipv4/netfilter/ip_conntrack_max' if [[ -f $NF_CT_COUNT_PATH ]] && [[ -f $NF_CT_MAX_PATH ]]; then readonly CT_COUNT_PATH=$NF_CT_COUNT_PATH readonly CT_MAX_PATH=$NF_CT_MAX_PATH elif [[ -f $IP_CT_COUNT_PATH ]] && [[ -f $IP_CT_MAX_PATH ]]; then readonly CT_COUNT_PATH=$IP_CT_COUNT_PATH readonly CT_MAX_PATH=$IP_CT_MAX_PATH else exit $UNKNOWN fi readonly conntrack_count=$(< $CT_COUNT_PATH) || exit $UNKNOWN readonly conntrack_max=$(< $CT_MAX_PATH) || exit $UNKNOWN readonly conntrack_usage_msg="${conntrack_count} out of ${conntrack_max}" if (( conntrack_count > conntrack_max * 9 /10 )); then echo "Conntrack table usage over 90%: ${conntrack_usage_msg}" exit $NONOK else echo "Conntrack table usage: ${conntrack_usage_msg}" exit $OK fi
解決方法
參考阿里雲,官方文檔
- OS CentOS7.7
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.7.1908 (Core)
Release: 7.7.1908
Codename: Core - OS Kernel版本
Linux PROD-DATA-K8S-WN1 5.11.1-1.el7.elrepo.x86_64 #1 SMP Mon Feb 22 17:30:33 EST 2021 x86_64 x86_64 x86_64 GNU/Linux
問題現象
Kubernetes環境,具體的網絡插件使用的是Cilium,並開啟eBPF功能,正常情況下會規避netfilter的功能,但是使用到Docker就會使用到iptables功能
摘抄其它
nf_conntrack是Linux系統內NAT的一個跟蹤連接條目的模塊。nf_conntrack模塊會使用一個哈希表記錄TCP協議“established connection”記錄,當這個哈希表滿之后,新的連接會引發“nf_conntrack: table full, dropping packet
”錯誤。關於nf_conntrack模塊中的重要參數,可參考如下信息。
nf_conntrack_buckets
:哈希表的大小,可在模塊加載時指定參數,也可以通過sysctl
命令修改。當系統內存大於等於4GB時,它的默認值是“65536”。nf_conntrack_max
:哈希表的最大節點個數,即nf_conntrack模塊支持的最大連接數。當系統內存大於等於4G時,它的默認值是“262144”。對於處理大量連接的服務器來說,該默認值相對較小。nf_conntrack_tcp_timeout_time_wait
:nf_conntrack模塊中保存time_wait狀態的TCP連接時間,默認值為“120s”。
雖然在dmesg日志沒有找到相對應的報錯信息,但是必須引起戒備之心,解決如下
根據自己業務場景調整參數的值,此值不能調整過高,眾所周知TCP連接消耗內存,也有具體公式
阿里雲官方建議,如果業務場景符合 “高並發,短鏈接”,那么可以根據調整這二個參數解決目前的問題,官方建議nf_conntrack_max = nf_conntrack_buckets * 4
net.netfilter.nf_conntrack_buckets = 131072
net.netfilter.nf_conntrack_max = 524288
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 60