【2019年版】Kubernetes 1.13 の簡単インストール手順(その1)

※当ブログではアフィリエイト広告を利用しています

この記事では、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.local10.0.2.15/24 (NATネットワーク)
192.168.56.101/24 (ホストオンリーネットワーク)
Master
k8snode-1.local10.0.2.16/24
192.168.56.102/24
Node
k8snode-2.local10.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は次回。

  1. Master VMを作成し、必要コンポーネントをインストール
  2. Master VMをコピーしてNode VMを作成
  3. Masterの構成
  4. 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を構成し、使える状態までもっていきます。

続き↓