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ノードのクラスターを構築します。
構成図は以下の通りです:

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 volume 和 load 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
新しいインスタンスが作成され、クラスターに追加されます。


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