目录

ipvs学习

概述

Kubernetes 的 kube-proxy 使用了 ipvs 来实现,如果想在排查相关问题的时候思路更清晰,那么就不得不好好学习一下 ipvs 的原理了。

安装

本地安装 Docker 来给后面的测试做准备。

1
2
3
4
5
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl enable docker
systemctl start docker
yum install ipvsadm -y

ipvs 说白了就是四层 lb,为什么叫四层,因为他工作在 tcp/ip 层,ipvsadm 运行在用户态,主要是规则的管理工具,而 ipvs 运行内核态

测试

下面这个测试是用两个 Docker 容器启动两个 Nginx 服务,然后通过 ipvsadm 创建 ipvs 规则,在访问 172.17.8.101:80 的时候,请求会随意落到两个服务中的一个。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
ipvsadm -A -t 172.17.8.101:80

sudo mkdir -p /tmp/nginx/A /tmp/nginx/B
echo "This is A" > /tmp/nginx/A/index.html
echo "This is B" > /tmp/nginx/B/index.html
docker run --rm -d -v "/tmp/tmp/nginx/A:/usr/share/nginx/html" --name nginx-A nginx
docker run --rm -d -v "/tmp/nginx/B:/usr/share/nginx/html" --name nginx-B nginx

IP_A=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx-A)
IP_B=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx-B)

ipvsadm -a -t 172.17.8.101:80 -r $IP_A -m
ipvsadm -a -t 172.17.8.101:80 -r $IP_B -m

命令参数

参考资料

警告
本文最后更新于 2017年2月1日,文中内容可能已过时,请谨慎参考。