ã泚æ perevã ïŒãã®èšäºã¯ãKubernetesã®æè¡ã³ã³ãµã«ã¿ã³ãå
Œèªå®ç®¡çè
ã§ããDaniele Polencicã«ãã£ãŠæžããããŠãŒã¶ãŒèŠæ±ãçåºã«é
ä¿¡ããéã«kube-proxyãæãã圹å²ãšãã¯ã©ã¹ã¿ãŒããŒãã®1ã€ã§åé¡ãçºçãããšãã«äœãèµ·ãããã«ã€ããŠèª¬æããŸããKubernetesã«ãããã€ãããã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒãã¯ã1ã€ä»¥äžã®äœæ¥ããŒãã§å®è¡ãããŸãã ããŒãã¯ãç©çãã·ã³ãŸãã¯ä»®æ³ãã·ã³ããŸãã¯AWS EC2ãŸãã¯Google Compute Engineã®ããããã«é
眮ã§ããŸãããã®ãããªãµã€ããå€æ°ååšãããããã¢ããªã±ãŒã·ã§ã³ãå¹æçã«èµ·åããã³ã¹ã±ãŒãªã³ã°ã§ããŸãã ããšãã°ãã¯ã©ã¹ã¿ãŒã3ã€ã®ããŒãã§æ§æãããŠãããã¢ããªã±ãŒã·ã§ã³ã4ã€ã®ã¬ããªã«ã«ã¹ã±ãŒãªã³ã°ããå ŽåãKubernetesã¯æ¬¡ã®ããã«ããŒãéã§ããããåçã«åæ£ããŸãã

ãã®ãããªã¢ãŒããã¯ãã£ã¯ããŸãæ©èœããŸãã 1ã€ã®ããŒãã䜿çšã§ããªãå Žåãã¢ããªã±ãŒã·ã§ã³ã¯ä»ã®2ã€ã®ããŒãã§åŒãç¶ãåäœããŸãã äžæ¹ãKubernetesã¯4çªç®ã®ã¬ããªã«ãå¥ã®ïŒäœ¿çšå¯èœãªïŒããŒãã«åå²ãåœãŠããŸãã

ããã«ããã¹ãŠã®ããŒããåé¢ãããŠããŠãããªã¯ãšã¹ããåŠçã§ããŸãã ããšãã°ãã¢ããªã±ãŒã·ã§ã³ã¬ããªã«ã®æ°ã2ã€ã«æžãããŸãã

åããŒããã¢ããªã±ãŒã·ã§ã³ãæäŸã§ããããã3çªç®
ïŒããŒã3ïŒã¯ãã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããŠããããä»ã®ããŒãã®1ã€ã«ãã©ãã£ãã¯ããªãã€ã¬ã¯ãããå¿
èŠãããããšãã©ã®ããã«ç¥ãã®ã§ãã

Kubernetesã«ã¯ãåããŒãã§å®è¡ããã
kube-proxy
ãã€ããªãããããã©ãã£ãã¯ãç¹å®ã®ãµãã«ã«ãŒãã£ã³ã°ããŸãã ããã«ã®åä»ä¿ãšæ¯èŒã§ããŸãã
Kube-proxy
ã¯ãããŒãã«çä¿¡ãããã¹ãŠã®ãã©ãã£ãã¯ãåãå
¥ããæ£ãããã©ãã£ãã¯ã«è»¢éããŸãã
ãããã kube-proxy
ã¯ããã¹ãŠã®ããããã©ãã«ããããã©ã®ããã«ç¥ãã®ã§ããããïŒ
圌ã¯ç¥ããŸããã
ãããã圌ã¯ãã¹ãŠã®ã«ãŒãã£ã³ã°ã«ãŒã«ã®ãªã¹ããäœæããã¡ã€ã³ïŒãã¹ã¿ãŒïŒããŒãã®
ãã¹ãŠã«ã€ããŠç¥ã£
ãŠããŸãã ãããŠ
kube-proxy
ã¯ãããã®ã«ãŒã«ããã§ãã¯ããããããå®æœ
kube-proxy
ãŸãã äžèšã®ç°¡åãªã·ããªãªã§ã¯ãã«ãŒã«ã®ãªã¹ãã¯æ¬¡ã®ãšããã§ãã
- æåã®ã¢ããªã±ãŒã·ã§ã³ã¬ããªã«ã¯ããŒã1 ïŒããŒã1ïŒã§å©çšå¯èœã§ãã
- 2çªç®ã®ã¢ããªã±ãŒã·ã§ã³ã¬ããªã«ã¯ããŒã2 ïŒããŒã2ïŒã§å©çšå¯èœã§ãã
ãã©ãã£ãã¯ã®
kube-proxy
ããŒãã¯é¢ä¿ãããŸãã
kube-proxy
ããã®ã«ãŒã«ã®ãªã¹ãã«åŸã£ãŠãã©ãã£ãã¯ããªãã€ã¬ã¯ããã
å Žæãèªè
ããŠããŸãã

ããããkube-proxyãã¯ã©ãã·ã¥ãããšã©ããªããŸããïŒ
ãããŠãã«ãŒã«ã®ãªã¹ããæ¶ãããã©ãããŸããïŒ
ãã©ãã£ãã¯ã転éããã«ãŒã«ããªãå Žåã¯ã©ããªããŸããïŒ
é
äºåŠ
ãåã質åãããŸããã ãããŠåœŒã¯ãããç解ããããšã«ããŸããã
GCPã«2ã€ã®ããŒãã®ã¯ã©ã¹ã¿ãŒããããšããŸãã
$ kubectl get nodes NAME STATUS ROLES AGE VERSION node1 Ready <none> 17h v1.8.8-gke.0 node2 Ready <none> 18h v1.8.8-gke.0
ãããŠãããªãã¯Manabuã¢ããªããããã€ããŠããŸãïŒ
$ kubectl create -f https://raw.githubusercontent.com/manabusakai/k8s-hello-world/master/kubernetes/deployment.yml $ kubectl create -f https://raw.githubusercontent.com/manabusakai/k8s-hello-world/master/kubernetes/service.yml
ããã¯ãçŸåšã®å²çè£ã®ãã¹ãåãWebããŒãžã«è¡šç€ºããåçŽãªã¢ããªã±ãŒã·ã§ã³ã§ãã

10åã®ã¬ããªã«ã«ã¹ã±ãŒã«ããŸãïŒ
Deployment ïŒïŒ
$ kubectl scale --replicas 10 deployment/k8s-hello-world
10åã®ã¬ããªã«ã2ã€ã®ããŒãïŒ
node1ããã³
node2 ïŒã«åçã«åæ£ãããŠã
ãŸã ã
$ kubectl get pods NAME READY STATUS NODE k8s-hello-world-55f48f8c94-7shq5 1/1 Running node1 k8s-hello-world-55f48f8c94-9w5tj 1/1 Running node1 k8s-hello-world-55f48f8c94-cdc64 1/1 Running node2 k8s-hello-world-55f48f8c94-lkdvj 1/1 Running node2 k8s-hello-world-55f48f8c94-npkn6 1/1 Running node1 k8s-hello-world-55f48f8c94-ppsqk 1/1 Running node2 k8s-hello-world-55f48f8c94-sc9pf 1/1 Running node1 k8s-hello-world-55f48f8c94-tjg4n 1/1 Running node2 k8s-hello-world-55f48f8c94-vrkr9 1/1 Running node1 k8s-hello-world-55f48f8c94-xzvlc 1/1 Running node2
ãµãŒãã¹ã¯ã10åã®ã¬ããªã«ã«ãããèŠæ±ããã®è² è·ãåæ£ããããã«äœæãããŸãã
$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE k8s-hello-world NodePort 100.69.211.31 <none> 8080:30000/TCP 3h kubernetes ClusterIP 100.64.0.1 <none> 443/TCP 18h
NodePort
ãä»ããŠå€éšã«è»¢éãããããŒã30000ã§ã¢ã¯ã»ã¹å¯èœã§ããã€ãŸããåããŒãã§ãå€éšã€ã³ã¿ãŒãããçšã«ããŒã30000ãéããçä¿¡ãã©ãã£ãã¯ã®åä¿¡ãéå§ããŸãã

ãããããã©ãã£ãã¯ã¯ã©ã®ããã«ããŠããŒã30,000ããçåºã«ã«ãŒãã£ã³ã°ãããŸããïŒ
kube-proxy
ã¯ãããŒã30000ãã10åã®ãããã®1ã€ãžã®çä¿¡ãã©ãã£ãã¯ã®ã«ãŒã«ãèšå®ããŸãã
ããããã®ããŒãã®ããŒã30,000ã«ãªã¯ãšã¹ããéä¿¡ããŠã¿ãŠãã ããã
$ curl <node ip>:30000
泚 ïŒãã¹ãIPã¢ãã¬ã¹ã¯ã kubectl get nodes -o wide
ã³ãã³ãã§kubectl get nodes -o wide
ã§ããŸããã¢ããªã±ãŒã·ã§ã³ã¯ãHello worldïŒãã§å¿çããã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããŠããã³ã³ããã®ãã¹ãåïŒ
Hello world! via <hostname>
Hello world! via <hostname>
ã
åãURLãåãªã¯ãšã¹ããããšãåãåçã衚瀺ãããå Žåãšãå€æŽãããå ŽåããããŸãã ãã®çç±ã¯ã
kube-proxy
ããŒããã©ã³ãµãŒãšããŠæ©èœããã«ãŒãã£ã³ã°ããã§ãã¯ãã10åã®ã»ã¯ã·ã§ã³ã«ãã©ãã£ãã¯ãåæ£ãããããã§ãã
èå³æ·±ãããšã«ãããªããã©ã®ããŒããåç
§ããŠãããã¯é¢ä¿ãããŸãããçãã¯ã©ã®ãããããã§ã-ä»ã®ããŒãã«ãããã®ïŒããªããåãããã®ã§ã¯ãªãïŒããã®ãã®ã§ãã
æçµæ§æã§ã¯ãå€éšããŒããã©ã³ãµãŒã䜿çšããå¿
èŠããããŸããããã«ãããããŒãéã§ãã©ãã£ãã¯ãåæ£ãããŸãïŒããŒã30000äžïŒã æçµçãªã¯ãšãªãããŒã¹ããŒã ã¯æ¬¡ã®ããã«ãªããŸãã

ã€ãŸããããŒããã©ã³ãµãŒã¯ãã€ã³ã¿ãŒãããããã®çä¿¡ãã©ãã£ãã¯ã2ã€ã®ããŒãã®ããããã«ãªãã€ã¬ã¯ãããŸãã ãã®ã¹ããŒã å
šäœãæ確ã«ããŸã-ãã®åäœã®åçãèŠçŽããŸãïŒ
- ã€ã³ã¿ãŒãããããã®ãã©ãã£ãã¯ã¯ãã¡ã€ã³ã®ããŒããã©ã³ãµãŒã«åããããŸãã
- ãã®ãã©ã³ãµãŒã¯ã2ã€ã®ããŒãã®ããããã®ããŒã30000ã«ãã©ãã£ãã¯ã転éããŸãã
kube-proxy
ã«ãã£ãŠèšå®ãããã«ãŒã«ã¯ããã¹ããããµãã«ãã©ãã£ãã¯ããªãã€ã¬ã¯ãããŸãã- ãã©ãã£ãã¯ãäžã«èœã¡ãã
ãããå
šäœã®ã¹ããŒã ã§ãïŒ
ããããã¹ãŠå解ããæã§ã
ãã¹ãŠãçžäºäœçšããæ¹æ³ãããã£ãã®ã§ãå
ã®è³ªåã«æ»ããŸãããã ã«ãŒãã£ã³ã°ã«ãŒã«ãå€æŽãããšã©ããªããŸããïŒ ã¯ã©ã¹ã¿ãŒã¯åŒãç¶ãæ©èœããŸããïŒ ãããã¯ãªã¯ãšã¹ãã«å¯Ÿå¿ããŸããïŒ
ã«ãŒãã£ã³ã°ã«ãŒã«ãåé€ããå¥ã®ã¿ãŒããã«ã§-ã¢ããªã±ãŒã·ã§ã³ã®å¿çæéãšèŠæ±ã®æ¬ èœãç£èŠããŸãã åŸè
ã®å Žåã1ç§ããšã«çŸåšã®æå»ã衚瀺ããŠã¢ããªã±ãŒã·ã§ã³ã«èŠæ±ãè¡ãã«ãŒããäœæããã ãã§ååã§ãã
$ while sleep 1; do date +%X; curl -sS http://<your load balancer ip>/ | grep ^Hello; done
åºåã§ã¯ãå²çè£ããæéãšå¿çããã¹ããå«ãåãååŸããŸãã
10:14:41 Hello world! via k8s-hello-world-55f48f8c94-vrkr9 10:14:43 Hello world! via k8s-hello-world-55f48f8c94-tjg4n
ããã§ã¯ããã¹ãããã«ãŒãã£ã³ã°ã«ãŒã«ãåé€ããŸãããããæåã«ãããè¡ãæ¹æ³ãèããŸãããã
kube-proxy
ã¯ã
userspace ã
iptablesããã³
ipvsã® 3ã€ã®ã¢ãŒãã§åäœã§ããŸãã Kubernetes 1.2以éã®ããã©ã«ãã¢ãŒãã¯
iptablesã§ãã
ïŒ æ³š ïŒæåŸã®ã¢ãŒãipvsã¯ã K8s 1.8ãªãªãŒã¹ã§ç»å Žãã 1.9ã§ããŒã¿ã¹ããŒã¿ã¹ãåãåããŸãããïŒiptablesã¢ãŒãã§ã¯ã
kube-proxy
ã¯iptablesã«ãŒã«ã䜿çšããŠãã¹ãäžã®ã«ãŒãã£ã³ã°ã«ãŒã«ããªã¹ãããŸãã ãããã£ãŠã
iptables -F
ã³ãã³ãã䜿çšããŠãä»»æã®ããŒãã«ç§»åããŠãããã®ã«ãŒã«ãåé€ã§ããŸãã
泚 ïŒ iptables -F
ãåŒã³åºããšãSSHæ¥ç¶ãåæãããå¯èœæ§ãããããšã«æ³šæããŠãã ããããã¹ãŠãèšç»ã©ããã«é²ãã å Žåã次ã®ãããªãã®ã衚瀺ãããŸãã
10:14:41 Hello world! via k8s-hello-world-55f48f8c94-xzvlc 10:14:43 Hello world! via k8s-hello-world-55f48f8c94-tjg4n
ããã«ãããããã«ãiptablesã«ãŒã«ããªã»ãããããŠãã次ã®åçãŸã§çŽ27ç§ïŒ10:14:43ãã10:15:10ãŸã§ïŒããããŸããã
ãã®éã«äœãèµ·ããŸãããïŒ 27ç§åŸã«ãã¹ãŠãæ£åžžã«ãªã£ãã®ã¯ãªãã§ããïŒ ãã¶ãããã¯åãªãå¶ç¶ã§ããããïŒ
åã³ã«ãŒã«ããªã»ããããŸãããã
11:29:55 Hello world! via k8s-hello-world-55f48f8c94-xzvlc 11:29:56 Hello world! via k8s-hello-world-55f48f8c94-tjg4n
11:29:56ãã11:30:25ãŸã§ã®29ç§ã®äžæåæ¢ã衚瀺ãããŸãã ããããã¯ã©ã¹ã¿ãŒã¯åã³æ©èœããããã«ãªããŸããã
å¿çã«30ç§ãããã®ã¯ãªãã§ããïŒ ã«ãŒãã£ã³ã°ããŒãã«ããªããŠããèŠæ±ã¯ããŒãã«å±ããŸããïŒ
ãã®30ç§éã«ããŒãã§äœãèµ·ãããã確èªã§ããŸãã å¥ã®ã¿ãŒããã«ã§ãã¢ããªã±ãŒã·ã§ã³ã«æ¯ç§ãªã¯ãšã¹ããè¡ãã«ãŒããå®è¡ããŸãããä»åã¯ãããŒããã©ã³ãµãŒã§ã¯ãªãããŒãã«ã¢ã¯ã»ã¹ããŸãã
$ while sleep 1; printf %"s\n" $(curl -sS http://<ip of the node>:30000); done
ãããŠãiptablesã«ãŒã«ãå床ãªã»ããããŸãã 次ã®ãã°ãååŸããŸãã
Hello world! via k8s-hello-world-55f48f8c94-xzvlc Hello world! via k8s-hello-world-55f48f8c94-tjg4n
ã«ãŒã«ããªã»ããããåŸããã¹ããžã®æ¥ç¶ãã¿ã€ã ã¢ãŠãããããšã¯é©ãããšã§ã¯ãããŸããã ãããã
curl
ã10ç§ã®å¿çãåŸ
ã€ã®ã¯èå³æ·±ãããšã§ãã
ããããåã®äŸã§ããŒããã©ã³ãµãŒãæ°ããæ¥ç¶ãåŸ
æ©ããŠããå Žåã¯ã©ãã§ããããã ããã¯30ç§ã®é
延ã説æããŸãããååã«é·ãåŸ
æ©ã®åŸãããŒããæ¥ç¶ãåãå
¥ããæºåãã§ããŠããçç±ã¯æ確ã§ã¯ãããŸããã
ã§ã¯ããªã30ç§åŸã«åã³ãã©ãã£ãã¯ãæµããã®ã§ããããïŒ èª°ãiptablesã«ãŒã«ã埩å
ããŸããïŒ
iptablesã«ãŒã«ããªã»ããããåã«ãããããèŠãããšãã§ããŸãïŒ
$ iptables -L
ã«ãŒã«ããªã»ãããããã®ã³ãã³ãã®å®è¡ãç¶ããŸã-æ°ç§ã§ã«ãŒã«ã埩å
ãããããšãããããŸãã
ããªãã¯
kube-proxy
ã§ããïŒ ã¯ãïŒ å
¬åŒã®kube-proxyããã¥ã¡ã³ãã«ã¯ã2ã€ã®èå³æ·±ããã©ã°ããããŸãã
--iptables-sync-period
-iptablesã«ãŒã«ãæŽæ°ãããæ倧ééïŒäŸïŒã5sããã1mããã2h22mãïŒã 0ãã倧ãããªããã°ãªããŸãããããã©ã«ãã¯30ç§ã§ãã--iptables-min-sync-period
ãšã³ããã€ã³ãããã³ãµãŒãã¹ãžã®å€æŽãçºçãããšãã«iptablesã«ãŒã«ãæŽæ°ãããæå°ééïŒäŸïŒã5sããã1mããã2h22mãïŒã ããã©ã«ãã¯10ç§ã§ãã
ã€ãŸãã
kube-proxy
iptablesã«ãŒã«ã10ã30ç§ããšã«æŽæ°ããŸãã iptablesã«ãŒã«ããªã»ãããããšã
kube-proxy
ããããèªèããŠåŸ©å
ãããŸã§ã«æ倧30ç§ããããŸãã
ãã®ãããããŒããåã³æ©èœãããŸã§ã«çŽ30ç§ããããŸããã ãŸããã«ãŒãã£ã³ã°ããŒãã«ããã¹ã¿ãŒããŒãããã¯ãŒã«ãŒããŒãã«å°éããæ¹æ³ã«ã€ããŠã説æããŸãã ãããã¯
kube-proxy
ã«ãã£ãŠå®æçã«åæãããŸãã ã€ãŸããçåºãè¿œå ãŸãã¯åé€ãããã³ã«ãã¡ã€ã³ããŒãã¯ã«ãŒãã®ãªã¹ããããçŽãã
kube-proxy
ã¯èŠåãçŸåšã®ããŒããšå®æçã«åæããŸãã
ãã®ããããã¹ãäžã®iptablesã«ãŒã«ã誰ããå°ç¡ãã«ããå Žåã«Kubernetesãš
kube-proxy
ã©ã®ããã«åŸ©å
ããããããŸãšããŸãã
- iptablesã«ãŒã«ã¯ãã¹ãããåé€ãããŸããã
- èŠæ±ã¯ããŒããã©ã³ãµãŒã«éä¿¡ãããããŒãã«ã«ãŒãã£ã³ã°ãããŸãã
- ããŒãã¯çä¿¡èŠæ±ãåãå
¥ããªãããããã©ã³ãµãŒã¯åŸ
æ©ããŠããŸãã
- 30ç§åŸã
kube-proxy
ã¯iptablesã«ãŒã«ã埩å
ããŸãã - ãã¹ãã¯åã³ãã©ãã£ãã¯ãåä¿¡ã§ããŸãã Iptablesã«ãŒã«ã¯ããã©ã³ãµãŒèŠæ±ãsubã«ãªãã€ã¬ã¯ãããŸãã
- Underã¯ã30ç§ã®åèšé
延ã§ããŒããã©ã³ãµãŒãæºãããŸãã
30ç§ã®åŸ
æ©ã¯ãã¢ããªã±ãŒã·ã§ã³ã§ã¯åãå
¥ããããªãå ŽåããããŸãã ãã®å Žåã
kube-proxy
æšæºæŽæ°ééã®å€æŽãæ€èšããå¿
èŠããããŸãã ãããã®èšå®ã¯ã©ãã«ãããã©ã®ããã«å€æŽããã®ã§ããïŒ
ããŒãã«ãšãŒãžã§ã³ã
-kubelet-ããããåããŒãã§éççåºãšããŠ
kube-proxy
ãèµ·åããã®ã¯åœŒã§ãã éçãªæåºã«é¢ããããã¥ã¡ã³ãã¯ãkubeletãç¹å®ã®ãã£ã¬ã¯ããªã®å
容ããã§ãã¯ãããããããã¹ãŠã®ãªãœãŒã¹ãäœæããããšã瀺åããŠããŸãã
ããŒãã§å®è¡ãããŠããkubeletããã»ã¹ãèŠããšããã©ã°
--pod-manifest-path=/etc/kubernetes/manifests
å®è¡ãããŠããããšãããããŸãã å°åŠæ ¡ã®
ls
ã¯ç§å¯ã®ããŒã«ãéããŸãïŒ
$ ls -l /etc/kubernetes/manifests total 4 -rw-r--r-- 1 root root 1398 Feb 24 08:08 kube-proxy.manifest
ãã®
kube-proxy.manifest
ã¯äœãå«ãŸããŠããŸããïŒ
apiVersion: v1 kind: Pod metadata: name: kube-proxy spec: hostNetwork: true containers: - name: kube-proxy image: gcr.io/google_containers/kube-proxy:v1.8.7-gke.1 command: - /bin/sh - -c -> echo -998 > /proc/$$$/oom_score_adj && exec kube-proxy --master=https://35.190.207.197 --kubeconfig=/var/lib/kube-proxy/kubeconfig --cluster-cidr=10.4.0.0/14 --resource-container="" --v=2 --feature-gates=ExperimentalCriticalPodAnnotation=true --iptables-sync-period=30s 1>>/var/log/kube-proxy.log 2>&1
泚 ïŒç°¡åã«ããããã«ããã¡ã€ã«ã®å
容ã¯ããã§ã¯å®å
šã§ã¯ãããŸãããè¬ã¯è§£æ±ºããŸããïŒ ã芧ã®ãšããã
--iptables-sync-period=30s
ãªãã·ã§ã³ã¯30ç§ããšã«äœ¿çšãããiptablesã«ãŒã«ãæŽæ°ããŸãã ããã§ãç¹å®ã®ããŒãã§ã«ãŒã«ãæŽæ°ããããã®æå°æéãšæ倧æéãå€æŽã§ããŸãã
çµè«
iptablesã«ãŒã«ããªã»ãããããšããã¹ãã«ã¢ã¯ã»ã¹ã§ããªããªããŸãã ãã©ãã£ãã¯ã¯åŒãç¶ãããŒãã«éä¿¡ãããŸããããã以äžïŒã€ãŸãããµãã«ïŒè»¢éããããšã¯ã§ããŸããã Kubernetesã¯ãã«ãŒãã£ã³ã°ã«ãŒã«ãç£èŠããå¿
èŠã«å¿ããŠæŽæ°ããããšã«ããããã®ãããªåé¡ããå埩ã§ããŸãã
ãã®ããã¹ãã«å€ãã®ç¹ã§ã€ã³ã¹ãã¬ãŒã·ã§ã³ãäžããããã°æçš¿ã®
é
äºåŠ ãããã³ãŠã£ã¶ãŒãããä»ã®ãµã€ããžã®iptablesã«ãŒã«ã®è»¢éã®åé¡ãç 究ããŠ
ããã
Valentin Ouvrardã«æè¬ããŸãã
翻蚳è
ããã®PS
ããã°ãã芧ãã ããã