ubuntuでkubeadmを使ってkubernetesを構築する

スポンサーリンク

はじめに

本当はscratchで入れたかったけど難しすぎていつまでたってもできる気がしなかったので
kubeadmを使ってとりあえずkubernetes(通称:k8s)が動く環境を作ろうと思います。

いつの日かscratchで作りたいな。

注意1

k8sは発展が早いというか、3カ月ごとにversionが新しくなるようで昔の投稿を参考にすると混乱することこの上ないので、この内容も混乱を助長することになるかもしれません。
k8sを構築される方は必ず公式サイトを参考にして、他サイトはこんな風に作ってたんだな程度に構えていたほうが良いと思います。

サポート期限とかはこちらを参照

注意2

個人的に一番混乱してた内容がこちら。

k8sを勉強していくとMasterノードとWorkerノードという言葉に出会います。

公式ではMaster Components、Node Componentsともあります。

Masterノード
いくつかのMasterプロセスたち
これらが起動するノードを単にMasterノードという。

Workerノード
いくつかのWorkerプロセスたち
これらが起動するノードを単にWorkerノードという

※ノード:ホストのこと。物理サーバだったり、AWSのインスタンスだったり。

このMasterノードとWorkerノードですが絶対に分けないと動かないというわけではなく、1つのノードで同時に動かすこともできる様子。MasterプロセスとWorkerプロセスを同時に起動すればMasterノードかつWorkerノードになるみたい。

でも分けて動かしたほうが色々分かりやすいので、私も分けて作ります。

こちらのサイト様をみるとわかりやすい。

参考サイト

どちらも公式サイトから。

インストールまではこちら

 kubernetes.io 
Installing kubeadm - Kubernetes
https://kubernetes.io/docs/tasks/tools/install-kubeadm/
Installing kubeadm

インストールが終わったらここ参考にして構築

使用した環境について

各versionはこちら

Ubuntu 16.04.4 LTS

docker:17.03.2-ce

kubeadm:v1.10.1

kubelet:v1.10.1

kubectl:v1.10.1

flannel:v0.10.0

クラスタ環境を作るのでサーバを複数用意する必要がありますが、今回はWindows10のPC1台で仮想サーバを複数建てて構築しました。

以下概要図です。

まずWindows10でVMware Workstation 12 Playerを起動させます。
VMware Workstation 12 PlayerでVMware ESXi6を起動します。このときVMware Workstation 12 Playerの設定でESXi6の仮想マシン設定でネットワークアダプタの設定を「ブリッジ」にします。
※これ重要。忘れていると各ubuntu16.04同士が通信できずk8sがうまく構築できません。

そしてESXi6上でubuntu16.04を3台たちあげます。この3台をそれぞれmaster1台とworker2台(host1,host2)としています。

事前準備

k8sでクラスタを組む前に事前準備をします。

masterもworkerもそれぞれ実施する必要があります。

macアドレスとproduct_uuidの確認

・macアドレスとproduct_uuidが各ノードで一意であることを確認します。
ip linkでmacアドレスをが他ノードのどれともかぶってないことを確認。
sudo cat /sys/class/dmi/id/product_uuidでproduct_uuidが他ノードとかぶってないことを確認します。

/etc/hostsの設定

環境にあわせて作成します。今回は3台それぞれに以下を設定しました。

192.168.0.14 master
192.168.0.15 host1
192.168.0.16 host2

swapを落とす

sudo swapoff -aで一時的にswapをOFFにします。

sudo vim /etc/fstabでSWAP部分のUUIDからはじまる箇所をコメントアウトして永続的にOFFにします。

とりあえず両方やっておきました。

Dockerのインストール

推奨されている17.03を入れます。公式の通りですが一部sudoとか入れてます。

インストール後、sudo docker versionでバージョン確認をします。

kubeadm、kubelet、kubectlのインストール

公式に書いてある通りです。まとめてインストールします。

(Master ノード限定)kubeletが使用するcgroupドライバ設定

※確認して問題なければ何もしなくてOK。実際何もしなかったです。

この事前準備だけMasterノード限定です。

kubeletが使用するcgroupドライバとDockerが使用するドライバと同じであることを確認します。

でもcat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf でみても

sedコマンドで変換する「cgroup-driver=systemd」がないので何もしませんでした。

以上で事前準備は完了です。ここからk8sでクラスタ環境を構築していきます。

Master ノードのセットアップ

・Masterの初期化
kubeadm initを実行しますが、今回はPod Network Pluginにflannelを使うので--pod-network-cidr=10.244.0.0/16を追加します。
--apiserver-advertise-addressでMaster nodeが使うIPアドレスを指定できる。
が、つけないとデフォルトゲートウェイのinterfaceを使ってくれる様子。

一応ちゃんと指定しました。

sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.0.14

実行結果に出てくる以下のような出力はroot以外のユーザにkubectlを動作させるために必要だとか。とりあえず実行しておきます。

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

kubeadm joinのコマンドも表示されるのでメモしておきます。これをworkerノードで実行しする必要があるので必ずメモします。

※以下のコマンドは私の環境で入力するコマンドです。各環境で違うのでご自身のログをコピペして使用してください。

kubeadm join 192.168.0.14:6443 --token y424xf.0i7gl376iq6w8m12 --discovery-token-ca-cert-hash sha256:c8441f4abe503f44362522a5328586fe2ecdd613981a521552aa62fec8f162bc

※以下はこの段階での各種ログです。自分のメモ用です。インストールには関係ないので無視して先に進んでください。ただいつかk8sに詳しくなってから見ると色々参考になるかも?

podネットワークのインストール

今回はflannel使います。
以下コマンドの結果が1であることを確認。
cat /proc/sys/net/bridge/bridge-nf-call-iptables

その後以下を実行します。

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml

以上でMasterノード側のセットアップは完了です。引き続きworkerノードのセットアップを実施します。

workerノードのセットアップとクラスタへの追加

ここからworkerノードでの作業です。

masterノードでkubeadm initコマンドで出てきた以下コマンドをsudoつけて打ちます。

※以下のコマンドは私の環境で入力するコマンドです。各環境で違うのでご自身のログをコピペして使用してください。

sudo kubeadm join 192.168.0.14:6443 --token y424xf.0i7gl376iq6w8m12 --discovery-token-ca-cert-hash sha256:c8441f4abe503f44362522a5328586fe2ecdd613981a521552aa62fec8f162bc

まずはhost1で実行します。

master側で追加されているか確認します。kubectl get node -o wideを打ちます。

host1がいますね。

まったく同じようにhost2でもsudo kubeadm join 192.168.0.14:6443 --token ・・・実行します。実行結果は同じなので省略。

host2で実行した後にmaster側でhost2がいるか確認します。

ばっちりいますね。STATUSがReadyになっていればOKです。

以上でk8sの構築は完了です!

こちらはノード2つ追加後のログです。

※失敗した場合

何かしらの理由で失敗した場合ですがsudo kubeadm resetコマンドでsudo kubeadm init前の状態に戻せます。

masterノード作成時に~/.kubeを作っているなら念のため消しておいたほうがいいかも。

workerノード側はsudo kubeadm resetを打てばsudo kubeadm init前に戻れます。

戻した後に再度sudo kubeadm init~を打てばk8sを再度構築しなおせます。

おまけ:タブ補完

今後はkubectlをメインに使うことになりますが、タブ補完がないと大変なので以下を.bash_profileなどに追加しておきます。

source <(kubectl completion bash)

追加後にsource .bash_profileか再起動をします。

うまくいくとkubectl以降のコマンド、kubectl getなどがタブ補完されるようになります。

最後に

今回はインストールと構築までです。このあとダッシュボード追加したら実際に何かk8s上で動かしていきたいと思います。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする