OpenShift on OpenStackの一例

クラウドインフラ全般を担当しているソリューションアーキテクトの伊藤です。

はじめに

OpenShiftを利用する際は様々な環境でデプロイすることができます。
以下の図のA. のようにオンプレミスでのデプロイは、コスト効率、柔軟性なインフラ構成、レガシーアプリケーションとの接続性といった観点で有利に働きます。
また他の構成として、マネージドサービスを利用することで早く、簡単にOpenShiftを利用することができます。
図のB-2. のようにいくつかのマネージドサービスを選択できます。

f:id:takitou:20190227203201p:plain

そして今回は上記図のA-4. の様に2019年1月にリリースされたRed Hat OpenStack Platform 14(RHOSP14)を使って、OpenShiftをデプロイしたいと思います。

Directorについて

RHOSPにはDirectorと呼ばれるインフラをデプロイするためのツールが備わっています。
このDirectorはOpenStackをデプロイするのは勿論のこと、以下の4つのソフトウェアをデプロイすることが可能です。
・OpenStack
・OpenShift
・Ceph Storage
・OpenShiftに付随するストレージとしてGluster Storage

f:id:takitou:20190227203254p:plain

また、デプロイするサーバに割り当てるプロファイルを調整することで、
・OpenStackのみをデプロイ
・OpenStackとCeph Storageをデプロイ
・OpenShiftのみをデプロイ
・OpenShiftとGluster Storageをデプロイ
・OpenStackとOpenShift、Ceph Storage、Gluster Storageをデプロイ
といったサブスクリプションの所有状況やインフラ要件に応じて、デプロイをするソフトウェアを切り替えられます。

以下の図は例として
・赤い線でDirectorでOpenStackとCeph Storageをデプロイする
・緑の線でDirectorでOpenShiftとGluster Storageをデプロイする
という例を示しました。

f:id:takitou:20190227203313p:plain

・OpenShiftをDirectorからデプロイする手順

以下のOSP14のドキュメントでは、Directorでベアメタルにデプロイする方法とOpenStack上の仮想インスタンスへデプロイする方法が記載されています。
https://access.redhat.com/documentation/en-us/red_hat_openstack_platform/14/html-single/installing_openshift_container_platform_on_bare_metal_using_director/

Directorでデプロイする際には以下の要素を抑えておきます。
・コンポーザブルロール
Directorによるデプロイでは役割を最初に定義します。役割をホストに割り当てることでデプロイする構成が決まります。
Composable Rolesと言い、OpenShiftをデプロイする際は通常、OpenShiftMaster, OpenShiftWorker, OpenShiftInfraという3つのロールを定義します。

・Directorがデプロイに使用するコンテナレジストリ
コンポーザブルロールにはそのロールが、どのソフトウェアを必要とするかを定義します。
Director環境下ではソフトウェアはコンテナによってパッケージングされます。ロールを定義するときに動作させるソフトウェアが決まるためロールに適したコンテナをコンテナレジストリに登録します。

・DirectorがIPMIで制御可能なホストのリスト
DirectorがOpenShiftをデプロイする先の物理サーバをjsonフォーマットで定義します。
IPMIのIPアドレス、アカウント情報、割り当てるプロファイルなどを記載します。

・Directorが環境を理解するための構成ファイル
environmentファイルと呼ばれているものになります。
ホスト名、VLAN、IPアドレスといったネットワーク構成、利用するストレージ構成、サーバ証明書、クラウドの名前まで環境ファイルで定義するものは多岐に渡ります。
定義した環境ファイルは、デプロイ時のコマンドにすべて記載します。

重要な要素はたった4つです!

手順

これから説明する手順は例となりますので、実際にデプロイする環境に合わせてご準備頂く必要があります。

・Director(Undercloud)のセットアップ
Red Hat OpenStack Platformの世界においては
・クラウド基盤利用者が実際に使うインフラソフトウェアがインストールされたサーバをOvercloud
・そのOvercloudをデプロイするためのサーバをUndercloud
と言います。

まずDirectorでOpenShiftをデプロイするには、Director自体をセットアップしなくてはなりません。
RHEL7がインストールされたサーバを準備し、ドキュメントのようにDirectorをセットアップしていきます。
実際のところ、UndercloudのセットアップはOpenStackをデプロイする際と変わりません。
https://access.redhat.com/documentation/en-us/red_hat_openstack_platform/14/html/director_installation_and_usage/planning-your-undercloud

echo "stack ALL=(root) NOPASSWD:ALL" | tee -a /etc/sudoers.d/stack && chmod 0440 /etc/sudoers.d/stack && su - stack
mkdir ~/images && mkdir ~/templates
sudo subscription-manager register
sudo subscription-manager list --available --all --matches="Red Hat OpenStack"
sudo subscription-manager attach --pool=Valid-Pool-Number-123456
sudo subscription-manager repos --disable=* --enable=rhel-7-server-rpms --enable=rhel-7-server-extras-rpms --enable=rhel-7-server-rh-common-rpms --enable=rhel-ha-for-rhel-7-server-rpms --enable=rhel-7-server-openstack-14-rpms --enable=rhel-7-server-rhceph-3-tools-rpms

sudo yum update -y
sudo yum install -y python-tripleoclient ceph-ansible rhosp-director-images rhosp-director-images-ipa libguestfs-tools OpenIPMI-tools
reboot

openstack tripleo container image prepare default --local-push-destination --output-env-file containers-prepare-parameter.yaml
sudo openstack tripleo container image prepare -e ~/containers-prepare-parameter.yaml

cp /usr/share/python-tripleoclient/undercloud.conf.sample ~/undercloud.conf    
#undercloud.confは環境に応じて変更してください

openstack undercloud install

これで/home/stack/stackrc というファイルが生成されたらDirectorのインストールが完了ですので、その後の各コマンドが動作するかご確認下さい。

・コンポーザブルロールの定義
コンポーザブルロールを定義します。

openstack overcloud roles generate -o /home/stack/templates-ocp/openshift_roles_data.yaml OpenShiftMaster OpenShiftWorker OpenShiftInfra

・Directorにデプロイ対象のサーバを登録
スペックに合わせたフレーバーを作成し、それぞれにプロファイルを割り当てます。
OpenStackをデプロイする際とcapabilitiesを除いて変わりません。
instackenv.jsonの例:
この例はOpenShiftWorker、OpenShiftMaster、OpenShiftInfraノードがそれぞれ3台です。

{
    "nodes":[
        {
            "name": "worker001",
            "pm_type":"pxe_ipmitool",
            "pm_user":"root",
            "pm_password":"root",
            "pm_addr":"192.168.99.131",
            "capabilities": "profile:OpenShiftWorker,boot_option:local,node:worker-0",
            "arch":"x86_64"
        },
        {
            "name": "worker002",
            "pm_type":"pxe_ipmitool",
            "pm_user":"root",
            "pm_password":"root",
            "pm_addr":"192.168.99.132",
            "capabilities": "profile:OpenShiftWorker,boot_option:local,node:worker-1",
            "arch":"x86_64"
        },
        {
            "name": "worker003",
            "pm_type":"pxe_ipmitool",
            "pm_user":"root",
            "pm_password":"root",
            "pm_addr":"192.168.99.133",
            "capabilities": "profile:OpenShiftWorker,boot_option:local,node:worker-2",
            "arch":"x86_64"
        },
        {
            "name": "master001",
            "pm_type":"pxe_ipmitool",
            "pm_user":"root",
            "pm_password":"root",
            "pm_addr":"192.168.99.141",
            "capabilities": "profile:OpenShiftMaster,boot_option:local,node:master-0",
            "arch":"x86_64"
        },
        {
            "name": "master002",
            "pm_type":"pxe_ipmitool",
            "pm_user":"root",
            "pm_password":"root",
            "pm_addr":"192.168.99.142",
            "capabilities": "profile:OpenShiftMaster,boot_option:local,node:master-1",
            "arch":"x86_64"
        },
        {
            "name": "master003",
            "pm_type":"pxe_ipmitool",
            "pm_user":"root",
            "pm_password":"root",
            "pm_addr":"192.168.99.143",
            "capabilities": "profile:OpenShiftMaster,boot_option:local,node:master-2",
            "arch":"x86_64"
        },
        {
            "name": "infra001",
            "pm_type":"pxe_ipmitool",
            "pm_user":"root",
            "pm_password":"root",
            "pm_addr":"192.168.99.151",
            "capabilities": "profile:OpenShiftInfra,boot_option:local,node:infra-0",
            "arch":"x86_64"
        },
        {
            "name": "infra002",
            "pm_type":"pxe_ipmitool",
            "pm_user":"root",
            "pm_password":"root",
            "pm_addr":"192.168.99.152",
            "capabilities": "profile:OpenShiftInfra,boot_option:local,node:infra-1",
            "arch":"x86_64"
        },
        {
            "name": "infra003",
            "pm_type":"pxe_ipmitool",
            "pm_user":"root",
            "pm_password":"root",
            "pm_addr":"192.168.99.153",
            "capabilities": "profile:OpenShiftInfra,boot_option:local,node:infra-2",
            "arch":"x86_64"
        }
    ]
}

フレーバーとプロパティの登録をします。

openstack flavor create --id auto --ram 4096 --disk 40 --vcpus 1 --swap 500 m1.OpenShiftMaster
openstack flavor create --id auto --ram 4096 --disk 40 --vcpus 1 --swap 500 m1.OpenShiftWorker
openstack flavor create --id auto --ram 4096 --disk 40 --vcpus 1 --swap 500 m1.OpenShiftInfra
openstack flavor set --property "capabilities:profile"="OpenShiftMaster" --property "capabilities:boot_option"="local" m1.OpenShiftMaster
openstack flavor set --property "capabilities:profile"="OpenShiftWorker" --property "capabilities:boot_option"="local" m1.OpenShiftWorker
openstack flavor set --property "capabilities:profile"="OpenShiftInfra" --property "capabilities:boot_option"="local" m1.OpenShiftInfra
openstack overcloud node import ~/instackenv.json
openstack overcloud node introspect --all-manageable --provide

イントロスペクションを実施し、Directorが実際にデプロイ可能なホストと認識すると以下のように利用可能なステータスになります。

f:id:takitou:20190227203442p:plain

・Directorが環境を理解するために構成ファイルを準備します
テンプレートを生成します。

cd /usr/share/openstack-tripleo-heat-templates
./tools/process-templates.py -o ~/templates/

以下のファイルを準備します

/home/stack/openshift_env.yaml

Parameter_defaults:
# by default Director assigns the VIP random from the allocation pool
# by using the FixedIPs we can set the VIPs to predictable IPs before starting the deployment

CloudName: openshift.localdomain
PublicVirtualFixedIPs: [{'ip_address':'10.0.0.200'}]

CloudNameInternal: internal.openshift.localdomain
InternalApiVirtualFixedIPs: [{'ip_address':'172.17.1.200'}]

CloudDomain: openshift.localdomain

## Required for CNS deployments only
OpenShiftInfraParameters:
OpenShiftGlusterDisks:
- /dev/vdb

## Required for CNS deployments only
OpenShiftWorkerParameters:
OpenShiftGlusterDisks:
- /dev/vdb
- /dev/vdc

NtpServer: ["clock.redhat.com","clock2.redhat.com"]

ControlPlaneDefaultRoute: 192.168.24.1
EC2MetadataIp: 192.168.24.1
ControlPlaneSubnetCidr: 24

# The DNS server below should have entries for resolving {internal,public,apps}.openshift.localdomain names
DnsServers:
- 10.0.0.90

OpenShiftGlobalVariables:

openshift_master_identity_providers:
- name: 'htpasswd_auth'
login: 'true'
challenge: 'true'
kind: 'HTPasswdPasswordIdentityProvider'
openshift_master_htpasswd_users:
sysadmin: '$apr1$jpBOUqeU$X4jUsMyCHOOp8TFYtPq0v1'

#openshift_master_cluster_hostname should match the CloudNameInternal parameter
openshift_master_cluster_hostname: internal.openshift.localdomain

#openshift_master_cluster_public_hostname should match the CloudName parameter
openshift_master_cluster_public_hostname: public.openshift.localdomain

openshift_master_default_subdomain: apps.openshift.localdomain

Directorがデプロイに使用するコンテナレジストリ情報を生成します。
/home/stack/containers-prepare-parameter.yaml
このファイルはUndercloudのインストール時に作成しています。

サブスクリプション管理のための環境ファイル
/home/stack/rhsm.yaml

resource_registry:
OS::TripleO::Services::Rhsm: /usr/share/openstack-tripleo-heat-templates/extraconfig/services/rhsm.yaml
parameter_defaults:
RhsmVars:
rhsm_repos:
- rhel-7-server-rpms
- rhel-7-server-extras-rpms
- rhel-7-server-ose-3.11-rpms
rhsm_pool_ids: "8a85f37c63842fef0166949e5f9c4be0"
rhsm_method: "portal"
rhsm_username: yourusername
rhsm_password: yourpassword
rhsm_autosubscribe: true

Overcloudをデプロイします。

$ openstack overcloud deploy \
--stack openshift \
--templates \
-r /home/stack/openshift_roles_data.yaml \
-n /usr/share/openstack-tripleo-heat-templates/network_data_openshift.yaml \
-e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \
-e /usr/share/openstack-tripleo-heat-templates/environments/openshift.yaml \
-e /usr/share/openstack-tripleo-heat-templates/environments/openshift-cns.yaml \
-e /home/stack/openshift_env.yaml \
-e /home/stack/containers-prepare-parameter.yaml \
-e /home/stack/rhsm.yaml
確認

以下のようにデプロイしたOpenShift環境を確認することができます。
https://access.redhat.com/documentation/en-us/red_hat_openstack_platform/14/html-single/installing_openshift_container_platform_on_bare_metal_using_director/#review_the_ocp_deployment

まとめ

ひと昔に比べてクラウドインフラを構築する敷居はDirectorを活用することでどんどん下がってきています。
Directorは内部でAnsibleを使いOpenStack、OpenShift、Ceph Storage、Gluster Storageをデプロイすることができます。
柔軟性を犠牲にすることなく高度なクラウドインフラをデプロイすることができるDirectorについて、お気軽に問い合わせ下さい。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。