Hyper-Vにokd4(OpenShift Origin)をインストールする


最近出たというOpenShiftのupstream版である okd をインストールしようとしたら結構てこずったのでメモ。 Hyper-Vは対応プラットフォームに書かれていないので、手探り感がすごい。

okdは昔は OpenShift Origin と呼ばれていたが、OpenShift3の途中からokdという名前に変わった。 その後、OpenShift 4になって、ずっと出ていなかったが、OpenShift 4.5にあわせて再登場したらしい。

https://www.publickey1.jp/blog/20/red_hatkubernetesokd_4.html

ちなみに、OpenShift4を手軽に試す環境として、 CodeReady Containers というものあり、 こちらは1VMで動かす minikubeminishift みたいなものだ。

CodeReady Containersも以前構築してみたことがあり、そのときの記事がこちら。

CodeReady ContainersでWindows上にOpenShift環境を構築する

CodeReady Containersは完全お試し用のもので、30日で証明書が切れると再インストール、 すなわち最初からやりなおしという致命的な弱点がある。 OKDはバージョンアップの方法も書かれているので、そういったことは無いと信じたい。

以下の実施内容は、基本的に公式ドキュメントの記載にもとづいておこなった。

https://docs.okd.io/latest/installing/installing_bare_metal/installing-bare-metal.html

準備するもの

名前CPUメモリ備考
Master4vCPU24GBコントロールプレーン
Bootstrap4vCPU16GBインストール時だけ必要
ロードバランサnginxを利用
DNSdnsmasqを利用
HTTPサーバnginxを利用

ドキュメントには、コントロールプレーンが3台、ワーカーノードが2台必要って書かれているが、 以下のFAQに、コントロールプレーン1台でもOKって書かれていたので、そのようにしてみた。

Bootstrapサーバがインストール時だけ必要なくせに、16GB必要だし、おかげでLBも用意しなきゃいけないしでつらい。

本来コントロールプレーンもメモリ16GBでよいのだが、さすがに1ノードにまとめるならもうちょっと入れておくかと24GBにした。 本当は32GB確保したかったのだけど、Bootstrapのせいで確保できなかったので妥協。

https://github.com/openshift/okd/blob/master/FAQ.md#can-i-run-a-single-node-cluster

ロードバランサ、DNS、HTTPサーバは先日作ったGitlab用のVMがあったので、そこにまとめて入れることにした。

また、okd(openshift)は、 xxx.クラスタ名.ベースドメイン という形式のFQDNでアクセスすることになる。 今回は、クラスタ名を okd 、ベースドメインを local とした。

インストール

作業端末の準備

  1. 作業端末を準備する。 openshift-install コマンドがLinuxとmacだけだったのでどちらか。 自分は、Windowsなので、wsl上で作業した。

  2. インストーラをgithubからダウンロードする。

    https://github.com/openshift/okd/releases/tag/4.5.0-0.okd-2020-07-29-070316

    wget https://github.com/openshift/okd/releases/download/4.5.0-0.okd-2020-07-29-070316/openshift-client-linux-4.5.0-0.okd-2020-07-29-070316.tar.gz
    wget https://github.com/openshift/okd/releases/download/4.5.0-0.okd-2020-07-29-070316/openshift-install-linux-4.5.0-0.okd-2020-07-29-070316.tar.gz
    
    tar xf openshift-client-linux-4.5.0-0.okd-2020-07-29-070316.tar.gz
    tar xf openshift-install-linux-4.5.0-0.okd-2020-07-29-070316.tar.gz
    
  3. こちらのページから、Red Hat Developerに登録したアカウントで pull-secret なるファイルをダウンロードする

    https://cloud.redhat.com/openshift/install/pull-secret

  4. インストール設定を格納するディレクトリを作成する。このとき、ディレクトリ名はクラスタ名にそろえるということなので、 mkdir okd とokdディレクトリを作成した。

  5. okd/install-config.yaml を以下の内容で作成する。

    apiVersion: v1
    baseDomain: local
    compute:
    ​- hyperthreading: Enabled
      name: worker
      replicas: 0
    controlPlane:
      hyperthreading: Enabled
      name: master
      replicas: 1
    metadata:
      name: okd
    networking:
      clusterNetwork:
    ​  - cidr: 10.128.0.0/14
        hostPrefix: 23
      networkType: OpenShiftSDN
      serviceNetwork:
    ​  - 172.30.0.0/16
    platform:
      none: {}
    fips: false
    pullSecret: '{"auths": ...}' #先ほどダウンロードした pull-secretの中身
    sshKey: 'ssh-ed25519 AAAA...' #公開鍵。なければ適当につくる。
    

    先述のとおり、今回はコントロールプレーンは1台だけなので、ドキュメントと違って、 .controlPlane.replicas を1にしている。

  6. マニフェストの作成

install-config.yamlを配置した okdディレクトリの1階層上で以下のコマンドを実行する。

openshift-install create manifests --dir=okd

実行すると、install-config.yamlは消えてしまうので、何回もやり直しそうならコピーしておくのが無難。

実行後、設定を変更してコントロールプレーンではPodが起動しないように設定することもできるが、 今回は1台構成なので変更せずにそのままとする。

  1. ignitionファイルの作成 okd(OpenShift)のインストールでは、ignitionファイルとよばれるものの中に、 install-config.yamlおよびそこから生成されたマニフェストの情報が含まれているようだ。

    openshift-install create ignition-configs --dir=<
    

    を実行すると、 bootstrap.ign master.ign worker.ign というファイルが作成される。

    作業用端末での操作はいったん止めて、次に周辺サーバの準備、および Fedora CoreOSのインストールをおこなう。

DNSの準備

dnsmasqを適当に設定すればよい。自分は以下の通り/etc/hostsを設定し、必要な名前解決ができるようにした。

192.168.2.11 api.okd.local api-int.okd.local
192.168.2.12 master.okd.local etcd-0.okd.local _etcd-server-ssl._tcp.okd.local
192.168.2.13 bootstrap.okd.local

HTTPサーバの準備

  1. nginxをインストール

    dnf install nginx nginx-mod-stream
    

    のちにLBとしても利用したかったので、streamモジュールもインストール。

  2. 通常は、インストールすればおしまいだが、Gitlabが 80ポートを占領しているので、Listenするポートを10080に変更した。

    http {
      server {
        listen 10080;
        listen [::]:10080;
      }
    }
    
  3. /usr/share/nginx/htmlに必要資材を配置

    先ほど作成された bootstrap.ign master.ign worker.ign を配置する。

    以下のサイトからRawファイルとsignatureファイルをダウンロードして配置する。 ドキュメントにはsignatureファイルのことが書かれてないが配置しないとインストールに失敗するので注意(1敗)。

    また、Rawファイルは展開する必要はない。圧縮ファイルのままで配置しないとインストールに失敗するので注意(1敗)。 なお、RawとRaw(4k Native)の2種類あるが、よくわからなかったので、Rawのほうを使った。

    https://getfedora.org/en/coreos/download?tab=metal_virtualized&stream=stable

Load Balancerの設定

nginxをTCPロードバランサとするために、 /etc/nginx/nginx.conf に以下の設定を入れた。

stream {
  upstream k8s-api {
    server 192.168.2.12:6443;
    server 192.168.2.13:6443;
  }
  upstream machine-config {
    server 192.168.2.12:22623;
    server 192.168.2.13:22623;
  }
  server {
    listen 6443;
    proxy_pass k8s-api;
  }
  server {
    listen 22623;
    proxy_pass machine-config;
  }
}

Fedora CoreOSをインストール

ここから実際にbootstrapサーバやMasterサーバにokdを動かすためのOSであるFedora CoreOSをインストールしていく。

  1. ISOをダウンロード

    先ほどRawファイルをダウンロードしたときと同じサイトだが、 https://getfedora.org/en/coreos/download?tab=metal_virtualized&stream=stable からISOをダウンロードする

  2. Hyper-Vの管理コンソールから、仮想マシンを作成する。

    メモリの動的割当は無効化した。

  3. ISOをマウントしてOSを起動する

  4. インストール選択画面で タブキー を押し、カーネル引数を入力できるようにする

  5. 表示されているパラメータに続けて以下のように入力する

    • Bootstrap

      coreos.inst=yes coreos.inst.install_dev=sda coreos.inst.image_url=http://192.168.2.11:10080/fedora-coreos-32.raw.xz coreos.inst.ignition_url=http://192.168.2.11:10080/bootstrap.ign ip=192.168.2.13::192.168.2.1:255.255.255.0:bootstrap.okd.local:eth0:none nameserver=192.168.2.11
      
    • Master

      coreos.inst=yes coreos.inst.install_dev=sda coreos.inst.image_url=http://192.168.2.11:10080/fedora-coreos-32.raw.xz coreos.inst.ignition_url=http://192.168.2.11:10080/master.ign ip=192.168.2.12::192.168.2.1:255.255.255.0:master.okd.local:eth0:none  nameserver=192.168.2.11
      

    それぞれのパラメータの詳細は以下のとおり。

    coreos.inst.image_url には、rawファイルにアクセスできるURLを書く。

    coreos.inst.ignition_url には、それぞれのignitionファイルにアクセスできるURLを書く。

    ip は、次のフォーマットでIPアドレスを設定する IPアドレス::デフォルトゲートウェイ:サブネットマスク:ホスト名:デバイス名:none 。 IPアドレスの直後だけコロンが2つなことに注意(1敗)。

    nameserver は、ネームサーバのアドレスを書く。これもドキュメントには目立たないところにあるので忘れないように(1敗)。

    ちなみに手入力がつらかったのだが、Hyper-Vにはクリップボードから入力という神機能があった。 ただし、動作としてペーストではなくて1文字ずつ解釈して変わりに入力してくれるRPAみたいな機能のため、 JIS配列とUS配列の記号位置による違いがそのまま反映される。 =_ になってしまうとか。

    これは、あらかじめ自分の環境もIMEを変更してUSキーボードにしておくことで回避できた。

  6. 入力したらエンターキーを押すとインストールがはじまる。

    インストールがおわると一瞬エラーメッセージのようなものが 赤字 で表示されて再起動してしまうのだけれどエラーではないので注意(N敗)。 単に、再起動時にISOをunmountしようとして、できなかったといってるだけである。

    コンマ何秒しか表示されないので、しかたがなく画面を録画して確認して、がっかり。

  7. 再起動したら、再度タブを押してISOを手動でunmountしてから再起動する。

    これをやらないと、せっかくFedore CoreOSがインストールできたのに、またインストール処理に入ってしまう。 しかも、未設定の状態で(N敗)。

    タブを押すとパラメータ入力待ちとなってくれるため、おちついてディスクをとりはずして再起動できる。

    これでFedora CoreOSのインストールはおしまい。

okdのインストール

CoreOSのインストールもおわり、あとはokdをインストールするだけ……なのだけど、実はインストールは 先ほどのignitionファイルの内容をもとに裏で勝手におこなわれるため、待ってるだけでよい。

作業端末で、以下のコマンドを実行するとインストール状況を監視してくれる。

openshift-install --dir=okd wait-for bootstrap-complete --log-level=debug

なお、インストールは30分ぐらいかかるが、20分ぐらいはずっとエラーメッセージが出続ける (上記コマンドの標準出力も、CoreOSの標準出力も)。

見てても落ち着かないだけなので、のんびり待ちましょう(1敗)。

最終的に、以下のような感じで出力されてコマンドが終了する。 そうしたら無事に終了である。

DEBUG Bootstrap status: complete
INFO It is now safe to remove the bootstrap resources
INFO Time elapsed: 30m

okdへのアクセス

okd/auth 配下に、kubeconfigファイルとkubeadmin-passwdファイルができている。

kubeconfigファイルを使えば ockubectl でCLIアクセスできるし、 https://console-openshift-console.apps.okd.local/ にアクセスすることでWebコンソールも利用可能。 初期ユーザは kubeadmin であり、パスワードは kubeadmin-passwd に書かれている。

この辺は、CodeReady Containersと同じだ。

CodeReady Containersのころは、OpenShift 4.2相当だったと思うので、 だいぶみためが変わっている。

インストールが無事にできたので、今度はなんか適当にアプリケーションを動かしてみよう。


関連記事