※当ブログではアフィリエイト広告を利用しています
この記事では、Kubernetes(k8s)クラスターをオンプレで構築するために、なるべく簡単な構築手順を解説します。
そもそも、わざわざオンプレにk8s環境を作成する必要があるのか疑問を持つ人もいるかもしれません。Amazon EKS、Azure Kubernetes Cluster(AKS)、Google Kubernetes Engine(GKE)、IBM Cloud Kubernetes Service (IKS)といったクラウドサービスを活用することで、すぐにKubernetesクラスターを使うことができます。
しかし、私の経験上、顧客が扱うシステムにはどうしてもオンプレで運用したいというものが必ず存在します。主に顧客情報や企業秘密を扱うシステムですね。
そのため、システム構築する人もオンプレで一からk8s Clusterの構築・運用ができるようになる必要があります。
この記事では、その入口としてまず簡単なクラスターを構築します。開発環境や検証環境といったSandbox的に扱われることを想定したクラスターです。
追記
2020年になりましたがリンクを確認する限りインストール方法に大きな違いはないように見えます。公式ドキュメントの記述を正として、この記事も参考にしながらインストールしてみてください。
技術的な興味〜で導入するのは良いですが、2020年の今においては、素のKubernetesを1から組むのはおすすめしません。
検証用途はまだしも、本番利用を見据えたときに
- 問題発生時のサポートはコミュニティーベース
- OSやKubernetesクラスターのハードニング
- ロギングや監視、バックアップなどの運用はKubernetesだけではカバーできないので別ツールを検討する必要がある
- 定期的なアップデート作業
などを検討事項にキリがありません。(検討するうちにKubernetesのバージョンも上がっていってしまう・・・)
メリットとしてはベンダー製品にないような多様な組み合わせを実現できるということでしょうか。どちらにせよ超上級者向けだと思っています。
個人的には
- AWSやAzureなどクラウドサービスが提供するKubernetesクラスターを活用する
- オンプレで組む場合はOpenShiftなどのKubernetesベースの製品を活用する
のが一般的だと思っています。
参考 kubeadmのインストールkubernetes.io
参考 kubeadmを使用したシングルコントロールプレーンクラスターの作成kubernetes.io
環境概要
Master x 1、Node x 2の単純な構成とします。Nodeの数は用途に応じて増やしてよいですが、Masterの数は今回は1つにしてください。Masterを複数にするとロードバランサーが必要になり、少し複雑になります。

ホスト名 | IPアドレス | 役割 |
k8smaster.local | 10.0.2.15/24 (NATネットワーク) 192.168.56.101/24 (ホストオンリーネットワーク) | Master |
k8snode-1.local | 10.0.2.16/24 192.168.56.102/24 | Node |
k8snode-2.local | 10.0.2.17/24 192.168.56.103/24 | Node |
OSはRHEL 7.xを使います。ライセンスがなければCentOS 7.xでもOKです。私はいつもCentOSです。
システム要件としては、CPU 2コア/メモリ 2GBが必要となります。ディスクは適当に 100GB程度で十分です。足りなくなったら増やしましょう。お使いのPCスペック、余っているサーバーリソースやWorker上で動かしたいアプリケーションが使うリソースなどに合わせて準備してください。
ここではローカルPC内のVMで動かすことを想定し、最低限のスペック(1コア、1GB、100GB)で作成していきます。サーバーが用意できる場合はもっと潤沢なスペックを用意してみてください。
VirtualBoxなどの導入が禁止されている場合は、、、頑張って社内でインターネット接続できるサーバーを借りてください。
# オフラインでも導入できなくはないのですが、その手間とインターネット接続できるサーバーを申請する手間はあまり変わらないと思います。せめてインストール作業の間だけもインターネット接続を許可してもらうことをお勧めします。
導入方針
2019年2月時点でKubernetesの導入方法は非常に多岐に渡っていますが、今回は最も基本的なkubeadmを使用した導入を行います。
k8sの導入を楽にしてくれるOSSを活用することもできますが、SIer的には、
- 採用理由が明確(公式が提供しているインストール方法であるためこれで良いと言える)
- 何か問題があったときに(問題判別や対処もそうだが主に顧客への説明が)大変
- 「簡単」といっても(設計書に起こしたり顧客へ説明するために)内部の仕組みを把握する必要があるため、学習コストがかかる
・・・などなど諸々の理由でkubeadmを使うのが良いかなと思います。まあk8sに習熟してきて余裕が出てきたらそういったものに手を出すのもよいと思います。
# サポートが必要な場合、ベンダーが提供しているk8sをラップしたソリューションを使用するのも手です。
同様の理由でAnsibleなどの構成管理ツールも使用しません。SIer的には顧客への説明や未知の人への引継ぎ手順を作成することを考えると、なるべく素のコマンド実行だけで導入構成できるようにしておいたほうが良いと思っています。
# もちろん、自分用だったり、顧客に引き継ぐ必要のないPoC(概念実証)環境だったりする場合なら効率化のためにどんどん使っていくべきです。
以下の流れで導入を行います。1と2が本記事の内容です。3と4は次回。
- Master VMを作成し、必要コンポーネントをインストール
- Master VMをコピーしてNode VMを作成
- Masterの構成
- Nodeの構成
VMのセットアップ
Master VMの作成
OSの導入
まずはk8sクラスターを構成するVMを作成していきます。
まずはMasterとなるVMを作成しましょう。OSを最小限のインストールで導入します。私はVirtual Boxを使っていますが何でも構いません。
1台目をMaster用として諸々の設定をした後、このVMを複製してNode用のVMを作成していきます。
例えばこんな感じになります。

ネットワーク設定に注意してください。 仮想マシン同士が相互に通信できる状態にしておくことが必要です。(VMからVMへSSHログインできればOK)
この場合はNATネットワークを使ってVM同士が通信できるようにしつつ、ホストオンリーネットワークを使ってホストからVMへ接続できるようにしています。
パッケージの更新
パッケージを最新の状態にアップデートしましょう。
yum -y update
Guest Additionsの導入
Virtual Boxを導入している場合、Guest Additionsを導入します。k8sクラスターのノード間で時刻同期する必要があり、ホストと時刻を同期するために導入します。こちらを参考にしてください。
もちろん、chrony使っても大丈夫です。
※VMWare環境の場合はVMWare Toolsを入れましょう。
SELinuxの無効化
導入に必要なため、 本番でも無効化してください。
getenforce setenforce 0 getenforce sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config cat /etc/selinux/config
Firewalldの無効化
本番でも無効化することが多い気がします。(Firewallに別のネットワーク機器を使うため)
使用ポートを聞かれたらこちらで確認。
systemctl status firewalld systemctl stop firewalld systemctl disable firewalld
IPアドレスの固定
NATネットワークおよびホストオンリーネットワークのIPアドレスを固定します。また、IPv6は使用しないため無効化します。
nmtui #上記でIPアドレスを変更したうえで以下を実行 systemctl restart network
本番ならインフラ担当がOSまで作ってくれるのであまり考える必要はない・・・はず。
IPv6無効化
OSレベルでもIPv6を無効化します。
echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf sysctl -p /etc/sysctl.conf
ホスト名の設定
CentOS導入時に設定済みならスキップしてOKです。
hostnamectl set-hostname k8smaster.local hostname -f
本番ならインフラ担当が(略)
hosts設定
/etc/hosts に以下のように設定します。本番ならDNSに登録しておくべきですね。
IPv6は使わないようにするため、::1の行はコメントアウトしておきましょう。
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 #::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.0.2.15 k8smaster k8smaster.local 10.0.2.16 k8snode-1 k8snode-1.local 10.0.2.17 k8snode-2 k8snode-2.local
SSH鍵認証の設定
ssh-keygen -t rsa -b 4096 -q -f /root/.ssh/id_rsa -N "" ssh-copy-id root@localhost
Dockerのインストール
yum -y install docker systemctl start docker systemctl enable docker
kubeadm, kubelet, kubectl のインストール
必要な設定をした上で、yumで導入します。
cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg exclude=kube* EOF yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes systemctl enable --now kubelet
スワップの無効化
Kubernetesを動作させるにはスワップを無効化する必要があります。
swapoff -a vi /etc/fstab cat /etc/fstab /dev/mapper/centos_k8smaster-root / xfs defaults 0 0 UUID=7e0e04d1-3cf5-44e2-9a8d-4351e95ba20e /boot xfs defaul ts 0 0 /dev/mapper/centos_k8smaster-home /home xfs defaults 0 0 # 以下をコメントアウト # /dev/mapper/centos_k8smaster-swap swap swap defaults 0 0
IPv4転送の有効化
echo 1 > /proc/sys/net/ipv4/ip_forward echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p /etc/sysctl.conf
スナップショット取得
VMをシャットダウンして、スナップショットを取得します。
Node VMの作成
ここまでで作成したVMを2回コピーし、それぞれ「k8s_node_1」「k8s_node_2」とします。
VirtualBoxを使っている場合、以下のような設定でクローンします。

こんな感じになります。

それぞれのVMを起動し、IPアドレスとホスト名を変更します。
# nmtui を起動すると、「有線接続1」「有線接続2」とNICが増えていると思います。「有線接続1」は使用しないため、削除してください。
設定の確認
VMを3台立ち上げた状態で、お互いにパスワードなしでSSH接続できることを確認します。
全部確認は面倒かもしれませんが、、少なくともk8smasterからk8snode-1, k8snode-2 への接続ぐらいは確認しておきましょう。顧客向けに導入するときは当然全て確認しましょう。
まとめ
今回はk8sクラスターとなるVMを3インスタンス分作成しました。次回はKubernetesを構成し、使える状態までもっていきます。
続き↓