{"id":20934834,"url":"https://github.com/oracle-japan/ochacafe-clusterapi","last_synced_at":"2026-02-24T08:34:40.392Z","repository":{"id":194520551,"uuid":"690947654","full_name":"oracle-japan/ochacafe-clusterapi","owner":"oracle-japan","description":"OCHaCafe Season 7 #5 - Cluster API","archived":false,"fork":false,"pushed_at":"2024-08-01T17:21:02.000Z","size":357,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-10-30T08:51:42.472Z","etag":null,"topics":["clusterapi","kubermetes","multicluster","ochacafe","oci","ocne"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oracle-japan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-09-13T07:48:18.000Z","updated_at":"2023-09-13T09:31:59.000Z","dependencies_parsed_at":"2025-01-19T19:53:36.700Z","dependency_job_id":"a490fbe2-2761-4465-9246-52d594d88cf1","html_url":"https://github.com/oracle-japan/ochacafe-clusterapi","commit_stats":null,"previous_names":["oracle-japan/ochacafe-clusterapi"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/oracle-japan/ochacafe-clusterapi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oracle-japan%2Fochacafe-clusterapi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oracle-japan%2Fochacafe-clusterapi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oracle-japan%2Fochacafe-clusterapi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oracle-japan%2Fochacafe-clusterapi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oracle-japan","download_url":"https://codeload.github.com/oracle-japan/ochacafe-clusterapi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oracle-japan%2Fochacafe-clusterapi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29776642,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-24T04:54:30.205Z","status":"ssl_error","status_checked_at":"2026-02-24T04:53:58.628Z","response_time":75,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clusterapi","kubermetes","multicluster","ochacafe","oci","ocne"],"created_at":"2024-11-18T22:11:37.231Z","updated_at":"2026-02-24T08:34:40.358Z","avatar_url":"https://github.com/oracle-japan.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Oracle Cloud Hangout Cafe Season7 #5 Cluster API\n\n## Directory Configuration\n\n```sh\n.\n├── README.md\n├── autoscaler\n│   ├── scale.yaml\n│   └── workload\n│       └── nginx.yaml\n├── config\n│   └── starship.toml\n└── clusterapi\n    ├── kubeadm.yaml\n    ├── ocne.yaml\n    └── oke.yaml\n```\n\n## Management Clusterの構築\n\n### OKEのプロビジョニング\n\nOKEのプロビジョニングについては、[こちら](https://oracle-japan.github.io/ocitutorials/cloud-native/oke-for-commons/)の手順をベースに実施してください。\nただし、Worker Nodeのスペックを以下に設定してください。\n\n- Node数: 3\n- OCPU: 2\n- Memory: 8\n\n### clusterctlのインストール\n\nここではv1.5.2をインストールします。\n\n```sh\ncurl -L https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.5.2/clusterctl-linux-amd64 -o clusterctl\n```\n\n実行権限とパスを変更します。\n\n```sh\nsudo install -o root -g root -m 0755 clusterctl /usr/local/bin/clusterctl\n```\n\nこれでインストールは完了です。\n\n以下のコマンドが実行できればOKです。\n\n```sh\n$ clusterctl version\nclusterctl version: \u0026version.Info{Major:\"1\", Minor:\"5\", GitVersion:\"v1.5.2\", GitCommit:\"3290c5a28ed28c1909713e59e5d481a3e8f68a90\", GitTreeState:\"clean\", BuildDate:\"2023-09-26T15:50:41Z\", GoVersion:\"go1.20.8\", Compiler:\"gc\", Platform:\"linux/amd64\"}\n```\n\n### Cluster APIのインストール\n\nCluster APIをインストールします。\n\n今回は、OCI上でのKubeadmを利用したクラスタ、OKEクラスタ、Oracle Cloud Native Environmentクラスタを構築するため、KubeadmのControl Plane APIおよびBootstrap API、Cluster API for OCI、Cluster API for OCNEをインストールします。\n\n```sh\nclusterctl init --infrastructure oci --bootstrap ocne --control-plane ocne --bootstrap kubeadm  --control-plane kubeadm\n```\n\nこれでManagement Clusterの構築は完了です。\n\n## Workload Clusterの構築\n\n\n### ポリシーの設定\n\nManagement ClusterであるOKEから各種クラスタをプロビジョニングできるようにポリシーを設定します。  \n\n#### 動的グループの作成\n\n[こちら](https://docs.oracle.com/ja-jp/iaas/Content/Identity/Tasks/managingdynamicgroups.htm)を参考に以下の動的グループを作成してください。  '\n動的グループ名は`clusteraapi-dyn-group`とします。  \n\n```sh\ninstance.compartment.id = '\u003cコンパートメントOCID\u003e'\n```\n\n#### ポリシーの作成\n\n[こちら](hhttps://docs.oracle.com/ja-jp/iaas/Content/Identity/Tasks/managingpolicies.htm)を参考に以下のポリシーを作成してください。 \nポリシーは`clusterapi_policy`とします。  \n\n```sh\nAllow dynamic-group clusteraapi-dyn-group to manage instance-family in compartment tmm-evaluation\t\nAllow dynamic-group clusteraapi-dyn-group to manage virtual-network-family in compartment tmm-evaluation\t\nAllow dynamic-group clusteraapi-dyn-group to manage load-balancers in compartment tmm-evaluation\t\nAllow dynamic-group clusteraapi-dyn-group to use subnets in compartment tmm-evaluation\t\nAllow dynamic-group clusteraapi-dyn-group to inspect compartments in compartment tmm-evaluation\t\nAllow dynamic-group clusteraapi-dyn-group to use vnics in compartment tmm-evaluation\t\nAllow dynamic-group clusteraapi-dyn-group to use network-security-groups in compartment tmm-evaluation\t\nAllow dynamic-group clusteraapi-dyn-group to use private-ips in compartment tmm-evaluation\t\nAllow dynamic-group clusteraapi-dyn-group to manage public-ips in compartment tmm-evaluation\t\nAllow dynamic-group clusteraapi-dyn-group to use private-ips in compartment tmm-evaluation\t \nAllow dynamic-group clusteraapi-dyn-group to manage cluster-family in compartment tmm-evaluation\n```\n\n### Kubeadmクラスタ用のカスタムイメージの作成\n\nここでは、この後作成するKubeadmクラスタで利用するWorker Nodeのカスタムイメージを作成します。\n\nカスタムイメージはPackerというツールを利用して実施します。  \n手順は[こちら](https://github.com/kubernetes-sigs/image-builder)を参考に実施してください。  \nとりあえず試したい方は、[こちらでカスタムイメージを公開](https://objectstorage.us-ashburn-1.oraclecloud.com/p/8u0KE_tZsfnxAkDbQOUKuKTUv4Ifch1OvSWSA3bKw_6h6woBdyp6QSwauuHlYSMD/n/orasejapan/b/TestData/o/exported-image-20230829-1556)しているので、ご自身の環境にインポートしてください。  \nインポートの方法は[こちら](https://docs.oracle.com/ja-jp/iaas/Content/Compute/Tasks/imageimportexport.htm#Importing)を参考に実施してください。  \n\n### Cluster APIで利用する環境変数の設定\n\nここでは、この後で利用する環境変数を設定していきます。\n\n[こちら](https://docs.oracle.com/ja-jp/iaas/Content/Identity/Tasks/managingdynamicgroups.htm)を参考に動的グループを作成します。\n \n\nenv/envファイルの`CHANGE ME!!`項目を埋めます。\n\n```sh\nexport OCI_REGION=\"CHANGE ME!!\"\nexport OCI_COMPARTMENT_ID=\"CHANGE ME!!\"\nexport OCI_MANAGED_NODE_IMAGE_ID=\"CHANGE ME!!\"\nexport OCI_OCNE_IMAGE=\"CHANGE ME!!\"\nexport OCI_SSH_KEY=\"CHANGE ME!!\"\n```\n\n#### OCI_REGION\n\n[こちら](https://docs.oracle.com/ja-jp/iaas/Content/General/Concepts/regions.htm)のページでご自身が利用されるリージョン識別子を取得してください。\n\n#### OCI_COMPARTMENT_ID\n\nOCI_COMPARTMENT_IDは[こちら](https://docs.oracle.com/ja-jp/iaas/Content/GSG/Tasks/contactingsupport_topic-Finding_the_OCID_of_a_Compartment.htm#:~:text=%E3%82%B3%E3%83%B3%E3%83%91%E3%83%BC%E3%83%88%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AEOCID%E3%81%AE%E6%A4%9C%E7%B4%A2%20*%20%E3%83%8A%E3%83%93%E3%82%B2%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%BB%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%92%E9%96%8B%E3%81%8D%E3%80%81%E3%80%8C%E3%82%A2%E3%82%A4%E3%83%87%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3%E3%81%A8%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%80%8D%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%20%E3%80%8C%E3%82%A2%E3%82%A4%E3%83%87%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3%E3%80%8D%E3%81%A7%E3%80%81%E3%80%8C%E3%82%B3%E3%83%B3%E3%83%91%E3%83%BC%E3%83%88%E3%83%A1%E3%83%B3%E3%83%88%E3%80%8D%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)を参考に取得してください。\n\n#### OCI_MANAGED_NODE_IMAGE_ID\n\n[Kubeadmクラスタ用のカスタムイメージの作成](#kubeadmクラスタ用のカスタムイメージの作成)でインポートしたカスタムイメージのOCIDをコンソールから取得してください。\n\n#### OCI_OCNE_IMAGE\n\n[こちら](https://docs.oracle.com/en-us/iaas/images/oracle-linux-8x/)からご自身が利用されるリージョンに紐づくイメージOCIDを取得してください。\n\n#### OCI_SSH_KEY\n\nWorker NodeにSSHログインするためのSSHキーを設定してください。  \nこちらは必須です。\n\n例\n```sh\nOCI_SSH_KEY=ssh-rsa AAAAB3NzaC1ycxxxxxxxxxxxxmeGV4+L6j8bB\n```\n\n最後に環境変数をエクスポートします。  \n\n```sh\nsource env/env.sh\n```\n\n### k8s with Kubeadm on OCI Compute環境の構築\n\nまずは、OCI Compute上にKubeadmを利用したクラスタを構築します。  \n\n以下のコマンドを実行だけで構築できます。\n\n```sh\nclusterctl generate cluster oke-cluster --from ochacafe-cluster-api/clusterapi/oke.yaml |kubectl apply -f - --server-side\n```\n\n以下のコマンドで状況を確認できます。\n\n```sh\nclusterctl describe cluster oke-cluster\n```\n\nプロビジョニング完了までには10分ほどかかります。  \n\nプロビジョニングしたクラスタのKubeconfigを取得する場合は以下のコマンドを実行します。  \n今回のManifestでは、ClusterResourceSetを利用してContainer Network InteerfaceとしてCalico、OCIのCloud Controller Managerも一緒にデプロイしています。  \n\n```sh\nclusterctl get kuebconfig kubeadm-cluster \u003e kubeadm.config\n```\n\n```sh\nkubectl get node --kubeconfig kubeadm-cluster\n```\n\n### OCNE on OCI Compute環境の構築\n\n次に、OCI Compute上にOCNEを利用したクラスタを構築します。  \n\n以下のコマンドを実行だけで構築できます。\n\n```sh\nclusterctl generate cluster ocne-cluster --from ochacafe-cluster-api/clusterapi/ocne.yaml |kubectl apply -f - --server-side\n```\n\n以下のコマンドで状況を確認できます。\n\n```sh\nclusterctl describe cluster ocne-cluster\n```\n\nプロビジョニングしたクラスタのKubeconfigを取得する場合は以下のコマンドを実行します。  \n今回のManifestでは、ClusterResourceSetを利用してContainer Network InteerfaceとしてCalico、OCIのCloud Controller Managerも一緒にデプロイしています。  \n\n```sh\nclusterctl get kuebconfig ocne-cluster \u003e ocne.config\n```\n\n```sh\nkubectl get node --kubeconfig ocne-cluster\n```\n\n### OKE環境の構築\n\n次に、OKEクラスタを構築します。  \n\n以下のコマンドを実行だけで構築できます。\n\n```sh\nclusterctl generate cluster oke-cluster --from ochacafe-cluster-api/clusterapi/oke.yaml |kubectl apply -f -\n```\n\n以下のコマンドで状況を確認できます。\n\n```sh\nclusterctl describe cluster oke-cluster\n```\n\nプロビジョニング完了までには10分ほどかかります。\nプロビジョニングしたクラスタのKubeconfigを取得する場合は以下のコマンドを実行します。    \n\n```sh\nclusterctl get kuebconfig ocne-cluster \u003e oke.config\n```\n\n```sh\nkubectl get node --kubeconfig oke-cluster\n```\n\n### ヘルスチェック機能の動作確認\n\nここでは、Cluster APIのヘルスチェックの動作確認をします。    \n今回はKubeadmクラスタのWorker Nodeに対してヘルスチェックの設定をしています。(もちろんControl Planeに対して設定することも可能です)  \n\nOCIコンソール画面でCompute一覧を開きます。  \n\n先ほど作成したKubeadmクラスタのWorker Nodeインスタンス(`kubeadm-cluster-md-0-xxxx`)を停止させます。  \n\n![](image/001.png) \n\n`ただちに電源を切断することで、インスタンスを強制停止します。`にチェックを入れて、`インスタンスを強制停止`をクリックします。  \n\n![](image/002.png) \n\nインスタンスが停止されます。  \n\n![](image/003.png) \n\n今回はWorker NodeのステータスがReadyでない状態が1分以上継続するとタイムアウトする設定をしているので、1分ほど経過するとインスタンスが自動的に終了します。  \n\n![](image/004.png) \n\nインスタンスが終了後に新たにWorker Nodeインスタンスがプロビジョニングされます。  \nこれにより、自動的にクラスタが復旧します。  \n\n![](image/005.png) \n\n### オートスケール\n\nここでは、Cluster APIを利用したオートスケールを確認します。  \n\nまずは、Management ClusterがWorkload Clusterの状態を確認できるようにKubeconfigをSecretとして登録します。  \n今回は、Kubeadmクラスタを利用します。  \n登録するKubeconfigはKubeadmクラスタ作成時に取得したものです。 \n後ほどCluster Autoscaler用のDeploymentをkube-systemネームスペースにデプロイするため、kube-systemに対して登録します。  \n\n```sh\nkubectl create secret generic kubeconfig --from-file=kubeconfig=kubeadm.config -n kube-system\n```\n\nCluster Autoscaler用のDeploymentをデプロイします。  \n\n```sh\nkubectl apply -f autoscaler/scale.yaml\n```\n\nCluster Autoscalerを行うためにNGINXのPodをKubeadmクラスタにデプロイします。　　\n\n```sh\nkubectl apply -f autoscaler/workload/nginx.yaml --kubeconfig=kubeadm.config\n```\n\nデプロイするとリソース不足により、PendingのPodが発生します。  \n\n```sh\n$ kubectl get pods --kubeconfig=kubeadm.config\nNAME                     READY   STATUS    RESTARTS   AGE\nnginx-7bc465bf6f-6v2xz   0/1     Pending   0          25s\nnginx-7bc465bf6f-bpk6z   1/1     Running   0          25s\nnginx-7bc465bf6f-rbj6t   1/1     Running   0          25s\nnginx-7bc465bf6f-t28sl   0/1     Pending   0          25s\nnginx-7bc465bf6f-vjd66   1/1     Running   0          25s\n```\n\nしばらくすると新たにWorker Nodeが起動してくるのが確認できます。  \n\n![](image/006.png) \n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foracle-japan%2Fochacafe-clusterapi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foracle-japan%2Fochacafe-clusterapi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foracle-japan%2Fochacafe-clusterapi/lists"}