
Kubernetesã¯ããªãŒãã³ãœãŒã¹ã®ã³ã³ãããŒãªãŒã±ã¹ãã¬ãŒã·ã§ã³ãã¬ãŒã ã¯ãŒã¯ã§ãã ã³ã³ãã管çç°å¢ã®äœæåéã§ã®Googleã®è±å¯ãªçµéšãèæ
®ããŠäœæãããŠãããç£æ¥éçšã«å¯Ÿå¿ããã¯ã©ã¹ã¿ã§ã³ã³ããåãããã¢ããªã±ãŒã·ã§ã³ãå®è¡ã§ããŸãã Kubernetesãšã³ãžã³ã«ã¯ãã¢ããªã±ãŒã·ã§ã³ãã¯ãŒã¯ããŒãã¯ãã¡ããã®ããšãããŸããŸãªã·ã¹ãã ã³ã³ããŒãã³ãããããã¯ãŒã¯ãã©ã³ã¹ããŒããã©ã€ããŒãã³ãã³ãã©ã€ã³ãŠãŒãã£ãªãã£ãªã©ãå€ãã®å¯åéšåãšãã®æ§ææ¹æ³ããããŸãã
ãã®èšäºã§ã¯ãUbuntu 16.04ãå®è¡ããŠããå®éã®ïŒéä»®æ³ïŒãã·ã³ã«çŽ10åã§Kubernetes 1.6ãã€ã³ã¹ããŒã«ããŸãã ãã®çµæã kubectl
CLIãä»ããŠKubernetesãšå¯Ÿè©±ããæ¹æ³ãåŠç¿ããæ©äŒããããŸãã
Kubernetesã¬ãã¥ãŒïŒ

ãžã¥ãªã¢ãšãŽã¡ã³ã¹ã«ããKubernetesã®ã³ã³ããŒãã³ã
äœãå¿
èŠã§ãã
ã¯ã©ã¹ã¿ãŒãå±éããã«ã¯ãPacketãµãŒãã¹ã®ç©çãã·ã³ã䜿çšããããšããå§ãããŸãã Ubuntu 16.04ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãšããŠã€ã³ã¹ããŒã«ãããŠããå Žåãä»®æ³ãã·ã³ãŸãã¯ããŒã ã³ã³ãã¥ãŒã¿ãŒã§èª¬æããæé ã«åŸãããšãã§ããŸãã
Packet.netã«ç§»åããŠãæ°ãããããžã§ã¯ããäœæããŸãã ãã®èšäºã®ç®çã«ã¯ãã¿ã€ã0ãã¹ãã§ååã§ãïŒ4åã®Atomã³ã¢ãš8GBã®RAMã1æéããã0.05ãã«ïŒã
ãã¹ããã»ããã¢ãããããšãã¯ãOSãšããŠUbuntu 16.04ãéžæããŠãã ããã Dockerãšã¯ç°ãªããSwarm Kubernetesã¯å®çžŸã®ããDockerãªãªãŒã¹ã§ããé©åã«åäœããŸãã ãããããUbuntu aptãªããžããªã«ã¯Docker 1.12.6ãå«ãŸããŠããŸãã
- Dockerãã€ã³ã¹ããŒã«ããŸãã
$ apt-get update && apt-get install -qy docker.io
ãã®ãã¹ãã§DockerãæŽæ°ããªãã§ãã ããã CIããŒã«ããããŸãã¯ã©ãããããã§ã€ã¡ãŒãžãçµã¿ç«ãŠãããã«ãããæ°ããããŒãžã§ã³ã䜿çšã§ããŸãã
èšçœ®
- Kubernetes aptãªããžããªãã€ã³ã¹ããŒã«ããŸãã
$ apt-get update && apt-get install -y apt-transport-https $ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - OK $ cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF
次ã«ã apt-get update
ã³ãã³ãã䜿çšããŠããã±ãŒãžã®ãªã¹ããæŽæ°ããŸãã
kubelet
ã kubeadm
ããã³kubernetes-cni
ãã€ã³ã¹ããŒã«ããŸãã
kubelet
ã¯ãã¯ã©ã¹ã¿ãŒãã¹ãã§ã³ã³ãããŒãå®è¡ãã圹å²ãkubelet
ãŸãã kubeadm
ã¯ãã¯ã©ã¹ã¿ãŒãæ§æããããŸããŸãªã³ã³ããŒãã³ããæ§æããããã®äŸ¿å©ãªãŠãŒãã£ãªãã£ã§ããããããã¯ãŒã¯ã³ã³ããŒãã³ããkubernetes-cni
å¿
èŠã§ãã
CNIã¯Container Networking Interfaceã®ç¥ã§ããããã¯ãŒã¯ãã©ã€ããŒãKubernetesãšéä¿¡ããæ¹æ³ãå®çŸ©ãã仿§ã§ãã
$ apt-get update $ apt-get install -y kubelet kubeadm kubernetes-cni
kubeadm
ãŠã¯ã©ã¹ã¿ãŒãåæåããŸãã
ããã¥ã¡ã³ãããïŒ
kubeadmã¯ãRBACãªã©ã®ã¡ã«ããºã ã䜿çšããŠãããã«å®å
šãªã¯ã©ã¹ã¿ãŒãäœæããããã«èšèšãããŠããŸãã
Docker Swarmã«ã¯ããã©ã«ãã§ãªãŒããŒã¬ã€ãããã¯ãŒã¯ãã©ã€ããŒããããŸããã kubeadm
ãœãªã¥ãŒã·ã§ã³ãç§ãã¡ã®ãã®ã§ãã ããŒã ã¯ãŸã æç€ºã®æŽæ°ã«åãçµãã§ããã®ã§ãããã«ãŒã®1ã€ã§ããCoreOSãã©ã³ãã«ã«æãé¡äŒŒãããã©ã€ããŒã®äœ¿ç𿹿³ã瀺ããŸãã
ãã©ã³ãã«
Flannelã§ã¯ãLinuxã«ãŒãã«ã¢ãžã¥ãŒã«overlay
ãšipvlan
ã䜿çšããŠããœãããŠã§ã¢å®çŸ©ãããã¯ãŒã¯ïŒSDNïŒãç·šæã§ããŸãã
Packetã§ã¯ããã·ã³ã¯2ã€ã®ãããã¯ãŒã¯ã«æ¥ç¶ããŸãã1ã€ã¯ç¹å®ã®å°åãšãããžã§ã¯ãã«å±ãããã¹ããæ¥ç¶ããããŒã¿ã»ã³ã¿ãŒãããã¯ãŒã¯ã§ã2ã€ç®ã¯ã€ã³ã¿ãŒããããžã®ã¢ã¯ã»ã¹ã§ãã ãã¡ã€ã¢ãŠã©ãŒã«ã¯ããã©ã«ãã§ã¯èšå®ãããŠããªãããããããã¯ãŒã¯ã¢ã¯ãã£ããã£ãå¶éããå Žåã¯ã iptables
ãŸãã¯ufw
æåã§èšå®ããå¿
èŠããããŸãã
å
éšIPã¢ãã¬ã¹ã¯ifconfig
ã䜿çšãifconfig
決å®ã§ããŸãã
root@kubeadm:~
ãã®å
éšIPã¢ãã¬ã¹ã䜿çšããŠãKubernetes APIã倿ããŸãã
$ kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=10.80.75.9 --skip-preflight-checks --kubernetes-version stable-1.6
--pod-network-cidr
ã --pod-network-cidr
ãã©ã€ããŒã«å¿
èŠã§ãããã³ã³ãããŒã®ã¢ãã¬ã¹ç©ºéãå®çŸ©ããŸãã--apiserver-advertise-address
ã¯ãKubernetesãAPIãµãŒããŒãšããŠã¢ããã¿ã€ãºããIPã¢ãã¬ã¹ãæå®ããŸãã--skip-preflight-checks
kubeadm
--skip-preflight-checks
䜿çšãããšã kubeadm
ã¯å¿
èŠãªæ©èœã«ã€ããŠãã¹ãã«ãŒãã«ããã§ãã¯ããŸããã ããã¯ãPacketãã¹ãã«ã«ãŒãã«ã¡ã¿ããŒã¿ããªãããã§ãã--kubernetes-version stable-1.6
ã¯ãã¯ã©ã¹ã¿ãŒããŒãžã§ã³ïŒãã®å Žåã¯1.6ïŒãå³å¯ã«æ±ºå®ããŸãã ããšãã°ãKubernetes 1.7ã䜿çšããå Žåã¯ããã®ãã©ã°ãã¹ãããããŸãã
åºåã§åŸããããã®ã¯æ¬¡ã®ãšããã§ãã
[init] Using Kubernetes version: v1.6.6 [init] Using Authorization mode: RBAC [preflight] Skipping pre-flight checks [certificates] Generated CA certificate and key. [certificates] Generated API server certificate and key. [certificates] API Server serving cert is signed for DNS names [kubeadm kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 10.80.75.9] [certificates] Generated API server kubelet client certificate and key. [certificates] Generated service account token signing key and public key. [certificates] Generated front-proxy CA certificate and key. [certificates] Generated front-proxy client certificate and key. [certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki" [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf" [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/controller-manager.conf" [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/scheduler.conf" [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/admin.conf" [apiclient] Created API client, waiting for the control plane to become ready [apiclient] All control plane components are healthy after 36.795038 seconds [apiclient] Waiting for at least one node to register [apiclient] First node has registered after 3.508700 seconds [token] Using token: 02d204.3998037a42ac8108 [apiconfig] Created RBAC rules [addons] Created essential addon: kube-proxy [addons] Created essential addon: kube-dns Your Kubernetes master has initialized successfully! To start using your cluster, you need to run (as a regular user): sudo cp /etc/kubernetes/admin.conf $HOME/ sudo chown $(id -u):$(id -g) $HOME/admin.conf export KUBECONFIG=$HOME/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: http://kubernetes.io/docs/admin/addons/ You can now join any number of machines by running the following on each node as root: kubeadm join --token 02d204.3998037a42ac8108 10.80.75.9:6443
- éç¹æš©ãŠãŒã¶ãŒãäœæããŸãã
Packet Ubuntuãã€ã³ã¹ããŒã«ããäžè¬ãŠãŒã¶ãŒã¯ããªãã®ã§ãäœæããŠã¿ãŸãããã
- æ°ãããŠãŒã¶ãŒã®ç°å¢å€æ°ãèšå®ããŸãã
ããã§ãã¯ã©ã¹ã¿ãŒã®äœæã«é¢ããäžèšã®ã¡ãã»ãŒãžã䜿çšããŠãç°å¢å€æ°ãèšå®ã§ããŸãã
æ°ãããŠãŒã¶ãŒãšããŠãã°ã€ã³ããŸãïŒ sudo su packet
$ cd $HOME $ sudo whoami $ sudo cp /etc/kubernetes/admin.conf $HOME/ $ sudo chown $(id -u):$(id -g) $HOME/admin.conf $ export KUBECONFIG=$HOME/admin.conf $ echo "export KUBECONFIG=$HOME/admin.conf" | tee -a ~/.bashrc
- å²çè£ïŒãã©ã³ãã«ïŒã®ãããã¯ãŒã¯æ§æãé©çšããŸãã
次ã«ã kubectl
ãšãã©ã³ãã«ã®ããã¥ã¡ã³ãããã®2ã€ã®ãšã³ããªã䜿çšããŠãã¯ã©ã¹ã¿ãŒã«ãããã¯ãŒã¯æ§æãé©çšããŸãã
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel-rbac.yml clusterrole "flannel" created clusterrolebinding "flannel" created $ kubectl create -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml serviceaccount "flannel" created configmap "kube-flannel-cfg" created daemonset "kube-flannel-ds" created
å²çè£ãããã¯ãŒã¯ãæ§æãããŸãã
- åäžãã¹ãã¯ã©ã¹ã¿ãŒã®äœ¿çšãèš±å¯ããŸãã
éåžžãKubernetesã¯ã©ã¹ã¿ãŒã«ã¯è€æ°ã®ãã¹ããå«ãŸãããããããã©ã«ãã§ã¯ããŠã£ã¶ãŒãã§ã³ã³ãããŒãèµ·åã§ããŸããã ãã ããããŒãã¯1ã€ãããªãã®ã§ã taint
æäœã䜿çšããŠããã®äžã§ã³ã³ãããŒãèµ·åã§ããããã«ããŸãã
$ kubectl taint nodes --all node-role.kubernetes.io/master-
ãŸãã¯ã kubeadm
ã®åºåããã®join token
ã䜿çšããŠãã¯ã©ã¹ã¿ãŒã«2çªç®ã®ãã·ã³ã远å ã§ããŸãã
- ã¯ã©ã¹ã¿ãŒãæ©èœããŠããããšã確èªããŸãã
å€ãã®Kubernetesã³ã³ããŒãã³ãã¯ãé衚瀺ã®kube-system
åå空éã§ã¯ã©ã¹ã¿ãŒã³ã³ãããŒãšããŠå®è¡ãããŸãã ãããã«é¢ããæ
å ±ã¯ã次ã®ããã«è¡šç€ºã§ããŸãã
$ kubectl get all --namespace=kube-system NAME READY STATUS RESTARTS AGE po/etcd-kubeadm 1/1 Running 0 12m po/kube-apiserver-kubeadm 1/1 Running 0 12m po/kube-controller-manager-kubeadm 1/1 Running 0 13m po/kube-dns-692378583-kqvdd 3/3 Running 0 13m po/kube-flannel-ds-w9xvp 2/2 Running 0 1m po/kube-proxy-4vgwp 1/1 Running 0 13m po/kube-scheduler-kubeadm 1/1 Running 0 13m NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc/kube-dns 10.96.0.10 <none> 53/UDP,53/TCP 14m NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deploy/kube-dns 1 1 1 1 14m NAME DESIRED CURRENT READY AGE rs/kube-dns-692378583 1 1 1 13m
ãªã¹ããããããããã«ããã¹ãŠã®ãµãŒãã¹ã¯Running
ç¶æ
ã«ãããŸããã€ãŸãããã¹ãŠãã¯ã©ã¹ã¿ãŒã§æ£åžžã«æ©èœããŠããŸãã ãããã®ã³ã³ããŒãã³ããã€ã³ã¿ãŒãããããã®ããŠã³ããŒãç¶æ
ã«ããå ŽåããŸã å®è¡ãããŠããªãå¯èœæ§ããããŸãã
ã³ã³ãããå®è¡
ããã§ãã¯ã©ã¹ã¿ãŒã§ã³ã³ãããŒãéå§ã§ããŸãã Kubernetesã§ã¯ãã³ã³ããã¯å
±æIPã¢ãã¬ã¹ã䜿çšãããããã«ç·šæãããåãããŒãïŒãã¹ãïŒã«ãã€ã³ããããå
±æããªã¥ãŒã ã䜿çšã§ããŸãã
å®è¡äžã®çïŒã³ã³ããïŒããªãããšã確èªããŸãã
$ kubectl get pods
ããã§ã kubectl run
ã䜿çšããŠã³ã³ãããèµ·åããŸãã HTTP GUIDãçæããNode.jsããã³Express.jsãã€ã¯ããµãŒãã¹ããããã€ããŸãã
ãã®ã³ãŒãã¯ãããšããšDocker Swarmãã¥ãŒããªã¢ã«çšã«äœæãããŸããã 察å¿ãããœãŒã¹ã¯ãã®ãªã³ã¯ã§èŠã€ããããšãã§ããŸãïŒ Docker 1.12 Swarmã¢ãŒãã§å®éã®ãã€ã¯ããµãŒãã¹ãã¹ã±ãŒãªã³ã°ããŸã
$ kubectl run guids --image=alexellis2/guid-service:latest --port 9000 deployment "guids" created
ããã§ã[ Name
åã§ãæ°ããå²çè£ã«å²ãåœãŠãããååãšããã€èµ·åããããã確èªã§ããŸãã
$ kubectl get pods NAME READY STATUS RESTARTS AGE guids-2617315942-lzwdh 0/1 Pending 0 11s
Name
ã䜿çšããŠãå²çè£ã®ç¶æ
ã確èªããŸãã
$ kubectl describe pod guids-2617315942-lzwdh ... Pulling pulling image "alexellis2/guid-service:latest" ...
åäœããã³ã³ãããã§ããããIPã¢ãã¬ã¹ãååŸãã curl
ã䜿çšããŠçæãããèå¥åãååŸã§ããŸãã
$ kubectl describe pod guids-2617315942-lzwdh | grep IP: IP: 10.244.0.3 $ curl http://10.244.0.3:9000/guid ; echo {"guid":"4659819e-cf00-4b45-99d1a9f81bdcf6ae","container":"guids-2617315942-lzwdh"} $ curl http://10.244.0.3:9000/guid ; echo {"guid":"1604b4cb-88d2-49e2-bd38-73b589da0469","container":"guids-2617315942-lzwdh"}
å²çè£ã®ãã°ã衚瀺ããã«ã¯ã次ã®ã³ãã³ãã䜿çšã§ããŸãã
$ kubectl logs guids-2617315942-lzwdh listening on port 9000
ã³ã³ããããããã°ããããã®éåžžã«äŸ¿å©ãªæ©èœã¯ãã³ã³ãœãŒã«ã«æ¥ç¶ããããã§ããŸããŸãªã³ãã³ããå®è¡ããæ©èœã§ãã
$ kubectl exec -t -i guids-2617315942-lzwdh sh /
- ããŒã«ããŒïŒããã·ã¥ããŒãïŒã
KubernetesããŒã«ããŒãå²çè£ãšããŠã€ã³ã¹ããŒã«ãããããŒã«ã«ãã·ã³ã§ã¢ã¯ã»ã¹ã§ããŸãã Kubernetesã€ã³ã¿ãŒãããã¢ã¯ã»ã¹ãéããªãã£ããããSSHãã³ãã«ã䜿çšããŠããŒã«ããŒã«ã¢ã¯ã»ã¹ããŸãã
$ kubectl create -f https://git.io/kube-dashboard $ kubectl proxy Starting to serve on 127.0.0.1:8001
次ã«ãPacketãã¹ããžã®ãã³ãã«ãäœæããWebãã©ãŠã¶ãŒã§httpïŒ// localhostïŒ8001 / ui /ããŒãžãéããŸãã
$ ssh -L 8001:127.0.0.1:8001 -N

詳现ã«ã€ããŠã¯ããããã¯ãªãã¯ããŠãã ããïŒ ããã·ã¥ããŒãGithubã§ç¢ºèªããŠãã ãã ã
ãŸãšãããš
Kubernetesã¯ã©ã¹ã¿ãŒãäœæããæåã®ãã€ã¯ããµãŒãã¹ãèµ·åããŸããã ããã§ãäœæ¥ã§kubectl
ã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠãã¯ã©ã¹ã¿ãŒã®ã³ã³ããŒãã³ãã®èª¿æ»ãéå§ã§ããŸãã
Michael HausenblasãäœæããKubernetes by Exampleããã¥ã¢ã«ã¯ã詳现ã§ã¢ã¯ã»ã¹ããããããã«æããŸããã
- ããã«ããŒãã远å ããŸãã
ããã§ã1ã€ã®ããŒãã§æ§æãããã¯ã©ã¹ã¿ãŒãã§ããŸããkubeadm
ããåãåã£ãjoin token
ã䜿çšããŠã Type 0
ããŒããããã«è¿œå ãå§ããããšãã§ãjoin token
ã
- Docker Swarmãšæ¯èŒããŠãã ããã
Docker Swarmã¯ãDocker CEããã³EEã«çµã¿èŸŒãŸããçµ±åãªãŒã±ã¹ãã¬ãŒã·ã§ã³ããŒã«ã§ãã Docker Swarmã¯ã©ã¹ã¿ãŒã¯ã1ã€ã®ã³ãã³ãã§èµ·åã§ããŸãã 詳现ã«ã€ããŠã¯ãDocker Swarmãã¥ãŒããªã¢ã«ãåç
§ããŠãã ãã ã
è¬èŸïŒ
Kubernetesã¯ã©ã¹ã¿ãŒã®ã»ããã¢ããã«é¢ãããã£ãŒãããã¯ãšãã³ããæäŸããŠããã@mhausenblas ã @ _errm ã @kubernetesonarmã«æè¬ããŸãã
åç
§ïŒ
- ãªãªãžãã«ïŒ 10åã§ãã¢ã¡ã¿ã«ã®Kubernetes ã