Hosted Control Plane を AWS 環境上にデプロイしてみる

Red Hat で OpenShift をサポートしている Yiyong です。この記事はOpenShift Advent Calendar 2024のエントリです。

qiita.com


OpenShift 4.17 バージョンより、OpenShift 公式ドキュメントの Hosted Control Planes (HCP) の章が大幅に充実しましたので、Hosted Control Plane on AWS 公式ドキュメントのステップを参照しながらデプロイしてみました。なお、今回は Managed Service となる ROSA with HCP ではなく、Self-Managed の OCP クラスタに HCP をデプロイするパターンを紹介しています。

HCP については用語が多く、その中に同義語も複数あり、ドキュメントにも完全には統一されていないため、こちらの記事に使用される主な2つの用語を説明します:

Hosted Cluster: API エンドポイントとコントロールプレーンが Hosting Cluster でホストされている OpenShift Container Platform クラスターです。同義語:Managed Cluster

Hosting Cluster: Hosted Cluster の API エンドポイントとコントロールプレーンをホストする OpenShift Container Platform クラスターです。同義語:Management Cluster 、 Hub Cluster

本記事では、Hosting Cluster として、AWS IPI でインストールした 4.17.3 のクラスタを利用しています。


まず事前準備として:

MultiCluster Engine for Kubernetes Operator (MCE) を Hosting Cluster にインストールして、hcp CLI を手元にダウンロードします:

## MCE Operator をインストール

$ vi mce-operator.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: multicluster-engine
---
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: multicluster-engine
  namespace: multicluster-engine
spec:
  targetNamespaces:
  - multicluster-engine
---
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: multicluster-engine
  namespace: multicluster-engine
spec:
  sourceNamespace: openshift-marketplace
  source: redhat-operators
  channel: stable-2.7
  installPlanApproval: Automatic
  name: multicluster-engine

$ oc create -f mce-operator.yaml

## MultiClusterEngine CR を作成

$ vi mce-cr.yaml
apiVersion: multicluster.openshift.io/v1
kind: MultiClusterEngine
metadata:
  name: multiclusterengine
spec: {}

$ oc create -f mce-cr.yaml

## hcp CLI をダウンロード

$ oc get ConsoleCLIDownload hcp-cli-download -o json | jq -r ".spec"
{
  "description": "With the Hosted Control Plane command line interface, you can create and manage OpenShift hosted clusters.\n",
  "displayName": "hcp - Hosted Control Plane Command Line Interface (CLI)",
  "links": [
    {
      "href": "https://hcp-cli-download-multicluster-engine.apps.yhe-blue.test.example.com/linux/amd64/hcp.tar.gz",
      "text": "Download hcp CLI for Linux for x86_64"
    },
    <..snip..>
  ]
}

$ wget --no-check-certificate https://hcp-cli-download-multicluster-engine.apps.yhe-blue.test.example.com/linux/amd64/hcp.tar.gz

$ tar xfz hcp.tar.gz

$ mv hcp bin

続いては HCP をデプロイする前に、AWS 側で必要なリソースを作成しておきます。

具体的には、S3 bucket、S3 OIDC secret、AWS IAM role と STS credentials の作成が必要です。基本的に公式ドキュメント通り作成すれば問題がないため、ここは割愛します 。


それではいよいよ HCP のデプロイを実施します。

デフォルトの設定でデプロイする場合は、下記の1つのコマンドだけでデプロイできます。

hcp create cluster aws \
    --name yhe-hosted \ 
    --infra-id yhe-hosted \ 
    --base-domain test.example.com \ 
    --sts-creds /home/ec2-user/sts-creds.json \ 
    --pull-secret /home/ec2-user/pull-secret.txt \ 
    --region ap-northeast-1 \ 
    --generate-ssh \
    --node-pool-replicas 2 \ 
    --namespace clusters  \ 
    --role-arn "arn:aws:iam::012345678901:role/yhe-hcp-cli-role" \
    --release-image=quay.io/openshift-release-dev/ocp-release:4.16.10-multi

hcp create cluster コマンドには大量のオプションが提供されていて、これらのオプションを指定することで Hosted Cluster をカスタマイズすることが可能となりますが、全てのオプションがドキュメントに網羅的に説明されていないため、利用可能なオプションについては --help で確認するようにしましょう。

一例として、上記のコマンドには --release-image オプションを指定していて、Hosted Cluster のバージョンを指定しています。このオプションを指定していない場合は最新のバージョンが使用されます。

HCP では、Hosted Cluster が Hosting Cluster と同一バージョンである必要がなく、かつ Hosting Cluster 上の複数の Hosted Cluster も同一バージョンである必要がないため、サポートされるバージョンであれば自由に指定することが可能です。

上記のコマンドを実行後、AWS 上で VPC や Subnet などの infrastructure が作成され、Hosting Cluster 側の clusters Namespace 配下に、HostedCluster CR と NodePool CR が作成されます。

Hosted Cluster のデプロイ状況を監視するためには、oc get hostedcluster コマンドを使用します。

$ oc -n clusters get hostedcluster
NAME         VERSION   KUBECONFIG                    PROGRESS    AVAILABLE   PROGRESSING   MESSAGE
yhe-hosted   4.16.10   yhe-hosted-admin-kubeconfig   Completed   True        False         The hosted control plane is available

作成途中では、PROGRESSPartial になっていたり、何かしらのエラーメッセージが表示される場合もありますが、しばらく時間が経つと、上記のように、PROGRESSCompleted になり、hosted control plane is available が表示されて、Hosted Cluster のデプロイが完了します。

NodePool についても同様に oc get nodepool コマンドで状態を確認できます。

$ oc -n clusters get nodepool
NAME                         CLUSTER      DESIRED NODES   CURRENT NODES   AUTOSCALING   AUTOREPAIR   VERSION   UPDATINGVERSION   UPDATINGCONFIG   MESSAGE
yhe-hosted-ap-northeast-1a   yhe-hosted   2               2               False         False        4.16.10   False             False

また、Hosted Control Plane はその名の通り、Hosted Cluster の Control Plane コンポーネントが Hosting Cluster 側にホストされていますので、それらのコンポーネント Pod は clusters-<Hosted Cluster Name> という Namespace 配下に存在します。

$ oc -n clusters-yhe-hosted get pods | wc -l
82

$ oc -n clusters-yhe-hosted get pods | grep kube
kube-apiserver-d7b9c4547-bt4v9                        5/5     Running                 17                41h
kube-apiserver-d7b9c4547-cttnm                        5/5     Running                 17                41h
kube-apiserver-d7b9c4547-fx6bs                        5/5     Running                 16                41h
kube-controller-manager-685dd87d7f-msdmm              1/1     Running                 3                 40h
kube-controller-manager-685dd87d7f-r5f76              1/1     Running                 3                 40h
kube-controller-manager-685dd87d7f-vvjlk              1/1     Running                 3                 40h
kube-scheduler-6f4f9cf5c4-b4756                       1/1     Running                 3                 41h
kube-scheduler-6f4f9cf5c4-fqb4p                       1/1     Running                 3                 41h
kube-scheduler-6f4f9cf5c4-ht4nz                       1/1     Running                 3                 41h
ovnkube-control-plane-548dcdcf4f-bqgql                3/3     Running                 9                 41h
ovnkube-control-plane-548dcdcf4f-grx92                3/3     Running                 9                 41h
それでは Hosted Cluster の方にアクセスしてみましょう。

Hosted Cluster にアクセスするためには、kubeconfig か kubeadmin password を利用することでアクセス可能です。こちら両方とも clusters Namespace 配下の Secret に保存されています。

$ oc -n clusters get secret
NAME                             TYPE                      DATA   AGE
builder-dockercfg-fc2qb          kubernetes.io/dockercfg   1      41h
default-dockercfg-dgl72          kubernetes.io/dockercfg   1      41h
deployer-dockercfg-8h99k         kubernetes.io/dockercfg   1      41h
yhe-hosted-admin-kubeconfig      Opaque                    1      41h
yhe-hosted-etcd-encryption-key   Opaque                    1      41h
yhe-hosted-kubeadmin-password    Opaque                    1      41h
yhe-hosted-pull-secret           Opaque                    1      41h
yhe-hosted-ssh-key               Opaque                    2      41h

$ oc extract secret/yhe-hosted-admin-kubeconfig -n clusters
kubeconfig

$ mv kubeconfig yhe-hosted.kubeconfig

$ oc --kubeconfig=yhe-hosted.kubeconfig get nodes
NAME                                              STATUS   ROLES    AGE   VERSION
ip-10-0-128-184.ap-northeast-1.compute.internal   Ready    worker   41h   v1.29.7+4510e9c
ip-10-0-143-38.ap-northeast-1.compute.internal    Ready    worker   41h   v1.29.7+4510e9c

$ oc --kubeconfig=yhe-hosted.kubeconfig get co
NAME                                       VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
console                                    4.16.10   True        False         False      41h
csi-snapshot-controller                    4.16.10   True        False         False      41h
dns                                        4.16.10   True        False         False      6h37m
image-registry                             4.16.10   True        False         False      41h
ingress                                    4.16.10   True        False         False      16m
insights                                   4.16.10   True        False         False      41h
kube-apiserver                             4.16.10   True        False         False      41h
kube-controller-manager                    4.16.10   True        False         False      41h
kube-scheduler                             4.16.10   True        False         False      41h
kube-storage-version-migrator              4.16.10   True        False         False      41h
monitoring                                 4.16.10   True        False         False      16m
network                                    4.16.10   True        False         False      41h
node-tuning                                4.16.10   True        False         False      41h
openshift-apiserver                        4.16.10   True        False         False      41h
openshift-controller-manager               4.16.10   True        False         False      41h
openshift-samples                          4.16.10   True        False         False      41h
operator-lifecycle-manager                 4.16.10   True        False         False      41h
operator-lifecycle-manager-catalog         4.16.10   True        False         False      41h
operator-lifecycle-manager-packageserver   4.16.10   True        False         False      41h
service-ca                                 4.16.10   True        False         False      41h
storage                                    4.16.10   True        False         False      41h

これで一番ベーシックな HCP on AWS のデプロイが完了になります。


最後にはいくつのカスタマイズ項目を説明します。
  • External DNS の有効化

デフォルトでは、Hosted Cluster 側のいくつの Route が Hosting Cluster 側の Ingress ドメインを使用するようになっているため、管理上の理由で、Hosting Cluster 側の Ingress ドメインを Expose したくない場合は、External DNS の有効化をすることで、Hosting Cluster の Ingress ドメインとは別のドメインを使用するように設定することができます。

External DNS を有効にするためには、AWS 側で新しい Public DNS hosted zone を作成して、Hosting Cluster の local-cluster Namespace 配下に hypershift-operator-external-dns-credentials という Secret を作成した後、hcp create cluster aws コマンドに --external-dns-domain オプションを指定して実行すれば、External DNS を使用するように Hosted Cluster が作成されます。

  • Private hosted cluster の作成

内部からの使用のみが想定されている場合は、Public からアクセスできない Private な Hosted Cluster を作成することができます。

Private Hosted Cluster を作成するためには、AWS PrivateLink を有効化するように、Hosting Cluster の local-cluster Namespace 配下に hypershift-operator-private-link-credentials という Secret を作成した後、hcp create cluster aws コマンドに --endpoint-access Private オプションを指定して実行すれば、Private Hosted Cluster が作成されます。

Private Hosted Cluster にアクセスするためには、kubeconfig ファイルを踏み台となる bastion サーバにコピーして、bastion サーバからアクセスする必要があります。


Reference:

Documentation - OpenShift Container Platform 4.17 / Hosted control planes / Deploying hosted control planes / Deploying hosted control planes on AWS

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