Calico ãããã¯ãŒã¯ ãã©ã°ã€ã³ã¯ãããŒããŠã§ã¢ ãã¹ããä»®æ³ãã·ã³ãããã³ããããä¿è·ããããã®çµ±äžãããæ§æãåããå¹
åºããããã¯ãŒã¯ ããªã·ãŒãæäŸããŸãã ãããã®ããªã·ãŒã¯ãåå空éå
ã«é©çšããããšãã以äžã«é©çšãããã°ããŒãã« ãããã¯ãŒã¯ ããªã·ãŒãšããŠé©çšããããšãã§ããŸãã
ãã®èšäºã¯ãKubernetes ããã³ Calico ãããã¯ãŒã¯ ããªã·ãŒã®ä»çµã¿ã«ã€ããŠåºæ¬çã«ç解ããŠããããšãåæãšããŠããŸãã ããã§ãªãå Žåã¯ãè©ŠããŠã¿ãããšããå§ãããŸã
ãµã©ãµ
åºæ¬çãªã¬ãã«ã§ã¯ãCalico ããããããããã¯ãŒã¯ã«æ¥ç¶ãããšã (以äžã®å³ãåç §)ãä»®æ³ã€ãŒãµããã ã€ã³ã¿ãŒãã§ã€ã¹ (veth) ã䜿çšããŠãããããã¹ãã«æ¥ç¶ããŸãã ãããã«ãã£ãŠéä¿¡ããããã©ãã£ãã¯ã¯ããã®ä»®æ³ã€ã³ã¿ãŒãã§ã€ã¹ãããã¹ãã«éä¿¡ãããç©çãããã¯ãŒã¯ ã€ã³ã¿ãŒãã§ã€ã¹ããéä¿¡ãããå Žåãšåãæ¹æ³ã§åŠçãããŸãã ããã©ã«ãã§ã¯ãCalico ã¯ãããã®ã€ã³ã¿ãŒãã§ã€ã¹ã« caliXXX ãšããååãä»ããŸãã ãã©ãã£ãã¯ã¯ä»®æ³ã€ã³ã¿ãŒãã§ã€ã¹ãçµç±ããããããããã XNUMX ãããé¢ããŠãããã®ããã« iptables ãééããŸãã ãããã£ãŠããã©ãã£ãã¯ããããã«éåä¿¡ããããšãããã®ãã©ãã£ãã¯ã¯ãã¹ãã®èŠ³ç¹ãã転éãããŸãã
Calico ãå®è¡ããŠãã Kubernetes ããŒãã§ã¯ã次ã®ããã«ä»®æ³ã€ã³ã¿ãŒãã§ã€ã¹ (veth) ãã¯ãŒã¯ããŒãã«ãããã§ããŸãã 以äžã®äŸã§ã¯ãveth#10 (calic1cbf1ca0f8) ã calico-monitoring åå空éã® cnx-manager-* ã«æ¥ç¶ãããŠããããšãããããŸãã
[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 (ããããŸãã¯ãããã¯ãŒã¯äžã®å¥ã®ããŒãã«éä¿¡ããã) ãééããŸãã ããŒã«ã« ããã»ã¹ããããã±ãã㯠OUTPUT ãã§ãŒã³ãééãã次㫠POSTROUTING ãã§ãŒã³ãééããŠããã±ãŒãã«ã«éä¿¡ãããŸãã
iptables åŠçã®èŠ³ç¹ããã¯ãPod ã¯å€éšãšã³ãã£ã㣠(veth ã«æ¥ç¶ãããŠãã) ã§ãããããšã«æ³šæããŠãã ããã èŠçŽããŸããã:
- 転éããããã©ãã£ã㯠(natãã«ãŒãã£ã³ã°ããŸãã¯ããããžã®/ãããããã®ãã©ãã£ãã¯) ã¯ãPREROUTING - FORWARD - POSTROUTING ãã§ãŒã³ãééããŸãã
- ããŒã«ã« ãã¹ã ããã»ã¹ãžã®ãã©ãã£ãã¯ã¯ãPREROUTING - INPUT ãã§ãŒã³ãééããŸãã
- ããŒã«ã« ãã¹ã ããã»ã¹ããã®ãã©ãã£ãã¯ã¯ãOUTPUT - POSTROUTING ãã§ãŒã³ãééããŸãã
Calico ã¯ããã¹ãŠã®ãã§ãŒã³ã«ããªã·ãŒãé©çšã§ããããªã·ãŒ ãªãã·ã§ã³ãæäŸããŸãã ããã念é ã«çœ®ããŠãCalico ã§å©çšã§ããããŸããŸãªããªã·ãŒæ§æãªãã·ã§ã³ãèŠãŠã¿ãŸãããã 以äžã®ãªãã·ã§ã³ã®ãªã¹ãã®çªå·ã¯ãäžã®å³ã®çªå·ã«å¯Ÿå¿ããŠããŸãã
- ã¯ãŒã¯ããŒã ãšã³ããã€ã³ã (ããã) ããªã·ãŒ
- ãã¹ããšã³ããã€ã³ãããªã·ãŒ
- [ApplyOnForward] ãªãã·ã§ã³
- PreDNAT ããªã·ãŒ
- 远跡ãããŠããªãããªã·ãŒ
ãŸããã¯ãŒã¯ããŒã ãšã³ããã€ã³ã (Kubernetes ããããŸã㯠OpenStack VM) ã«ããªã·ãŒãã©ã®ããã«é©çšãããããèŠãŠããããã¹ã ãšã³ããã€ã³ãã®ããªã·ãŒ ãªãã·ã§ã³ãèŠãŠã¿ãŸãããã
ã¯ãŒã¯ããŒããšã³ããã€ã³ã
ã¯ãŒã¯ããŒããšã³ããã€ã³ãããªã·ãŒ (1)
ããã¯ãKubernetes ããããä¿è·ããããã®ãªãã·ã§ã³ã§ãã Calico 㯠Kubernetes NetworkPolicy ãšã®é£æºããµããŒãããŠããŸãããè¿œå ã®ããªã·ãŒã§ãã Calico NetworkPolicy ãš GlobalNetworkPolicy ãæäŸããŸãã Calico ã¯ãããã (ã¯ãŒã¯ããŒã) ããšã«ãã§ãŒã³ãäœæããã¯ãŒã¯ããŒãã® INPUT ãã§ãŒã³ãš OUTPUT ãã§ãŒã³ã FORWARD ãã§ãŒã³ã®ãã£ã«ã¿ãŒ ããŒãã«ã«ããã¯ããŸãã
ãã¹ããšã³ããã€ã³ã
ãã¹ããšã³ããã€ã³ãããªã·ãŒ (2)
CNI (ã³ã³ãã ãããã¯ãŒã¯ ã€ã³ã¿ãŒãã§ã€ã¹) ã«å ããŠãCalico ããªã·ãŒã¯ãã¹ãèªäœãä¿è·ããæ©èœãæäŸããŸãã Calico ã§ã¯ããã¹ã ã€ã³ã¿ãŒãã§ã€ã¹ãšå¿ èŠã«å¿ããŠããŒãçªå·ã®çµã¿åãããæå®ããŠããã¹ã ãšã³ããã€ã³ããäœæã§ããŸãã ãã®ãšã³ãã£ãã£ã«å¯Ÿããããªã·ãŒã®é©çšã¯ãINPUT ãã§ãŒã³ãš OUTPUT ãã§ãŒã³ã®ãã£ã«ã¿ãŒ ããŒãã«ã䜿çšããŠå®çŸãããŸãã å³ãããããããã«ã(2) ããŒã/ãã¹ãäžã®ããŒã«ã« ããã»ã¹ã«é©çšãããŸãã ã€ãŸãããã¹ã ãšã³ããã€ã³ãã«é©çšããããªã·ãŒãäœæããå Žåãããããšã®éã§éåä¿¡ããããã©ãã£ãã¯ã«ã¯åœ±é¿ããŸããã ãã ããCalico ããªã·ãŒã䜿çšããŠãã¹ããšãããã®ãã©ãã£ãã¯ããããã¯ããããã®åäžã®ã€ã³ã¿ãŒãã§ã€ã¹/æ§æãæäŸãããŸãã ããã«ãããç°çš®ãããã¯ãŒã¯ã®ããªã·ãŒç®¡çããã»ã¹ãå€§å¹ ã«ç°¡çŽ åãããŸãã ã¯ã©ã¹ã¿ãŒã®ã»ãã¥ãªãã£ã匷åããããã«ãã¹ã ãšã³ããã€ã³ã ããªã·ãŒãæ§æããããšããéèŠãªäœ¿çšäŸã§ãã
é©çšããªã·ãŒ (3)
Calico ã°ããŒãã« ãããã¯ãŒã¯ ããªã·ãŒã§ã¯ãApplyOnForward ãªãã·ã§ã³ã䜿çšããŠããã¹ãã«ãã£ãŠè»¢éããããã©ãã£ãã¯ãå«ãããã¹ã ãšã³ããã€ã³ããééãããã¹ãŠã®ãã©ãã£ãã¯ã«ããªã·ãŒãé©çšã§ããããã«ããŸãã ããã«ã¯ãããŒã«ã« ããããŸãã¯ãããã¯ãŒã¯äžã®ä»ã®å Žæã«è»¢éããããã©ãã£ãã¯ãå«ãŸããŸãã Calico ã§ã¯ãPreDNAT ããã³è¿œè·¡ãããŠããªãããªã·ãŒã䜿çšããããªã·ãŒã«å¯ŸããŠãã®èšå®ãæå¹ã«ããå¿ èŠããããŸãã次ã®ã»ã¯ã·ã§ã³ãåç §ããŠãã ããã ããã«ãä»®æ³ã«ãŒã¿ãŒãŸãã¯ãœãããŠã§ã¢ NAT ã䜿çšãããŠããå ŽåãApplyOnForward ã䜿çšããŠãã¹ã ãã©ãã£ãã¯ãç£èŠã§ããŸãã
åããããã¯ãŒã¯ ããªã·ãŒããã¹ã ããã»ã¹ãšãããã®äž¡æ¹ã«é©çšããå¿ èŠãããå Žåã¯ãApplyOnForward ãªãã·ã§ã³ã䜿çšããå¿ èŠããªãããšã«æ³šæããŠãã ããã å¿ èŠãªã®ã¯ãå¿ èŠãªãã¹ããšã³ããã€ã³ããšã¯ãŒã¯ããŒããšã³ããã€ã³ã (ããã) ã®ã©ãã«ãäœæããããšã ãã§ãã Calico ã¯ããšã³ããã€ã³ãã®çš®é¡ (ãã¹ããšã³ããã€ã³ããŸãã¯ã¯ãŒã¯ããŒã) ã«é¢ä¿ãªããã©ãã«ã«åºã¥ããŠããªã·ãŒãé©çšã§ããã»ã©è³¢ãã§ãã
PreDNAT ããªã·ãŒ (4)
Kubernetes ã§ã¯ãNodePorts ãªãã·ã§ã³ã䜿çšããŠããŸãã¯ãªãã·ã§ã³ã§ (Calico ã䜿çšããå Žå) ã¯ã©ã¹ã¿ãŒ IP ãŸãã¯å€éš IP ãªãã·ã§ã³ã䜿çšããŠãµãŒãã¹ ãšã³ãã£ã㣠ããŒããã¢ããã¿ã€ãºããããšã«ããããµãŒãã¹ ãšã³ãã£ã㣠ããŒããå€éšã«å ¬éã§ããŸãã Kube ãããã·ã¯ãDNAT ã䜿çšããŠããµãŒãã¹ã«ãã€ã³ããããåä¿¡ãã©ãã£ãã¯ã察å¿ãããµãŒãã¹ã®ãããã«åæ£ããŸãã ãã®ããšãèžãŸãããšãNodePort ãçµç±ãããã©ãã£ãã¯ã«å¯ŸããŠããªã·ãŒãé©çšããã«ã¯ã©ãããã°ããã§ãããã? ãã©ãã£ãã¯ã DNAT (ãã¹ã:ããŒããšå¯Ÿå¿ãããµãŒãã¹ã®éã®ãããã³ã°) ã«ãã£ãŠåŠçãããåã«ãããã®ããªã·ãŒã確å®ã«é©çšãããããã«ãCalico ã¯ãpreDNAT: trueããšåŒã°ãã globalNetworkPolicy ã®ãã©ã¡ãŒã¿ãŒãæäŸããŸãã
pre-DNAT ãæå¹ãªå Žåããããã®ããªã·ãŒã¯ãå³ã® (4)ãPREROUTING ãã§ãŒã³ã®ãã³ã°ã« ããŒãã«ãDNAT ã®çŽåã«å®è£ ãããŸãã ãããã®ããªã·ãŒã®é©çšã¯ãã©ãã£ãã¯åŠçãã¹ã®ããªãæ©ã段éã§è¡ããããããããã§ã¯éåžžã®ããªã·ãŒã®é åºã«ã¯åŸããŸããã ãã ããpreDNAT ããªã·ãŒã¯ããªã·ãŒéã®é©çšé åºãå°éããŸãã
pre-DNAT ã䜿çšããŠããªã·ãŒãäœæããå Žåã¯ãåŠçãããã©ãã£ãã¯ã«æ³šæãã倧éšåãæåŠãããããã«ããããšãéèŠã§ãã pre-DNAT ããªã·ãŒã§ãèš±å¯ããšããŒã¯ããããã©ãã£ãã¯ã¯ãã¹ããšã³ããã€ã³ã ããªã·ãŒã«ãã£ãŠãã§ãã¯ãããªããªããŸãããpre-DNAT ããªã·ãŒã«å€±æãããã©ãã£ãã¯ã¯æ®ãã®ãã§ãŒã³ãééãç¶ããŸãã
Calico ã§ã¯ãå®çŸ©äžãã©ãã£ãã¯ã®å®å
ããŸã éžæãããŠããªããããpreDNAT ã䜿çšããå Žå㯠applyOnForward ãªãã·ã§ã³ãæå¹ã«ããããšãå¿
é ã«ãªã£ãŠããŸãã ãã©ãã£ãã¯ã¯ãã¹ã ããã»ã¹ã«éä¿¡ããããšããããããŸãã¯å¥ã®ããŒãã«è»¢éããããšãã§ããŸãã
远跡ãããŠããªãããªã·ãŒ (5)
ãããã¯ãŒã¯ãšã¢ããªã±ãŒã·ã§ã³ã®åäœã«ã¯å€§ããªéããããå¯èœæ§ããããŸãã 極端ãªå Žåã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã¯åç¶æéã®çãæ¥ç¶ãå€æ°çæããããšããããŸãã ããã«ãããconntrack (Linux ãããã¯ãŒã¯ ã¹ã¿ãã¯ã®ã³ã¢ ã³ã³ããŒãã³ã) ãã¡ã¢ãªäžè¶³ã«ãªãå¯èœæ§ããããŸãã åŸæ¥ããã®çš®ã®ã¢ããªã±ãŒã·ã§ã³ã Linux äžã§å®è¡ããã«ã¯ãconntrack ãæåã§æ§æãŸãã¯ç¡å¹ã«ããããconntrack ããã€ãã¹ãã iptables ã«ãŒã«ãäœæããå¿
èŠããããŸããã æ¥ç¶ãã§ããã ãæ©ãåŠçãããå Žåã¯ãCalico ã®è¿œè·¡ãããŠããªãããªã·ãŒãããã·ã³ãã«ã§å¹ççãªãªãã·ã§ã³ã§ãã ããšãã°ã倧èŠæš¡ãªã䜿çšããå Žåã
ãããèªã
Calico globalNetworkPolicy ã§ãdoNotTrack: trueããªãã·ã§ã³ãèšå®ãããšã**远跡ãããªã** ããªã·ãŒã«ãªããLinux ãã±ããåŠçãã€ãã©ã€ã³ã®éåžžã«æ©ã段éã§é©çšãããŸãã äžã®å³ãèŠããšãæ¥ç¶è¿œè·¡ (conntrack) ãéå§ãããåã«ãçã®ããŒãã«ã® PREROUTING ãã§ãŒã³ãš OUTPUT ãã§ãŒã³ã«è¿œè·¡ãããŠããªãããªã·ãŒãé©çšãããŠããŸãã ãã±ããã远跡ãããŠããªãããªã·ãŒã«ãã£ãŠèš±å¯ãããŠããå Žåããã®ãã±ããã®æ¥ç¶è¿œè·¡ãç¡å¹ã«ããããã«ããŒã¯ãããŸãã ãã®æå³ã¯ïŒ
- 远跡ãããŠããªãããªã·ãŒã¯ãã±ããããšã«é©çšãããŸãã æ¥ç¶ïŒãŸãã¯æµãïŒãšããæŠå¿µã¯ãããŸããã æ¥ç¶ãäžè¶³ãããšãããã€ãã®éèŠãªçµæãçããŸãã
- èŠæ±ãã©ãã£ãã¯ãšå¿çãã©ãã£ãã¯ã®äž¡æ¹ãèš±å¯ããå Žåã¯ãåä¿¡ãã©ãã£ãã¯ãšéä¿¡ãã©ãã£ãã¯ã®äž¡æ¹ã®ã«ãŒã«ãå¿ èŠã§ã (Calico ã¯éåžžãconntrack ã䜿çšããŠå¿çãã©ãã£ãã¯ãèš±å¯ãšããŠããŒã¯ãããã)ã
- untracked ããªã·ãŒã¯ãKubernetes ã¯ãŒã¯ããŒã (ããã) ã§ã¯æ©èœããŸããããã®å Žåããããããã®éä¿¡æ¥ç¶ã远跡ããæ¹æ³ããªãããã§ãã
- NAT ã¯ã远跡ãããŠããªããã±ããã§ã¯æ£ããæ©èœããŸãã (ã«ãŒãã«ã NAT ãããã³ã°ã conntrack ã«ä¿åãããã)ã
- 远跡ãããŠããªãããªã·ãŒã®ããã¹ãŠãèš±å¯ãã«ãŒã«ãééãããšããã¹ãŠã®ãã±ããã远跡ãããŠããªããšããŠããŒã¯ãããŸãã ããã¯ã»ãšãã©ã®å Žåãåžæã©ããã§ã¯ãªãããã远跡ãããŠããªãããªã·ãŒã«ãã£ãŠèš±å¯ããããã±ãããéåžžã«æ éã«éžæããããšãéèŠã§ã (ãããŠãã»ãšãã©ã®ãã©ãã£ãã¯ãéåžžã®è¿œè·¡ãããããªã·ãŒãééã§ããããã«ãã)ã
- 远跡ãããŠããªãããªã·ãŒã¯ããã±ããåŠçãã€ãã©ã€ã³ã®æåã«é©çšãããŸãã ããã¯ãCalico ããªã·ãŒãäœæãããšãã«ç解ããããšãéåžžã«éèŠã§ãã order:1 ã®ããã ããªã·ãŒãš order:1000 ã®è¿œè·¡ãããŠããªãããªã·ãŒãèšå®ã§ããŸãã é¢ä¿ãªãã§ãããã Untracked ããªã·ãŒã¯ããããã®ããªã·ãŒããåã«é©çšãããŸãã 远跡ãããŠããªãããªã·ãŒã¯ãããªã·ãŒéã§ã®ã¿å®è¡é åºãå°éããŸãã
doNotTrack ããªã·ãŒã®ç®çã® 5 ã€ã¯ãLinux ãã±ããåŠçãã€ãã©ã€ã³ã®éåžžã«æ©ã段éã§ããªã·ãŒãé©çšããããšã§ãããããCalico ã§ã¯ãdoNotTrack ã䜿çšãããšãã« applyOnForward ãªãã·ã§ã³ãæå®ããããšãå¿ é ã«ããŠããŸãã ãã±ããåŠçå³ãåç §ãããšãã«ãŒãã£ã³ã°ã®æ±ºå®ã®åã« untracked(XNUMX) ããªã·ãŒãé©çšãããããšã«æ³šæããŠãã ããã ãã©ãã£ãã¯ã¯ãã¹ã ããã»ã¹ã«éä¿¡ããããšããããããŸãã¯å¥ã®ããŒãã«è»¢éããããšãã§ããŸãã
çµæ
Calico ã®ããŸããŸãªããªã·ãŒ ãªãã·ã§ã³ (ãã¹ã ãšã³ããã€ã³ããApplyOnForwardãpreDNATãããã³ Untracked) ãšããããããã±ããåŠçãã¹ã«æ²¿ã£ãŠã©ã®ããã«é©çšããããã調ã¹ãŸããã ããããã©ã®ããã«æ©èœããããç解ããããšã¯ãå¹æçã§å®å šãªããªã·ãŒãéçºããã®ã«åœ¹ç«ã¡ãŸãã Calico ã䜿çšãããšãã©ãã« (ããŒããšãããã®ã°ã«ãŒã) ã«é©çšãããã°ããŒãã« ãããã¯ãŒã¯ ããªã·ãŒã䜿çšããããŸããŸãªãã©ã¡ãŒã¿ãŒãå«ãããªã·ãŒãé©çšã§ããŸãã ããã«ãããã»ãã¥ãªãã£ããã³ãããã¯ãŒã¯èšèšã®å°é家ã¯ãCalico ããªã·ãŒãå«ãåäžã®ããªã·ãŒèšèªã䜿çšããŠãããã¹ãŠã(ãšã³ããã€ã³ãã®çš®é¡) ãäžåºŠã«ç°¡åã«ä¿è·ã§ããããã«ãªããŸãã
è¬èŸïŒæè¬ããããšæããŸã
åºæïŒ habr.com