📖

ROSA with HCPでALBを作ろうとしてハマったポイント

2024/05/20に公開

はじめに

アクセンチュア株式会社 テクノロジーコンサルティング本部の銭谷(ぜにや)です。

今回、業務の一環で「Red Hat OpenShift Service on AWS(ROSA)」の「ROSA with hosted control planes(ROSA with HCP)」 に触れる機会があり、いくつか検証してみたのでその内容を記事にします。本記事は前回に続いて2本目となります(全部で何本書くかは未定です)。

なお、ROSAには「ROSA classic」と「ROSA with HCP」の2つがあります。前述のとおり当記事のシリーズで扱うのは「ROSA with HCP」となりますので、あらかじめご了承ください。
今回はROSA with HCP上からALBを作ってみたときに遭遇したハマりポイントについてです。

ROSA with HCPとは?

ROSAとは、Kubernetesベースのコンテナ実行基盤である「OpenShift」を、AWS上でマネージドサービスとして利用できるサービスです。この記事で扱うROSA with HCPとは、OpenShiftのコントロールプレーンもマネージド型で提供されるサービスで、2023年12月からGAになった比較的新しいサービスです。最小構成で必要なEC2インスタンスの台数が少ないため、従来提供されてきたROSA classicよりも検証等を行いやすくなっています。

結論

ROSA with HCP上からALBを作るには、以下のRed Hat社のページにある「Installation」の手順3「Create Role for ALB Operator」のあとに、追加作業を2点実行する必要があります。

Red Hat社作業手順「AWS Load Balancer Operator On ROSA」
以降この手順を「作業手順」と呼びます。
https://cloud.redhat.com/experts/rosa/aws-load-balancer-operator/

追加作業

  1. VPC内の「全サブネット」にタグを追加
    Key = kubernetes.io/cluster/[クラスタネーム]
    Value = owned
  2. IAMロール「[クラスタネーム]-alb-operator」にELBv2のTaggingを許可

このあとは前述の作業手順に戻って残りの作業を行います。

ハマりポイントの詳細

1. サブネットのタグ

Red Hat社の作業手順に沿って「7. Check the Operator and Controller pods are both running」まで行ったところ、2つ上がってくるはずのPodのうち「aws-load-balancer-controller-cluster-xxxxxxxxxx-xxxxx」が上がってきませんでした。
以下のコマンドでaws-load-balancer-operator-controller-managerのログを確認してみたところ、エラーが出ていました。

#コマンド
oc logs -n aws-load-balancer-operator deployment/aws-load-balancer-operator-controller-manager -c manager
#エラー抜粋
"error": "failed to update subnets: no subnets with tag kubernetes.io/cluster/27xfg6jxxxxxxxxxxxxxxxxckht2na7z found"

少し調べてみましたが、ROSA with HCPというキーワードでは有益な情報を見つけることができませんでした。そこで、KubernetesつながりであるEKSのドキュメントを調べてみたところ、以下の記述が見つかりました。

AWS Load Balancer Controller (aws-load-balancer-controller) は、クラスタのサブネットをクエリしてサブネットを識別します。このクエリは、次のタグをフィルターとして使用します。
kubernetes.io/cluster/cluster-name

出典:https://repost.aws/ja/knowledge-center/eks-vpc-subnet-discovery

このタグのキーはRed Hat社の作業手順「2. Tag VPC with the cluster name」でVPCに付与しているタグと同じです。そのため、ROSAのクラスタで使用する各サブネットにもVPCと同じタグが必要なのではと考えました。

2. IAMロールの権限

Red Hat社作業手順の「1. Deploy Echo Server Ingress with ALB 」まで実施してもALBが作成されませんでした。試しにIngressの状態を確認してみたところ、以下のエラーが出ていました。

#コマンド
oc -n echoserver describe ingress echoserver
#エラー抜粋
Failed deploy model due to AccessDenied: User: arn:aws:sts::xxxxxxxxxxxx:assumed-role/27xfg6jxxxxxxxxxxxxxxxxckht2na7z-alb-operator/xxxxxxxxxxxxxxxxxxx is not authorized to perform: elasticloadbalancing:AddTags on resource: arn:aws:elasticloadbalancing:us-east-1:xxxxxxxxxxxx:targetgroup/k8s-echoserv-echoserv-xxxxxxxxxx/* because no identity-based policy allows the elasticloadbalancing:AddTags action

話が少し飛びますが、作成後のALBを見てみるとROSA with HCP管理下のリソースであることを示すタグがいくつか付与されていたため、ALBに対するタグ付与の権限がないとALBを作成できないのだと思います。

追加手順をもう少し詳しく

1. VPC内の全サブネットにタグを追加

たとえばクラスタネームが「27xfg6jxxxxxxxxxxxxxxxxckht2na7z」の場合、以下のタグを付与します。

Key Value
kubernetes.io/cluster/27xfg6jxxxxxxxxxxxxxxxxckht2na7z owned

クラスタネームはOIDC-Config-IDと見た目が似ていますが、中身は異なりますので注意が必要です。クラスタネームは以下のコマンドで確認可能です。

oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}"

実はこのコマンドは、冒頭であげた作業手順の「AWS VPC / Subnets > 1. Set Variables describing your VPC and Subnets」で「CLUSTER_NAME」に結果を格納済みです。ですので、タグ追加の作業は以下のコマンドで済ませることができます。

aws ec2 create-tags  \
--resources [半角スペース区切りのサブネットID]  \
--tags Key=kubernetes.io/cluster/${CLUSTER_NAME},Value=owned  \
--region ${REGION}

2. IAMロールにELBv2のTaggingを許可

冒頭であげた作業手順に沿って進めていくと「[クラスタネーム]-alb-operator」というIAMロールが作成されます。このIAMロールにELBv2のTaggingを許可します。ここではポリシーの文字数上限の都合から、新しいインラインポリシーを作って許可しました。


その他の注意点

ingressやserviceの作成コマンドは実行に時間がかかる場合があります。
また、Red Hat社の作業手順ではALBやNLBにcurlするためのホスト名を「oc get ingress」や「oc get service」コマンドで取得していますが、ロードバランサ作成直後は戻り値に含まれるホスト名がブランクになっていることがあります。その場合はしばらく待ってから再度実行してみてください。

おわりに

作業手順の通りに進めてもなかなかALBを作ることができず困っていたのですが、なんとか無事に作ることができてホッとしました。ALBやNLBが使えるとACMの証明書が利用できるため大変便利です(こちらの検証結果もどこかで記事にできればと考えています)。

以上、アクセンチュアの銭谷がお届けしました。

アクセンチュア株式会社ではエンジニア職の積極採用を行っています。私たちと一緒に働きませんか?

Accenture Japan (有志)

Discussion