OpenShiftをAWSにUPIインストールする

『IT自動化の力でビジネス加速を全ての企業に』

”IT自動化の専門会社”、リアルグローブ・オートメーティッド(RGA)の技術ブログ編集部の馬塚です。本日もRGAの技師がまとめた技術情報を読者の皆様にお届けしていきます!

RGAでは、Red Hat社が提供するエンタープライズ向けのコンテナオーケストレーションプラットフォームである「OpenShift」の導入支援サービスも提供しております。
今回、RGAの技師が OpenShift をAWS上に「UPI」という方法でインストールする手順について、踏み台サーバーのセットアップからCluster作成までの作業手順と細かいポイントなどをまとめたレポートをご紹介いたします。

――――――――――――――――――――――――――――――――――

UPI インストールとはなにか

今回は OpenShift を「UPI」と呼ばれる方法でインストールします。
「UPI」とは「User Provisioned Infrastructure」の略称であり、ユーザー自身が事前にインフラ環境を構築して、そこに OpenShift をインストールするという方法です。
OpenShiftでは「UPI」とは別に「IPI」(Installer Provisioned Infrastructure) と呼ばれるインストール方法が存在し、こちらの方法ではインフラ環境の構築まで含めてインストーラーが自動で行ってくれます。

「UPI」では「IPI」と異なり、手動で設定する項目が多く、構築手順は少しかさみますが、インフラ環境を自由に構築できるというメリットがあります。
また、「IPI」によるインストール方法に対応していないIaaSを使用している場合などで「UPI」が必要な場面があります。

「UPI」でインストールを行うことで OpenShift のインフラ環境を理解することの手助けにもなるため、今回は Red Hatの赤帽エンジニアブログ記事を参考に、AWS 環境で「UPI」インストールを行うということをやってみました。
※なお、ここに記載する手順は OpenShift Ver4.1で確認しています。

準備

環境

この後の作業を行うための踏み台サーバーとして、AWS の EC2 インスタンスを利用しました。環境は以下の通りです。

OS:RHEL 7.8
インスタンスタイプ:m5.large

使用ツールなど

今回の「UPI」インストールでは terraform で AWS 上の環境を構築しながら OpenShift のインストールを行います。
この作業に当たって、最低限必要なツールは以下のリストになります。
これらのツールのインストールも並行して行っていきます。

・OpenShift Ver.4.1.41
    ・openshift-install コマンド
    ・oc コマンド
・Terraform ver 0.13.0
・aws-cli  Ver.2.0.44
・jq
・vim や emacs などのエディタ

また、今回の作業では、先述のRed Hatの赤帽エンジニアブログ記事からリンクされている以下のリポジトリのコードを利用します。
literalice/terraform-aws-openshift-upi
こちらのリポジトリでは、AWS 上で「UPI」インストールをするに当たっての環境を整備する terraform のコードが配布されています。(Red Hat 社の公式なものではありません)
※【注意点】
2020年8月の terraform-provider-aws のバージョンアップにより、上記リポジトリのコードは一部改修を加えないと動作しません。
terraform コード中の blacklisted_names を exclude_names へリネームする必要があります。

インストール方法

使用ツールの準備

まず、openshift-installer などのツールを準備します。
以下、rootユーザーでの作業です。

sudo -i

# 利用する OpenShift と terraform のバージョンを入力
OCP_VERSION=4.1.41
TERRAFORM_VERSION=0.13.0

yum check-update
yum update -y
yum install -y unzip wget httpd-tools vim

# openshift-installer の準備
wget https://mirror.openshift.com/pub/openshift-v4/clients/ocp/${OCP_VERSION}/openshift-install-linux-${OCP_VERSION}.tar.gz
tar zxvf openshift-install-linux-${OCP_VERSION}.tar.gz -C /usr/bin
rm -f openshift-install-linux-${OCP_VERSION}.tar.gz /usr/bin/README.md
chmod +x /usr/bin/openshift-install

# oc の準備
wget https://mirror.openshift.com/pub/openshift-v4/clients/ocp/${OCP_VERSION}/openshift-client-linux-${OCP_VERSION}.tar.gz
tar zxvf openshift-client-linux-${OCP_VERSION}.tar.gz -C /usr/bin
rm -f openshift-client-linux-${OCP_VERSION}.tar.gz /usr/bin/README.md
chmod +x /usr/bin/oc

# terraform の準備
wget https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip
unzip terraform_${TERRAFORM_VERSION}_linux_amd64.zip
mv terraform /user/bin
rm -f terraform_${TERRAFORM_VERSION}_linux_amd64.zip

# aws-cli の準備。2 系の最新版を利用します。
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
./aws/install
rm -rf ./aws awscliv2.zip

# jq の準備
curl -o /usr/bin/jq -L https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64
chmod +x /usr/bin/jq

上記作業の終了後、続く「UPI」インストール作業は一般ユーザーで行います。
各種ツールが正常に準備されているか、バージョンの確認後にインストール作業を進めます。

$ openshift-install version
openshift-install v4.1.41-202004130646-dirty
built from commit 7c3a1e0c854806e74447b2c2189fdd9a69a4d96a
release image quay.io/openshift-release-dev/ocp-release@sha256:a8f706d139c8e77d884ccedbf67d69eefd67b66dcf69ee1032b507fe3acbf8c8

$ oc version
Client Version: version.Info{Major:"4", Minor:"1", GitVersion:"4.1.41-202004130646-d372a16", GitCommit:"d372a16", GitTreeState:"clean", BuildDate:"2020-04-13T08:25:03Z", GoVersion:"go1.11.13", Compiler:"gc", Platform:"linux/amd64"}

$ terraform version
Terraform v0.13.0

Your version of Terraform is out of date! The latest version
is 0.13.1. You can update by downloading from https://www.terraform.io/downloads.html

UPI インストールの準備

予め以下の情報を取得・決定しておきます。

・AWS の Administorator アカウントへのアクセス
    ※正確には、ドキュメントで指定されたパーミッションを持つIAM アカウントが ${HOME}/.aws/credentials に設定されていること。
・OpenShift UPI インストール用のシークレット情報
    ※こちら のページで取得可能。
・Cluster 用のベースドメイン
・Cluster を構成するマシンに設定する公開鍵

AWSで使用する IAM アカウントのクレデンシャル情報を設定し、公開鍵を作成します。

# 準備した IAM アカウントの情報を入力し、実行する。
$ export AWSKEY=<AWS_KEY>
$ export AWSSECRETKEY=<AWS_SECRETKEY>
$ export REGION=ap-northeast-1

$ mkdir $HOME/.aws
$ cat << EOF >>  $HOME/.aws/credentials
[default]
aws_access_key_id = ${AWSKEY}
aws_secret_access_key = ${AWSSECRETKEY}
region = ${REGION}
EOF

$ mkdir -p ${HOME}/secrets/ssh
$ ssh-keygen -t rsa -b 4096 -f ${HOME}/secrets/ssh/id_rsa -P ''

マニフェストファイルの作成

OpenShift の Cluster の設定情報を作成するために、yaml ファイルで構成情報を記述します。
まず、作業用ディレクトリに install-config.yaml ファイルを作成します。

$ mkdir ${HOME}/openshift-upi
$ cd ${HOME}/openshift-upi
$ touch install-config.yaml

install-config.yaml の内容≫

apiVersion: v1
baseDomain: cluster.example.com # <ベースドメイン>
compute:
 - hyperthreading: Enabled
   name: worker
   platform: {}
   replicas: 0 # Worker Node の数。後で作成するので、ここでは0を指定
controlPlane:
 hyperthreading: Enabled
 name: master
 platform: {}
 replicas: 3 # Master Node の数
metadata:
 name: upi-1 # Cluster 名
networking: # 固定で以下を設定
 clusterNetwork:
   - cidr: 10.128.0.0/14
     hostPrefix: 23
 machineCIDR: 10.0.0.0/16
 networkType: OpenShiftSDN
 serviceNetwork:
   - 172.30.0.0/16
platform:
 aws:
   region: ap-northeast-1 # 構築先のリージョン
# https://cloud.redhat.com/openshift/install/aws/user-provisioned で取得できる、OpenShift製品管理のためのシークレット情報
pullSecret: '{"auths":{"cloud.openshift.com":{"auth....'
# Cluster を構成する各マシンに設定される、SSH公開鍵。先に作成したものを記入。
sshKey: |
 ssh-rsa AAAAB3NzaC1yc2EAAA...

install-config.yaml を作成後、openshift-install コマンドを用いてマニフェストファイルを作成します。
この時、install-config.yaml ファイルが自動的に削除されてしまいますので、予め下記コマンドの実行前に別ディレクトリにコピーを取得しておくことをお勧めします。

$ cp ${HOME}/openshift-upi/install-config.yaml ${HOME}
$ openshift-install create manifests --dir=${HOME}/openshift-upi

machines オブジェクトや machineset オブジェクトは、OpenShift cluster が自身を構成するマシンや OS を管理するためのオブジェクトですが、「UPI 」インストールではマシンを自分で用意するため不要です。
そのため、今回は以下のyamlファイルを削除します。

openshift-upi/
├── manifests/
│  ├── cluster-config.yaml
│  ├── ...
└── openshift/
   ├── 99_kubeadmin-password-secret.yaml
   ├── 99_openshift-cluster-api_master-machines-0.yaml
   ├── 99_openshift-cluster-api_worker-machineset-0.yaml
   ├── 99_openshift-machineconfig_master.yaml
   ├── ...
$ rm ${HOME}/openshift-upi/openshift/99_openshift-cluster-api_master-machines-*.yaml
$ rm ${HOME}/openshift-upi/openshift/99_openshift-cluster-api_worker-machineset-*.yaml

Ignition ファイルの作成

次に、マシン起動時の初期処理を定義する Ignition ファイルを作成します。
以下のコマンドを実行することで、これまで作成してきた設定ファイルや API オブジェクトを元に Iginition ファイルを生成できます。

$ openshift-install create ignition-configs --dir=${HOME}/openshift-upi

上記により openshift-upi ディレクトリは以下のようになります。

openshift-upi/
├── auth/
│ ├── kubeadmin-password
│ └── kubeconfig
├── bootstrap.ign
├── master.ign
├── metadata.json
└── worker.ign

openshift-upi/metadata.json には Cluster の ID が含まれるため、事前に取得して控えておきます。

$ cat openshift-upi/metadata.json | jq
{
 "clusterName": "upi-1",
 "clusterID": "xxx",
 "infraID": "upi-1-1-xxxx",
 "aws": {
   "region": "ap-northeast-1",
   "identifier": [
     {
       "kubernetes.io/cluster/upi-1-1-xxxx": "owned"
     },
     {
       "openshiftClusterID": "xxxx"
     }
   ]
 }
}

# IDを控える
$ CLUSTER_ID=$(jq -r .infraID openshift-upi/metadata.json)
$ echo $CLUSTER_ID

VPC、サブネット、ロードバランサーの作成

AWS上に VPC、サブネット、ロードバランサーなどのネットワークリソースを作成します。
下図のような環境を構成し、OpenShift のインストールを行います。

画像1

実際の構成にあたっては、冒頭にも述べたように terraform を利用して作成していきます。
VPC などの作成にあたっては modules/network のコードが利用されますが、この中では以下のようなAWSリソースが作成されます。

・VPC
・プライベート Subnet と Security Group
・パブリック Subnet と Security Group
・NLB(Network Load Balancer)
・Route53 のホストゾーン
・Route53 の A レコード
$ git clone https://github.com/June3141/terraform-aws-openshift-upi
$ cd terraform-aws-openshift-upi
$ cat <<EOF > terraform.tfvars
config_dir = ~/openshift-upi" # openshift-install時に--dirオプションで指定したディレクトリを設定
blacklist_az = [] # AWSアカウント、対象リージョンで、使用できないAZがある場合はここに指定する
EOF

$ terraform init
$ terraform plan -target module.network
$ terraform apply -target module.network

BootStrap Node の作成

次に BootStrap Node の配置をします。先ほどと同様 modules/bootstrap のコードを利用し、以下のAWSリソースを作成します。

・IAM ポリシー & IAM ロール
・EC2 Instance
・S3 バケット(Ignition ファイルを共有するため)
$ terraform plan -target module.bootstrap
$ terraform apply -target module.bootstrap

上記コマンド完了後、BootStrap Node の IPアドレスが払い出されます。
正常に BootStrap Node が起動できているかどうか、ssh 接続をして確認します。

$ ssh core@<BootStrap Node IP> -i

Master Node の作成

BootStrap Node の次に、Master Node の作成を行います。
modules/controlplane のコードを利用し、以下のAWSリソースを作成します。

・IAM ポリシー & IAM ロール
・EC2 Instance
$ cd terraform-aws-openshift-upi
$ terraform plan -target module.controlplane
$ terraform apply -target module.controlplane

上記のコマンドの完了後、Master Node が立ち上がっているかを確認します。
以下のコマンドが正常に完了すれば、Master Node の起動に成功しています。※Master Node の起動には約 30 分ほどかかります。

$ openshift-install wait-for bootstrap-complete --dir=${HOME}/openshift-upi --log-level debug

Worker Node の作成

OpenShift の Ingress Router など、一部のインフラコンポーネントは Master Node ではなく Worker Node にデプロイされます。
そのため、ここまでの作業では一部の Pod は Pending 状態のままです。
以下のコマンドで確認できます。

$ oc get pods -A | grep Pending

oc get clusterversions コマンド実行時に ”Unable to apply 4.x.xx: an unknown error has occurred” と表記されている場合、上述の通りWorker Node が不足しているために表示されている可能性が高いです。この場合は、気にせずに作業を続けてください。

Worker Node のデプロイは modules/worker のコードを利用して行います。
以下のAWSリソースが作成されます。

・IAM ポリシー & IAM ロール
・EC2 Instance
$ terraform plan -target module.worker
$ terraform apply -target module.worker

上記のデプロイでは Worker Node 1 台がデプロイされます。
しかし、一般的にOpenShiftでは Worker Node を 3 台以上作成することが推奨されています。
今回の作業では、MachineSet を編集することで Worker Node を増やします。

$ oc get machinesets -n openshift-machine-api
NAME                                  DESIRED   CURRENT   READY   AVAILABLE   AGE
ctc-openshift-xxxxx-ap-northeast-1a   1         1         1       1           154m
s
# 上記の結果から、対象となる Cluster の MachineSet を編集する
$ oc edit machinesets -n openshift-machine-api ctc-openshift-xxxxx-ap-northeast-1

≪MachineSet の内容≫

apiVersion: machine.openshift.io/v1beta1
kind: MachineSet
metadata: ...
spec:
 replicas: 1 # ここを3に変更する
 selector:
   matchLabels:
     machine.openshift.io/cluster-api-cluster: ctc-openshift-xxxxx
     machine.openshift.io/cluster-api-machine-role: worker
     machine.openshift.io/cluster-api-machine-type: worker
     machine.openshift.io/cluster-api-machineset: ctc-openshift-xxxxx-ap-northeast-1a
 template:
   metadata:
     labels:
       machine.openshift.io/cluster-api-cluster: ctc-openshift-xxxxx
       machine.openshift.io/cluster-api-machine-role: worker
       machine.openshift.io/cluster-api-machine-type: worker
       machine.openshift.io/cluster-api-machineset: ctc-openshift-xxxxx-ap-northeast-1a

設定がうまく行けば、Worker Node が自動的に立ち上がります。
少し時間がかかるので watch oc get nodes で立ち上がりを待ちます。

その後、pod の Pending 状態が解消したかをチェックします。

$ oc get pods -A | grep Pending

解消ができていれば、OpenShift の Webコンソール にアクセスできるはずです。以下のコマンドでWebコンソールのURLと kubeadmin ユーザーのログインパスワードを取得し、ログインできることを確認します。

$ oc get routes -n openshift-console
NAME        HOST/PORT                                                     PATH   SERVICES    PORT    TERMINATION          WILDCARD
console     console-openshift-console.apps.<クラスタ名>.<ベースドメイン>             console     https   reencrypt/Redirect   None
downloads   downloads-openshift-console.apps.<クラスタ名>.<ベースドメイン>           downloads   http    edge                 None

# ユーザー `kubeadmin` のログインパスワード
$ cat ~/openshift-upi/auth/kubeadmin-password

画像3

以上で、OpenShift インストールとCluster のセットアップが完了です。

――――――――――――――――――――――――――――――――――

執筆者プロフィール:合屋 純
九州大学大学院理学府修士卒 大学院で物理学を専攻し、数値計算プログラムに触れたことをキッカケにエンジニアリングに興味を持つ。
現在はリアルグローブ・オートメーティッドにて、コンテナ関連技術や自動化ツールの導入業務に従事。

【ご案内】
ITシステム開発やITインフラ運用の効率化、高速化、品質向上、その他、情シス部門の働き方改革など、IT自動化導入がもたらすメリットは様々ございます。
IT業務の自動化にご興味・ご関心ございましたら、まずは一度、IT自動化の専門家リアルグローブ・オートメーティッド(RGA)にご相談ください!

お問合せは以下の窓口までお願いいたします。

【お問い合わせ窓口】
株式会社リアルグローブ・オートメーティッド
代表窓口:info@rg-automated.jp
URL:https://rg-automated.jp

画像2

(編集:馬塚勇介)