Red Hat で OpenShift をサポートしている Yiyong です。この記事はOpenShift Advent Calendar 2024のエントリです。
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
作成途中では、PROGRESS
が Partial
になっていたり、何かしらのエラーメッセージが表示される場合もありますが、しばらく時間が経つと、上記のように、PROGRESS
が Completed
になり、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 サーバからアクセスする必要があります。