ibmcloudでオンプレミスのopenshift環境を構築する。

#はじめに

お客様のオンプレミス環境にopenshiftを導入する需要に対し、勉強のためibmcloudでベアメタルサーバーを購入し、検証環境を作成しました。
インフラ以外は極力お金をかけない方針で進めました。

備忘録も兼ねて手順を残します。
openshiftのユーザープロビジョニングに関しては既に記事がいくつか出ていますが、本記事では以下にフォーカスしました。
ご参考になれば幸いです。

1) ibmcloudの利用
2) openshift環境のためのインフラの準備
3) RHEL8におけるbastion(踏み台)サーバーの構築
4) 他、注意点など


#目次
[1.大体の流れ](#大体の流れ)
[2.構成](#構成)
[3.必要なリソースを入手する](#必要なリソースを入手する)
[4.ハイパーバイザーを導入しネットワークを構築する](#ハイパーバイザーを導入しネットワークを構築する)
[5.踏み台サーバーを構築する](#踏み台サーバーを構築する)
[6.踏み台サーバーから各ノードをイグニッションする](#踏み台サーバーから各ノードをイグニッションする)
[7.参考文献](#参考文献)

#大体の流れ

ibmcloudは「RedHat OpenShift on IBM Cloud Container Platform」というフルマネージドなopenshiftプラットホームを提供していますが、こちらは当然注文時点でopenshiftが出来上がってしまうため、環境構築の勉強にはなりません。
今回はオンプレミスでの構築想定なので、ベアメタルサーバー1台を購入しその中に導入していく一番面倒な(その分安い)方法を取っていきます。

流れはざっくり以下のようになります。

①必要なリソースを入手する。
②ハイパーバイザー(ESXi)を導入しネットワークを構築する。
③openshift環境に接続するためのbastion（踏み台）サーバーを構築する。
④bastionサーバーからopenshiftのOSであるCoreOSをインストール（イグニッション）する。

以降、既に消去した環境なので、パブリックipやパスワードなど特にマスキングせずに記載しています。

#構成
・ネットワーク図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/24a3cda2-156b-0cb3-158a-5fb2cca59902.png)
・スペック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/125f5260-d76b-8f71-edf6-2333a7b02975.png)

・ESXi hostコンソールでのネットワーク設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/f5738fb8-520e-cfe9-8f07-1af0bc0aefc4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/04c34006-0c9e-9145-ff20-79e34baff1b4.png)



#必要なリソースを入手する

###リソースを注文可能にする
ibmcloudにアカウント登録し、クレジットカードを登録して従量課金アカウントへアップグレードします。

ドキュメント：
　[IBM Cloud アカウントのセットアップ](https://cloud.ibm.com/docs/account?topic=account-account-getting-started)
　

###ベアメタルサーバーの注文

こちらのページから注文できます。
　https://cloud.ibm.com/gen1/infrastructure/provision/bm

本記事では以下のように注文しました。

|||
|:--|:--|
|ロケーション|北米南 DAL10 - ダラス|
|プロファイル|構成可能サーバー<br>デュアル・プロセッサー<br>Intel Xeon 8260(Cascade Lake)  |
|RAM|128 GB|
|イメージ|OSなし|
|ストレージ・ディスク※1|RAID 5<br>ディスク 3個<br>ホット・スペア 0<br>SATA SSD<br>1.7TB|
|ネットワーク・インターフェース※2|パブリック及びプライベート<br>1Gbps<br>500GB|

※1 ディスク容量をかなり大きく確保し、かつ冗長化しています。本記事での構成だと冗長化は必須では無く実効容量1TBほどあれば構築可能です。
※2 パブリックインターフェースも注文していますが本記事ではプライベートネットワークアクセスしか利用していません

作成ボタンをクリックして注文すると、空のデバイスリストに戻されます。
特に何もメッセージが出ないので注文に失敗したのかと不安になりますが、
ベアメタルサーバーの注文は特に反映に時間がかかるようで、データセンターでは構築作業が始まっています。

この時点できちんと注文できているかはオーダー履歴でのみ分かります。
https://cloud.ibm.com/billing/orders

1、2時間ほど待つと、デバイスリストに以下のように購入したベアメタルサーバーが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/706adb61-7f2e-d5e0-55c8-94342a95f209.png)

###IPアドレスの注文
bastionサーバー購入時に付与されるパブリックIP、プライベートIPは筐体管理用のIPなので、ESXi上に構築するvmには割り当てられません。
bastionサーバーとopenshiftのノード間を行き来する内部ネットワークのためのPrivate IP、及びインターネットからopenshiftコンソールにアクセスするためのPublic IPを注文します。

以下ページから「Create Subnet」をクリックして注文します。
https://cloud.ibm.com/networking/subnets

|Private IP||
|:--|:--|
|Scope|NA South DAL10 - Dallas 10|
|Network|Private|
|Size|/28|
|Routing|Portable|
|Endpoint|ベアメタル注文時に自動作成されたvlanを選択|

|Public IP||
|:--|:--|
|Scope|NA South DAL10 - Dallas 10|
|Network|Public|
|Size|/30|
|Routing|Portable|
|Endpoint|ベアメタル注文時に自動作成されたvlanを選択|

### VMware ESXiのダウンロード
以下の評価版(60日)を利用します。
アカウント登録してダウンロードします。
https://my.vmware.com/jp/web/vmware/evalcenter?p=vsphere-eval-7

### RHELのダウンロード
bastionサーバーに導入するOSのisoイメージを入手します。
以下の開発版を利用します。アカウント登録し、ダウンロードします。
https://developers.redhat.com/products/rhel/download

### openshiftのライセンス入手
私は別口で検証用のライセンスがあったのでそちらを利用しましたが、以下から評価版のライセンスを入手できるようです。
アカウント登録して入手します。
https://access.redhat.com/downloads

### CoreOS、pull secret、openshift-install、openshift installerの入手
openshiftのライセンスを入手し、RedHatアカウントと結びついたら以下からダウンロードできるようになります。
https://cloud.redhat.com/openshift/install/metal/user-provisioned

CoreOSはISOとrawの両方をダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/8d911d9d-4e53-f685-8f9e-3789a5e3115e.png)


#ハイパーバイザーを導入しネットワークを構築する

###SSL VPNに接続する
ベアメタルサーバーへのアクセスには、VPNを利用します。

まずは、ibmcloudコンソール右上から「管理」→「アクセス(IAM)」→「ユーザー」→「クラシック・インフラストラクチャー」→「自身のユーザー」→「クラシック・インフラストラクチャー」→「VPNサブネット」と進んでいき、「SSL VPNアクセスを有効にする」にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/b545ecbd-ae1b-192e-7606-c956beb246df.png)



次に、「ユーザーの詳細」タブに戻り、「VPN パスワード」の欄からユーザー名とパスワードを確認します。

以下urlにInternet Explorerでアクセスして、確認したユーザー名とパスワードでログインし、接続します。
(Internet Explorer以外は対応していません・・・。VPNクライアントをダウンロードする方法もあります。)
https://vpn.tok02.softlayer.com

###KVNコンソールに接続
ベアメタルサーバーにESXiを導入するため、筐体管理用のコンソールに接続します。
デバイス画面から購入したベアメタルサーバーをクリックし、「リモート管理」からユーザーとパスワードを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/2bb21b77-d26a-4be5-e26d-4e0ee7bc3063.png)

その後、コンソール右上の「アクション」から「KVNコンソール」を選択します。
SSL VPNに接続できている状態であれば、KVMコンソールのログイン画面に進めます。確認したユーザーとパスワードを入力し、ログインします。

（私の環境では何故かログイン画面に飛ばずデバイスリストにリダイレクトされてしまう事がたびたびありました。その場合何度かやり直すとアクセスできました。）

###ESXi isoファイルのマウント
ダウンロードしたESXiのisoファイルを、ベアメタルサーバーにマウントします。
「リモート・コンソール」から下図の赤く囲った部分をクリックし、「リモート・コンソールの起動」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/80577ca4-fbcb-76ba-5d6d-e7a217f63da3.png)

リモートコンソールが立ち上がるので、画面上部の「メディア」をクリックし、「ローカル・メディア用Javaクライアントを起動する」を選択します。
Javaクライアントのダウンロードが始まるので、それを起動すると下図のような小さいウィンドウが立ち上がります。
続けて「Virtual Media」→「Select Devices to Mount...」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/ddd881b4-db60-29b0-4b2f-7928c943d965.png)


その後「Add Image...」を選択し、ダウンロードしたESXiのisoファイルを選択します。
「Mapped」と「Read Only」にチェックを入れた状態で、「Mount Selected」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/bb029343-8aac-de9b-6b76-5d5880ce6a37.png)

下図のように表示されたらOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/7ce03519-ea9f-4fef-8d9e-bb213adb446b.png)


###ESXiのインストール
「メディア」の画面を閉じて、「電源」→「サーバーの電源オン」をクリックして暫く待つと、自動でESXiのインストーラーが立ち上がります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/79872ae9-31db-729f-cf44-5b141c09279b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/5af499f0-e2ae-4597-f994-2632f8964c71.png)


ESXiのインストール詳細は割愛します。以下の記事等参考にされると良いと思います。
　[VMware vSphere Hypervisor 7.0 (ESXi) をインストールしてみてみた @shirok様](https://qiita.com/shirok/items/ffc4a04e6891ddc8dee2)
　
###ESXi Webコンソールに接続
インストールが終了して再起動したら、「F2」キー→ログイン→「Configure Management Network」→「IPv4 Configuration」と進み、「Set static IPv4 address and network configuration」を選択し、ESXiのWebコンソールに接続するためのIPアドレスをセットします。
ここで入力するIPはベアメタル購入時に付与されたprivate IPです。IPアドレスの実値は読み替えてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/93e7d287-eddf-6ab3-09cd-250a0e42e3e8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/bf9d2909-fcdf-3e8d-9a07-35dbc06e4b83.png)

エスケープで抜けると変更を反映するためにManagement Networkのリスタートを促されるので、実行します。

その後、ブラウザのurlバーに以下を入力すると、Webコンソールにアクセスできます。


    https://<筐体管理用のprivate IP>/ui/


###Networkの構築
ESXi Webコンソールにログインしたら、「ネットワーク」タブをクリックし、[2.構成](#構成)の通りにvSwitchとPort Groupを作成します。


#踏み台サーバーを構築する
###仮想マシンの作成
ESXi Webコンソールで「仮想マシン」タブをクリックし、「仮想マシンの作成/登録」をクリック。
「新規仮想マシンの作成」を選び「次へ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/832f79e4-5739-62b5-5ca2-98c5a90b9fe3.png)


以下のように入力、選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/8e4aab26-43f0-371f-eaff-16b1f1007f06.png)

そのまま次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/e3be3a05-d92c-61ae-04e9-3ec33b33c7c8.png)

以下のように入力、選択します。CD/DVDドライブは入手したRHEL8のisoファイルをアップロードして選択します。
※アップロードに5時間くらいかかりました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/bbcba0c6-02d4-0fee-34d8-5863cecc6e7e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/54493eb3-c6c3-f412-f385-dfd5dd49a664.png)

###RHEL8のインストール
作成した仮想マシンをパワーオンしてコンソールを開くと、RHEL8のインストーラーが起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/d6756a75-902c-27c9-a4a3-73bb9565f942.png)

インストールの詳細は割愛します。以下の記事等参考にされると良いと思います。
　https://www.rem-system.com/rhel8-install/

###ipアドレスのセット
RHEL8のインストールを終え、ログインしたら、ipアドレスをセットします。(インストール時にGUIでセットしても良いです。)
筐体管理用のipでは無く、追加で購入したipをセットします。ipアドレスの実値は読み替えてください。

    #Private
    nmcli connection modify ens192 connection.autoconnect yes
    nmcli connection modify ens192 ipv4.method manual
    nmcli connection modify ens192 ipv4.address 10.171.33.34/28
    nmcli connection modify ens192 ipv4.dns 127.0.0.1

    #Public
    nmcli connection modify ens224 connection.autoconnect yes
    nmcli connection modify ens224 ipv4.method manual
    nmcli connection modify ens224 ipv4.address 169.48.182.142/30
    nmcli connection modify ens224 ipv4.gateway 169.48.182.141

    #反映、起動
    nmcli connection reload
    nmcli connection down ens192 && nmcli con up ens192
    nmcli connection down ens224 && nmcli con up ens224


最終的に以下のようになればokです。（途中メモ取り忘れたので曖昧、ごめんなさい）

    [root@bastion ~]# nmcli device
    DEVICE  TYPE      STATE     CONNECTION 
    ens224  ethernet  接続済み  ens224     
    ens192  ethernet  接続済み  ens192     
    lo      loopback  管理無し  --

    [root@bastion ~]# nmcli
    ens224: 接続済み から ens224
            "VMware VMXNET3"
            ethernet (vmxnet3), 00:0C:29:CB:93:07, hw, mtu 1500
            ip4 デフォルト
            inet4 169.48.182.142/30
            route4 0.0.0.0/0
            route4 169.48.182.140/30
    
    ens192: 接続済み から ens192
            "VMware VMXNET3"
            ethernet (vmxnet3), 00:0C:29:CB:93:FD, hw, mtu 1500
            inet4 10.171.33.34/28
            route4 10.0.0.0/8
            route4 10.171.33.32/28
    
    [root@bastion ~]# ip route
    default via 169.48.182.141 dev ens224 proto static metric 102 
    10.0.0.0/8 via 10.171.33.33 dev ens192 proto static metric 100 
    10.171.33.32/28 dev ens192 proto kernel scope link src 10.171.33.34 metric 100 
    169.48.182.140/30 dev ens224 proto kernel scope link src 169.48.182.142 metric 102

    [root@bastion ~]# cat /etc/resolv.conf 
    # Generated by NetworkManager
    nameserver 127.0.0.1

この時点でネットワーク設定が上手くいっていればインターネットに接続できているはずです。
適当なサイトにpingして確認します。(以下はyahoo.co.jp)

    [root@bastion ~]# ping 183.79.250.123
    PING 183.79.250.123 (183.79.250.123) 56(84) bytes of data.
    64 bytes from 183.79.250.123: icmp_seq=1 ttl=51 time=144 ms
    64 bytes from 183.79.250.123: icmp_seq=2 ttl=51 time=144 ms
    64 bytes from 183.79.250.123: icmp_seq=3 ttl=51 time=144 ms
    ^C
    --- 183.79.250.123 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 5ms
    rtt min/avg/max/mdev = 143.568/143.691/143.818/0.102 ms

###subscription-managerの登録
RedHatのDeveloperのアカウント情報でサブスクリプション登録します。

    subscription-manager register --username=xxxxxx --password=xxxxxx
    subscription-manager attach --auto

とりあえずパッケージ更新

    dnf update


###カーネルパラメタの変更

    #ipv6の無効化
     echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.d/99-sysctl.conf
    #LBのためのパケット転送許可
     echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.d/99-sysctl.conf
    #反映
     sysctl -p /etc/sysctl.d/99-sysctl.conf

###SE Linux

    #httpdがユーザディレクトリにアクセスできるようにする
    setsebool -P httpd_read_user_content 1

    #HAproxyがバックエンドポートに接続することを許可する
    setsebool -P haproxy_connect_any 1

###Firewallの設定

    # trusted zoneを定義
    nmcli c modify ens192 connection.zone trusted

    # external zoneを定義
    nmcli c modify ens224 connection.zone external

    # trusted zoneのマスカレードを許可
    firewall-cmd --zone=trusted --add-masquerade --permanent

    # externalの通信を許可
    firewall-cmd --zone="external" --set-target=ACCEPT --permanent

    # サービスの許可
    firewall-cmd --add-service=http --zone="trusted" --permanent
    firewall-cmd --add-service=https --zone="trusted" --permanent
    firewall-cmd --add-service=dhcp --zone="trusted" --permanent
    firewall-cmd --add-service=dns --zone="trusted" --permanent

    #リロード
    firewall-cmd --reload
    #確認
    firewall-cmd --get-active-zone
    firewall-cmd --list-all-zones




###DNS,DHCPの構築
openshiftのノードに対して名前解決やipアドレス付与を行うためのDNS、DHCPとしてdnsmasqをインストールします。

    #dnsmasqのインストール
    dnf install -y dnsmasq

confファイルに以下を追記します。ipアドレスは読み替えてください。
macアドレスは固定で入力する必要があり、ESXiが付与しそうな値を適当に定義しています。

    # vi /etc/dnsmasq.conf

    port=53
    domain-needed
    bogus-priv
    resolv-file=/etc/resolv.dnsmasq
    no-poll
    address=/apps.test.example.local/10.171.33.34
    no-dhcp-interface=ens224
    expand-hosts
    domain=test.example.local
    dhcp-range=10.171.33.35,10.171.33.46,255.255.255.240,12h
    dhcp-host=00:50:56:00:00:01,bootstrap,10.171.33.35
    dhcp-host=00:50:56:00:00:02,master-0,10.171.33.36
    dhcp-host=00:50:56:00:00:03,master-1,10.171.33.37
    dhcp-host=00:50:56:00:00:04,master-2,10.171.33.38
    dhcp-host=00:50:56:00:00:05,worker-0,10.171.33.39
    dhcp-host=00:50:56:00:00:06,worker-1,10.171.33.40
    dhcp-option=option:dns-server,10.171.33.34
    dhcp-leasefile=/var/lib/dnsmasq/dnsmasq.leases
    srv-host=_etcd-server-ssl._tcp.test.example.local,etcd-0.test.example.local,2380,0,10
    srv-host=_etcd-server-ssl._tcp.test.example.local,etcd-1.test.example.local,2380,0,10
    srv-host=_etcd-server-ssl._tcp.test.example.local,etcd-2.test.example.local,2380,0,10
    log-dhcp
    log-facility=/var/log/dnsmasq.log


名前解決のためのhostsを設定します。ipアドレスは読み替えてください。
openshiftの要件としてbastionサーバーの外側をapi、内側をapi-intと定義します。

    #vi /etc/hosts

    169.48.182.142 api
    10.171.33.34    api-int
    10.171.33.35    bootstrap
    10.171.33.36    master-0
    10.171.33.37    master-1
    10.171.33.38    master-2
    10.171.33.39    worker-0
    10.171.33.40    worker-1

サービスの再起動と設定反映

    systemctl enable dnsmasq.service
    systemctl start dnsmasq.service
    systemctl status dnsmasq.service


ここで、私の環境ではdnsmasqが何故か起動しませんでした。
　→　"cannot open log /var/log/dnsmasq.log: Permission denied"と権限不足で怒られる。
　→　しかしディレクトリは-rw-rw---- dnsmasq dnsmasq /var/log/dnsmasq.logと正しい権限になっている。

selinuxを停止すると起動に成功したため、auditで原因を調べて見ると「dac_override」プラグインが不正な権限のプロセスを弾いている模様。根本原因不明・・・分かる人いたら教えてくれると助かります。
所詮検証環境なのでSElinuxを停止して逃げるか迷いましたが、"chmod 666 /var/log/dnsmasq.log"で権限を緩くすると起動できたので、それで進みました。

###HAProxyの構成
openshiftノードに対してのロードバランシングとして、HAProxyを導入します。

    # インストール
    dnf install -y haproxy

    # 構成ファイルの編集
    vi /etc/haproxy/haproxy.cfg
    
    frontend kube-api
    	bind *:6443
    	option tcplog
    	mode tcp
    	default_backend api-6443
    
    frontend machine-config
    	bind *:22623
    	option tcplog
    	mode tcp
    	default_backend config-22623
    
    frontend http
    	bind *:80
    	option tcplog
    	mode tcp
    	default_backend http-80
    
    frontend https
    	bind *:443
    	option tcplog
    	mode tcp
    	default_backend https-443
    
    backend api-6443
    	mode tcp
    	balance roundrobin
    	option ssl-hello-chk
    	server bootstrap bootstrap.test.example.local:6443 check
    	server master-0 master-0.test.example.local:6443 check
    	server master-1 master-1.test.example.local:6443 check
    	server master-2 master-2.test.example.local:6443 check
    
    backend config-22623
    	mode tcp
    	balance roundrobin
    	server bootstrap bootstrap.test.example.local:22623 check
    	server master-0 master-0.test.example.local:22623 check
    	server master-1 master-1.test.example.local:22623 check
    	server master-2 master-2.test.example.local:22623 check
    
    backend http-80
    	mode tcp
    	balance roundrobin
    	server worker-0 worker-0.test.example.local:80 check
    	server worker-1 worker-1.test.example.local:80 check
    
    backend https-443
    	mode tcp
    	balance roundrobin
    	option ssl-hello-chk
    	server worker-0 worker-0.test.example.local:443 check
    	server worker-1 worker-1.test.example.local:443 check

    # 設定の有効化、開始
    systemctl enable haproxy.service
    systemctl start haproxy.service
    systemctl status haproxy.service

### nginxの構成
openshiftノードの構成時に必要なファイルをWebサーバーとして提供する必要があるため、nginxを導入します。

    dnf install -y nginx
    vi /etc/nginx/nginx.conf
    →中身のlistenポートを8008に変えます

    # 設定の有効化、開始
    systemctl enable nginx
    systemctl start nginx
    systemctl status nginx

###イグニッションに向けたファイルの準備
ディレクトリを作成

    mkdir -p /usr/share/nginx/html/ocp/rhcos/ignitions
    mkdir -p /usr/share/nginx/html/ocp/rhcos/images/latest
    mkdir -p /usr/share/nginx/html/ocp/rhcos/images/release/460

460ディレクトリに入手しておいたrhcos~raw.gzをアップロードします。
後続の処理の都合上、このままだとファイル名が長すぎるので、Webサーバーにはシンボリックリンクを作成します。（参考文献書籍より引用）

    cd /usr/share/nginx/html/ocp/rhcos/images/latest
    ln -s ../release/460/rhcos-metal.x86_64.raw.gz bios.raw.gz

openshiftノードにsshする用の鍵を作成します。

    ssh-keygen -t rsa -b 4096 -N '' -f ~/.ssh/new_rsa

適当な場所にインストール用のディレクトリを作成し、インストール用のConfigファイルを作成します。
本記事では/root/baremetalとします。
「pullSecret」には入手しておいたpull secretの文字列を、「sshKey」には作成したnew_rsa.pubの文字列を記載します。

    mkdir -p /root/baremetal
    cd /root/baremetal

    vi install-config.yaml
    
    apiVersion: v1
    baseDomain: example.local
    compute:
    - hyperthreading: Enabled  
      name: worker
      replicas: 0 
    controlPlane:
      hyperthreading: Enabled  
      name: master 
      replicas: 3 
    metadata:
      name: test 
    networking:
      clusterNetwork:
      - cidr: 10.128.0.0/14 
        hostPrefix: 23 
      networkType: openshiftSDN
      serviceNetwork: 
      - 172.30.0.0/16
    platform:
      none: {} 
    fips: false 
    pullSecret: 'xxxxx'
    sshKey: 'xxxxx'

入手しておいたopenshift-installコマンドラインツールをアップロードして解凍し、実行することでマニフェストファイルを作成します。

    cd /root
    tar -xvf openshift-install-linux.tar.gz
    ./openshift-install create manifests --dir=./baremetal

manifestsディレクトリが作成されるので、中にあるcluster-scheduler-02-config.ymlを以下のように編集

    vi cluster-scheduler-02-config.yml
    #trueからfalse
    mastersSchedulable: false

イグニッションファイルを作成し、Webサーバーに配置します。

    ./openshift-install create ignition-configs --dir=./baremetal
    chmod 644 ./baremetal/*.ign
    cp ./baremetal/*.ign /usr/share/nginx/html/ocp/rhcos/ignitions/bootstrap.ign

なお、イグニッションファイルは作成時点から24時間で効果が切れるので、イグニッション完了までに時間切れになってしまった場合は、インストール用のディレクトリを作成するところからやり直す必要があります。

#踏み台サーバーから各ノードをイグニッションする
###仮想マシンの作成
bastionサーバーと同様に、bootstrapノード、workerノード、masterノードを全て作成します。
ただし、ネットワークアダプタはPrivate Networkのみで、dnsmasqの構成の際に決めたmacアドレスを手動で設定します。
CD/DVDドライブは入手しておいたrhcos-live.x86_64.isoをアップロードして挿入します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/286db006-3ce0-683e-2b3e-2672eec7e41a.png)

###イグニッションする
最後の難関です。ここでまさかのアクション要素が登場します。
ここから各ノードに対して、CoreOSインストール時の初期パラメータを与えていきます。

bootstrap→master0,1,2→worker0,1の順に実施します。

パワーオンし、コンソールを開いたらTABキーを入力します。
そうするとCoreOSのインストールが始まる前にカーネルコマンドラインに対して初期パラメータを受け付けるようになります。

このTABキー入力受付時間が非常に短く、パワーオンして悠長にコンソールを起動していたらまず間に合いません。

コツとしては、「パワーオン」ではなく下図のペンギンの絵が描いてある再生ボタンの方を押すと通常より早くコンソールが立ち上がるので、起動するウィンドウをカチカチクリックしながらTABキーを連打します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/e581b99d-196b-1f19-f4a8-52ff2b116c7c.png)

これでも入力が間に合うかは5分5分でした。インストールプロセスが走ってしまった場合はパワーオフしてやり直します。
やり方としては超ダサいのでスマートに入力できる方法があれば教えていただきたいです。。（切に）

入力受付状態になったら、以下を追記して、Enterを入力します。ipアドレスは読み替えてください。bootstrapサーバーにはbootstrap.ignファイルを、master-0,1,2サーバーに対してはmaster.ignファイルを、worker-0,1サーバーに対してはworker.ignファイルを指定します。

    coreos.inst=yes coreos.inst.install_dev=sda coreos.inst.image_url=http://10.171.33.34:8008/ocp/rhcos/images/latest/bios.raw.gz coreos.inst.ignition_url=http://10.171.33.34:8008/ocp/rhcos/ignitions/bootstrap.ign

エラーで止まらなければ、しばらく待った後に踏み台サーバーからブートストラップサーバーにログインできます。
作成した秘密鍵を利用します。

    ssh -i ~/.ssh/new_rsa core@bootstrap.test.example.local

ログイン後、journalctlコマンドでopenshiftの構築状況がわかります。

    journalctl -b -f -u release-image.service -u bootkube.service

Firewallの設定やdnsmasqやhaproxyなどの設定にどこか間違いがあると、エラーが発生するのでそれを検索して原因を特定し、一つずつ潰していきます。原因を解消すると大体は自動で進行が再開しますが、進まない場合は問題のあるノードの再インストールからになります。


###状態の確認
下記コマンドで「DEBUG Bootstrap status: complete」が出力されたらbootstrapの立ち上げが完了していることを確認できます。

    [root@bastion ~]# ./openshift-install wait-for bootstrap-complete --dir=/root/baremetal --log-level=debug
    <略>
    DEBUG Bootstrap status: complete

入手しておいたopenshift-clientの中に入っているocコマンドラインツールで、csrの承認状況を確認します。Pendingのものがあれば、手動で承認します。

    export KUBECONFIG=/root/baremetal/auth/kubeconfig
    #確認
    oc get csr
    #承認
    oc adm certificate approve <csr_name>

ノードが全て起動していることを確認します。
いつまでもReadyにならないノードがあれば設定見直すかインストールやり直しになります。

    [root@bastion ~]# ./oc get node
    NAME       STATUS   ROLES    AGE   VERSION
    master-0   Ready    master   18d   v1.19.0+7070803
    master-1   Ready    master   18d   v1.19.0+7070803
    master-2   Ready    master   18d   v1.19.0+7070803
    worker-0   Ready    worker   18d   v1.19.0+7070803
    worker-1   Ready    worker   18d   v1.19.0+7070803


次にCluster Operatorが全て起動するまで待ちます。
AVAILABLEが全てTrueになればokです。
csrを全てapprovedにしてから暫く時間がかかるみたいです。

    [root@bastion ~]# ./oc get co
    NAME                                       VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE
    authentication                             4.6.9     True        False         False      141m
    cloud-credential                           4.6.9     True        False         False      19d
    cluster-autoscaler                         4.6.9     True        False         False      18d
    config-operator                            4.6.9     True        False         False      18d
    <略>



###ローカル端末のDNS設定
ローカル端末のコントロールパネルから、VPNのネットワークアダプタを見つけて踏み台サーバーのipアドレスをDNSサーバーとして設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/06be3fb4-fdd3-5cd1-dff6-5b90fcf59400.png)

###openshiftコンソールへアクセス

踏み台サーバーから、openshiftコンソールのurlと、ユーザー名とパスワードを確認します。

    [root@bastion ~]# ./openshift-install --dir=/root/baremetal wait-for install-complete
    DEBUG openshift Installer 4.6.9                    
    DEBUG Built from commit a48ad4a15b42102d1747d2f5f3b635deffb950b5 
    <略>
    INFO Access the openshift web-console here: https://console-openshift-console.apps.test.example.local 
    INFO Login to the console with user: "kubeadmin", and password: "CLfFH-Zn4FH-gszbS-6E9rb" 
    INFO Time elapsed: 0s




適当なインターネットブラウザからアクセスしてユーザー、パスワードを入力すると・・・



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339067/5b04f784-c096-70f3-285a-9b058b537cce.png)

やったー！

#参考文献
　[公式ドキュメント](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.6/html/installing_on_bare_metal/index)
　[書籍 openshift徹底活用ガイド[初版]](https://www.amazon.co.jp/dp/B08L5WFJGK)