こんにちは、富士通クラウドテクノロジーズでアルバイトをしている巨畠です。 おもに「Kubernetes」周辺のツール開発のお手伝いをさせていただいています。
このたび、私がお手伝いといいながらがっつり入り込んで開発を進めていた cluster-api-provider-nifcloud がOSSとしてリリースされました! 現段階では実験的な取り組みとしてお試しいただくためにリリースしたものであり、本番用途には不向きですが、Cluster APIと呼ばれる仕組みを使ってニフクラ上でKubernetesクラスタを構築することができるツールです。
Kubernetesとは
皆さんご存知の通り「Kubernetes」は近年非常に注目を集めているツールです。 Kubernetesはコンテナ化したアプリケーションやサービスの管理基盤であり、 多くのコンテナ操作を自動化することができます。 さらに、宣言的な設定によって、サービスを「あるべき姿」に収束させることができます。
Cluster APIとは
Kubernetes環境を構築するツールはたくさんありますが、 ツールごとで個別にクラウドなどの環境をサポートする必要がありました。
そこで、クラスタを含むKubernetes環境を包括的に管理するための仕組みが求められ、 誕生したのがCluster APIです。
Cluster APIはKubernetesプロジェクトの一つで、 Kubernetesの宣言的なAPI(Declarative API)を用いて、 Kubernetesクラスタの作成や削除などにかかわる共通操作を 異なる環境で行えるようにします。
利用者の視点でCluster APIについて以下にまとめます。
- Kubernetesクラスタを準備・管理する手間を短縮できる
- アプリケーションの開発に集中できる
- Kubernetesの運用知識が必要になるため、情報のキャッチアップに多少時間がかかる
cluster-api-provider-nifcloud
Cluster APIは汎用的なフレームワークの要素が強く、 特定の環境に対する操作(サーバーやVPN, ロードバランサーのCreate, Deleteなど)を実装することで、 環境ごとの差を吸収しています。
今回実装したcluster-api-provider-nifcloud
はこの部分に当たります。
利用方法
cluster-api-provider-nifcloud
を用いて、ニフクラ上にKubernetesクラスタを
作成するための手順を簡単に紹介します。
必要なツールや詳細な設定については、リポジトリを参照してください。
大きく分けて2つのステップがあります。
- Managementクラスタの構築・設定
- マニフェストを用いてニフクラ上にリソースの作成
具体的な手順をそれぞれ紹介します。手順自体は cluster-api-provider-nifcloud | Examplesに記載のとおりです。
Managementクラスタの構築・設定
ニフクラ上にグローバルIPが付与されたVMを作成しておき、そのVM上でManagementクラスタを作成していきます。
VMには kubectl, kustomize, golang, kindをあらかじめインストールしておきます。
Managementクラスタは既存のツールを用いることで、簡単に作成できます。 ここでは、kindを用いる方法を紹介します。
kind create cluster --name=clusterapi
ここからはクラスタの作成に必要な情報を作成していきます。
まず、ニフクラのコントロールパネルからSSHキーを作成し、作成したSSHキーの情報を環境変数に設定します。
export CLUSTER_API_SSH_KEY=<SSHキーを保存したファイルパス> export CLUSTER_API_PRIVATEKEY_PASS=<SSHキーのパスフレーズ> export SSH_KEY_NAME=<コントロールパネル上のSSHキーの名前> chmod 604 $CLUSTER_API_SSH_KEY
次に、cluster-api-provider-nifcloud
に必要な情報をManagementクラスタに登録します。
export NIFCLOUD_REGION=jp-east-1 export NIFCLOUD_ACCESS_KEY=<ニフクラのアクセスキー> export NIFCLOUD_SECRET_KEY=<ニフクラのシークレットキー>
上記で設定した環境変数の値を使って、マニフェストを生成・登録します。
git clone https://github.com/nifcloud-labs/cluster-api-provider-nifcloud.git cd cluster-api-provider-nifcloud ./examples/generator.sh make install kubectl apply -f examples/_out/provider-components.yaml
Managementクラスタにマニフェストを登録後、下記でControllerを起動します。
make run
ここまでで、cluster-api-provider-nifcloud
を利用する準備ができました。
マニフェストを用いてニフクラ上にリソースの作成
まず、Cluster
のマニフェストを用いて、
ニフクラ上にKubernetesクラスタを作成します。
マニフェストとは、Kubernetesリソースの構成を記述したファイルのことです。 ここでは、ニフクラ上に作成するクラスタについて以下のようなファイルを用意します。
apiVersion: cluster.x-k8s.io/v1alpha2 kind: Cluster metadata: name: capi spec: clusterNetwork: pods: cidrBlocks: ["192.168.0.0/16"] infrastructureRef: apiVersion: infrastructure.cluster.x-k8s.io/v1alpha2 kind: NifcloudCluster name: capi --- apiVersion: infrastructure.cluster.x-k8s.io/v1alpha2 kind: NifcloudCluster metadata: name: capi spec: region: jp-east-1
このファイルを先ほど用意したManagementクラスタに適用します。
kubectl apply -f cluster.yaml
すると、ニフクラ上にはファイアウォールや後程利用する付替IPが作成されます。
次に、ニフクラ上のクラスタにMachine
を作成します。
Cluster
の作成時と同様にマニフェストを用意します。
apiVersion: bootstrap.cluster.x-k8s.io/v1alpha2 kind: KubeadmConfig metadata: name: capi-controlplane-0 namespace: default spec: clusterConfiguration: apiServer: {} controllerManager: {} initConfiguration: nodeRegistration: kubeletExtraArgs: cloud-provider: external name: '{{ ds.meta_data.hostname }}' --- apiVersion: cluster.x-k8s.io/v1alpha2 kind: Machine metadata: labels: cluster.x-k8s.io/cluster-name: capi cluster.x-k8s.io/control-plane: "true" name: capi-controlplane-0 namespace: default spec: bootstrap: configRef: apiVersion: bootstrap.cluster.x-k8s.io/v1alpha2 kind: KubeadmConfig name: capi-controlplane-0 namespace: default infrastructureRef: apiVersion: infrastructure.cluster.x-k8s.io/v1alpha2 kind: NifcloudMachine name: capi-controlplane-0 namespace: default version: v1.17.0 --- apiVersion: infrastructure.cluster.x-k8s.io/v1alpha2 kind: NifcloudMachine metadata: name: capi-controlplane-0 namespace: default spec: imageID: '55395' instanceType: medium keyName: <コントロールパネル上のSSHキーの名前>
このファイルをManagementクラスタに適用します。
kubectl apply -f machine.yaml
すると、ニフクラ上にVMが作成されます。 さらにノードを1つ追加すると、コントロールパネルからはこのように確認することができます。
ここで作成されたVMは既にKubernetesとして動作しており、下記で接続することができます。
kubectl get secret capi-kubeconfig -o jsonpath='{.data.value}' | base64 -d > kubeconfig KUBECONFIG=./kubeconfig kubectl get nodes
マニフェストの設定値を変更することで、作成するクラスタのスペックや台数をコントロールできます。このように、Kubernetesクラスタの構築・管理をCluster APIによって自動化できることがわかりました。
今後の展望
2020年6月現在、v0.3.6がlatestとなっています。 2020年10月ごろにはv0.4がリリースされる予定で、 テスティングフレームワークやCLIツールの強化が組み込まれており、 プロバイダーの開発がより活発になることが期待されます。
最後に
cluster-api-provider-nifcloudの開発を通じて、 KubernetesのLifecycleやニフクラに関して様々な知識と経験を得ることができました。 今後OSSとしてアップデートされ続けるcluster-api-provider-nifcloudが幅広く活用されることを願っています。