Microsoft Azure Red Hat OpenShift (ARO) その1

OpenStackやOpenShiftなどのCloud製品を担当しているソリューションアーキテクトの輿水です。

Microsoft Azure Red Hat OpenShiftは Microsoft Azure上で提供されるフルマネージドのRed Hat OpenShiftサービスであり、2019年にリリースされ、2020年4月にOpenShift 4に対応するようになりました。

www.openshift.com

既にAzureをバリバリお使いの方には今更な内容も多いかもしれませんが、今回は初めてAzureを使う前提ですすめます。「Azure Red Hat OpenShift のドキュメント」が用意されておりますので、この「チュートリアル」に従って作業を行います。チュートリアルは「既にAzureを使っている」観点で書かれておりAzureの細かい操作にはあまり触れておりません。私自身はAzureには不慣れのため事前準備でかなりの時間を要しました。

Microsoft Azure Red Hat OpenShiftを使うまでのおおまかな手順は以下の通りです。

  • 事前準備

    • Azureアカウントの作成
      • Microsoftアカウントの作成
      • Microsoft Azureサブスクリプションの購入
      • クォータ確認と制限引き上げ
    • Red Hat アカウントの作成とプルシークレット取得
    • Azure CLI(バージョン 2.6.0 以降)のインストール
  • リソースプロバイダー登録

    • Microsoft.RedHatOpenShift リソース プロバイダー
    • Microsoft.Compute リソース プロバイダー
    • Microsoft.Storage リソース プロバイダー
    • Microsoft.Authorization リソース プロバイダー
  • 仮想ネットワークを作成

    • リソースグループ作成
    • 仮想ネットワークを作成
    • マスターノード用の空のサブネットを追加
    • ワーカーノード用の空のサブネットを追加
    • マスターサブネットの サブネットプライベートエンドポイントポリシー無効化
  • クラスターを作成

  • クラスターに接続


Azureアカウントの作成

licensecounter.jp

提供されている案内にしたがって「Microsoft アカウント」と「Microsoft Azure サブスクリプション」を作成します。とりあえず無料サービスを使えるアカウントを作成してみましたが、サブスクリプションは従量課金制のものが必要でした。 f:id:mkoshimizu:20210624183224p:plain

クォータ確認と制限引き上げ

OpenShiftを利用するためには、それなりのリソースが必要で、チュートリアルにも「少なくとも 40 コアが必要です」と記載があります。サブスクリプションを購入した時点のデフォルトのリソースではクォータの上限にひっかかってAROクラスターの作成に失敗します。クラスター作成の前にクォータの上限を上げておく必要があります。[サブスクリプション]のページから使用したいサブスクリプションを選択し[設定]の中にある[使用量+クォータ」のページの[引き上げを依頼する]をクリックしてサポートリクエストを作成します。

f:id:mkoshimizu:20210624184015p:plain f:id:mkoshimizu:20210624184331p:plain

  • 概要:適当に入力
  • 問題の種類:サービスとサブスクリプションの制限(クォータ)
  • サブスクリプション:サブスクリプション名(ID)
  • クォータの種類:コンピューティング-VM(コア-vCPU)のサブスクリプション上限の増加

詳細を入力をクリックするとクォータの詳細の入力を求められます。

f:id:mkoshimizu:20210624183711p:plain

  • デプロイモデル:リソースマネージャー
  • 場所:リソースを増やしたいリージョンを選択(複数選択可能)

ここでどのVMを選べばよいのかしばし迷いました。作成時のエラーメッセージを良く見ると「standardDSv3Family」とあるので「DSv3 Series」にチェックを入れて「新しいvCPUの制限」を50にしてみました。「次へ:確認および作成」をクリックするとサポートリクエストが行われ、しばらくすると(数分〜数十分)クォータが増えているのを確認できます。

▼クラスター作成時のエラー。standardDSv3Familyが10しかないので、追加で36必要。

$ az aro create   --resource-group $RESOURCEGROUP   --name $CLUSTER   --vnet aro-vnet   --master-subnet master-subnet   --worker-subnet worker-subnet --pull-secret @/Users/mayumi/Downloads/pull-secret
Deployment failed. Correlation ID: 95eacfcc-6802-4653-80b1-8ae18adfb6cd. Resource quota of standardDSv3Family exceeded. Maximum allowed: 10, Current in use: 0, Additional requested: 36.

ちなみに日本語ドキュメントには記載がなかったのですが英文ドキュメントにはクォータチェックコマンドがありました。

▼クォータチェックコマンド(場所として「eastus」を指定)

LOCATION=eastus
az vm list-usage -l $LOCATION \
--query "[?contains(name.value, 'standardDSv3Family')]" \
-o table

▼確認結果

CurrentValue    Limit    LocalName
--------------  -------  --------------------------
0               50       Standard DSv3 Family vCPUs

クラスター作成後に、作成時のログを見るとわかりますがマスターノードとワーカーノードはそれぞれ次のインスタンスを使用しています。マスター用に8コア×3台=24コア、ワーカー用に4コア×3台=12コア必要なので「Additional requested: 36」ということですね。

  • マスターノード:Standard_D8s_v3
  • ワーカーノード:Standard_D4s_v3

▼クラスター作成時のログの一部

  "masterProfile": {
    "subnetId": "/subscriptions/f6fd6eb1-0bdf-4f39-b9ec-60c30c1b533a/resourceGroups/aro-rg/providers/Microsoft.Network/virtualNetworks/aro-vnet/subnets/master-subnet",
    "vmSize": "Standard_D8s_v3"
  }
〜〜〜(略)〜〜〜
  "workerProfiles": [
    {
      "count": 1,
      "diskSizeGb": 128,
      "name": "cluster-t6x9s-worker-eastus1",
      "subnetId": "/subscriptions/f6fd6eb1-0bdf-4f39-b9ec-60c30c1b533a/resourceGroups/aro-rg/providers/Microsoft.Network/virtualNetworks/aro-vnet/subnets/worker-subnet",
      "vmSize": "Standard_D4s_v3"

Red Hat アカウントの作成とプルシークレット取得

AROクラスター作成時にOpenShift Container Platform の内部レジストリーを利用するためのプルシークレットを指定します。プルシークレットはカスタマーポータルのアカウントと紐付くので、Red Hat アカウントを持っていない場合は作成します。Red HatアカウントでRed Hat OpenShift Cluster Managerにログインしてプルシークレットを任意のファイル名で作業している端末にダウンロードします。今回は「pull-secret」というファイル名で保存してます。

f:id:mkoshimizu:20210625151244p:plain

Azure CLI(バージョン 2.6.0 以降)のインストール

Azure CLIをインストールする環境にあわせてInstall the Azure CLI | Microsoft Docsに従ってインストールします。Azure CLIインストール後はloginコマンドを実行します。

az login

コマンドを実行するとデフォルトブラウザが開いてAzureへのsign inページが表示されるので、Azureアカウント(Microsoftアカウント)でサインインします。

リソースプロバイダー登録

Azureサブスクリプションを複数有している場合は、適切なサブスクリプションIDを指定します。サブスクリプションIDはazure portalの[サブスクリプション]で確認することができます。リソースグループを作成するために、必要なリソースプロバイダーを登録します。

  • Microsoft.RedHatOpenShift リソース プロバイダー
  • Microsoft.Compute リソース プロバイダー
  • Microsoft.Storage リソース プロバイダー
  • Microsoft.Authorization リソース プロバイダー

f:id:mkoshimizu:20210625145112p:plain

az account set --subscription <SUBSCRIPTION ID>
az provider register -n Microsoft.RedHatOpenShift --wait
az provider register -n Microsoft.Compute --wait
az provider register -n Microsoft.Storage --wait
az provider register -n Microsoft.Authorization --wait

仮想ネットワークを作成

2つの空のサブネットを含む仮想ネットワークを作成します。マスターとワーカーの仮想ネットワーク サブネットは、最小でも /27 にする必要があります。後々の作成コマンドの中で使うパラメーターを環境変数で設定しておきます。「サブネットプライベートエンドポイントポリシー無効化」ってなんだろう?と思いつつとりあえず進みます。

  • リソースグループ作成
  • 仮想ネットワークを作成:仮想ネットワーク名「aro-vnet」アドレス「10.0.0.0/22」
  • マスターノード用の空のサブネットを追加:サブネット名「master-subnet」アドレス「10.0.0.0/23」
  • ワーカーノード用の空のサブネットを追加:サブネット名「worker-subnet」アドレス「10.0.2.0/23」
  • マスターサブネットのサブネットプライベートエンドポイントポリシー無効化

▼コマンド

LOCATION=eastus                 # クラスターのロケーション(この例では米国東部)
RESOURCEGROUP=aro-rg            # クラスターを作成する場所のリソースグループ名。任意の名称でOK。
CLUSTER=cluster                 # クラスター名。任意の名称でOK。


az group create \
  --name $RESOURCEGROUP \
  --location $LOCATION

az network vnet create \
   --resource-group $RESOURCEGROUP \
   --name aro-vnet \
   --address-prefixes 10.0.0.0/22

az network vnet subnet create \
  --resource-group $RESOURCEGROUP \
  --vnet-name aro-vnet \
  --name master-subnet \
  --address-prefixes 10.0.0.0/23 \
  --service-endpoints Microsoft.ContainerRegistry

az network vnet subnet create \
  --resource-group $RESOURCEGROUP \
  --vnet-name aro-vnet \
  --name worker-subnet \
  --address-prefixes 10.0.2.0/23 \
  --service-endpoints Microsoft.ContainerRegistry

az network vnet subnet update \
  --name master-subnet \
  --resource-group $RESOURCEGROUP \
  --vnet-name aro-vnet \
  --disable-private-link-service-network-policies true

クラスターを作成

作成したリソースグループや仮想ネットワーク、プルシークレットを指定してAROクラスターを作成します。作成時にワーカーノードの数やマスターノードのVMサイズなど細かい設定も可能なのですが、今回はチュートリアルに従ってデフォルトのまま作成します。作成時間は数十分程度で、事前にクォータの引き上げが終わっていれば問題なく作成されるはずです。

$ az aro create \
  --resource-group $RESOURCEGROUP \
  --name $CLUSTER \
  --vnet aro-vnet \
  --master-subnet master-subnet \
  --worker-subnet worker-subnet \
  --pull-secret @/Users/mayumi/Downloads/pull-secret

クラスターに接続

作成されたクラスターの「kubeadmin ユーザー」と「パスワード」を調べます。

$ az aro list-credentials \
>   --name $CLUSTER \
>   --resource-group $RESOURCEGROUP

{
  "kubeadminPassword": "tug3L-6GUSf-5StUk-PswKh",
  "kubeadminUsername": "kubeadmin"
}

作成されたクラスターのコンソールの URLを調べます。

$  az aro show \
>     --name $CLUSTER \
>     --resource-group $RESOURCEGROUP \
>     --query "consoleProfile.url" -o tsv
https://console-openshift-console.apps.csm8323l.eastus.aroapp.io/

https://console-openshift-console.apps.csm8323l.eastus.aroapp.io/」にアクセスするとOpenShiftクラスターのコンソール画面が開くので「kubeadmin」とパスワードでログインします。見慣れたいつものOpenShiftコンソールが開けば無事ログイン完了です。

f:id:mkoshimizu:20210625143455p:plain f:id:mkoshimizu:20210625143745p:plain

次の回で作成されたAROクラスターの中身を確認してゆきます。ひとまずお疲れさまでした。


APPENDIX

OpenShift YouTube Channel の「Hands-on demo of Azure Red Hat OpenShift」(9分ちょっとの動画です)

www.youtube.com

▼仮想ネットワークを作成コマンドと実行結果のログ

$ LOCATION=eastus                 # the location of your cluster
$ RESOURCEGROUP=aro-rg            # the name of the resource group where you want to create your cluster
$ CLUSTER=cluster                 # the name of you r cluster

$ az group create \
>   --name $RESOURCEGROUP \
>   --location $LOCATION
{
  "id": "/subscriptions/f6fd6eb1-0bdf-4f39-b9ec-60c30c1b533a/resourceGroups/aro-rg",
  "location": "eastus",
  "managedBy": null,
  "name": "aro-rg",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}

$ az network vnet create \
>    --resource-group $RESOURCEGROUP \
>    --name aro-vnet \
>    --address-prefixes 10.0.0.0/22
{
  "newVNet": {
    "addressSpace": {
      "addressPrefixes": [
        "10.0.0.0/22"
      ]
    },
    "bgpCommunities": null,
    "ddosProtectionPlan": null,
    "dhcpOptions": {
      "dnsServers": []
    },
    "enableDdosProtection": false,
    "enableVmProtection": null,
    "etag": "W/\"9a085cba-2693-4aff-ac38-b1f34df69355\"",
    "extendedLocation": null,
    "flowTimeoutInMinutes": null,
    "id": "/subscriptions/f6fd6eb1-0bdf-4f39-b9ec-60c30c1b533a/resourceGroups/aro-rg/providers/Microsoft.Network/virtualNetworks/aro-vnet",
    "ipAllocations": null,
    "location": "eastus",
    "name": "aro-vnet",
    "provisioningState": "Succeeded",
    "resourceGroup": "aro-rg",
    "resourceGuid": "9c98ffb4-7edb-4abf-856f-7ec6621f7026",
    "subnets": [],
    "tags": {},
    "type": "Microsoft.Network/virtualNetworks",
    "virtualNetworkPeerings": []
  }
}

$ az network vnet subnet create \
>   --resource-group $RESOURCEGROUP \
>   --vnet-name aro-vnet \
>   --name master-subnet \
>   --address-prefixes 10.0.0.0/23 \
>   --service-endpoints Microsoft.ContainerRegistry
{
  "addressPrefix": "10.0.0.0/23",
  "addressPrefixes": null,
  "applicationGatewayIpConfigurations": null,
  "delegations": [],
  "etag": "W/\"c171d195-7852-45fd-aee2-cb61863010f2\"",
  "id": "/subscriptions/f6fd6eb1-0bdf-4f39-b9ec-60c30c1b533a/resourceGroups/aro-rg/providers/Microsoft.Network/virtualNetworks/aro-vnet/subnets/master-subnet",
  "ipAllocations": null,
  "ipConfigurationProfiles": null,
  "ipConfigurations": null,
  "name": "master-subnet",
  "natGateway": null,
  "networkSecurityGroup": null,
  "privateEndpointNetworkPolicies": "Enabled",
  "privateEndpoints": null,
  "privateLinkServiceNetworkPolicies": "Enabled",
  "provisioningState": "Succeeded",
  "purpose": null,
  "resourceGroup": "aro-rg",
  "resourceNavigationLinks": null,
  "routeTable": null,
  "serviceAssociationLinks": null,
  "serviceEndpointPolicies": null,
  "serviceEndpoints": [
    {
      "locations": [
        "*"
      ],
      "provisioningState": "Succeeded",
      "service": "Microsoft.ContainerRegistry"
    }
  ],
  "type": "Microsoft.Network/virtualNetworks/subnets"
}

$ az network vnet subnet create \
>   --resource-group $RESOURCEGROUP \
>   --vnet-name aro-vnet \
>   --name worker-subnet \
>   --address-prefixes 10.0.2.0/23 \
>   --service-endpoints Microsoft.ContainerRegistry
{
  "addressPrefix": "10.0.2.0/23",
  "addressPrefixes": null,
  "applicationGatewayIpConfigurations": null,
  "delegations": [],
  "etag": "W/\"cc544642-0bb6-4d44-b16b-776c4a2a737e\"",
  "id": "/subscriptions/f6fd6eb1-0bdf-4f39-b9ec-60c30c1b533a/resourceGroups/aro-rg/providers/Microsoft.Network/virtualNetworks/aro-vnet/subnets/worker-subnet",
  "ipAllocations": null,
  "ipConfigurationProfiles": null,
  "ipConfigurations": null,
  "name": "worker-subnet",
  "natGateway": null,
  "networkSecurityGroup": null,
  "privateEndpointNetworkPolicies": "Enabled",
  "privateEndpoints": null,
  "privateLinkServiceNetworkPolicies": "Enabled",
  "provisioningState": "Succeeded",
  "purpose": null,
  "resourceGroup": "aro-rg",
  "resourceNavigationLinks": null,
  "routeTable": null,
  "serviceAssociationLinks": null,
  "serviceEndpointPolicies": null,
  "serviceEndpoints": [
    {
      "locations": [
        "*"
      ],
      "provisioningState": "Succeeded",
      "service": "Microsoft.ContainerRegistry"
    }
  ],
  "type": "Microsoft.Network/virtualNetworks/subnets"
}

$ az network vnet subnet update \
>   --name master-subnet \
>   --resource-group $RESOURCEGROUP \
>   --vnet-name aro-vnet \
>   --disable-private-link-service-network-policies true
{
  "addressPrefix": "10.0.0.0/23",
  "addressPrefixes": null,
  "applicationGatewayIpConfigurations": null,
  "delegations": [],
  "etag": "W/\"350d8005-0e04-4bfb-89f8-9b1dc37ecce2\"",
  "id": "/subscriptions/f6fd6eb1-0bdf-4f39-b9ec-60c30c1b533a/resourceGroups/aro-rg/providers/Microsoft.Network/virtualNetworks/aro-vnet/subnets/master-subnet",
  "ipAllocations": null,
  "ipConfigurationProfiles": null,
  "ipConfigurations": null,
  "name": "master-subnet",
  "natGateway": null,
  "networkSecurityGroup": null,
  "privateEndpointNetworkPolicies": "Enabled",
  "privateEndpoints": null,
  "privateLinkServiceNetworkPolicies": "Disabled",
  "provisioningState": "Succeeded",
  "purpose": null,
  "resourceGroup": "aro-rg",
  "resourceNavigationLinks": null,
  "routeTable": null,
  "serviceAssociationLinks": null,
  "serviceEndpointPolicies": null,
  "serviceEndpoints": [
    {
      "locations": [
        "*"
      ],
      "provisioningState": "Succeeded",
      "service": "Microsoft.ContainerRegistry"
    }
  ],
  "type": "Microsoft.Network/virtualNetworks/subnets"

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