Skip to content

oracle-japan/ochacafe-clusterapi

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Oracle Cloud Hangout Cafe Season7 #5 Cluster API

Directory Configuration

.
├── README.md
├── autoscaler
│   ├── scale.yaml
│   └── workload
│       └── nginx.yaml
├── config
│   └── starship.toml
└── clusterapi
    ├── kubeadm.yaml
    ├── ocne.yaml
    └── oke.yaml

Management Clusterの構築

OKEのプロビジョニング

OKEのプロビジョニングについては、こちらの手順をベースに実施してください。 ただし、Worker Nodeのスペックを以下に設定してください。

  • Node数: 3
  • OCPU: 2
  • Memory: 8

clusterctlのインストール

ここでは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のインストール

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の構築は完了です。

Workload 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クラスタ用のカスタムイメージの作成

ここでは、この後作成するKubeadmクラスタで利用するWorker Nodeのカスタムイメージを作成します。

カスタムイメージはPackerというツールを利用して実施します。
手順はこちらを参考に実施してください。
とりあえず試したい方は、こちらでカスタムイメージを公開しているので、ご自身の環境にインポートしてください。
インポートの方法はこちらを参考に実施してください。

Cluster APIで利用する環境変数の設定

ここでは、この後で利用する環境変数を設定していきます。

こちらを参考に動的グループを作成します。

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_REGION

こちらのページでご自身が利用されるリージョン識別子を取得してください。

OCI_COMPARTMENT_ID

OCI_COMPARTMENT_IDはこちらを参考に取得してください。

OCI_MANAGED_NODE_IMAGE_ID

Kubeadmクラスタ用のカスタムイメージの作成でインポートしたカスタムイメージのOCIDをコンソールから取得してください。

OCI_OCNE_IMAGE

こちらからご自身が利用されるリージョンに紐づくイメージOCIDを取得してください。

OCI_SSH_KEY

Worker NodeにSSHログインするためのSSHキーを設定してください。
こちらは必須です。

OCI_SSH_KEY=ssh-rsa AAAAB3NzaC1ycxxxxxxxxxxxxmeGV4+L6j8bB

最後に環境変数をエクスポートします。

source env/env.sh

k8s with Kubeadm on OCI Compute環境の構築

まずは、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

OCNE on OCI Compute環境の構築

次に、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環境の構築

次に、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が起動してくるのが確認できます。