.
├── README.md
├── autoscaler
│ ├── scale.yaml
│ └── workload
│ └── nginx.yaml
├── config
│ └── starship.toml
└── clusterapi
├── kubeadm.yaml
├── ocne.yaml
└── oke.yaml
OKEのプロビジョニングについては、こちらの手順をベースに実施してください。 ただし、Worker Nodeのスペックを以下に設定してください。
- Node数: 3
- OCPU: 2
- Memory: 8
ここではv1.5.2をインストールします。
curl -L https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.5.2/clusterctl-linux-amd64 -o clusterctl
実行権限とパスを変更します。
sudo install -o root -g root -m 0755 clusterctl /usr/local/bin/clusterctl
これでインストールは完了です。
以下のコマンドが実行できればOKです。
$ 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をインストールします。
今回は、OCI上でのKubeadmを利用したクラスタ、OKEクラスタ、Oracle Cloud Native Environmentクラスタを構築するため、KubeadmのControl Plane APIおよびBootstrap API、Cluster API for OCI、Cluster API for OCNEをインストールします。
clusterctl init --infrastructure oci --bootstrap ocne --control-plane ocne --bootstrap kubeadm --control-plane kubeadm
これでManagement Clusterの構築は完了です。
Management ClusterであるOKEから各種クラスタをプロビジョニングできるようにポリシーを設定します。
こちらを参考に以下の動的グループを作成してください。 '
動的グループ名はclusteraapi-dyn-group
とします。
instance.compartment.id = '<コンパートメントOCID>'
こちらを参考に以下のポリシーを作成してください。
ポリシーはclusterapi_policy
とします。
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クラスタで利用するWorker Nodeのカスタムイメージを作成します。
カスタムイメージはPackerというツールを利用して実施します。
手順はこちらを参考に実施してください。
とりあえず試したい方は、こちらでカスタムイメージを公開しているので、ご自身の環境にインポートしてください。
インポートの方法はこちらを参考に実施してください。
ここでは、この後で利用する環境変数を設定していきます。
こちらを参考に動的グループを作成します。
env/envファイルのCHANGE ME!!
項目を埋めます。
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_COMPARTMENT_IDはこちらを参考に取得してください。
Kubeadmクラスタ用のカスタムイメージの作成でインポートしたカスタムイメージのOCIDをコンソールから取得してください。
こちらからご自身が利用されるリージョンに紐づくイメージOCIDを取得してください。
Worker NodeにSSHログインするためのSSHキーを設定してください。
こちらは必須です。
例
OCI_SSH_KEY=ssh-rsa AAAAB3NzaC1ycxxxxxxxxxxxxmeGV4+L6j8bB
最後に環境変数をエクスポートします。
source env/env.sh
まずは、OCI Compute上にKubeadmを利用したクラスタを構築します。
以下のコマンドを実行だけで構築できます。
clusterctl generate cluster oke-cluster --from ochacafe-cluster-api/clusterapi/oke.yaml |kubectl apply -f - --server-side
以下のコマンドで状況を確認できます。
clusterctl describe cluster oke-cluster
プロビジョニング完了までには10分ほどかかります。
プロビジョニングしたクラスタのKubeconfigを取得する場合は以下のコマンドを実行します。
今回のManifestでは、ClusterResourceSetを利用してContainer Network InteerfaceとしてCalico、OCIのCloud Controller Managerも一緒にデプロイしています。
clusterctl get kuebconfig kubeadm-cluster > kubeadm.config
kubectl get node --kubeconfig kubeadm-cluster
次に、OCI Compute上にOCNEを利用したクラスタを構築します。
以下のコマンドを実行だけで構築できます。
clusterctl generate cluster ocne-cluster --from ochacafe-cluster-api/clusterapi/ocne.yaml |kubectl apply -f - --server-side
以下のコマンドで状況を確認できます。
clusterctl describe cluster ocne-cluster
プロビジョニングしたクラスタのKubeconfigを取得する場合は以下のコマンドを実行します。
今回のManifestでは、ClusterResourceSetを利用してContainer Network InteerfaceとしてCalico、OCIのCloud Controller Managerも一緒にデプロイしています。
clusterctl get kuebconfig ocne-cluster > ocne.config
kubectl get node --kubeconfig ocne-cluster
次に、OKEクラスタを構築します。
以下のコマンドを実行だけで構築できます。
clusterctl generate cluster oke-cluster --from ochacafe-cluster-api/clusterapi/oke.yaml |kubectl apply -f -
以下のコマンドで状況を確認できます。
clusterctl describe cluster oke-cluster
プロビジョニング完了までには10分ほどかかります。 プロビジョニングしたクラスタのKubeconfigを取得する場合は以下のコマンドを実行します。
clusterctl get kuebconfig ocne-cluster > oke.config
kubectl get node --kubeconfig oke-cluster
ここでは、Cluster APIのヘルスチェックの動作確認をします。
今回はKubeadmクラスタのWorker Nodeに対してヘルスチェックの設定をしています。(もちろんControl Planeに対して設定することも可能です)
OCIコンソール画面でCompute一覧を開きます。
先ほど作成したKubeadmクラスタのWorker Nodeインスタンス(kubeadm-cluster-md-0-xxxx
)を停止させます。
ただちに電源を切断することで、インスタンスを強制停止します。
にチェックを入れて、インスタンスを強制停止
をクリックします。
インスタンスが停止されます。
今回はWorker NodeのステータスがReadyでない状態が1分以上継続するとタイムアウトする設定をしているので、1分ほど経過するとインスタンスが自動的に終了します。
インスタンスが終了後に新たにWorker Nodeインスタンスがプロビジョニングされます。
これにより、自動的にクラスタが復旧します。
ここでは、Cluster APIを利用したオートスケールを確認します。
まずは、Management ClusterがWorkload Clusterの状態を確認できるようにKubeconfigをSecretとして登録します。
今回は、Kubeadmクラスタを利用します。
登録するKubeconfigはKubeadmクラスタ作成時に取得したものです。
後ほどCluster Autoscaler用のDeploymentをkube-systemネームスペースにデプロイするため、kube-systemに対して登録します。
kubectl create secret generic kubeconfig --from-file=kubeconfig=kubeadm.config -n kube-system
Cluster Autoscaler用のDeploymentをデプロイします。
kubectl apply -f autoscaler/scale.yaml
Cluster Autoscalerを行うためにNGINXのPodをKubeadmクラスタにデプロイします。
kubectl apply -f autoscaler/workload/nginx.yaml --kubeconfig=kubeadm.config
デプロイするとリソース不足により、PendingのPodが発生します。
$ 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が起動してくるのが確認できます。