オフラインインストール可能な Kubernetes インストーラを作った


概要

いろいろ必要に迫られて、完全オフラインな環境に Kubernetes をインストールする必要がでてきました。

Kubernetes のオフラインインストールは手動でやるとかなり面倒です。そこで、完全にオフラインな環境(オンプレ)に Kubernetes をインストールするためのインストーラを作りました。

  • CentOS 7, RHEL 7, Ubuntu 18.04 に対応しています。
  • 内部的には kubeadm を使用しています。
  • Ansible を使用してインストールします (スクリプトベースのインストーラも一応あり)
  • オフラインインストールをする場合は、事前にオンライン環境で RPM / DEB ファイルの取得とコンテナイメージをダウンロードしておき、これを外付けHDDなりでオフライン環境に持ち込む、という手順になります。
  • Kubernetes 以外に、Rook NFS/Ceph、Private Registry、Nginx Ingress Controller、Metrics Server、Helm のインストールもできます。

Kuberspray に似ていますが、完全オフラインでインストールができるという点が異なります。

ダウンロード

作ったものは https://k8s-installer.github.io/ においてあります。マニュアルもここにありますので、使い方はこちらを見てください。

Git レポジトリは https://github.com/k8s-installer/k8s-installer です。

使い方

使い方はマニュアルを見てもらうとして、ここでは簡単な使い方のみ記載します。

オンラインインストール

インストーラを Github から入手します。

次に、Ansible インストールと、Inventory file および vars ファイルのコピー・編集を行います。

$ cd ansible
$ pip install -r requirements.txt
$ cp samples/* inventory/

Inventory ファイル(inventory/hosts) には、デプロイ先のホストを指定します。
master_first にマスタノードの1台目、master_secondaryにマスターノードの2台目以降(HA構成の場合)、worker にワーカーノードを指定します。

[master_first]
master-0  ip=10.240.0.10

[master_secondary]
master-1  ip=10.240.0.11
master-2  ip=10.240.0.12

[worker]
worker-0  ip=10.240.0.20
worker-1  ip=10.240.0.21

[master:children]
master_first
master_secondary

HA 構成にする場合は inventory/group_vars/all/main.yml の lb_apiserver_address にロードバランサのIPアドレス or ホスト名を指定します。

Ansible playbook を実行してデプロイを行います。sudo パスワードが必要な場合は -K オプションを追加してください。

$ ansible-playbook -i inventory/hosts site.yml

オフラインインストール

オンライン環境で offline-generator ディレクトリの generate-offline.sh を実行してオフラインファイル一式を収集します。
(オフライン環境は、デプロイ先のノードと同一の OS で稼働している必要があります)

k8s-offline-files.tar.gz というファイルができますので、本インストーラと本ファイルを外付けHDDなどを使用してオフライン環境で Ansible を実行するノードに転送します。
(ノードには別途 Ansible のインストールが必要です)

あとは、オンラインインストールの時と同様に Ansible を実行してインストールを行います。
一箇所だけ、inventory/group_vars/offline.yml の offline_install の値を yes に変更する必要があります。

設計指針

軽く設計方針などについて記載しておきます。

Kubeadm を活用して Ansibleインストールする、という点は Kubespray などと同じなので、特に説明は不要と思います。

問題はオフラインインストールをどうやって実行するか、という点です。これについては、1) RPM/DEB などのパッケージのオフラインインストールをどうするか、2) コンテナイメージをどう各ノードに投入するか、が問題になります。

RPM/DEB のオフラインインストール

必要な RPM なり DEB を依存関係を含めダウンロードしておき、全ノードに Ansible で転送してオフラインリポジトリを作る、という戦略を取ります。
(ローカルに Web サーバを立てて yum/apt リポジトリにするという手もあるのですが、面倒なので)

依存関係含めて RPM / DEB を取得する方法、およびオフラインリポジトリを生成する方法は以下です。具体的な手順は create-repo-*.sh を見てください。

  • RHEL/CentOSの場合:
    • RPM の取得は repotrack で一発です。
    • リポジトリ生成には createrepo を使います。
  • Ubuntu の場合:
    • DEB ファイルの依存関係は apt-cache depends で取れます。ダウンロード自体は apt download です。
    • リポジトリ生成には apt-ftparchive を使います。

コンテナイメージの取得・投入

コンテナイメージの取得は docker pull で行い、docker save で tar.gz 形式でイメージ化できます。
これを各ノードに転送して、docker load でロードします。

ちょっとやっかいなのは必要なコンテナイメージの洗い出しです。Kubernetes 本体のコンテナイメージは kubeadm config image list で取得できます。
それ以外のものについては、yaml ファイルから "image:" で grep して引っこ抜くしかありません。