2
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-05-03

概要

いろいろ必要に迫られて、完全オフラインな環境に 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 して引っこ抜くしかありません。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1