Kubernetesクラスターの迅速なデプロイ:OpenStack上でのkops活用実践ガイド

Auto Draft

Kubernetesには多くのデプロイオプションがありますが、その中でもkopsは使いやすさと統合性の高さで際立っています。本記事ではkopsツールについて詳しく紹介し、実際の操作を通じてOpenStack環境でKubernetesクラスターを迅速に構築する方法を解説します。

kops とは何ですか?

kops(Kubernetes Operations)は、その名の通り、Kubernetesクラスターの運用・保守操作に特化したツールです。kopsの主な特徴は以下の通りです。

  • Kubernetesクラスターの作成、メンテナンス、アップグレード、削除をサポート
  • AWS、OpenStack/DigitalOcean(Beta)、Azure/GCP(Alpha)などの複数のクラウドプラットフォームをサポート
  • kopsを通じてクラスターのTerraformテンプレートを生成可能
  • Kubernetesクラスタープラグインの管理
  • Kubernetesクラスターのデプロイを自動化します。

kops 用語

ストレージ

ステートストア

STATE STOREは、kopsがデータを保存する場所を定義します。kopsが保存するデータには、クラスター仕様(cluster spec)、インスタンスグループ(instance group)、SSHキーなどが含まれます。

API

クラスタースペック

Cluster specは、クラスター自体に必要な仕様(specification)を定義します。例えば、クラスター内のDNS、ロードバランサー、etcdクラスターなどの情報です。

インスタンスグループ

Instance Groupは、実際のワーカーノード、マスターノード、etcdノードに関する情報を定義します。OpenStackを例に挙げると、作成される仮想マシンで使用されるフレーバー(flavor)やイメージ(image)などです。

クラウド

クラウド

The Cloudは、異なるクラウドプラットフォームに対して統一されたgolangインターフェースを定義しています。kopsは多くの異なるクラウド環境をサポートしているため、このインターフェースを利用して抽象化(abstraction)を行っています。

タスク

タスク(task)とは、クラウド環境に対する1つのAPIコールのことです。

モデル

Modelは、以前に定義されたクラスター仕様(cluster spec)の内容を実際のタスクに対応させるものです。
例えば、クラスター仕様でロードバランサーを定義した場合、loadbalancerモデルはそれを、実際にロードバランサーを作成するために必要な各種APIコールに対応させます。

kops のインストール

事前準備

kopsをインストールする前にkubectlをインストールする必要があります。インストール方法についてはこちらをご覧ください。公式ドキュメント

Homebrew を使用したインストール

brew update && brew install kops

公式にビルドされたリリース版を使用したインストール

Linux

curl -Lo kops https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64
chmod +x kops
sudo mv kops /usr/local/bin/kops

Mac

curl -Lo kops https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-darwin-amd64
chmod +x kops
sudo mv kops /usr/local/bin/kops

独自にコンパイル

自分でビルドする場合は、環境にgolangがインストールされていることを確認し、GOPATHとGOBINを適切に設定してください。

git clone git@github.com:kubernetes/kops.git
cd kops
make

ラボ:Kubernetes クラスターの構築

OpenStack 認証情報のダウンロード

Note

ロードバランサーの使用権限を有効にするには、管理者に連絡してください。

OpenStackダッシュボードの「アイデンティティ / アプリケーション認証情報」にアクセスし、右上の「新しいアプリケーション認証情報の作成」を選択します。

CNTUG Infra Labを例に挙げると、そのリンクはここにあります。 https://openstack.cloudnative.tw/identity/application_credentials/

作成が完了したら、「Download openrc file」をクリックします。これにより、シェルスクリプトファイルがダウンロードされます。

ダウンロード完了後、RCファイルの情報をシェルの環境変数に設定する必要があります。

source openrc.sh
export OS_DOMAIN_NAME=Default

kops STATE_STORE の設定

kopsではデータの保存先を設定する必要があります。これが前述のSTATE_STOREです。

Infra LabsではSwiftサービスが提供されているため、これを直接利用できます。

export KOPS_STATE_STORE=swift://kops

Kubernetes クラスターテンプレートの作成

次に、kopsを使用してクラスターのデータを作成します。コマンドを1行実行するだけの簡単な手順です:

Note

コマンド内の以下の部分を置き換えてください:

kops create cluster \
  --cloud openstack \
  --name <cluster_name>.k8s.local \
  --state ${KOPS_STATE_STORE} \
  --zones nova \
  --network-cidr 10.0.0.0/24 \
  --image Ubuntu-22.04 \
  --master-count=3 \
  --node-count=1 \
  --node-size m1.small \
  --master-size m1.small \
  --etcd-storage-type NVMe \
  --api-loadbalancer-type public\
  --topology private \
  --bastion \
  --ssh-public-key <ssh_key_path> \
  --networking calico \
  --os-ext-net public \
  --os-dns-servers=8.8.8.8,8.8.4.4 \
  --os-octavia=true \
  --os-octavia-provider=ovn

今回のラボでは、3つのマスター/etcdノードと1つのワーカーノードを含む、計4ノードのクラスターを構築します。

構成図は以下の通りです:

architecture

kops create cluster クラスターのスペックやインスタンスグループなどのデータが作成されます。次に、 kops update cluster を使用して、実際にKubernetesクラスターを構築します。

kops update cluster --name <cluster_name> --yes --admin

このとき、kopsはOpenStack APIの呼び出しを開始し、Kubernetesクラスターに必要なVM、ネットワーク、ディスク、ロードバランサーなどのリソースを作成します。完了後、クラスター全体が起動するまで5〜10分ほど待ちます。

このとき、新しく作成されたKubernetesクラスターの設定(config)は、 ~/.kube/config

Note

アップデート中に409エラーが発生し、OpenStackダッシュボード上でロードバランサーがPENDING_UPDATE状態になっている場合は、管理者に連絡してください。

Kubernetes クラスターの検証

最後に、Kubernetesクラスターのインストールが成功したことを確認できます。

kops validate cluster --wait 5m

以下のような出力が表示されます。


Validating cluster igene.k8s.local

INSTANCE GROUPS
NAME        ROLE    MACHINETYPE MIN MAX SUBNETS
bastions    Bastion m1.tiny     1   1   nova
master-nova-1   Master  m1.small    1   1   nova
master-nova-2   Master  m1.small    1   1   nova
master-nova-3   Master  m1.small    1   1   nova
nodes-nova  Node    m1.small    1   1   nova

NODE STATUS
NAME            ROLE    READY
master-nova-1-nvhtbc    master  True
master-nova-2-jgnhbo    master  True
master-nova-3-vllcwf    master  True
nodes-nova-yxorvl   node    True

Your cluster igene.k8s.local is ready

これで、 kubectl クラスターを操作できるようになります。

kops を使用してインストールされたクラスターには、デフォルトで cloud-provider-openstack Cinder CSI や Octavia Load Balancer などの機能が統合されています。

kubectl get csidrivers.storage.k8s.io
NAME                       ATTACHREQUIRED   PODINFOONMOUNT   STORAGECAPACITY   TOKENREQUESTS   REQUIRESREPUBLISH   MODES                  AGE
cinder.csi.openstack.org   true             true             false             <unset>         false               Persistent,Ephemeral   13h

Kubernetesクラスターの削除

kops は OpenStack 上に作成されたすべてのリソースを記録しているため、Kubernetes クラスターを削除してリソースを解放するのは非常に簡単で、コマンドを 1 行実行するだけです:

kops delete cluster <cluster_name> --yes

kops は OpenStack 上に作成されたすべてのリソースを削除します。

まとめ

今回のラボでは、kops を使用して OpenStack 上に完全な Kubernetes クラスターを構築する方法を解説しました。kops で構築されたクラスターは、 cloud-provider-openstack の関連機能も統合しており、ユーザーはクラスター内で直接 persistant volumeload balancer などの機能を利用できます。

今後の Kubernetes 関連のラボでも、この方法で Kubernetes クラスターを構築することをお勧めします。

付録

異なるフレーバーのインスタンスを追加

kops はインスタンスグループ(instance groups)を通じて、異なるフレーバーや数量のインスタンスを追加できます。

インスタンスグループの例は以下の通りです。

apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
  labels:
    kops.k8s.io/cluster: <cluster_name>.k8s.local
  name: nodes-nova-arm
spec:
  image: Ubuntu-22.04-aarch64
  machineType: a1.large
  maxSize: 1
  minSize: 1
  role: Node
  subnets:
  - nova

以下のコマンドを使用してインスタンスグループを作成し、クラスターを更新して新しいインスタンスを作成します。

cat ig.yaml | kops create -f -

kops update cluster --name <cluster_name>.k8s.local --yes --admin

新しいインスタンスが作成され、クラスターに追加されます。

参考文献

「Kubernetes クラスターの迅速なデプロイ:OpenStack 上での kops 活用ガイド」への1件の返信

  1. ProjectPM さんのコメント: 返信

    これこそが私の見たい質の高いコンテンツです。

コメントを残す