ΠΡΠ΅ΠΆΠΎΠ²ΠΈΡΡ ΠΏΠ»ΡΠ³ΠΈΠ½ Calico ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΡΠΈΡΠΎΠΊ Π½Π°Π±ΠΎΡ ΠΎΡ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ Ρ ΡΠ½ΠΈΡΠΈΡΠΈΡΠ°Π½ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π·Π° Π·Π°ΡΠΈΡΠ° Π½Π° Ρ
Π°ΡΠ΄ΡΠ΅ΡΠ½ΠΈ Ρ
ΠΎΡΡΠΎΠ²Π΅, Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ ΠΈ ΠΏΠΎΠ΄ΠΎΠ²Π΅. Π’Π΅Π·ΠΈ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΎΡ ΠΈΠΌΠ΅Π½Π° ΠΈΠ»ΠΈ Π΄Π° Π±ΡΠ΄Π°Ρ Π³Π»ΠΎΠ±Π°Π»Π½ΠΈ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ ΠΊΡΠΌ
Π’Π°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°, ΡΠ΅ ΠΈΠΌΠ°ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎ ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΡΡ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ Π½Π° Kubernetes ΠΈ Calico. ΠΠΊΠΎ Π½Π΅, ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°ΠΌΠ΅ Π΄Π° ΠΎΠΏΠΈΡΠ°ΡΠ΅
Π°ΠΌΠ΅ΡΠΈΠΊΠ°Π½
ΠΠ° ΠΎΡΠ½ΠΎΠ²Π½ΠΎ Π½ΠΈΠ²ΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ Calico ΡΠ²ΡΡΠ·Π²Π° ΠΏΠΎΠ΄ ΠΊΡΠΌ ΠΌΡΠ΅ΠΆΠ°ΡΠ° (Π²ΠΈΠΆΡΠ΅ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ°ΡΠ° ΠΏΠΎ-Π΄ΠΎΠ»Ρ), ΡΠΎΠΉ Π³ΠΎ ΡΠ²ΡΡΠ·Π²Π° Ρ Ρ ΠΎΡΡΠ°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Π²ΠΈΡΡΡΠ°Π»Π΅Π½ Ethernet ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ (veth). Π’ΡΠ°ΡΠΈΠΊΡΡ, ΠΈΠ·ΠΏΡΠ°ΡΠ΅Π½ ΠΎΡ pod, ΠΈΠ΄Π²Π° ΠΊΡΠΌ Ρ ΠΎΡΡΠ° ΠΎΡ ΡΠΎΠ·ΠΈ Π²ΠΈΡΡΡΠ°Π»Π΅Π½ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΈ ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° ΠΏΠΎ ΡΡΡΠΈΡ Π½Π°ΡΠΈΠ½, ΠΊΠ°ΠΊΡΠΎ Π°ΠΊΠΎ ΠΈΠ΄Π²Π° ΠΎΡ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ ΠΌΡΠ΅ΠΆΠΎΠ² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. ΠΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Calico Π½Π°ΡΠΈΡΠ° ΡΠ΅Π·ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ caliXXX. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΡΡΠ°ΡΠΈΠΊΡΡ ΠΈΠ΄Π²Π° ΠΏΡΠ΅Π· Π²ΠΈΡΡΡΠ°Π»Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, ΡΠΎΠΉ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° ΠΏΡΠ΅Π· iptables, ΡΡΠΊΠ°Ρ ΠΏΠΎΠ΄ΡΡ Π΅ Π½Π° Π΅Π΄ΠΈΠ½ ΡΠΊΠΎΠΊ ΡΠ°Π·ΡΡΠΎΡΠ½ΠΈΠ΅. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΠ°ΡΠΈΠΊΡΡ ΠΈΠ΄Π²Π° ΠΊΡΠΌ/ΠΎΡ ΠΏΠΎΠ΄, ΡΠΎΠΉ ΡΠ΅ ΠΏΡΠ΅ΠΏΡΠ°ΡΠ° ΠΎΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° Ρ ΠΎΡΡΠ°.
ΠΠ° Kubernetes Π²ΡΠ·Π΅Π», ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ Calico, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°Π½Π΅ΡΠ΅ΡΠ΅ Π²ΠΈΡΡΡΠ°Π»Π΅Π½ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ (veth) Π½Π° ΡΠ°Π±ΠΎΡΠ½ΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅, ΠΊΠ°ΠΊΡΠΎ ΡΠ»Π΅Π΄Π²Π°. Π ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΠΎ-Π΄ΠΎΠ»Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΠ΅ veth#10 (calic1cbf1ca0f8) Π΅ ΡΠ²ΡΡΠ·Π°Π½ ΠΊΡΠΌ cnx-manager-* Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΡΠΎ ΠΎΡ ΠΈΠΌΠ΅Π½Π° Π½Π° calico-monitoring.
[centos@ip-172-31-31-46 K8S]$ sudo ip a
...
10: calic1cbf1ca0f8@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 5
inet6 fe80::ecee:eeff:feee:eeee/64 scope link
valid_lft forever preferred_lft forever
...
[centos@ip-172-31-31-46 K8S]$ calicoctl get wep --all-namespaces
...
calico-monitoring cnx-manager-8f778bd66-lz45m ip-172-31-31-46.ec2.internal 192.168.103.134/32
calic1cbf1ca0f8
...
ΠΠ°ΡΠΎ ΡΠ΅ ΠΈΠΌΠ° ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ Calico ΡΡΠ·Π΄Π°Π²Π° veth ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π·Π° Π²ΡΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠ½ΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅, ΠΊΠ°ΠΊ Π½Π°Π»Π°Π³Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ? ΠΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠΎΠ²Π°, Calico ΡΡΠ·Π΄Π°Π²Π° ΠΊΡΠΊΠΈ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²Π΅ΡΠΈΠ³ΠΈ Π½Π° ΠΏΡΡΡ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ iptables.
ΠΠΈΠ°Π³ΡΠ°ΠΌΠ°ΡΠ° ΠΏΠΎ-Π΄ΠΎΠ»Ρ ΠΏΠΎΠΊΠ°Π·Π²Π° Π²Π΅ΡΠΈΠ³ΠΈΡΠ΅, Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈ Π² ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Π² iptables (ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° netfilter). ΠΠΎΠ³Π°ΡΠΎ ΠΏΠ°ΠΊΠ΅Ρ ΠΏΡΠΈΡΡΠΈΠ³Π½Π΅ ΠΏΡΠ΅Π· ΠΌΡΠ΅ΠΆΠΎΠ² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, ΡΠΎΠΉ ΠΏΡΡΠ²ΠΎ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° ΠΏΡΠ΅Π· Π²Π΅ΡΠΈΠ³Π°ΡΠ° PREROUTING. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ Π²Π·Π΅ΠΌΠ° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π° ΠΌΠ°ΡΡΡΡΡΠΈΠ·ΠΈΡΠ°Π½Π΅ ΠΈ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΡΠΎΠ²Π° ΠΏΠ°ΠΊΠ΅ΡΡΡ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° ΠΏΡΠ΅Π· INPUT (Π½Π°ΡΠΎΡΠ΅Π½ ΠΊΡΠΌ Ρ ΠΎΡΡ ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅) ΠΈΠ»ΠΈ FORWARD (Π½Π°ΡΠΎΡΠ΅Π½ ΠΊΡΠΌ pod ΠΈΠ»ΠΈ Π΄ΡΡΠ³ Π²ΡΠ·Π΅Π» Π² ΠΌΡΠ΅ΠΆΠ°ΡΠ°). ΠΡ Π»ΠΎΠΊΠ°Π»Π½ΠΈΡ ΠΏΡΠΎΡΠ΅Ρ ΠΏΠ°ΠΊΠ΅ΡΡΡ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° ΠΏΡΠ΅Π· Π²Π΅ΡΠΈΠ³Π°ΡΠ° OUTPUT ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° POSTROUTING, ΠΏΡΠ΅Π΄ΠΈ Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ·ΠΏΡΠ°ΡΠ΅Π½ Π½Π°Π΄ΠΎΠ»Ρ ΠΏΠΎ ΠΊΠ°Π±Π΅Π»Π°.
ΠΠΌΠ°ΠΉΡΠ΅ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ pod ΡΡΡΠΎ Π΅ Π²ΡΠ½ΡΠ΅Π½ ΠΎΠ±Π΅ΠΊΡ (ΡΠ²ΡΡΠ·Π°Π½ Ρ veth) ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° iptables. ΠΠ΅ΠΊΠ° ΠΎΠ±ΠΎΠ±ΡΠΈΠΌ:
- ΠΡΠ΅Π½Π°ΡΠΎΡΠ΅Π½ΠΈΡΡ ΡΡΠ°ΡΠΈΠΊ (nat, ΠΌΠ°ΡΡΡΡΡΠΈΠ·ΠΈΡΠ°Π½ ΠΈΠ»ΠΈ ΠΊΡΠΌ/ΠΎΡ ΠΏΠΎΠ΄) ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° ΠΏΡΠ΅Π· Π²Π΅ΡΠΈΠ³ΠΈΡΠ΅ PREROUTING - FORWARD - POSTROUTING.
- Π’ΡΠ°ΡΠΈΠΊΡΡ ΠΊΡΠΌ Π»ΠΎΠΊΠ°Π»Π½ΠΈΡ Ρ ΠΎΡΡ ΠΏΡΠΎΡΠ΅Ρ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° ΠΏΡΠ΅Π· Π²Π΅ΡΠΈΠ³Π°ΡΠ° PREROUTING - INPUT.
- Π’ΡΠ°ΡΠΈΠΊΡΡ ΠΎΡ Π»ΠΎΠΊΠ°Π»Π½ΠΈΡ Ρ ΠΎΡΡ ΠΏΡΠΎΡΠ΅Ρ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° ΠΏΡΠ΅Π· Π²Π΅ΡΠΈΠ³Π°ΡΠ° OUTPUT - POSTROUTING.
Calico ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΎΠΏΡΠΈΠΈ Π·Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π΄Π° ΠΏΡΠΈΠ»Π°Π³Π°ΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ Π²ΡΠ² Π²ΡΠΈΡΠΊΠΈ Π²Π΅ΡΠΈΠ³ΠΈ. ΠΠΌΠ°ΠΉΠΊΠΈ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ ΡΠΎΠ²Π°, Π½Π΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈΡΠ΅ ΠΎΠΏΡΠΈΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ, Π½Π°Π»ΠΈΡΠ½ΠΈ Π² Calico. Π§ΠΈΡΠ»Π°ΡΠ° Π² ΡΠΏΠΈΡΡΠΊΠ° Ρ ΠΎΠΏΡΠΈΠΈ ΠΏΠΎ-Π΄ΠΎΠ»Ρ ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π°Ρ Π½Π° ΡΠΈΡΠ»Π°ΡΠ° Π² Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ°ΡΠ° ΠΏΠΎ-Π³ΠΎΡΠ΅.
- ΠΡΠ°Π²ΠΈΠ»Π° Π·Π° ΠΊΡΠ°ΠΉΠ½Π° ΡΠΎΡΠΊΠ° (pod) Π½Π° ΡΠ°Π±ΠΎΡΠ½ΠΎΡΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅
- ΠΠΎΠ»ΠΈΡΠΈΠΊΠ° Π·Π° ΠΊΡΠ°ΠΉΠ½ΠΈ ΡΠΎΡΠΊΠΈ Π½Π° Ρ ΠΎΡΡΠ°
- ΠΠΏΡΠΈΡ ApplyOnForward
- PreDNAT ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°
- ΠΠ΅ΠΏΡΠΎΡΠ»Π΅Π΄Π΅Π½Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°
ΠΠ΅ΠΊΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ, ΠΊΠ°ΡΠΎ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΊΠ°ΠΊ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° ΠΊΡΠΌ ΠΊΡΠ°ΠΉΠ½ΠΈΡΠ΅ ΡΠΎΡΠΊΠΈ Π½Π° ΡΠ°Π±ΠΎΡΠ½ΠΎΡΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ (Kubernetes pods ΠΈΠ»ΠΈ OpenStack VM), Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΎΠΏΡΠΈΠΈΡΠ΅ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π·Π° ΠΊΡΠ°ΠΉΠ½ΠΈΡΠ΅ ΡΠΎΡΠΊΠΈ Π½Π° Ρ ΠΎΡΡΠ°.
ΠΡΠ°ΠΉΠ½ΠΈ ΡΠΎΡΠΊΠΈ Π½Π° ΡΠ°Π±ΠΎΡΠ½ΠΎΡΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅
ΠΡΠ°Π²ΠΈΠ»Π° Π·Π° ΠΊΡΠ°ΠΉΠ½Π° ΡΠΎΡΠΊΠ° Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ (1)
Π’ΠΎΠ²Π° Π΅ ΠΎΠΏΡΠΈΡ Π·Π° Π·Π°ΡΠΈΡΠ° Π½Π° Π²Π°ΡΠΈΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ kubernetes. Calico ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΡΠ°Π±ΠΎΡΠ° Ρ Kubernetes NetworkPolicy, Π½ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΈ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ - Calico NetworkPolicy ΠΈ GlobalNetworkPolicy. Calico ΡΡΠ·Π΄Π°Π²Π° Π²Π΅ΡΠΈΠ³Π° Π·Π° Π²ΡΠ΅ΠΊΠΈ pod (ΡΠ°Π±ΠΎΡΠ½ΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅) ΠΈ ΡΠ²ΡΡΠ·Π²Π° Π²Π΅ΡΠΈΠ³ΠΈΡΠ΅ INPUT ΠΈ OUTPUT Π·Π° ΡΠ°Π±ΠΎΡΠ½ΠΎΡΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ ΠΊΡΠΌ ΡΠΈΠ»ΡΡΡΠ½Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° Π½Π° Π²Π΅ΡΠΈΠ³Π°ΡΠ° FORWARD.
Π₯ΠΎΡΡ ΠΊΡΠ°ΠΉΠ½ΠΈ ΡΠΎΡΠΊΠΈ
ΠΡΠ°Π²ΠΈΠ»Π° Π·Π° ΠΊΡΠ°ΠΉΠ½ΠΈ ΡΠΎΡΠΊΠΈ Π½Π° Ρ ΠΎΡΡ (2)
Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ CNI (ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΌΡΠ΅ΠΆΠΎΠ² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ), ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈΡΠ΅ Π½Π° Calico ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° Π·Π°ΡΠΈΡΠ° Π½Π° ΡΠ°ΠΌΠΈΡ Ρ ΠΎΡΡ. Π Calico ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΊΡΠ°ΠΉΠ½Π° ΡΠΎΡΠΊΠ° Π½Π° Ρ ΠΎΡΡ, ΠΊΠ°ΡΠΎ ΠΏΠΎΡΠΎΡΠΈΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π½Π° Ρ ΠΎΡΡ ΠΈ, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° ΠΏΠΎΡΡΠΎΠ²Π΅. ΠΡΠΈΠ»Π°Π³Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° Π·Π° ΡΠΎΠ·ΠΈ ΠΎΠ±Π΅ΠΊΡ ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠΈΠ»ΡΡΡΠ½Π° ΡΠ°Π±Π»ΠΈΡΠ° Π²ΡΠ² Π²Π΅ΡΠΈΠ³ΠΈΡΠ΅ INPUT ΠΈ OUTPUT. ΠΠ°ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΎΡ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ°ΡΠ°, (2) ΡΠ΅ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ Π·Π° Π»ΠΎΠΊΠ°Π»Π½ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈ Π½Π° Π²ΡΠ·Π΅Π»Π°/Ρ ΠΎΡΡΠ°. Π’ΠΎΠ΅ΡΡ, Π°ΠΊΠΎ ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° ΠΊΡΠΌ ΠΊΡΠ°ΠΉΠ½Π°ΡΠ° ΡΠΎΡΠΊΠ° Π½Π° Ρ ΠΎΡΡΠ°, ΡΠΎΠ²Π° Π½ΡΠΌΠ° Π΄Π° ΠΏΠΎΠ²Π»ΠΈΡΠ΅ Π½Π° ΡΡΠ°ΡΠΈΠΊΠ°, ΠΎΡΠΈΠ²Π°Ρ ΠΊΡΠΌ/ΠΎΡ Π²Π°ΡΠΈΡΠ΅ ΠΊΠ°ΠΏΡΡΠ»ΠΈ. ΠΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π΅Π΄ΠΈΠ½Π΅Π½ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ/ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π·Π° Π±Π»ΠΎΠΊΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ°ΡΠΈΠΊΠ° Π·Π° Π²Π°ΡΠΈΡ Ρ ΠΎΡΡ ΠΈ ΠΏΠΎΠ΄ΠΎΠ²Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ Π½Π° Calico. Π’ΠΎΠ²Π° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΎΠΏΡΠΎΡΡΡΠ²Π° ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ Π·Π° ΡΠ°Π·Π½ΠΎΡΠΎΠ΄Π½Π° ΠΌΡΠ΅ΠΆΠ°. ΠΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ Π·Π° ΠΊΡΠ°ΠΉΠ½Π° ΡΠΎΡΠΊΠ° Π½Π° Ρ ΠΎΡΡΠ° Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ° Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ° Π΅ Π΄ΡΡΠ³ Π²Π°ΠΆΠ΅Π½ ΡΠ»ΡΡΠ°ΠΉ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅.
ΠΠΎΠ»ΠΈΡΠΈΠΊΠ° ApplyOnForward (3)
ΠΠΏΡΠΈΡΡΠ° ApplyOnForward Π΅ Π½Π°Π»ΠΈΡΠ½Π° Π² Π³Π»ΠΎΠ±Π°Π»Π½Π°ΡΠ° ΠΌΡΠ΅ΠΆΠΎΠ²Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° Π½Π° Calico, Π·Π° Π΄Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ ΠΊΡΠΌ ΡΠ΅Π»ΠΈΡ ΡΡΠ°ΡΠΈΠΊ, ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Ρ ΠΏΡΠ΅Π· ΠΊΡΠ°ΠΉΠ½Π°ΡΠ° ΡΠΎΡΠΊΠ° Π½Π° Ρ ΠΎΡΡΠ°, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΡΡΠ°ΡΠΈΠΊΠ°, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΡΠ΅ΠΏΡΠ°ΡΠ΅Π½ ΠΎΡ Ρ ΠΎΡΡΠ°. Π’ΠΎΠ²Π° Π²ΠΊΠ»ΡΡΠ²Π° ΡΡΠ°ΡΠΈΠΊ, ΠΏΡΠ΅ΠΏΡΠ°ΡΠ΅Π½ ΠΊΡΠΌ Π»ΠΎΠΊΠ°Π»Π½ΠΈΡ ΠΌΠΎΠ΄ΡΠ» ΠΈΠ»ΠΈ ΠΊΡΠ΄Π΅ΡΠΎ ΠΈ Π΄Π° Π΅ Π΄ΡΡΠ³Π°Π΄Π΅ Π² ΠΌΡΠ΅ΠΆΠ°ΡΠ°. Calico ΠΈΠ·ΠΈΡΠΊΠ²Π° ΡΠ°Π·ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π΄Π° Π±ΡΠ΄Π΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π° Π·Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠΈ PreDNAT ΠΈ Π½Π΅ΠΏΡΠΎΡΠ»Π΅Π΄Π΅Π½ΠΈ, Π²ΠΈΠΆΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΠΈ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ApplyOnForward ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ°ΡΠΈΠΊΠ° Π½Π° Ρ ΠΎΡΡ Π² ΡΠ»ΡΡΠ°ΠΈΡΠ΅, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π²ΠΈΡΡΡΠ°Π»Π΅Π½ ΡΡΡΠ΅Ρ ΠΈΠ»ΠΈ ΡΠΎΡΡΡΠ΅ΡΠ΅Π½ NAT.
ΠΠΌΠ°ΠΉΡΠ΅ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ Π°ΠΊΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠΈΡΠ΅ Π΅Π΄Π½Π° ΠΈ ΡΡΡΠ° ΠΌΡΠ΅ΠΆΠΎΠ²Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° ΠΊΠ°ΠΊΡΠΎ ΠΊΡΠΌ Ρ ΠΎΡΡ ΠΏΡΠΎΡΠ΅ΡΠΈ, ΡΠ°ΠΊΠ° ΠΈ ΠΊΡΠΌ ΠΏΠΎΠ΄ΠΎΠ²Π΅, ΡΠΎΠ³Π°Π²Π° Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΎΠΏΡΠΈΡΡΠ° ApplyOnForward. ΠΡΠΈΡΠΊΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅, Π΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ Π΅ΡΠΈΠΊΠ΅Ρ Π·Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°ΡΠ° ΠΊΡΠ°ΠΉΠ½Π° ΡΠΎΡΠΊΠ° Π½Π° Ρ ΠΎΡΡ ΠΈ ΠΊΡΠ°ΠΉΠ½Π° ΡΠΎΡΠΊΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ½ΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ (pod). Calico Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ ΠΈΠ½ΡΠ΅Π»ΠΈΠ³Π΅Π½ΡΠ΅Π½, Π·Π° Π΄Π° Π½Π°Π»ΠΎΠΆΠΈ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° Π΅ΡΠΈΠΊΠ΅ΡΠΈ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΈΠΏΠ° ΠΊΡΠ°ΠΉΠ½Π° ΡΠΎΡΠΊΠ° (ΡΠΎΡΠΊΠ° Π½Π° Ρ ΠΎΡΡ ΠΈΠ»ΠΈ ΡΠ°Π±ΠΎΡΠ½ΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅).
PreDNAT ΠΠΎΠ»ΠΈΡΠΈΠΊΠ° (4)
Π Kubernetes ΠΏΠΎΡΡΠΎΠ²Π΅ΡΠ΅ Π½Π° ΠΎΠ±ΡΠ»ΡΠΆΠ²Π°Ρ ΠΎΠ±Π΅ΠΊΡ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π΅ΠΊΡΠΏΠΎΠ½ΠΈΡΠ°Π½ΠΈ Π²ΡΠ½ΡΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΎΠΏΡΠΈΡΡΠ° NodePorts ΠΈΠ»ΠΈ, ΠΏΠΎ ΠΈΠ·Π±ΠΎΡ (ΠΊΠΎΠ³Π°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Calico), ΠΊΠ°ΡΠΎ Π³ΠΈ ΡΠ΅ΠΊΠ»Π°ΠΌΠΈΡΠ°ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΎΠΏΡΠΈΠΈΡΠ΅ Cluster IPs ΠΈΠ»ΠΈ External IPs. Kube-proxy Π±Π°Π»Π°Π½ΡΠΈΡΠ° Π²Ρ ΠΎΠ΄ΡΡΠΈΡ ΡΡΠ°ΡΠΈΠΊ, ΡΠ²ΡΡΠ·Π°Π½ Ρ ΡΡΠ»ΡΠ³Π°, ΠΊΡΠΌ ΠΏΠΎΠ΄ΠΎΠ²Π΅ΡΠ΅ Π½Π° ΡΡΠΎΡΠ²Π΅ΡΠ½Π°ΡΠ° ΡΡΠ»ΡΠ³Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ DNAT. ΠΠ°ΡΠΎ ΡΠ΅ ΠΈΠΌΠ° ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ ΡΠΎΠ²Π°, ΠΊΠ°ΠΊ Π½Π°Π»Π°Π³Π°ΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ Π·Π° ΡΡΠ°ΡΠΈΠΊ, ΠΈΠ΄Π²Π°Ρ ΠΏΡΠ΅Π· NodePorts? ΠΠ° Π΄Π° Π³Π°ΡΠ°Π½ΡΠΈΡΠ°, ΡΠ΅ ΡΠ΅Π·ΠΈ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ, ΠΏΡΠ΅Π΄ΠΈ ΡΡΠ°ΡΠΈΠΊΡΡ Π΄Π° Π±ΡΠ΄Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ΅Π½ ΠΎΡ DNAT (ΠΊΠΎΠ΅ΡΠΎ Π΅ ΡΡΠΏΠΎΡΡΠ°Π²ΡΠ½Π΅ ΠΌΠ΅ΠΆΠ΄Ρ Ρ ΠΎΡΡ:ΠΏΠΎΡΡ ΠΈ ΡΡΠΎΡΠ²Π΅ΡΠ½Π°ΡΠ° ΡΡΠ»ΡΠ³Π°), Calico ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π·Π° globalNetworkPolicy, Π½Π°ΡΠ΅ΡΠ΅Π½ "preDNAT: true".
ΠΠΎΠ³Π°ΡΠΎ pre-DNAT Π΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½, ΡΠ΅Π·ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π° ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ Π² (4) Π½Π° Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ°ΡΠ° - Π² ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π½Π° mangle Π½Π° Π²Π΅ΡΠΈΠ³Π°ΡΠ° PREROUTING - Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½ΠΎ ΠΏΡΠ΅Π΄ΠΈ DNAT. Π’ΡΠΊ Π½Π΅ ΡΠ΅ ΡΠ»Π΅Π΄Π²Π° ΠΎΠ±ΠΈΡΠ°ΠΉΠ½ΠΈΡΡ ΡΠ΅Π΄ Π½Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈΡΠ΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅Π·ΠΈ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ ΡΠ΅ ΡΠ»ΡΡΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-ΡΠ°Π½ΠΎ Π² ΠΏΡΡΡ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΡΠ°ΡΠΈΠΊΠ°. ΠΠΎΠ»ΠΈΡΠΈΠΊΠΈΡΠ΅ Π½Π° preDNAT ΠΎΠ±Π°ΡΠ΅ ΡΠΏΠ°Π·Π²Π°Ρ ΡΠ΅Π΄Π° Π½Π° ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ.
ΠΠΎΠ³Π°ΡΠΎ ΡΡΠ·Π΄Π°Π²Π°ΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ Ρ pre-DNAT, Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° Π²Π½ΠΈΠΌΠ°Π²Π°ΡΠ΅ Π·Π° ΡΡΠ°ΡΠΈΠΊΠ°, ΠΊΠΎΠΉΡΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΈΡΠ΅, ΠΈ Π΄Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΠ΅ ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠ°ΡΠ° ΡΠ°ΡΡ Π΄Π° Π±ΡΠ΄Π΅ ΠΎΡΡ
Π²ΡΡΠ»Π΅Π½Π°. Π’ΡΠ°ΡΠΈΠΊΡΡ, ΠΌΠ°ΡΠΊΠΈΡΠ°Π½ ΠΊΠ°ΡΠΎ βΡΠ°Π·ΡΠ΅ΡΠ°Π²Π°Π½Π΅β Π² ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°ΡΠ° ΠΏΡΠ΅Π΄ΠΈ DNAT, Π²Π΅ΡΠ΅ Π½ΡΠΌΠ° Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° ΠΎΡ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°ΡΠ° Π·Π° ΠΊΡΠ°ΠΉΠ½Π°ΡΠ° ΡΠΎΡΠΊΠ° Π½Π° Ρ
ΠΎΡΡΠ°, Π΄ΠΎΠΊΠ°ΡΠΎ ΡΡΠ°ΡΠΈΠΊΡΡ, ΠΊΠΎΠΉΡΠΎ Π½Π΅ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π½Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°ΡΠ° ΠΏΡΠ΅Π΄ΠΈ DNAT, ΡΠ΅ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈ ΠΏΡΠ΅Π· ΠΎΡΡΠ°Π½Π°Π»ΠΈΡΠ΅ Π²Π΅ΡΠΈΠ³ΠΈ.
Calico Π½Π°ΠΏΡΠ°Π²ΠΈ Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΎΠΏΡΠΈΡΡΠ° applyOnForward ΠΏΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° preDNAT, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠΈΡ ΠΌΠ΅ΡΡΠΎΠ½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΡΠ°ΡΠΈΠΊΠ° Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ Π΅ ΠΈΠ·Π±ΡΠ°Π½ΠΎ. Π’ΡΠ°ΡΠΈΠΊΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π½Π°ΡΠΎΡΠ΅Π½ ΠΊΡΠΌ Ρ
ΠΎΡΡ ΠΏΡΠΎΡΠ΅ΡΠ° ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠ΅ΠΏΡΠ°ΡΠ΅Π½ ΠΊΡΠΌ pod ΠΈΠ»ΠΈ Π΄ΡΡΠ³ Π²ΡΠ·Π΅Π».
ΠΠ΅ΠΏΡΠΎΡΠ»Π΅Π΄Π΅Π½Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° (5)
ΠΡΠ΅ΠΆΠΈΡΠ΅ ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΈΠΌΠ°Ρ Π³ΠΎΠ»Π΅ΠΌΠΈ ΡΠ°Π·Π»ΠΈΠΊΠΈ Π² ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΡΠΎ. Π Π½ΡΠΊΠΎΠΈ Π΅ΠΊΡΡΡΠ΅ΠΌΠ½ΠΈ ΡΠ»ΡΡΠ°ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΡΠ°ΡΠΊΠΎΡΡΠ°ΠΉΠ½ΠΈ Π²ΡΡΠ·ΠΊΠΈ. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ ΠΈΠ·ΡΠ΅ΡΠΏΠ²Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π½Π° conntrack (ΠΎΡΠ½ΠΎΠ²Π΅Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡ ΡΡΠ΅ΠΊ Π½Π° Linux). Π’ΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎ, Π·Π° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΡΠ΅Π·ΠΈ Π²ΠΈΠ΄ΠΎΠ²Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° Linux, ΡΠ΅ ΡΡΡΠ±Π²Π° ΡΡΡΠ½ΠΎ Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ ΠΈΠ»ΠΈ Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΡΠ΅ conntrack ΠΈΠ»ΠΈ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° iptables, Π·Π° Π΄Π° Π·Π°ΠΎΠ±ΠΈΠΊΠΎΠ»ΠΈΡΠ΅ conntrack. ΠΠ΅ΠΏΡΠΎΡΠ»Π΅Π΄Π΅Π½Π°ΡΠ° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° Π² Calico Π΅ ΠΏΠΎ-ΠΏΡΠΎΡΡΠ° ΠΈ ΠΏΠΎ-Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½Π° ΠΎΠΏΡΠΈΡ, Π°ΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°ΡΠ΅ Π²ΡΡΠ·ΠΊΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉ-Π±ΡΡΠ·ΠΎ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π°ΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΌΠ°ΡΠΈΠ²Π½ΠΈ
ΠΡΠΎΡΠ΅ΡΠΈ ΡΠΎΠ²Π°
ΠΠΎΠ³Π°ΡΠΎ Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ ΠΎΠΏΡΠΈΡΡΠ° βdoNotTrack: trueβ Π² Calico globalNetworkPolicy, ΡΡ ΡΡΠ°Π²Π° **Π½Π΅ΠΏΡΠΎΡΠ»Π΅Π΄Π΅Π½Π°** ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° ΠΈ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π½ΠΎ Π² ΡΡΡΠ±ΠΎΠΏΡΠΎΠ²ΠΎΠ΄Π° Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Π½Π° Linux. Π Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΉΠΊΠΈ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ°ΡΠ° ΠΏΠΎ-Π³ΠΎΡΠ΅, Π½Π΅ΠΏΡΠΎΡΠ»Π΅Π΄Π΅Π½ΠΈΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ Π²ΡΠ² Π²Π΅ΡΠΈΠ³ΠΈΡΠ΅ PREROUTING ΠΈ OUTPUT Π² Π½Π΅ΠΎΠ±ΡΠ°Π±ΠΎΡΠ΅Π½Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ°, ΠΏΡΠ΅Π΄ΠΈ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π²ΡΡΠ·ΠΊΠ°ΡΠ° (conntrack). ΠΠΎΠ³Π°ΡΠΎ Π΄Π°Π΄Π΅Π½ ΠΏΠ°ΠΊΠ΅Ρ Π΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ ΠΎΡ Π½Π΅ΠΏΡΠΎΡΠ»Π΅Π΄Π΅Π½Π°ΡΠ° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°, ΡΠΎΠΉ ΡΠ΅ ΠΌΠ°ΡΠΊΠΈΡΠ°, Π·Π° Π΄Π° Π·Π°Π±ΡΠ°Π½ΠΈ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π²ΡΡΠ·ΠΊΠ°ΡΠ° Π·Π° ΡΠΎΠ·ΠΈ ΠΏΠ°ΠΊΠ΅Ρ. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°:
- ΠΠ΅ΠΏΡΠΎΡΠ»Π΅Π΄Π΅Π½Π°ΡΠ° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° Π·Π° Π²ΡΠ΅ΠΊΠΈ ΠΏΠ°ΠΊΠ΅Ρ. ΠΡΠΌΠ° ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ Π·Π° Π²ΡΡΠ·ΠΊΠ° (ΠΈΠ»ΠΈ ΠΏΠΎΡΠΎΠΊ). ΠΠΈΠΏΡΠ°ΡΠ° Π½Π° Π²ΡΡΠ·ΠΊΠΈ ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π²Π°ΠΆΠ½ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΈΡΠΈ:
- ΠΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΡΠ°Π·ΡΠ΅ΡΠΈΡΠ΅ ΠΊΠ°ΠΊΡΠΎ ΡΡΠ°ΡΠΈΠΊ Π½Π° Π·Π°ΡΠ²ΠΊΠ°, ΡΠ°ΠΊΠ° ΠΈ ΡΡΠ°ΡΠΈΠΊ Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡ, ΠΈΠΌΠ°ΡΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΠΊΠ°ΠΊΡΠΎ Π·Π° Π²Ρ ΠΎΠ΄ΡΡ, ΡΠ°ΠΊΠ° ΠΈ Π·Π° ΠΈΠ·Ρ ΠΎΠ΄ΡΡ (ΡΡΠΉ ΠΊΠ°ΡΠΎ Calico ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° conntrack, Π·Π° Π΄Π° ΠΌΠ°ΡΠΊΠΈΡΠ° ΡΡΠ°ΡΠΈΠΊΠ° Π·Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡ ΠΊΠ°ΡΠΎ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½).
- ΠΠ΅ΠΏΡΠΎΡΠ»Π΅Π΄Π΅Π½Π°ΡΠ° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° Π½Π΅ ΡΠ°Π±ΠΎΡΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ½ΠΈ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½ΠΈΡ Π½Π° Kubernetes (pods), Π·Π°ΡΠΎΡΠΎ Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ Π½ΡΠΌΠ° Π½Π°ΡΠΈΠ½ Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠ»Π΅Π΄ΠΈ ΠΈΠ·Ρ ΠΎΠ΄ΡΡΠ°ΡΠ° Π²ΡΡΠ·ΠΊΠ° ΠΎΡ pod.
- NAT Π½Π΅ ΡΠ°Π±ΠΎΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ Ρ Π½Π΅ΠΏΡΠΎΡΠ»Π΅Π΄Π΅Π½ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ (ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΄ΡΠΎΡΠΎ ΡΡΡ ΡΠ°Π½ΡΠ²Π° NAT ΠΊΠ°ΡΡΠΎΠ³ΡΠ°ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π² conntrack).
- ΠΡΠΈ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ ΠΏΡΠ΅Π· ΠΏΡΠ°Π²ΠΈΠ»ΠΎΡΠΎ βΡΠ°Π·ΡΠ΅ΡΠΈ Π²ΡΠΈΡΠΊΠΈβ Π² ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°ΡΠ° Π·Π° Π½Π΅ΠΏΡΠΎΡΠ»Π΅Π΄Π΅Π½ΠΈ, Π²ΡΠΈΡΠΊΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΌΠ°ΡΠΊΠΈΡΠ°Π½ΠΈ ΠΊΠ°ΡΠΎ Π½Π΅ΠΏΡΠΎΡΠ»Π΅Π΄Π΅Π½ΠΈ. Π’ΠΎΠ²Π° ΠΏΠΎΡΡΠΈ Π²ΠΈΠ½Π°Π³ΠΈ Π½Π΅ Π΅ ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ ΠΈΡΠΊΠ°ΡΠ΅, ΡΠ°ΠΊΠ° ΡΠ΅ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΡΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅Π»Π΅ΠΊΡΠΈΠ²Π½ΠΈ ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅, ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈ ΠΎΡ Π½Π΅ΠΏΡΠΎΡΠ»Π΅Π΄Π΅Π½ΠΈΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ (ΠΈ Π΄Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΠ΅ Π½Π° ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΡΡΠ°ΡΠΈΠΊ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ ΠΏΡΠ΅Π· Π½ΠΎΡΠΌΠ°Π»Π½ΠΈ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½ΠΈ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ).
- ΠΠ΅ΠΏΡΠΎΡΠ»Π΅Π΄Π΅Π½ΠΈΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ Π² ΡΠ°ΠΌΠΎΡΠΎ Π½Π°ΡΠ°Π»ΠΎ Π½Π° ΡΡΡΠ±ΠΎΠΏΡΠΎΠ²ΠΎΠ΄Π° Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ. Π’ΠΎΠ²Π° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π°Ρ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ Π½Π° Calico. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠΌΠ°ΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° Π½Π° ΠΏΠΎΠ΄ Ρ ΠΏΠΎΡΡΡΠΊΠ°:1 ΠΈ Π½Π΅ΠΏΡΠΎΡΠ»Π΅Π΄Π΅Π½Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° Ρ ΠΏΠΎΡΡΡΠΊΠ°:1000. ΠΡΠΌΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΠΎΠ»ΠΈΡΠΈΠΊΠ°ΡΠ° Π·Π° Π½Π΅ΠΏΡΠΎΡΠ»Π΅Π΄Π΅Π½ΠΈ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½Π° ΠΏΡΠ΅Π΄ΠΈ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°ΡΠ° Π·Π° Π³ΡΡΠΏΠ°ΡΠ°. ΠΠ΅ΠΏΡΠΎΡΠ»Π΅Π΄Π΅Π½ΠΈΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ Π·Π°ΡΠΈΡΠ°Ρ ΡΠ΅Π΄Π° Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ°ΠΌΠΎ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ.
Π’ΡΠΉ ΠΊΠ°ΡΠΎ Π΅Π΄Π½Π° ΠΎΡ ΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°ΡΠ° doNotTrack Π΅ Π΄Π° Π½Π°Π»ΠΎΠΆΠΈ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°ΡΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π½ΠΎ Π² ΡΡΡΠ±ΠΎΠΏΡΠΎΠ²ΠΎΠ΄Π° Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Π½Π° Linux, Calico ΠΏΡΠ°Π²ΠΈ Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎ ΡΠΊΠ°Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΎΠΏΡΠΈΡΡΠ° applyOnForward, ΠΊΠΎΠ³Π°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ doNotTrack. ΠΠΎΠ·ΠΎΠ²Π°Π²Π°ΠΉΠΊΠΈ ΡΠ΅ Π½Π° Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ°ΡΠ° Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΠΈΠΌΠ°ΠΉΡΠ΅ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°ΡΠ° Π·Π° Π½Π΅ΠΏΡΠΎΡΠ»Π΅Π΄Π΅Π½ΠΎ(5) ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° ΠΏΡΠ΅Π΄ΠΈ Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π° ΠΌΠ°ΡΡΡΡΡΠΈΠ·ΠΈΡΠ°Π½Π΅. Π’ΡΠ°ΡΠΈΠΊΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π½Π°ΡΠΎΡΠ΅Π½ ΠΊΡΠΌ Ρ ΠΎΡΡ ΠΏΡΠΎΡΠ΅ΡΠ° ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠ΅ΠΏΡΠ°ΡΠ΅Π½ ΠΊΡΠΌ pod ΠΈΠ»ΠΈ Π΄ΡΡΠ³ Π²ΡΠ·Π΅Π».
Π Π΅Π·ΡΠ»ΡΠ°ΡΠΈ ΠΎΡ
Π Π°Π·Π³Π»Π΅Π΄Π°Ρ ΠΌΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈΡΠ΅ ΠΎΠΏΡΠΈΠΈ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° (ΠΊΡΠ°ΠΉΠ½Π° ΡΠΎΡΠΊΠ° Π½Π° Ρ ΠΎΡΡ, ApplyOnForward, preDNAT ΠΈ Untracked) Π² Calico ΠΈ ΠΊΠ°ΠΊ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ ΠΏΠΎ ΠΏΡΡΡ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ. Π Π°Π·Π±ΠΈΡΠ°Π½Π΅ΡΠΎ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΡΡ ΡΠ΅ ΠΏΠΎΠΌΠ°Π³Π° Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΈ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΈ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ. Π‘ Calico ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π³Π»ΠΎΠ±Π°Π»Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° ΠΊΡΠΌ Π΅ΡΠΈΠΊΠ΅Ρ (Π³ΡΡΠΏΠ° ΠΎΡ Π²ΡΠ·Π»ΠΈ ΠΈ ΠΏΠΎΠ΄ΠΎΠ²Π΅) ΠΈ Π΄Π° ΠΏΡΠΈΠ»Π°Π³Π°ΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ. Π’ΠΎΠ²Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΠΈΡΡΠΈΡΠ΅ ΠΏΠΎ ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ° ΠΈ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡ Π΄ΠΈΠ·Π°ΠΉΠ½ ΡΠ΄ΠΎΠ±Π½ΠΎ Π΄Π° Π·Π°ΡΠΈΡΠ°Π²Π°Ρ βΠ²ΡΠΈΡΠΊΠΎβ (ΡΠΈΠΏΠΎΠ²Π΅ ΠΊΡΠ°ΠΉΠ½ΠΈ ΡΠΎΡΠΊΠΈ) Π½Π°Π²Π΅Π΄Π½ΡΠΆ, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π΅Π΄ΠΈΠ½Π΅Π½ Π΅Π·ΠΈΠΊ Π½Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° Ρ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ Π½Π° Calico.
ΠΡΠΈΠ·Π½Π°Π½ΠΈΠ΅: ΠΠΈΡ
ΠΈΡΠΊΠ°Π» Π΄Π° Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com