ニフクラ ブログ

ニフクラやクラウドの技術について、エンジニアが語るブログです。

ニフクラ上でCluster APIによるKubernetesクラスタ構築ができるツールをリリースしました

こんにちは、富士通クラウドテクノロジーズでアルバイトをしている巨畠です。 おもに「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クラスタの作成や削除などにかかわる共通操作を 異なる環境で行えるようにします。

f:id:nifcloud-developers:20200602132735p:plain
cluster-api-provider-nifcloud

利用者の視点でCluster APIについて以下にまとめます。

  • Kubernetesクラスタを準備・管理する手間を短縮できる
  • アプリケーションの開発に集中できる
  • Kubernetesの運用知識が必要になるため、情報のキャッチアップに多少時間がかかる

cluster-api-provider-nifcloud

Cluster APIは汎用的なフレームワークの要素が強く、 特定の環境に対する操作(サーバーやVPN, ロードバランサーのCreate, Deleteなど)を実装することで、 環境ごとの差を吸収しています。

今回実装したcluster-api-provider-nifcloudはこの部分に当たります。

利用方法

cluster-api-provider-nifcloudを用いて、ニフクラ上にKubernetesクラスタを 作成するための手順を簡単に紹介します。 必要なツールや詳細な設定については、リポジトリを参照してください。

大きく分けて2つのステップがあります。

  1. Managementクラスタの構築・設定
  2. マニフェストを用いてニフクラ上にリソースの作成

具体的な手順をそれぞれ紹介します。手順自体は 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つ追加すると、コントロールパネルからはこのように確認することができます。

f:id:nifcloud-developers:20200602132910p:plain
cluster-api-provider-nifcloudで作成したKubernetesクラスタのVM

ここで作成された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が幅広く活用されることを願っています。