Kubernetesのラボ、初期構築(前編)

babyFTHG7289_TP_V

あくまでも試みレベルですが、「Kubernetes勉強記事」の連載を始めてみようと思います。

スポンサーリンク
レクタングル大

はじめに

ラボの構築について、以下のリンクの記事を参考にさせていただきました。決して全ての手順が私の独自アイデアで完成できた訳ではありません。

>>CentOS7にKubernetes1.9をインストール

>>KubernetesにDashboardをインストールして、認証なしでアクセスする

>>オンプレK8sで使えるGoogle製External Load Balancer: MetalLB

>>Kubernetes on CentOS7

感謝してもしきれないほど、お世話になりました。上記の記事がなければ、私のKubernetesスキルは上達しなかったと言っても良いくらいです。

ただ、前回の記事の通り、書くコンポーネントのバージョンが変わったことで、一部導入がうまく行かなかったりしました。なので、今回の記事でサマライズしようと考えました。

はじめに(その2)

Kubernetesを一度も触ったことがない人でも大丈夫です。まずはコピペで初期構築ができるようにしています。

敢えて「Kuberenetesの解説の前にラボ環境」という順番にしています。

この記事でできること

今回のラボ環境は「自宅でESXi環境で作った4つのVM」にKubernetesを導入していきます。

この記事に従って構築すれば

  • 4ノード構成のKubernetes環境が出来上がる
  • ゆえに、Dockerの検証環境も出来上がる
  • type LoadBalancerのService構築も出来る

ようになります。つまりKubernetesの一連の機能を確認できる環境ができるはずです。

今後の連載では同じ環境でKubernetesを解説していく予定です。

なぜ、Minikubeやクラウド環境を使用しないか?

簡単な学習でしたらMinikubeで十分ですし、クラウド環境(GKEなど)を使用したほうが手っ取り早く検証環境が手に入ります。

しかし、ノード間の通信の確認には複数ノードがあったほうが直感的に学べますし、自宅で構築したほうが内部の動きがわかりやすく、コストも気にせずすみます。

せっかくですから「ランニングコストも気にする必要がなく、自分で勝手にできる環境」を作ってしまったほうが後々ラクだと思います。

あと、MinikubeのダッシュボードはMinikubeのホスト以外からアクセスさせるのが大変です。通常環境のダッシュボードを把握することが後々良いと感じました。

なぜ、Kubernetesの解説の前に、ラボ構築か?

まずは触ってもらいたいからです。論より証拠、触ったほうが「なんとなく」Kubernetesがつかめるはずです。

Kubernetesは「言葉で説明するより、実際に見たほうが理解できる」と感じてます。

対象読者

先日の記事で書いたとおり、Kubernetesは難しい。色んなコンポーネントが絡み合って、色んな製品の知識があった方が理解が深まりやすい。

だからこそ、まずは触ってほしい。

この連載では、全ての手順をできるだけ平易な用語で説明していく予定ですが、やはり最低限以下の知識があったほうが良いかと。

  • ESXiでCentOS7を導入できること
    →事前準備で必須です
  • Linuxの基本的なコマンドが使えること
    →ls/vi/cp/yumなどのレベルでOK。基本的にコピペで大丈夫にしています
  • Linux(Centos7)のネットワーク設定ができること
    →この辺はググったらすぐに出てきます

事前準備(全ての4VMで行う)

ESXiで4つのVMを準備する

まずは自宅のパソコンにESXiで4つのCentos7のVMを構築してください。

私は去年構築した64GBメモリのvCenterマシンに構築しましたが、そんなにリソースはいりません。

  • 1台目(Master):4GBメモリ、10GBデータストア
  • 2台目(Node1):1GBメモリ、10GBデータストア
  • 3台目(Node2):1GBメモリ、10GBデータストア
  • 4台目(LB):1GBメモリ、10GBデータストア

これで動作確認ができています。このレベルだったら意外と準備できるのではないでしょうか。

参考までに、私の家でのvCenter構築記事を記します。何度も言いますが、これと同じ構成は不要です。

ESXiの上のVMはH/Wに基本依存しません。

H170-PROとi7-6700KでのESXiサーバ構築手順!
ASUSのH170-PROマザーボードとSkylake i7-6700Kの組み合わせで無事にESXiの構築に成功しました。 ESXiは...

全ての4VMのCentos7を入れて初期設定する

VNCの記事のときと同様に、今回もCentos7を使用します。4VM全てにCentos7を入れてください。

初期設定:

  • 使用するCentOS7は「CentOS-7-x86_64-Minimal-1804.iso」
  • IPアドレス・Gateway・DNSの設定をする
  • つまり、CentOS7からインターネットへのアクセスができることとする

また、あくまでもセキュリティを意識しないで良い環境を前提に考えているので、セキュリティの設定は一切していません。なので、その辺はしっかり念頭にいれて必要に応じてハードニングしてください。責任は負えません。

ネットワークの初期設定

上に書いたとおりIPアドレス・Gateway・DNSの初期設定をしてインターネットに繋がる状態にしてください。

私の環境は以下のとおりです。ネットワーク構成は合わせてもらったほうが連載でのイメージがしやすいかもしれません。

topology1

ネットワーク設定:

Master Node1 Node2 LB
ホスト名 master node1 node2 nodelb
IPアドレス 192.168.1.80/24 192.168.1.81/24 192.168.1.82/24 192.168.1.83/24
Gateway 192.168.1.1 192.168.1.1 192.168.1.1 192.168.1.1

ちなみに、以降はできるだけ図とコマンドを多用していきます。

時には冗長に感じる人も出てくるでしょう。「こんなの常識だよ」と思う人もいるかも知れません。

でも、その人にとって常識でも、他の人にとって常識じゃないことも沢山あるんです。IT業界の中では、特にです。

CCIE/CISSPを取得している今でも、入社1年目の方に教えてもらうことも沢山あります。IT業界なんてそんなものです。

なので、出来るだけ沢山の人がついて行けるようにしてると思ってください。

sshでアクセスできるようにする

まずは操作しやすいようにSSHでrootログインができるようにします。つまり、この作業はコンソール上から行うことになります。

sshd_configを修正します。

以下の箇所のコメントアウトを外します。

こんな感じです。

面倒なので、再起動して反映させます。

これで「root@IPアドレス」でログインできるようになります。

以降は全てSSHでの作業を想定しています。

SELinuxをOFFにする

/etc/selinux/confiを修正します

これを

このように変更し、rebootします。

4VM全てで行ってください。(rebootを忘れないでください)

Hostsファイルを追記する

4VM全てでホスト名を登録してください。ホスト名でお互いにpingが通ることを確認してください。

一旦、スナップショットを取っておく

ここから先はDockerやKubernetesのインストール、初期設定などを行っていきます。

必ず外部、VM同士が通信できるかをPingで確認しましょう。

この時点で4VMのスナップショットを取得することをオススメします。そうすることで、この時点に簡単に戻れるので。

この時点までは、KubernetesやDockerの作業にはまだ行き着いていない状態です。この時点で「pingが通らない」とか「sshでログインできない」人は、ググって環境を整えてください。

これが成立していない状態で以降に進んでも絶対にうまくいきません。

Masterノードの設定(前半)

では、いよいよです。まずはMasterノードの構築です。

topology2

Masterノードにログインしてください。

Kubenetes Repositoryの設定

/etc/yum.repos.d/kubernetes.repoを「作成」してください。

KubeadmとDockerの導入

以下をコピペしてください。

docker-ceとkubeadmのインストールにバージョンを指定しているのがミソです。現時点でバージョンを指定しなければ、Dockerのバージョンが新しくて、以降のKubernetes init時にエラーが発生します。

とりあえずコピペしてください。

Serviceの初期設定

インストールしたDockerとKubeadmをsystemctlに登録&起動します。firewalldは停止します。ついでにswapをoffします。

結果はこんな感じ。

参考まで。Centos7はsystemctlという機能でマシンを起動したときに動かすサービスを設定できます。上の設定で、システムが再起動した時もDockerとKubernetesサービスが起動するようにします。

MasterNodeの作成

ここが肝心です。とは言ってもコマンド一つですが。Masterの初期設定を行います。

「–apiserver-advertise-address」はMasterのIPを設定してください。「–pod-network-cidr」はFlannelの使用可能IPレンジを指定します。

「なんじゃそりゃ!」と思われるかもしれませんが、とりあえずコピペしてください。私の環境と同じIPの設定にしていたらうまくいくはずです。

実行して2分ほどかかると思います(環境依存)。

終わったら以下のメッセージが表示されます。

最後の「kubeadm join …..」の行は必ずメモ帳にコピペして保管してください。後ほど使います。

ここでエラーが出た場合(良く出る)、上に記載した何かが漏れてる可能性があります。

よくあるのが。

  • インターネットに通信できていない。(ping www.google.comなどが上手くいくか?)
  • ホストファイルの記載に誤りがある
  • Dockerが最新のバージョンになってしまっている
  • swapがonの状態

などです。

ここでエラーがでて、原因がわかった場合は、大人しくSnapshotを戻して再チャレンジしたほうが早いです。

ここまで問題ない場合、上のメッセージの通り大人しく以下を実行します。

ネットワークの設定

当環境はKubernetesネットワークとしてFlannelを採用しました。これには色々な理由があり(VXLANを採用しており、勉強にもってこい、パフォーマンスが良いらしい、後述のmetallbに対応してるなど、本当に色々あるんです)、この辺は連載の中で取り上げますが、とりあえず「へぇ〜」と思ってるレベルで大丈夫です。

Flannel導入用のyamlを取得します。

wgetというコマンドで、インターネットからファイルをダウンロードできます。ノートパソコンでリンクをクリックしてファイルをダウンロードするのと似てますね。

結果はこんな感じ。

ここからが一番難しいところ。kube-flannel.ymlを修正します。

ここにMasterのネットワークインターフェースを追加します。こんな感じになります。

Masterのインターフェースは「ip a」で見つけてください。

上の例だと2番目の「ens160」です。

次に、Tolerationを修正します。

ここにもう一つKeyを追加します。

この必要性は以下の記事を参照してください。

Kubernetes1.12でFlannelと連携できなかった時の対処法
これまでの流れをぶった切って、いきなりKubernetesネタです。 Kubernetes1.12でFlannelがデプロイできないと...

これで準備が整いました。yamlを適用してFlannelの設定を行います。

結果はこんな感じ。

これでMasterがReadyになるはずです。

ちなみに、めちゃんこネットワークインターフェースも増えてるはずです。

後述しますが[flannel.1]ができており、事前に設定したCIDRレンジの一部になってるはずです。

さらに、FlannelのPodも起動してるはずです。現時点では意味不明だと思いますが、とりあえず以下を起動してみてください。連載の中で解説します。(このコマンドは表示してるだけなので、まぁ入力しなくても後述の作業には影響しません。でも確認してみてください)

ダッシュボード導入

ついでにダッシュボードも導入していきます。

もう、この方の記事をそのまま活用させていただきました。外部からもアクセスできるし、認証も不要。ラボ環境にはもってこいです。

>>KubernetesにDashboardをインストールして、認証なしでアクセスする

念の為「http://MasterのIP」でアクセスできることを確認しましょう。

Worker Node1とWorker Node2の設定

次はWorker Nodeの設定です。LBは最後にします。(というか、次回の記事で紹介します)

「Worker Nodeって何だよ!」と思うかもしれませんが、この上に実際のサービスが起動します(Webサービスとか、自作アプリとか)」。この辺は詳しく解説するので、とりあえず「へぇ〜」と思っておいてください。

topology3

手順はMasterNodeと殆ど同じです。最後が違うだけ。

Kubenetes Repositoryの設定

/etc/yum.repos.d/kubernetes.repoを「作成」してください。

KubeadmとDockerの導入

以下をコピペしてください。

docker-ceとkubeadmのインストールにバージョンを指定しているのがミソです。現時点でバージョンを指定しなければ、Dockerのバージョンが新しくて、以降のKubernetes init時にエラーが発生します。

とりあえずコピペしてください。

Serviceの初期設定

インストールしたDockerとKubeadmをsystemctlに登録&起動します。firewalldは停止します。ついでにswapをoffします。

結果はこんな感じ。

以下を実行してiptablesを修正します。これをやらないと後述のjoinでエラーが発生します。

Masterのinit時に取得したコマンドを実行します(環境によってstringが違います)。このコマンドでMasterに参加します。つまり、初めてMasterと通信してます。

うまくいけば、こんな感じになります。

MasterでNodeの登録を確認

以下のコマンドでNodeの登録を確認します。

この「kubectl」というのがkubernetesのcliです。これから多用します。

パラメーターについては以後の連載で「何度も何度も」説明しますので、今は「こんなもんかぁ〜」と思っておいてください。

結果は以下の出力になるはずです。

重要なのは「master/node1/node2」の全てが「Ready」になってることです。

Nodeを参加させて「Ready」になるのに、およそ30秒ほどかかるはずです。

5分待っても「Ready」にならなければ、なんか変です。(少なくともこの手順の流れでReadyにならなければ変です)

可能性として大いに考えられるのは

  • ネットワーク設定で失敗している
  • initの時点で失敗している

ですね。

この時点で3ノードとも「Ready」になっていたら、基本的なKubernetes/Dockerの演習が出来る状態です。

おめでとうございます!

この時点で全ノードのスナップショットを取得することをオススメします。

しかし、もう一つ残ってる作業があります。

「LoadBalancer」の設定です。

この時点では「何のロードバランサだよ!」と疑問に思ってるでしょう。色々あるんです。

これについては次回解説します。

(一つの記事として既に長くなりすぎているので・・・)

とりあえず、ここまで来たら「かなり大丈夫」だと思ってもらって結構です。

勉強を再会する方へ
スポンサーリンク
レクタングル大
  • このエントリーをはてなブックマークに追加

コメントをどうぞ

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">