概述
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日,文中内容可能已过时,请谨慎参考。