Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/oracle-japan/ochacafe-clusterapi
OCHaCafe Season 7 #5 - Cluster API
https://github.com/oracle-japan/ochacafe-clusterapi
clusterapi kubermetes multicluster ochacafe oci ocne
Last synced: about 4 hours ago
JSON representation
OCHaCafe Season 7 #5 - Cluster API
- Host: GitHub
- URL: https://github.com/oracle-japan/ochacafe-clusterapi
- Owner: oracle-japan
- Created: 2023-09-13T07:48:18.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2023-10-12T02:35:40.000Z (about 1 year ago)
- Last Synced: 2023-10-12T18:40:34.459Z (about 1 year ago)
- Topics: clusterapi, kubermetes, multicluster, ochacafe, oci, ocne
- Homepage:
- Size: 349 KB
- Stars: 0
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Oracle Cloud Hangout Cafe Season7 #5 Cluster API
## Directory Configuration
```sh
.
├── README.md
├── autoscaler
│ ├── scale.yaml
│ └── workload
│ └── nginx.yaml
├── config
│ └── starship.toml
└── clusterapi
├── kubeadm.yaml
├── ocne.yaml
└── oke.yaml
```## Management Clusterの構築
### OKEのプロビジョニング
OKEのプロビジョニングについては、[こちら](https://oracle-japan.github.io/ocitutorials/cloud-native/oke-for-commons/)の手順をベースに実施してください。
ただし、Worker Nodeのスペックを以下に設定してください。- Node数: 3
- OCPU: 2
- Memory: 8### clusterctlのインストール
ここではv1.5.2をインストールします。
```sh
curl -L https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.5.2/clusterctl-linux-amd64 -o clusterctl
```実行権限とパスを変更します。
```sh
sudo install -o root -g root -m 0755 clusterctl /usr/local/bin/clusterctl
```これでインストールは完了です。
以下のコマンドが実行できればOKです。
```sh
$ clusterctl version
clusterctl version: &version.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"}
```### Cluster APIのインストール
Cluster APIをインストールします。
今回は、OCI上でのKubeadmを利用したクラスタ、OKEクラスタ、Oracle Cloud Native Environmentクラスタを構築するため、KubeadmのControl Plane APIおよびBootstrap API、Cluster API for OCI、Cluster API for OCNEをインストールします。
```sh
clusterctl init --infrastructure oci --bootstrap ocne --control-plane ocne --bootstrap kubeadm --control-plane kubeadm
```これでManagement Clusterの構築は完了です。
## Workload Clusterの構築
### ポリシーの設定
Management ClusterであるOKEから各種クラスタをプロビジョニングできるようにポリシーを設定します。
#### 動的グループの作成
[こちら](https://docs.oracle.com/ja-jp/iaas/Content/Identity/Tasks/managingdynamicgroups.htm)を参考に以下の動的グループを作成してください。 '
動的グループ名は`clusteraapi-dyn-group`とします。```sh
instance.compartment.id = '<コンパートメントOCID>'
```#### ポリシーの作成
[こちら](hhttps://docs.oracle.com/ja-jp/iaas/Content/Identity/Tasks/managingpolicies.htm)を参考に以下のポリシーを作成してください。
ポリシーは`clusterapi_policy`とします。```sh
Allow dynamic-group clusteraapi-dyn-group to manage instance-family in compartment tmm-evaluation
Allow dynamic-group clusteraapi-dyn-group to manage virtual-network-family in compartment tmm-evaluation
Allow dynamic-group clusteraapi-dyn-group to manage load-balancers in compartment tmm-evaluation
Allow dynamic-group clusteraapi-dyn-group to use subnets in compartment tmm-evaluation
Allow dynamic-group clusteraapi-dyn-group to inspect compartments in compartment tmm-evaluation
Allow dynamic-group clusteraapi-dyn-group to use vnics in compartment tmm-evaluation
Allow dynamic-group clusteraapi-dyn-group to use network-security-groups in compartment tmm-evaluation
Allow dynamic-group clusteraapi-dyn-group to use private-ips in compartment tmm-evaluation
Allow dynamic-group clusteraapi-dyn-group to manage public-ips in compartment tmm-evaluation
Allow dynamic-group clusteraapi-dyn-group to use private-ips in compartment tmm-evaluation
Allow dynamic-group clusteraapi-dyn-group to manage cluster-family in compartment tmm-evaluation
```### Kubeadmクラスタ用のカスタムイメージの作成
ここでは、この後作成するKubeadmクラスタで利用するWorker Nodeのカスタムイメージを作成します。
カスタムイメージはPackerというツールを利用して実施します。
手順は[こちら](https://github.com/kubernetes-sigs/image-builder)を参考に実施してください。
とりあえず試したい方は、[こちらでカスタムイメージを公開](https://objectstorage.us-ashburn-1.oraclecloud.com/p/8u0KE_tZsfnxAkDbQOUKuKTUv4Ifch1OvSWSA3bKw_6h6woBdyp6QSwauuHlYSMD/n/orasejapan/b/TestData/o/exported-image-20230829-1556)しているので、ご自身の環境にインポートしてください。
インポートの方法は[こちら](https://docs.oracle.com/ja-jp/iaas/Content/Compute/Tasks/imageimportexport.htm#Importing)を参考に実施してください。### Cluster APIで利用する環境変数の設定
ここでは、この後で利用する環境変数を設定していきます。
[こちら](https://docs.oracle.com/ja-jp/iaas/Content/Identity/Tasks/managingdynamicgroups.htm)を参考に動的グループを作成します。
env/envファイルの`CHANGE ME!!`項目を埋めます。
```sh
export OCI_REGION="CHANGE ME!!"
export OCI_COMPARTMENT_ID="CHANGE ME!!"
export OCI_MANAGED_NODE_IMAGE_ID="CHANGE ME!!"
export OCI_OCNE_IMAGE="CHANGE ME!!"
export OCI_SSH_KEY="CHANGE ME!!"
```#### OCI_REGION
[こちら](https://docs.oracle.com/ja-jp/iaas/Content/General/Concepts/regions.htm)のページでご自身が利用されるリージョン識別子を取得してください。
#### OCI_COMPARTMENT_ID
OCI_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)を参考に取得してください。
#### OCI_MANAGED_NODE_IMAGE_ID
[Kubeadmクラスタ用のカスタムイメージの作成](#kubeadmクラスタ用のカスタムイメージの作成)でインポートしたカスタムイメージのOCIDをコンソールから取得してください。
#### OCI_OCNE_IMAGE
[こちら](https://docs.oracle.com/en-us/iaas/images/oracle-linux-8x/)からご自身が利用されるリージョンに紐づくイメージOCIDを取得してください。
#### OCI_SSH_KEY
Worker NodeにSSHログインするためのSSHキーを設定してください。
こちらは必須です。例
```sh
OCI_SSH_KEY=ssh-rsa AAAAB3NzaC1ycxxxxxxxxxxxxmeGV4+L6j8bB
```最後に環境変数をエクスポートします。
```sh
source env/env.sh
```### k8s with Kubeadm on OCI Compute環境の構築
まずは、OCI Compute上にKubeadmを利用したクラスタを構築します。
以下のコマンドを実行だけで構築できます。
```sh
clusterctl generate cluster oke-cluster --from ochacafe-cluster-api/clusterapi/oke.yaml |kubectl apply -f - --server-side
```以下のコマンドで状況を確認できます。
```sh
clusterctl describe cluster oke-cluster
```プロビジョニング完了までには10分ほどかかります。
プロビジョニングしたクラスタのKubeconfigを取得する場合は以下のコマンドを実行します。
今回のManifestでは、ClusterResourceSetを利用してContainer Network InteerfaceとしてCalico、OCIのCloud Controller Managerも一緒にデプロイしています。```sh
clusterctl get kuebconfig kubeadm-cluster > kubeadm.config
``````sh
kubectl get node --kubeconfig kubeadm-cluster
```### OCNE on OCI Compute環境の構築
次に、OCI Compute上にOCNEを利用したクラスタを構築します。
以下のコマンドを実行だけで構築できます。
```sh
clusterctl generate cluster ocne-cluster --from ochacafe-cluster-api/clusterapi/ocne.yaml |kubectl apply -f - --server-side
```以下のコマンドで状況を確認できます。
```sh
clusterctl describe cluster ocne-cluster
```プロビジョニングしたクラスタのKubeconfigを取得する場合は以下のコマンドを実行します。
今回のManifestでは、ClusterResourceSetを利用してContainer Network InteerfaceとしてCalico、OCIのCloud Controller Managerも一緒にデプロイしています。```sh
clusterctl get kuebconfig ocne-cluster > ocne.config
``````sh
kubectl get node --kubeconfig ocne-cluster
```### OKE環境の構築
次に、OKEクラスタを構築します。
以下のコマンドを実行だけで構築できます。
```sh
clusterctl generate cluster oke-cluster --from ochacafe-cluster-api/clusterapi/oke.yaml |kubectl apply -f -
```以下のコマンドで状況を確認できます。
```sh
clusterctl describe cluster oke-cluster
```プロビジョニング完了までには10分ほどかかります。
プロビジョニングしたクラスタのKubeconfigを取得する場合は以下のコマンドを実行します。```sh
clusterctl get kuebconfig ocne-cluster > oke.config
``````sh
kubectl get node --kubeconfig oke-cluster
```### ヘルスチェック機能の動作確認
ここでは、Cluster APIのヘルスチェックの動作確認をします。
今回はKubeadmクラスタのWorker Nodeに対してヘルスチェックの設定をしています。(もちろんControl Planeに対して設定することも可能です)OCIコンソール画面でCompute一覧を開きます。
先ほど作成したKubeadmクラスタのWorker Nodeインスタンス(`kubeadm-cluster-md-0-xxxx`)を停止させます。
![](image/001.png)
`ただちに電源を切断することで、インスタンスを強制停止します。`にチェックを入れて、`インスタンスを強制停止`をクリックします。
![](image/002.png)
インスタンスが停止されます。
![](image/003.png)
今回はWorker NodeのステータスがReadyでない状態が1分以上継続するとタイムアウトする設定をしているので、1分ほど経過するとインスタンスが自動的に終了します。
![](image/004.png)
インスタンスが終了後に新たにWorker Nodeインスタンスがプロビジョニングされます。
これにより、自動的にクラスタが復旧します。![](image/005.png)
### オートスケール
ここでは、Cluster APIを利用したオートスケールを確認します。
まずは、Management ClusterがWorkload Clusterの状態を確認できるようにKubeconfigをSecretとして登録します。
今回は、Kubeadmクラスタを利用します。
登録するKubeconfigはKubeadmクラスタ作成時に取得したものです。
後ほどCluster Autoscaler用のDeploymentをkube-systemネームスペースにデプロイするため、kube-systemに対して登録します。```sh
kubectl create secret generic kubeconfig --from-file=kubeconfig=kubeadm.config -n kube-system
```Cluster Autoscaler用のDeploymentをデプロイします。
```sh
kubectl apply -f autoscaler/scale.yaml
```Cluster Autoscalerを行うためにNGINXのPodをKubeadmクラスタにデプロイします。
```sh
kubectl apply -f autoscaler/workload/nginx.yaml --kubeconfig=kubeadm.config
```デプロイするとリソース不足により、PendingのPodが発生します。
```sh
$ kubectl get pods --kubeconfig=kubeadm.config
NAME READY STATUS RESTARTS AGE
nginx-7bc465bf6f-6v2xz 0/1 Pending 0 25s
nginx-7bc465bf6f-bpk6z 1/1 Running 0 25s
nginx-7bc465bf6f-rbj6t 1/1 Running 0 25s
nginx-7bc465bf6f-t28sl 0/1 Pending 0 25s
nginx-7bc465bf6f-vjd66 1/1 Running 0 25s
```しばらくすると新たにWorker Nodeが起動してくるのが確認できます。
![](image/006.png)