เบเบณเบ™เบปเบ”เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบเบฒเบ™เบ›เบฑเบšเบฅเบฐเบญเบฝเบ”เบชเบณเบฅเบฑเบš MetalLB เปƒเบ™เป‚เปเบ” L2

เบเบณเบ™เบปเบ”เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบเบฒเบ™เบ›เบฑเบšเบฅเบฐเบญเบฝเบ”เบชเบณเบฅเบฑเบš MetalLB เปƒเบ™เป‚เปเบ” L2
เบšเปเปˆเบ”เบปเบ™เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ›เบฐเป€เบŠเบตเบ™เบซเบ™เป‰เบฒเบเบฑเบšเบงเบฝเบเบ‡เบฒเบ™เบ—เบตเปˆเบœเบดเบ”เบ›เบปเบเบเบฐเบ•เบดเบซเบผเบฒเบเบ‚เบญเบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบชเปเบฒเบฅเบฑเบš MetalLB. เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบˆเบฐเบ”เบต, เป€เบžเบฒเบฐเบงเปˆเบฒ ... เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบง MetalLB เบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบก, เปเบ•เปˆเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบเบธเปˆเบกเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบžเปเบชเบปเบกเบ„เบงเบ™เบ—เบตเปˆเบกเบตเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบ.

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบ‚เป‰เบญเบเบˆเบฐเบšเบญเบเบ—เปˆเบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบเปเบฒเบ™เบปเบ”เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ—เบตเปˆเบญเบตเบ‡เปƒเบชเปˆเปเบซเบผเปˆเบ‡เปเบฅเบฐเบ™เบฐเป‚เบเบšเบฒเบเบชเปเบฒเบฅเบฑเบšเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบžเบฒเบเบ™เบญเบเบ‚เบญเบ‡เบเบธเปˆเบกเบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

เบ‚เป‰เบญเบเบˆเบฐเบšเปเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบฅเบฐเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ MetalLB, เป€เบžเบฒเบฐเบงเปˆเบฒเบ‚เป‰เบญเบเบ–เบทเบงเปˆเบฒเป€เบˆเบปเป‰เบฒเบกเบตเบ›เบฐเบชเบปเบšเบเบฒเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡เปเบฅเป‰เบง. เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เปเบ™เบฐโ€‹เบ™เปเบฒโ€‹เปƒเบซเป‰โ€‹เป„เบ›โ€‹เบเบปเบ‡โ€‹เป„เบ›โ€‹เบเบปเบ‡โ€‹เบกเบฒโ€‹เบˆเบธเบ”โ€‹, เบ„เบทโ€‹เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹เป€เบชเบฑเป‰เบ™โ€‹เบ—เบฒเบ‡โ€‹. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบชเบตเปˆเบเปเบฅเบฐเบ™เบต:

เบเปเบฅเบฐเบ™เบตเบ—เบต 1: เป€เบกเบทเปˆเบญเบšเปเปˆเบกเบตเบเบฒเบ™เบเบณเบ™เบปเบ”เบ„เปˆเบฒเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™

เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบ.

เบเบณเบ™เบปเบ”เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบเบฒเบ™เบ›เบฑเบšเบฅเบฐเบญเบฝเบ”เบชเบณเบฅเบฑเบš MetalLB เปƒเบ™เป‚เปเบ” L2

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเปเบกเปˆเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เป€เบกเบทเปˆเบญเบ—เบตเปˆเบขเบนเปˆเบ—เบตเปˆเบญเบญเบเป‚เบ”เบ MetalLB เบขเบนเปˆเปƒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบเปˆเบญเบเบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบ—เบตเปˆเบขเบนเปˆเบ‚เบญเบ‡ nodes เบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ—เปˆเบฒเบ™เบกเบตเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบเปˆเบญเบ 192.168.1.0/24, เบกเบฑเบ™เบกเบต router 192.168.1.1, เปเบฅเบฐ nodes เบ‚เบญเบ‡โ€‹เบ—เปˆเบฒเบ™โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบ—เบตเปˆโ€‹เบขเบนเปˆโ€‹: 192.168.1.10-30, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบชเปเบฒเบฅเบฑเบš MetalLB เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฑเบšเบฅเบฐเบ”เบฑเบš 192.168.1.100-120 เปเบฅเบฐเปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบžเบตเปˆเบกเป€เบ•เบตเบก.

เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบ„เบท? เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ nodes เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบกเบตเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ—เบตเปˆเบเปเบฒเบซเบ™เบปเบ”เบ„เปˆเบฒเปเบฅเป‰เบง:

# ip route
default via 192.168.1.1 dev eth0 onlink 
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10

เปเบฅเบฐเบ—เบตเปˆเบขเบนเปˆเบˆเบฒเบเป„เบฅเบเบฐเบ”เบฝเบงเบเบฑเบ™เบˆเบฐเปƒเบŠเป‰เบžเบงเบเบกเบฑเบ™เบ„เบทเบ™เปƒเปเปˆเป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเปƒเบ”เป†.

เบเปเบฅเบฐเบ™เบต 2: เป€เบกเบทเปˆเบญเบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฒเบ™เบ›เบฑเบšเปเบ•เปˆเบ‡เป€เบžเบตเปˆเบกเป€เบ•เบตเบก

เบเบณเบ™เบปเบ”เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบเบฒเบ™เบ›เบฑเบšเบฅเบฐเบญเบฝเบ”เบชเบณเบฅเบฑเบš MetalLB เปƒเบ™เป‚เปเบ” L2

เบ—เปˆเบฒเบ™เบ„เบงเบ™เบเปเบฒเบซเบ™เบปเบ”เบ„เปˆเบฒเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบ—เบธเบเบ„เบฑเป‰เบ‡เบ—เบตเปˆ nodes เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบšเปเปˆเบกเบตเบ—เบตเปˆเบขเบนเปˆ IP เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เบซเบผเบทเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป„เบ›เบซเบฒเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบเปˆเบญเบเบ—เบตเปˆ MetalLB เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒ.

เบ‚เป‰เบญเบเบˆเบฐเบญเบฐเบ—เบดเบšเบฒเบเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเป€เบฅเบฑเบเบ™เป‰เบญเบ. เป€เบกเบทเปˆเบญเปƒเบ”เบเปเปˆเบ•เบฒเบกเบ—เบตเปˆ MetalLB เบชเบปเปˆเบ‡เบญเบญเบเบ—เบตเปˆเบขเบนเปˆ, เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ›เบฝเบšเบ—เบฝเบšเบเบฑเบšเบเบฒเบ™เบกเบญเบšเบซเบกเบฒเบเบ‡เปˆเบฒเบเป†เป€เบŠเบฑเปˆเบ™:

ip addr add 10.9.8.7/32 dev lo

เบ•เบฑเป‰เบ‡โ€‹เปƒเบˆ:

  • a) เบ—เบตเปˆเบขเบนเปˆเป„เบ”เป‰เบ–เบทเบเบกเบญเบšเบซเบกเบฒเบเบ”เป‰เบงเบเบ„เปเบฒเบ™เปเบฒเบซเบ™เป‰เบฒ /32 เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบˆเบฐเบšเปเปˆเบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบเปˆเบญเบเป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ” (เบกเบฑเบ™เป€เบ›เบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเบ—เบตเปˆเบขเบนเปˆ)
  • b) เบ—เบตเปˆเบขเบนเปˆเปเบกเปˆเบ™เบ•เบดเบ”เบเบฑเบšเบชเปˆเบงเบ™เบ•เบดเบ”เบ•เปเปˆเบ‚เบญเบ‡ node เปƒเบ” (เบ•เบปเบงเบขเปˆเบฒเบ‡: loopback). เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเป„เบ”เป‰เบเปˆเบฒเบงเบกเบฒเปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ„เบธเบ™เบ™เบฐเบชเบปเบกเบšเบฑเบ”เบ‚เบญเบ‡ stack เป€เบ„เบทเบญเบ‚เปˆเบฒเบ Linux. เบšเปเปˆเบงเปˆเบฒเบญเบดเบ™เป€เบ•เบตเป€เบŸเบ”เปƒเบ”เบ—เบตเปˆเบ—เปˆเบฒเบ™เป€เบžเบตเปˆเบกเบ—เบตเปˆเบขเบนเปˆ, kernel เบˆเบฐเบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป arp เปเบฅเบฐเบชเบปเปˆเบ‡เบ„เปเบฒเบ•เบญเบš arp เป„เบ›เบซเบฒเปƒเบ”เป†เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ, เบžเบถเบ”เบ•เบดเบเปเบฒเบ™เบตเป‰เบ–เบทเบงเปˆเบฒเบ–เบทเบเบ•เป‰เบญเบ‡เปเบฅเบฐเบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบขเปˆเบฒเบ‡เบเบงเป‰เบฒเบ‡เบ‚เบงเบฒเบ‡เปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเป€เบŠเบฑเปˆเบ™ Kubernetes.

เบžเบถเบ”เบ•เบดเบเปเบฒเบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ›เบฑเบšเปเบ•เปˆเบ‡เป„เบ”เป‰, เบ•เบปเบงเบขเปˆเบฒเบ‡เป‚เบ”เบเบเบฒเบ™เป€เบ›เบตเบ”เปƒเบŠเป‰ arp เบ—เบตเปˆเป€เบ„เบฑเปˆเบ‡เบ„เบฑเบ”:

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบเบฒเบ™เบ•เบญเบšเป‚เบ•เป‰ arp เบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เบžเบฝเบ‡เปเบ•เปˆเบ–เป‰เบฒเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบกเบตเบ—เบตเปˆเบขเบนเปˆ IP เบชเบฐเป€เบžเบฒเบฐเบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™. เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบงเบฒเบ‡เปเบœเบ™เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰ MetalLB เปเบฅเบฐ kube-proxy เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเบเปเบฒเบฅเบฑเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เป‚เบซเบกเบ” IPVS.

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, MetalLB เบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰ kernel เป€เบžเบทเปˆเบญเบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป arp, เปเบ•เปˆเบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ™เบตเป‰เบˆเบฐเบšเปเปˆเบกเบตเบœเบปเบ™เบเบฐเบ—เบปเบšเบ•เปเปˆเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡ MetalLB.

เปƒเบซเป‰เบเบฑเบšเบ„เบทเบ™เป„เบ›เบซเบฒเบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เบ–เป‰เบฒเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบชเปเบฒเบฅเบฑเบšเบ—เบตเปˆเบขเบนเปˆเบ—เบตเปˆเบญเบญเบเบšเปเปˆเบกเบตเบขเบนเปˆเปƒเบ™ nodes เบ‚เบญเบ‡เบ—เปˆเบฒเบ™, เป€เบžเบตเปˆเบกเบกเบฑเบ™เบฅเปˆเบงเบ‡เบซเบ™เป‰เบฒเปƒเบชเปˆเบ—เบธเบ nodes:

ip route add 10.9.8.0/24 dev eth1

เบเปเบฅเบฐเบ™เบตเบ—เบต 3: เป€เบกเบทเปˆเบญเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ—เบตเปˆเบญเบตเบ‡เปƒเบชเปˆเปเบซเบผเปˆเบ‡

เบ—เปˆเบฒเบ™เบˆเบฐเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบเปเบฒเบซเบ™เบปเบ”เบ„เปˆเบฒเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ—เบตเปˆเบญเบตเบ‡เปƒเบชเปˆเปเบซเบผเปˆเบ‡เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ—เปˆเบฒเบ™เป„เบ”เป‰เบฎเบฑเบšเปเบžเบฑเบเป€เบเบฑเบ”เบœเปˆเบฒเบ™เบ›เบฐเบ•เบนเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ, เบšเปเปˆเปเบกเปˆเบ™เบเบฒเบ™เบเปเบฒเบซเบ™เบปเบ”เบ„เปˆเบฒเป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เปเบžเบฑเบเป€เบเบฑเบ”เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ„เบงเบ™เบˆเบฐเบœเปˆเบฒเบ™เบ›เบฐเบ•เบนเบ”เบฝเบงเบเบฑเบ™.

เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ—เปˆเบฒเบ™เบกเบต subnet เบ”เบฝเบงเบเบฑเบ™ 192.168.1.0/24 เบญเบธเบ—เบดเบ”เบ•เบปเบ™เปƒเบซเป‰เบเบฑเบš nodes เบ‚เบญเบ‡เบ—เปˆเบฒเบ™, เปเบ•เปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบญเบญเบเบ—เบตเปˆเบขเบนเปˆเบžเบฒเบเบ™เบญเบเป‚เบ”เบเปƒเบŠเป‰ MetalLB. เปƒเบซเป‰เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบ—เปˆเบฒเบ™เบกเบตเบซเบผเบฒเบเบ—เบตเปˆเบขเบนเปˆเบˆเบฒเบเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบเปˆเบญเบ 1.2.3.0/24 เบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™ VLAN 100 เปเบฅเบฐเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰เบžเบงเบเบกเบฑเบ™เป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™ Kubernetes เบžเบฒเบเบ™เบญเบ.

เบเบณเบ™เบปเบ”เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบเบฒเบ™เบ›เบฑเบšเบฅเบฐเบญเบฝเบ”เบชเบณเบฅเบฑเบš MetalLB เปƒเบ™เป‚เปเบ” L2

เป€เบกเบทเปˆเบญเบ•เบดเบ”เบ•เปเปˆ 1.2.3.4 เบ—เปˆเบฒเบ™เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบˆเบฒเบ subnet เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบเปˆเบงเบฒ 1.2.3.0/24 เปเบฅเบฐเบฅเปเบ–เป‰เบฒเบ„เปเบฒเบ•เบญเบš. node เบ—เบตเปˆเบ›เบฐเบˆเบธเบšเบฑเบ™เป€เบ›เบฑเบ™เปเบกเปˆเบšเบปเบ”เบชเปเบฒเบฅเบฑเบšเบ—เบตเปˆเบขเบนเปˆ MetalLB เบญเบญเบเปƒเบซเป‰ 1.2.3.4, เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเปเบžเบฑเบเป€เบเบฑเบ”เบˆเบฒเบ router 1.2.3.1, เปเบ•เปˆเบ„เปเบฒเบ•เบญเบšเบชเปเบฒเบฅเบฑเบšเป€เบ‚เบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ›เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ”เบฝเบงเบเบฑเบ™, เบœเปˆเบฒเบ™ 1.2.3.1.

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบ node เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบกเบต gateway เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ—เบตเปˆเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป„เบงเป‰เปเบฅเป‰เบง 192.168.1.1, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบˆเบฐเป„เบ›เบซเบฒเบฅเบฒเบง, เปเบฅเบฐเบšเปเปˆเปเบกเปˆเบ™ 1.2.3.1, เป‚เบ”เบเบœเปˆเบฒเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบŠเบธเบ”.

เบงเบดเบ—เบตเบเบฒเบ™เบฎเบฑเบšเบกเบทเบเบฑเบšเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ™เบตเป‰?

เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบเบฐเบเบฝเบก nodes เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบตเปˆเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบžเป‰เบญเบกเบ—เบตเปˆเบˆเบฐเปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เบ—เบตเปˆเบขเบนเปˆเบžเบฒเบเบ™เบญเบเป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบเปเบฒเบซเบ™เบปเบ”เบ„เปˆเบฒเป€เบžเบตเปˆเบกเป€เบ•เบตเบก. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš VLAN เปƒเบ™ node เบฅเปˆเบงเบ‡เบซเบ™เป‰เบฒ:

ip link add link eth0 name eth0.100 type vlan id 100
ip link set eth0.100 up

เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เป€เบžเบตเปˆเบกเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡:

ip route add 1.2.3.0/24 dev eth0.100 table 100
ip route add default via 1.2.3.1 table 100

เบเบฐเบฅเบธเบ™เบฒเบฎเบฑเบšเบŠเบฒเบšเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเป€เบžเบตเปˆเบกเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป„เบ›เบซเบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ 100 เบกเบฑเบ™เบˆเบฐเบ›เบฐเบเบญเบšเบกเบตเบžเบฝเบ‡เปเบ•เปˆเบชเบญเบ‡เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเบชเบปเปˆเบ‡เบŠเบญเบ‡เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบœเปˆเบฒเบ™เบ›เบฐเบ•เบน 1.2.3.1, เบ•เบฑเป‰เบ‡เบขเบนเปˆเบ—เบฒเบ‡เบซเบฅเบฑเบ‡เบ‚เบญเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš eth0.100.

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบกเบเบปเบ”เบฅเบฐเบšเบฝเบšเบ‡เปˆเบฒเบเป†:

ip rule add from 1.2.3.0/24 lookup 100

เป€เบŠเบดเปˆเบ‡เป€เบงเบปเป‰เบฒเบขเปˆเบฒเบ‡เบˆเบฐเปเบˆเป‰เบ‡เบงเปˆเบฒ: เบ–เป‰เบฒเบ—เบตเปˆเบขเบนเปˆเบ‚เบญเบ‡เปเบžเบฑเบเป€เบเบฑเบ”เบขเบนเปˆเปƒเบ™ 1.2.3.0/24, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปƒเบŠเป‰เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡ 100. เปƒเบ™เบกเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเปเบฅเป‰เบงเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ—เบตเปˆเบˆเบฐเบชเบปเปˆเบ‡เบฅเบฒเบงเบœเปˆเบฒเบ™ 1.2.3.1

เบเปเบฅเบฐเบ™เบตเบ—เบต 4: เป€เบกเบทเปˆเบญเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ—เบตเปˆเบญเบตเบ‡เปƒเบชเปˆเบ™เบฐเป‚เบเบšเบฒเบ

topology เป€เบ„เบทเบญเบ‚เปˆเบฒเบเปเบกเปˆเบ™เบ„เบทเบเบฑเบ™เบเบฑเบšเปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ, เปเบ•เปˆเปƒเบซเป‰เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ—เบตเปˆเบขเบนเปˆเบชเบฐเบ™เบธเบเป€เบเบตเบžเบฒเบเบ™เบญเบ. 1.2.3.0/24 เบˆเบฒเบโ€‹เบเบฑเบโ€‹เบ‚เบญเบ‡โ€‹เบ—เปˆเบฒเบ™โ€‹:

เบเบณเบ™เบปเบ”เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบเบฒเบ™เบ›เบฑเบšเบฅเบฐเบญเบฝเบ”เบชเบณเบฅเบฑเบš MetalLB เปƒเบ™เป‚เปเบ” L2

peculiarity เปเบกเปˆเบ™โ€‹เบงเปˆเบฒโ€‹เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ—เบตเปˆโ€‹เบเบฒเบ™โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เป€เบ–เบดเบ‡โ€‹เบ—เบตเปˆโ€‹เบขเบนเปˆโ€‹เปƒเบ”โ€‹เบซเบ™เบถเปˆเบ‡โ€‹เปƒเบ™ 1.2.3.0/24, packet เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡ hits node เปเบฅเบฐเบกเบตเบ—เบตเปˆเบขเบนเปˆเปเบซเบผเปˆเบ‡เปƒเบ™เบ‚เบญเบšเป€เบ‚เบ” 1.2.3.0/24 เบˆเบฐโ€‹เบ–เบทเบโ€‹เบชเบปเปˆเบ‡โ€‹เป„เบ›โ€‹เบขเปˆเบฒเบ‡โ€‹เป€เบŠเบทเปˆเบญโ€‹เบŸเบฑเบ‡ eth0.100, เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™ Kubernetes เบ›เปˆเบฝเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป„เบ›เบซเบฒเบเบญเบ”เบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เป€เบŠเบดเปˆเบ‡เบชเป‰เบฒเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš.

เบเบฒเบ™โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เบšเบฑเบ™โ€‹เบซเบฒโ€‹เบ™เบตเป‰โ€‹เป„เบ”เป‰โ€‹เบเบฒเบโ€‹เป€เบ›เบฑเบ™โ€‹เบ„เบงเบฒเบกโ€‹เบซเบเบธเป‰เบ‡โ€‹เบเบฒเบ, เปเบ•เปˆโ€‹เบกเบฑเบ™โ€‹เป€เบ›เบฑเบ™โ€‹เป„เบ›โ€‹เป„เบ”เป‰โ€‹เบเป‰เบญเบ™โ€‹เบเบฒเบ™โ€‹เบงเบฒเบ‡โ€‹เป€เบชเบฑเป‰เบ™โ€‹เบ—เบฒเบ‡โ€‹เบ—เบตเปˆโ€‹เบญเบตเบ‡โ€‹เปƒเบชเปˆโ€‹เบ™เบฐโ€‹เป‚เบโ€‹เบšเบฒเบ:

เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเปƒเบˆเบ”เบตเบ‚เบถเป‰เบ™เบเปˆเบฝเบงเบเบฑเบšเบ‚เบฐเบšเบงเบ™เบเบฒเบ™, เบ™เบตเป‰เปเบกเปˆเบ™เปเบœเบ™เบงเบฒเบ” netfilter block:
เบเบณเบ™เบปเบ”เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบเบฒเบ™เบ›เบฑเบšเบฅเบฐเบญเบฝเบ”เบชเบณเบฅเบฑเบš MetalLB เปƒเบ™เป‚เปเบ” L2

เบ—เปเบฒเบญเบดเบ”, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ, เปƒเบซเป‰เบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป€เบžเบตเปˆเบกเป€เบ•เบตเบก:

ip route add 1.2.3.0/24 dev eth0.100 table 100
ip route add default via 1.2.3.1 table 100

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเป€เบžเบตเปˆเบกเบเบปเบ”เบฅเบฐเบšเบฝเบšเบšเบฒเบ‡เบขเปˆเบฒเบ‡เปƒเบซเป‰เบเบฑเบš iptables:

iptables -t mangle -A PREROUTING -i eth0.100 -j CONNMARK --set-mark 0x100
iptables -t mangle -A PREROUTING  -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j RETURN
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

เบเบปเบ”เบฅเบฐเบšเบฝเบšเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบˆเบฐเบซเบกเบฒเบเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบฒเป€เบ‚เบปเป‰เบฒเบเบฑเบšเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš eth0.100, เบซเบกเบฒเบเปเบžเบฑเบเป€เบเบฑเบ”เบ—เบฑเบ‡เบซเบกเบปเบ”เบ”เป‰เบงเบเปเบ—เบฑเบ 0x100, เบ„เปเบฒเบ•เบญเบšเบžเบฒเบเปƒเบ™เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ”เบฝเบงเบเบฑเบ™เบˆเบฐเบ–เบทเบเบซเบกเบฒเบเบ”เป‰เบงเบเปเบ—เบฑเบเบ”เบฝเบงเบเบฑเบ™.

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบกเบเบปเบ”เบฅเบฐเบšเบฝเบšเบเบฒเบ™เบเปเบฒเบ™เบปเบ”เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡:

ip rule add from 1.2.3.0/24 fwmark 0x100 lookup 100

เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบ—เบธเบเปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเบกเบตเบ—เบตเปˆเบขเบนเปˆเปเบซเบผเปˆเบ‡ 1.2.3.0/24 เปเบฅเบฐเปเบ—เบฑเบ 0x100 เบ•เป‰เบญเบ‡โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบ•เบฒโ€‹เบ•เบฐโ€‹เบฅเบฒเบ‡โ€‹ 100.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เปเบžเบฑเบเป€เบเบฑเบ”เบญเบทเปˆเบ™เป†เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบญเบทเปˆเบ™เปเบกเปˆเบ™เบšเปเปˆเบ‚เบถเป‰เบ™เบเบฑเบšเบเบปเบ”เบฅเบฐเบšเบฝเบšเบ™เบตเป‰, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบžเบงเบเป€เบ‚เบปเบฒเบ–เบทเบเบ™เปเบฒเบ—เบฒเบ‡เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบท Kubernetes เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™.

เบกเบตเบชเบดเปˆเบ‡เบซเบ™เบถเปˆเบ‡เบญเบตเบ, เปƒเบ™ Linux เบกเบตเบญเบฑเบ™เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒเบ•เบปเบงเบเบญเบ‡เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ›เบตเป‰เบ™เบเบฑเบšเบเบฑเบ™, เป€เบŠเบดเปˆเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰เบชเบดเปˆเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เป€เบชเบเบซเบฒเบ; เบกเบฑเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ‡เปˆเบฒเบเป†: เบชเปเบฒเบฅเบฑเบšเปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบกเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”, เบกเบฑเบ™เบ›เปˆเบฝเบ™เบ—เบตเปˆเบขเบนเปˆเปเบซเบผเปˆเบ‡เบ‚เบญเบ‡เปเบžเบฑเบเป€เบเบฑเบ”เบเบฑเบšเบ—เบตเปˆเบขเบนเปˆเบœเบนเป‰เบชเบปเปˆเบ‡เปเบฅเบฐเบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒ. packet เบชเบฒเบกเบฒเบ”เบญเบญเบเบˆเบฒเบเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ”เบฝเบงเบเบฑเบ™เบ—เบตเปˆเบกเบฑเบ™เป„เบ”เป‰เบฎเบฑเบš, เบ–เป‰เบฒเบšเปเปˆเปเบกเปˆเบ™, เบกเบฑเบ™เบˆเบฐเบเบฑเปˆเบ™เบ•เบญเบ‡เบกเบฑเบ™เบญเบญเบ.

เบšเบฑเบ™เบซเบฒเปเบกเปˆเบ™เบงเปˆเบฒเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบกเบฑเบ™เบˆเบฐเบšเปเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡, เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบ›เบดเบ”เบเบฒเบ™เปƒเบŠเป‰เบ‡เบฒเบ™เป„เบ”เป‰:

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth0.100/rp_filter

เบเบฐเบฅเบธเบ™เบฒเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เปเบฒเบญเบดเบ”เบ„เบงเบšเบ„เบธเบกเบžเบถเบ”เบ•เบดเบเปเบฒเบ—เบปเปˆเบงเป‚เบฅเบเบ‚เบญเบ‡ rp_filter; เบ–เป‰เบฒเบกเบฑเบ™เบšเปเปˆเบ–เบทเบเบ›เบดเบ”เปƒเบŠเป‰เบ‡เบฒเบ™, เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเบชเบญเบ‡เบˆเบฐเบšเปเปˆเบกเบตเบœเบปเบ™เบเบฐเบ—เบปเบš. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเบˆเบฐเบเบฑเบ‡เบ„เบปเบ‡เบขเบนเปˆเบเบฑเบšเบเบฒเบ™เป€เบ›เบตเบ”เปƒเบŠเป‰ rp_filter.

เป€เบžเบทเปˆเบญเบšเปเปˆเบˆเปเบฒเบเบฑเบ”เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” rp_filter เบชเปเบฒเบฅเบฑเบš netfilter. เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ rpfilter เป€เบ›เบฑเบ™เป‚เบกเบ”เบนเบ™ iptables, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบเบปเบ”เบฅเบฐเบšเบฝเบšเบ—เบตเปˆเบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ›เปˆเบฝเบ™เปเบ›เบ‡เป„เบ”เป‰, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡:

iptables -t raw -A PREROUTING -i eth0.100 -d 1.2.3.0/24 -j RETURN
iptables -t raw -A PREROUTING -i eth0.100 -m rpfilter --invert -j DROP

เป€เบ›เบตเบ”เปƒเบŠเป‰ rp_filter เปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš eth0.100 เบชเปเบฒเบฅเบฑเบšเบ—เบตเปˆเบขเบนเปˆเบ—เบฑเบ‡เบซเบกเบปเบ”เบเบปเบเป€เบงเบฑเป‰เบ™ 1.2.3.0/24.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™