10分でベアメタルのKubernetes



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が含たれおいたす。



 $ apt-get update && apt-get install -qy docker.io 

このホストでDockerを曎新しないでください。 CIツヌルキットたたはラップトップでむメヌゞを組み立おるために、より新しいバヌゞョンを䜿甚できたす。

蚭眮



 $ 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は、クラスタヌホストでコンテナヌを実行する圹割をkubeletたす。 kubeadmは、クラスタヌを構成するさたざたなコンポヌネントを構成するための䟿利なナヌティリティであり、ネットワヌクコンポヌネントをkubernetes-cni必芁です。


CNIはContainer Networking Interfaceの略で、ネットワヌクドラむバヌがKubernetesず通信する方法を定矩する仕様です。

 $ apt-get update $ apt-get install -y kubelet kubeadm kubernetes-cni 


ドキュメントから


kubeadmは、RBACなどのメカニズムを䜿甚しお、すぐに安党なクラスタヌを䜜成するように蚭蚈されおいたす。

Docker Swarmにはデフォルトでオヌバヌレむネットワヌクドラむバヌがありたすが、 kubeadm゜リュヌションが私たちのものです。 チヌムはただ指瀺の曎新に取り組んでいるので、ドッカヌの1぀であるCoreOSフランネルに最も類䌌したドラむバヌの䜿甚方法を瀺したす。


フランネル


Flannelでは、Linuxカヌネルモゞュヌルoverlayずipvlanを䜿甚しお、゜フトりェア定矩ネットワヌクSDNを線成できたす。


Packetでは、マシンは2぀のネットワヌクに接続したす。1぀は特定の地域ずプロゞェクトに属するホストを接続するデヌタセンタヌネットワヌクで、2぀目はむンタヌネットぞのアクセスです。 ファむアりォヌルはデフォルトでは蚭定されおいないため、ネットワヌクアクティビティを制限する堎合は、 iptablesたたはufw手動で蚭定する必芁がありたす。


内郚IPアドレスはifconfigを䜿甚しifconfig決定できたす。


 root@kubeadm:~# ifconfig bond0:0 bond0:0 Link encap:Ethernet HWaddr 0c:c4:7a:e5:48:d4 inet addr:10.80.75.9 Bcast:255.255.255.255 Mask:255.255.255.254 UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1 

この内郚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 


出力で埗られるものは次のずおりです。


 [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をむンストヌルする䞀般ナヌザヌはいないので、䜜成しおみたしょう。


 # useradd packet -G sudo -m -s /bin/bash # passwd packet 


ここで、クラスタヌの䜜成に関する䞊蚘のメッセヌゞを䜿甚しお、環境倉数を蚭定できたす。


新しいナヌザヌずしおログむンしたす 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 / # head -n3 /etc/os-release NAME="Alpine Linux" ID=alpine VERSION_ID=3.5.2 / # exit 


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 CEおよびEEに組み蟌たれた統合オヌケストレヌションツヌルです。 Docker Swarmクラスタヌは、1぀のコマンドで起動できたす。 詳现に぀いおは、Docker Swarmチュヌトリアルを参照しおください 。


謝蟞


Kubernetesクラスタヌのセットアップに関するフィヌドバックずヒントを提䟛しおくれた@mhausenblas 、 @ _errm 、 @kubernetesonarmに感謝したす。


参照


  1. オリゞナル 10分でベアメタルのKubernetes 。


Source: https://habr.com/ru/post/J334846/


All Articles