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



All Articles