ãã®åºçç©ã§ã¯ãèå³æ·±ãããKubernetesã³ã³ãã管çã·ã¹ãã ã§ããHabrã«ã€ããŠã¯ããŸã説æãããŠããŸããã§ããã
Kubernetesãšã¯äœã§ããïŒ
Kubernetesã¯ãLinuxã³ã³ããã¯ã©ã¹ã¿ãåäžã·ã¹ãã ãšããŠç®¡çããããã«èšèšããããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã§ãã Kubernetesã¯ãå€æ°ã®ãã¹ãã§Dockerã³ã³ããã管çããã³å®è¡ããå€æ°ã®ã³ã³ãããå
±åãã¹ãããã³è€è£œããŸãã ãã®ãããžã§ã¯ãã¯Googleã«ãã£ãŠéå§ãããçŸåšã¯MicrosoftãRedHatãIBMãDockerãªã©ã®å€ãã®äŒæ¥ã«ãã£ãŠãµããŒããããŠããŸãã
Googleã¯10幎以äžã«ããã£ãŠã³ã³ãããã¯ãããžãŒã䜿çšããŠããŸããã 圌女ã¯ã1é±éã§20åå以äžã®ã³ã³ãããçºå£²ããããšããå§ããŸããã Kubernetesãããžã§ã¯ãã®å©ããåããŠãå瀟ã¯ã¹ã±ãŒã©ãã«ãªã³ã³ããã®èµ·åçšã«èšèšããããªãŒãã³ãã©ãããã©ãŒã ãäœæããçµéšãå
±æããŠããŸãã
ãããžã§ã¯ãã«ã¯2ã€ã®ç®æšããããŸãã Dockerã³ã³ãããŒã䜿çšããå Žåãå€æ°ã®Dockerãã¹ãã§ã³ã³ãããŒãããã«ã¹ã±ãŒãªã³ã°ããã³å®è¡ããæ¹æ³ãããã³ãããã®ãã©ã³ã¹ããšãæ¹æ³ã«ã€ããŠæ¬¡ã®è³ªåãçºçããŸãã ãã®ãããžã§ã¯ãã§ã¯ãã³ã³ããã®è«çã°ã«ãŒããå®çŸ©ããé«ã¬ãã«APIãææ¡ããŠããŸããããã«ãããã³ã³ããããŒã«ã®å®çŸ©ãè² è·ã®åæ£ãããã³å Žæã®æå®ãå¯èœã«ãªããŸãã
Kubernetesã®æŠå¿µ
ããŒã ïŒ
node.md ïŒïŒ
ããŒãã¯Kubernetesã¯ã©ã¹ã¿ãŒå
ã®ãã·ã³ã§ãã
ããã ïŒ
pods.md ïŒïŒãããã¯ããŠããããšããŠå®è¡ãããå
±æããŒãã£ã·ã§ã³ãæã€ã³ã³ããã®ã°ã«ãŒãã§ãã
ã¬ããªã±ãŒã·ã§ã³ã³ã³ãããŒã©ãŒ ïŒ
replication-controller.md ïŒïŒã¬ããªã±ãŒã·ã§ã³ã³ã³ãããŒã©ãŒã¯ãç¹å®ã®æ°ã®ãã¬ããªã«ãããããåžžã«èµ·åãããããã«ããŸãã
ãµãŒãã¹ ïŒ
services.md ïŒïŒKubernetesã®ãµãŒãã¹ã¯ããããã®è«ççãªçµ±åã»ãããšãããã®ã¢ã¯ã»ã¹ããªã·ãŒãå®çŸ©ããæœè±¡åã§ãã
ããªã¥ãŒã ïŒ
volumes.md ïŒïŒããªã¥ãŒã ïŒã»ã¯ã·ã§ã³ïŒã¯ãã£ã¬ã¯ããªã§ãããã³ã³ããå
ã§äœ¿çšå¯èœãªããŒã¿ãå«ãŸããŠããå ŽåããããŸãã
ã©ãã« ïŒ
labels.md ïŒïŒã©ãã«ã¯ãããããªã©ã®ãªããžã§ã¯ãã«æ·»ä»ãããããŒ/å€ã®ãã¢ã§ãã ã©ãã«ã䜿çšããŠããªããžã§ã¯ãã®ã»ãããäœæããã³éžæã§ããŸãã
Kubectlã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ ïŒ
kubectl.md ïŒïŒKubernetesã管çããããã®kubectlã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ã
Kubernetesã®ã¢ãŒããã¯ãã£
皌åäžã®Kubernetesã¯ã©ã¹ã¿ãŒã«ã¯ãããŒãïŒkubeletïŒããã³ãŠã£ã¶ãŒãã³ã³ããŒãã³ãïŒAPIãã¹ã±ãžã¥ãŒã©ãŒãªã©ïŒã§å®è¡ãããŠãããšãŒãžã§ã³ãããåæ£ã¹ãã¬ãŒãžãœãªã¥ãŒã·ã§ã³ã®äžã«å«ãŸããŠããŸãã äžèšã®å³ã¯ãæçµçã«ã¯æãŸããç¶æ
ã瀺ããŠããŸããããŸã ããã€ãã®äœæ¥ãè¡ãããŠããŸãããããšãã°ãkubeletïŒå®éã«ã¯ãã¹ãŠã®ã³ã³ããŒãã³ãïŒãã³ã³ãããŒå
ã§ç¬ç«ããŠå®è¡ããã¹ã±ãžã¥ãŒã©ãŒã100ïŒ
æ¥ç¶å¯èœã«ããæ¹æ³ã§ãã
éç°ã¯ãã«ããã¹
ã·ã¹ãã ã¢ãŒããã¯ãã£ãèŠããšãåããŒãã§åäœãããµãŒãã¹ãšã¯ã©ã¹ã¿ãŒç®¡çã¬ãã«ã®ãµãŒãã¹ã«åé¡ã§ããŸãã åKubernetesããŒãã§ããŠã£ã¶ãŒãããããŒãã管çããã¢ããªã±ãŒã·ã§ã³ãèµ·åããããã«å¿
èŠãªãµãŒãã¹ãèµ·åãããŸãã ãã¡ãããDockerã¯åããŒãã§èµ·åãããŸãã Dockerã¯ãã€ã¡ãŒãžã®ããŒããšã³ã³ãããŒã®èµ·åãæäŸããŸãã
ã¯ãã¬ãã
Kubeletã¯ãã³ã³ãããã€ã¡ãŒãžãããŒãã£ã·ã§ã³ãªã©ã«ãã£ãŠãããã管çããŸãã
ãã¥ãŒããããã·
ãŸããåçŽãªãããã·ãã©ã³ãµãŒãåããŒãã§èµ·åãããŸãã ãã®ãµãŒãã¹ã¯åããŒãã§å®è¡ãããKubernetes APIã§æ§æãããŸãã Kube-Proxyã¯ãäžé£ã®ããã¯ãšã³ãéã§TCPããã³UDPã¹ããªãŒã ã®æãåçŽãªãªãã€ã¬ã¯ãïŒã©ãŠã³ãããã³ïŒãå®è¡ã§ããŸãã
Kubernetes管çã³ã³ããŒãã³ã
Kubernetes管çã·ã¹ãã ã¯ãããã€ãã®ã³ã³ããŒãã³ãã«åãããŠããŸãã çŸæç¹ã§ã¯ããããã¯ãã¹ãŠãã¹ã¿ãŒããŒãã§å®è¡ãããŠããŸãããããã«ãã§ãŒã«ãªãŒããŒã¯ã©ã¹ã¿ãŒãäœæã§ããããã«å€æŽãããŸãã ãããã®ã³ã³ããŒãã³ãã¯é£åããŠãã¯ã©ã¹ã¿ãŒã®åäžã®ãã¥ãŒãæäŸããŸãã
etcd
ãŠã£ã¶ãŒãã®ç¶æ
ã¯etcdã®ã€ã³ã¹ã¿ã³ã¹ã«ä¿åãããŸãã ããã«ãããæ§æããŒã¿ã®ä¿¡é Œæ§ã®é«ãä¿åãšãç¶æ
å€æŽã«é¢ããä»ã®ã³ã³ããŒãã³ããžã®ã¿ã€ã ãªãŒãªéç¥ãä¿èšŒãããŸãã
Kubernetes APIãµãŒããŒ
Kubernetes APIã¯APIãµãŒããŒãæäŸããŸãã ããã¯ãåå¥ã®ã³ã³ããŒãã³ããŸãã¯ãã©ã°ã€ã³ã«å®è£
ãããçµã¿èŸŒã¿ã®ããžãã¹ããžãã¯ãåããCRUDãµãŒããŒã察象ãšããŠããŸãã äž»ã«RESTæäœãåŠçãããã§ãã¯ããŠetcdã®å¯Ÿå¿ãããªããžã§ã¯ãïŒããã³ä»ã®ãªããžããªã®ã€ãã³ãïŒãæŽæ°ããŸãã
ã¹ã±ãžã¥ãŒã©ãŒ
ã¹ã±ãžã¥ãŒã©ãŒã¯ã/ binding APIåŒã³åºããä»ããŠãéå®è¡ããããããŒãã«ãã€ã³ãããŸãã ã¹ã±ãžã¥ãŒã©ãŒæ¥ç¶ã è€æ°ã®ã¹ã±ãžã¥ãŒã©ãšã«ã¹ã¿ã ã¹ã±ãžã¥ãŒã©ã®ãµããŒããèšç»ãããŠããŸãã
Kubernetes Controller ManagerãµãŒããŒ
ä»ã®ãã¹ãŠã®ã¯ã©ã¹ã¿ãŒã¬ãã«ã®æ©èœã¯ãã³ã³ãããŒã©ãŒãããŒãžã£ãŒã§æäŸãããŸãã ããšãã°ãããŒãã¯ããŒãã³ã³ãããŒã©ã«ãã£ãŠæ€åºã管çãããã³å¶åŸ¡ãããŸãã ãã®ãšã³ãã£ãã£ãæçµçã«åå¥ã®ã³ã³ããŒãã³ãã«åå²ããŠãããããç¬ç«ããŠæ¥ç¶ããããšãã§ããŸãã
ReplicationControllerã¯ããããããŒã¹ã®APIãšã³ãžã³ã§ãã æçµçã«ã¯ãå®è£
æã«å
±éã®ãã©ã°ã€ã³ã¡ã«ããºã ã«è»¢éããäºå®ã§ãã
ã¯ã©ã¹ã¿ãŒã®ã»ããã¢ããäŸ
Ubuntu-server 14.10ã¯ãæ§æäŸã®ãã©ãããã©ãŒã ãšããŠæãåçŽãªäŸãšããŠéžæãããåæã«ã¯ã©ã¹ã¿ãŒã®åºæ¬èšå®ã瀺ãããšãã§ããŸããã
ãã¹ãã¯ã©ã¹ã¿ãäœæããã«ã¯ãããŒããäœæããããã®3å°ã®ãã·ã³ãšãªã¢ãŒãã€ã³ã¹ããŒã«çšã®å¥ã®ãã·ã³ã䜿çšããŸãã å¥ã®ãã·ã³ãéžæããŠãããããã®ããŒãããã€ã³ã¹ããŒã«ããããšã¯ã§ããŸããã
䜿çšæžã¿ãã·ã³ã®ãªã¹ãïŒ- Conf
- Node1ïŒ192.168.0.10-ãã¹ã¿ãŒããããªã³
- Node2ïŒ192.168.0.11-ãããªã³
- Node3ïŒ192.168.0.12-ãããªã³
ããŒãã®æºå
èµ·åã®èŠä»¶ïŒ
- DockerããŒãžã§ã³1.2+ããã³bridge-utilsã¯ãã¹ãŠã®ããŒãã«ã€ã³ã¹ããŒã«ãããŸã
- ãã¹ãŠã®ãã·ã³ãçžäºã«æ¥ç¶ãããŠãããããã€ã³ã¿ãŒãããã«ã¢ã¯ã»ã¹ããå¿
èŠã¯ãããŸããïŒãã®å ŽåãããŒã«ã«ã®dockerã¬ãžã¹ããªã䜿çšããå¿
èŠããããŸãïŒ
- ãã°ã€ã³/ãã¹ã¯ãŒããå
¥åããã«ãsshããŒã䜿çšããŠãã¹ãŠã®ããŒããå
¥åã§ããŸã
ããŒããžã®ãœãããŠã§ã¢ã®ã€ã³ã¹ããŒã«
å
¬åŒãœãŒã¹ã®èšäºã«åŸã£ãŠãDockerãã€ã³ã¹ããŒã«ã§ã
ãŸã ã
node% sudo apt-get update $ sudo apt-get install wget node% wget -qO- https://get.docker.com/ | sh
ã€ã³ã¹ããŒã«åŸã®Dockerã®è¿œå æ§æã¯å¿
èŠãããŸããã Kubernetesã€ã³ã¹ããŒã«ã¹ã¯ãªããã«ãã£ãŠçæãããŸãã
bridge-utilsãã€ã³ã¹ããŒã«ããŸãã
node% sudo apt-get install bridge-utils
SSHããŒãè¿œå ãã
ã€ã³ã¹ããŒã«ã¹ã¯ãªãããèµ·åããããã·ã³ã§å®è¡ããŸãã
ããŒããŸã äœæãããŠããªãå Žåã¯ãäœæããŸãã
conf% ssh-keygen
å¿
èŠãªãŠãŒã¶ãŒïŒãã®å Žåã¯ã³ã¢ïŒãããããšã確èªããåŸãããŒããªã¢ãŒããã·ã³ã«ã³ããŒããŸãã
conf% ssh-copy-id core@192.168.0.10 conf% ssh-copy-id core@192.168.0.11 conf% ssh-copy-id core@192.168.0.12
Kubernetesãã€ã³ã¹ããŒã«ãã
次ã«ãKubernetesãçŽæ¥ã€ã³ã¹ããŒã«ããŸãã ãããè¡ãã«ã¯ããŸããGitHubããå©çšå¯èœãªææ°ãªãªãŒã¹ãããŠã³ããŒãããŠè§£åããŸãã
conf% wget https://github.com/GoogleCloudPlatform/kubernetes/releases/download/v0.17.0/kubernetes.tar.gz conf% tar xzf ./kubernetes.tar.gz conf% cd ./kubernetes
ã«ã¹ã¿ãã€ãº
Kubernetesã¯ãã€ã³ã¹ããŒã«ãæ§æãã¡ã€ã«ãä»ããŠå®è¡ãããåã«ãæšæºã®ãµã³ãã«ã¹ã¯ãªãããä»ããŠå®å
šã«æ§æãããŸãã ã€ã³ã¹ããŒã«äžã«ãã/ cluster / ubuntu /ãã©ã«ããŒå
ã®ã¹ã¯ãªããã䜿çšããŸãã
ãŸããã€ã³ã¹ããŒã«ã«å¿
èŠãªKubernetesãetcdãããã³flannelãã€ããªãããŠã³ããŒãããã³æºåããã¹ã¯ãªãã./cluster/ubuntu/build.shãå€æŽããŸãã
conf% vim ./cluster/ubuntu/build.sh
åŸè
ã䜿çšããã«ã¯ãå·çæç¹ã§ãªãªãŒã¹0.17.0ã眮ãæããå¿
èŠããããŸãã
ãªã³ïŒ
ãããŠå®è¡ïŒ
conf% cd ./cluster/ubuntu/ conf% ./build.sh
次ã«ããã¡ã€ã«./config-default.shãç·šéããå°æ¥ã®ã¯ã©ã¹ã¿ãŒã®ãã©ã¡ãŒã¿ãŒã瀺ããŸãã
ããã§ã»ããã¢ãããå®äºããã€ã³ã¹ããŒã«ã«é²ãããšãã§ããŸãã
èšçœ®
ãŸããã·ã¹ãã ã«ssh-agentãäŒããsshããŒã䜿çšããŠãããè¡ãå¿
èŠããããŸãã
eval `ssh-agent -s` ssh-add ///
次ã«ãã€ã³ã¹ããŒã«ã«çŽæ¥ç§»åããŸãã ãããè¡ãã«ã¯ãã¹ã¯ãªãã./kubernetes/cluster/kube-up.shã䜿çšããŸãããã®ã¹ã¯ãªããã¯ãubuntuã䜿çšããããã«æå®ããå¿
èŠããããŸãã
conf% cd ../ conf% KUBERNETES_PROVIDER=ubuntu ./kube-up.sh
ã€ã³ã¹ããŒã«äžã«ãã¹ã¯ãªããã¯åããŒãã®sudoãã¹ã¯ãŒããèŠæ±ããŸãã ã€ã³ã¹ããŒã«ã®æåŸã«ãã¯ã©ã¹ã¿ãŒã®ã¹ããŒã¿ã¹ã確èªããããŒããšKubernetes APIã¢ãã¬ã¹ã®ãªã¹ãã衚瀺ããŸãã
ã¹ã¯ãªããåºåã®äŸ Starting cluster using provider: ubuntu ... calling verify-prereqs ... calling kube-up Deploying master and minion on machine 192.168.0.10 < > [sudo] password to copy files and start node: etcd start/running, process 16384 Connection to 192.168.0.10 closed. Deploying minion on machine 192.168.0.11 < > [sudo] password to copy files and start minion: etcd start/running, process 12325 Connection to 192.168.0.11 closed. Deploying minion on machine 192.168.0.12 < > [sudo] password to copy files and start minion: etcd start/running, process 10217 Connection to 192.168.0.12 closed. Validating master Validating core@192.168.0.10 Validating core@192.168.0.11 Validating core@192.168.0.12 Kubernetes cluster is running. The master is running at: http://192.168.0.10 ... calling validate-cluster Found 3 nodes. 1 NAME LABELS STATUS 2 192.168.0.10 <none> Ready 3 192.168.0.11 <none> Ready 4 192.168.0.12 <none> Ready Validate output: NAME STATUS MESSAGE ERROR etcd-0 Healthy {"action":"get","node":{"dir":true,"nodes":[{"key":"/coreos.com","dir":true,"modifiedIndex":11,"createdIndex":11},{"key":"/registry","dir":true,"modifiedIndex":5,"createdIndex":5}],"modifiedIndex":5,"createdIndex":5}} nil controller-manager Healthy ok nil scheduler Healthy ok nil Cluster validation succeeded Done, listing cluster services: Kubernetes master is running at http://192.168.0.10:8080
æ°ããã¯ã©ã¹ã¿ãŒã«ååšããããŒããšãµãŒãã¹ãèŠãŠã¿ãŸãããã
conf% cp ../kubernetes/platforms/linux/amd64/kubectl /opt/bin/ conf% /opt/bin/kubectl get services,minions -s "http://192.168.0.10:8080" NAME LABELS SELECTOR IP PORT(S) kubernetes component=apiserver,provider=kubernetes <none> 192.168.3.2 443/TCP kubernetes-ro component=apiserver,provider=kubernetes <none> 192.168.3.1 80/TCP NAME LABELS STATUS 192.168.0.10 <none> Ready 192.168.0.11 <none> Ready 192.168.0.12 <none> Ready
æºåå®äºç¶æ
ã®ã€ã³ã¹ããŒã«æžã¿ããŒãã®ãªã¹ããšã2ã€ã®äºåã€ã³ã¹ããŒã«æžã¿ãµãŒãã¹kubernetesããã³kubernetes-roã衚瀺ãããŸããããã¯Kubernetes APIã«çŽæ¥ã¢ã¯ã»ã¹ããããã®ãããã·ã§ãã KubernetesãµãŒãã¹ãšåæ§ã«ãkubernetesãškubernetes-roã¯ãã©ã®ããŒãããã§ãIPã¢ãã¬ã¹ã§çŽæ¥ã¢ã¯ã»ã¹ã§ããŸãã
ãã¹ããµãŒãã¹ã®éå§
ãµãŒãã¹ãéå§ããã«ã¯ãããã«ãŒã³ã³ãããæºåããããã«åºã¥ããŠãµãŒãã¹ãäœæããå¿
èŠããããŸãã è€éã«ãªããªãããã«ããã®äŸã§ã¯ãããªãã¯nginxã³ã³ãããŒã䜿çšããŸãã ãµãŒãã¹ã®å¿
é ã³ã³ããŒãã³ãã¯ã¬ããªã±ãŒã·ã§ã³ã³ã³ãããŒã©ãŒã§ããããã«ãããå¿
èŠãªã³ã³ãããŒïŒãŸãã¯ãããïŒã®ã»ãããèµ·åããããµãŒãã¹ãã©ã®IPã¢ãã¬ã¹ãšããŒãã決å®ãããããµãŒãã¹ããããéã§ãªãã¹ã³ããã«ãŒã«ã決å®ããŸãã
ä»»æã®ãµãŒãã¹ã¯ã2ã€ã®æ¹æ³ã§èµ·åã§ããŸããæåãšæ§æãã¡ã€ã«ã®äœ¿çšã§ãã äž¡æ¹ãæ€èšããŠãã ããã
æåãµãŒãã¹éå§
ã¬ããªã±ãŒã·ã§ã³ã³ã³ãããŒã©ãŒãäœæããããšããå§ããŸãããã
conf% /opt/bin/kubectl run-container nginx --port=80 --port=443 --image=nginx --replicas=6 -s "http://192.168.0.10:8080"
ã©ãã§ïŒ
- nginxã¯ãå°æ¥ã®rcã®ååã§ã
- --port-rcã³ã³ãããŒããªãã¹ã³ããããŒã
- --image-ã³ã³ãããŒã®èµ·åå
ã®ã€ã¡ãŒãž
- --replicas = 6-ã¬ããªã«ã®æ°
ç§ãã¡ãåŸããã®ãèŠãŠã¿ãŸãããïŒ
/opt/bin/kubectl get pods,rc -s "http://192.168.0.10:8080"
ãããã« POD IP CONTAINER(S) IMAGE(S) HOST LABELS STATUS CREATED MESSAGE nginx-3gii4 172.16.58.4 192.168.0.11/192.168.0.11 run-container=nginx Running 9 seconds nginx nginx Running 9 seconds nginx-3xudc 172.16.62.6 192.168.0.10/192.168.0.10 run-container=nginx Running 9 seconds nginx nginx Running 8 seconds nginx-igpon 172.16.58.6 192.168.0.11/192.168.0.11 run-container=nginx Running 9 seconds nginx nginx Running 8 seconds nginx-km78j 172.16.58.5 192.168.0.11/192.168.0.11 run-container=nginx Running 9 seconds nginx nginx Running 8 seconds nginx-sjb39 172.16.83.4 192.168.0.12/192.168.0.12 run-container=nginx Running 9 seconds nginx nginx Running 8 seconds nginx-zk1wv 172.16.62.7 192.168.0.10/192.168.0.10 run-container=nginx Running 9 seconds nginx nginx Running 8 seconds CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS nginx nginx nginx run-container=nginx 6
ã¬ããªã±ãŒã·ã§ã³ã³ã³ãããŒã©ãŒã¯nginxãšããååã§äœæãããã¬ããªã«ã®æ°ã¯6ã§ããã¬ããªã«ã¯ããŒãäžã§ã©ã³ãã ã«å®è¡ãããåãããã®å Žæã¯HOSTåã«ç€ºãããŸãã
çµè«ã¯ãããã€ãã®å Žåã«äžãããããã®ãšã¯ç°ãªãå ŽåããããŸããäŸãã°ïŒ
- ãããã®äžéšã¯ä¿çç¶æ
ã§ããããã¯ããããããŸã éå§ãããŠããªãããšãæå³ããŸããå°ãåŸ
ã€å¿
èŠããããŸã
- ãããã«ã¯HOSTãå®çŸ©ãããŠããŸãããããã¯ãããããèµ·åãããããŒããã¹ã±ãžã¥ãŒã©ãŒã«ãã£ãŠãŸã å²ãåœãŠãããŠããªãããšãæå³ããŸã
次ã«ãã¬ããªã±ãŒã·ã§ã³ã³ã³ãããŒã©ãŒãããã¯ãšã³ããšããŠäœ¿çšãããµãŒãã¹ãäœæããŸãã
httpã®å ŽåïŒ
conf% /opt/bin/kubectl expose rc nginx --port=80 --target-port=80 --service-name=nginx-http -s "http://192.168.0.10:8080"
httpsã®å ŽåïŒ
conf% /opt/bin/kubectl expose rc nginx --port=443 --target-port=443 --service-name=nginx-https -s "http://192.168.0.10:8080"
ã©ãã§ïŒ
- rc nginx-䜿çšããããªãœãŒã¹ã®ã¿ã€ããšååïŒrc = Replication ControllerïŒ
- --port-ãµãŒãã¹ãããªãã¹ã³ãããããŒã
- --target-port-ãªã¯ãšã¹ãããããŒããã£ã¹ããããã³ã³ããã®ããŒã
- --service-name-å°æ¥ã®ãµãŒãã¹å
çµæã確èªããŸãã
/opt/bin/kubectl get rc,services -s "http://192.168.0.10:8080"
ãããã« CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS nginx nginx nginx run-container=nginx 6 NAME LABELS SELECTOR IP PORT(S) kubernetes component=apiserver,provider=kubernetes <none> 192.168.3.2 443/TCP kubernetes-ro component=apiserver,provider=kubernetes <none> 192.168.3.1 80/TCP nginx-http <none> run-container=nginx 192.168.3.66 80/TCP nginx-https <none> run-container=nginx 192.168.3.172 443/TCP
ç¡èŠã確èªããã«ã¯ãä»»æã®ããŒãã«ç§»åããŠã³ã³ãœãŒã«ã§å®è¡ããŸãã
node% curl http://192.168.3.66
curlåºåã§ã¯ãæšæºã®nginxãŠã§ã«ã«ã ããŒãžã衚瀺ãããŸãã å®äºããµãŒãã¹ã¯çšŒåäžã§ãã
æ§æã䜿çšããŠãµãŒãã¹ãéå§ãã
ãã®èµ·åæ¹æ³ã§ã¯ãã¬ããªã±ãŒã·ã§ã³ã³ã³ãããŒã©ãŒãšãµãŒãã¹ã®æ§æãäœæããå¿
èŠããããŸãã Kubernetesã¯ãyamlããã³json圢åŒã®èšå®ãåãå
¥ããŸãã Yamlã¯ç§ã«è¿ãããã䜿çšããŸãã
ãŸãã以åã®å®éšããã¯ã©ã¹ã¿ãŒãã¯ãªãŒã³ã¢ããããŸãã
conf% /opt/bin/kubectl delete services nginx-http nginx-https -s "http://192.168.0.10:8080" conf% /opt/bin/kubectl stop rc nginx -s "http://192.168.0.10:8080" .
nginx_rc.yamlå
容 apiVersion: v1beta3 kind: ReplicationController
æ§æãé©çšããŸãã
conf% /opt/bin/kubectl create -f ./nginx_rc.yaml -s "http://192.168.0.10:8080"
çµæã確èªããŸãã
conf% /opt/bin/kubectl get pods,rc -s "http://192.168.0.10:8080"
ãããã« POD IP CONTAINER(S) IMAGE(S) HOST LABELS STATUS CREATED MESSAGE nginx-controller-0wklg 172.16.58.7 192.168.0.11/192.168.0.11 name=nginx Running About a minute nginx nginx Running About a minute nginx-controller-2jynt 172.16.58.8 192.168.0.11/192.168.0.11 name=nginx Running About a minute nginx nginx Running About a minute nginx-controller-8ra6j 172.16.62.8 192.168.0.10/192.168.0.10 name=nginx Running About a minute nginx nginx Running About a minute nginx-controller-avmu8 172.16.58.9 192.168.0.11/192.168.0.11 name=nginx Running About a minute nginx nginx Running About a minute nginx-controller-ddr4y 172.16.83.7 192.168.0.12/192.168.0.12 name=nginx Running About a minute nginx nginx Running About a minute nginx-controller-qb2wb 172.16.83.5 192.168.0.12/192.168.0.12 name=nginx Running About a minute nginx nginx Running About a minute CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS nginx-controller nginx nginx name=nginx 6
ã¬ããªã±ãŒã·ã§ã³ã³ã³ãããŒã©ãŒã¯nginxãšããååã§äœæãããã¬ããªã«ã®æ°ã¯6ã§ããã¬ããªã«ã¯ããŒãäžã§ã©ã³ãã ã«å®è¡ãããåãããã®å Žæã¯HOSTåã«ç€ºãããŸãã
nginx_service.yamlå
容 apiVersion: v1beta3 kind: Service metadata: name: nginx spec: publicIPs: - 12.0.0.5
configã䜿çšãããšãè€æ°ã®ããŒãã1ã€ã®ãµãŒãã¹ã«å²ãåœãŠãããšãã§ããããšã«æ°ä»ããããããŸããã
æ§æãé©çšããŸãã
conf% /opt/bin/kubectl create -f ./nginx_service.yaml -s "http://192.168.0.10:8080"
çµæã確èªããŸãã
/opt/bin/kubectl get rc,services -s "http://192.168.0.10:8080"
ãããã« CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS nginx-controller nginx nginx name=nginx 6 NAME LABELS SELECTOR IP PORT(S) kubernetes component=apiserver,provider=kubernetes <none> 192.168.3.2 443/TCP kubernetes-ro component=apiserver,provider=kubernetes <none> 192.168.3.1 80/TCP nginx <none> name=nginx 192.168.3.214 80/TCP 12.0.0.5 443/TCP
ç¡èŠã確èªããã«ã¯ãä»»æã®ããŒãã«ç§»åããŠã³ã³ãœãŒã«ã§å®è¡ããŸãã
node% curl http://192.168.3.214 node% curl http://12.0.0.5
curlåºåã§ã¯ãæšæºã®nginxãŠã§ã«ã«ã ããŒãžã衚瀺ãããŸãã
ããŒãžã³ããŒã
çµè«ãšããŠãã·ã¹ãã ãèšèšãããšãã«ã€ãŸãããªããã°ãªããªãã£ãããã€ãã®éèŠãªãã€ã³ãã説æããããšæããŸãã ãããã¯ãç°ãªãèŠçŽ ã®ã»ããããµãŒãã¹ã«å€ããããšãã§ããã¢ãžã¥ãŒã«ã§ããkube-proxyã®äœæ¥ãšæ¥ç¶ãããŠããŸããã
PORTAL_NETã æ¬è³ªèªäœãèå³æ·±ãã®ã§ããããã©ã®ããã«å®è£
ãããŠããããç¥ãããšãææ¡ããŸãã
çãæãäžããããã·ã³ãã«ã ãå¹æçãªã¢ãã«ã®å®çŸã«è³ããŸãããiptables-saveã®åºåãèŠãŠãã ããã
-A PREROUTING -j KUBE-PORTALS-CONTAINER -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER -A OUTPUT -j KUBE-PORTALS-HOST -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER -A POSTROUTING -s 10.0.42.0/24 ! -o docker0 -j MASQUERADE -A KUBE-PORTALS-CONTAINER -d 10.0.0.2/32 -p tcp -m comment --comment "default/kubernetes:" -m tcp --dport 443 -j REDIRECT --to-ports 46041 -A KUBE-PORTALS-CONTAINER -d 10.0.0.1/32 -p tcp -m comment --comment "default/kubernetes-ro:" -m tcp --dport 80 -j REDIRECT --to-ports 58340 -A KUBE-PORTALS-HOST -d 10.0.0.2/32 -p tcp -m comment --comment "default/kubernetes:" -m tcp --dport 443 -j DNAT --to-destination 172.16.67.69:46041 -A KUBE-PORTALS-HOST -d 10.0.0.1/32 -p tcp -m comment --comment "default/kubernetes-ro:" -m tcp --dport 80 -j DNAT --to-destination 172.16.67.69:58340
iptablesã«å
¥ã£ããµãŒãã¹ã®IPã¢ãã¬ã¹ãžã®ãã¹ãŠã®èŠæ±ã¯ãkube-proxyããªãã¹ã³ããããŒãã§ã©ãããããŸãã ããã«é¢ããŠã1ã€ã®åé¡ãçºçããŸããKubernetesèªäœã¯ããŠãŒã¶ãŒãšã®éä¿¡ã®åé¡ã解決ããŸããã ãããã£ãŠã次ã®ãããªå€éšæ段ã§ãã®åé¡ã解決ããå¿
èŠããããŸãã
- gcloud-Googleããã®ææéçº
- bgp-ãµããããã¢ããŠã³ã¹ã¡ã³ãã®äœ¿çš
- IPVS
- ãã®ä»ã®ãªãã·ã§ã³ã¯å€æ°ãããŸã
ãœãŒã¹IPåãã nginxãµãŒãã¹ãèšå®ãããšããèå³æ·±ãåé¡ã«çŽé¢ããªããã°ãªããŸããã§ããã ããã¥ã¢ã«ã®è¡ã®ããã«èŠããŸããïŒãkube-proxyã䜿çšãããšããµãŒãã¹ã«ã¢ã¯ã»ã¹ãããã±ããã®ãœãŒã¹IPããããã«ãããªããŸããã æåéããkube-proxyã䜿çšããå Žåãããã±ãŒãžã®ãœãŒã¹ã¢ãã¬ã¹ãé衚瀺ã«ããŸããã€ãŸããsource-IPã«åºã¥ããŠæ§ç¯ããããã¹ãŠã®åŠçã¯ãkube-proxyã䜿çšããåã«å®è¡ããå¿
èŠããããŸãã
ã芧ããã ãããããšãããããŸããæ®å¿µãªãããäŒããããã¹ãŠã®æ
å ±ã1ã€ã®èšäºã«åããããšã¯ã§ããŸããã
ææã®äœ¿çšïŒ