我用的 ingress-nginx-controller 0.44.0
kubectl patch svc ingress-nginx-controller -n ingress-nginx -p '{"spec":{"externalTrafficPolicy":"Local"}}'
cat > ConfigMap.yaml << EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: ingress-nginx-controller
data:
compute-full-forwarded-for: "true"
# X-Forwarded-For 本来就是默认值
forwarded-for-header: "X-Forwarded-For"
use-forwarded-headers: "true"
EOF
kubectl apply -f ConfigMap.yaml
kubectl rollout restart deploy/ingress-nginx-controller -n ingress-nginx
由于常规的IP地址(IPV4),是点分十进制表示的,是由4段 0 ~255 之间的10进制数表示的。所以,很明显的可以得出 IP地址实际上是一个32位正整数 。在C#中,uint的取值范围是 0 ~ 4,294,967,295,所以,可以完全胜任了。
但是,由于数据库中的数据类型和C#的数据类型的对应关系,有所差异,如果要考虑到存储到数据库中,那么需要考虑使用bigint的方式(特指SQL SERVER),对应于C#中,我们使用long类型。
/// <summary>
/// 将IP地址转为数值形式
/// </summary>
/// <returns>长整数</returns>
public static long ToDigit(IPAddress ip)
{
int x = 3;
long l = 0;
foreach (byte b in ip.GetAddressBytes())
{
l += (long)b << 8 * x--;
}
return l;
}
/// <summary>
/// 将数值转换为IP地址
/// </summary>
/// <returns>IP地址</returns>
public static IPAddress ToIP(long l)
{
var bt = new byte[4];
for (int i = 0; i < 4; i++)
{
bt[3 - i] = (byte)(l >> 8 * i);
}
return new IPAddress(bt);
}