背景

因02月23日ECS管控API发生异常,ACK及ACK Pro集群网络模式若为Terway(独占ENI或ENI多IP模式),部分用户在异常时间段所创建的Pod的IP会由于信息不一致而导致网络不通。我们建议相关用户核查此类Pod,如有问题需要加以修复,具体操作如下。

检查流程

步骤一:运行脚本检查节点

在每个节点上运行如下脚本。
#!/bin/bash
set -e
err(){
    echo "error at line $1"
}
trap 'err $LINENO' ERR
check(){
    cid=$1
    pid=$(docker inspect $cid -f '{{.State.Pid}}')
    if [ -z "$pid" ]; then
        echo 'cannot get pid from container $cid'
        return 1
    fi
    nsenter -t $pid -n curl -s --connect-timeout 4 100.100.100.200 -o /dev/null
}
for line in $(docker ps|grep -v k8s_POD|awk '$NF~/^k8s_/{print $1"_"$NF}'|awk -F_ '{print $1"_"$3"_"$4"_"$5}')
do
    IFS=_ read cid cname pod namespace <<< $line
    if ! check $cid; then
        echo "pod $namespace/$pod has connectivity issues"
    fi
    if [[ "$cname" == "terway" && "$namespace" == "kube-system"  && "$pod" =~ ^(terway-|terway-eniip-|terway-eni-) ]]; then
        terway_container=$cid
    fi
done
if [ -n "$terway_container" ]; then
   for pod in $(docker exec -it $terway_container terway-cli mapping|sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2})?)?[mGK]//g"|awk '$3=="X"{print $1}')
   do
        echo "pod $pod on this host has connectivity issues"
   done
fi

预期输出:

pod *** has connectivity issues

如果输出以上信息,表示对应的Pod可能分配了一个有问题的IP。

步骤二:修复有问题的Pod

  1. 重建Terway Pod。
    kubectl -n kube-system delete pod -l app=terway 
    kubectl -n kube-system delete pod -l app=terway-eniip
    kubectl -n kube-system delete pod -l app=terway-eni
  2. 重建受影响的Pod。
    • 如果是通过Deployment或DaemonSet方式创建的Pod,您可以直接删除Pod,等待系统直接创建。
    • 如果是您直接创建的Pod,你需要删除Pod之后重新创建。
说明 以上脚本是对于网络通信异常的Pod节点进行网络插件重加载操作,运行完成之后,您可以再次运行检查流程中步骤一:运行脚本检查节点,以确认集群是否加固完成。如仍出现异常信息,请提交工单