kakakakakku blog

Weekly Tech Blog: Keep on Learning!

kind を使って Feature Gates を有効化した Kubernetes クラスターを構築する

Mac のローカル環境で Kubernetes の検証をするときに,お手軽な Docker Desktop for Mac "Edge" を使っている.Feature Gates を有効化した Kubernetes クラスターで検証をするときは minikube--feature-gates オプションを指定して使うこともある.

kind 🐳

f:id:kakku22:20201001135956p:plain
kubernetes-sigs/kind: Kubernetes IN Docker - local clusters for testing Kubernetes より引用

「Kubernetes 完全ガイド 第2版」を読んでいたら,ローカル環境に Kubernetes クラスターを構築するツールの選択肢として kind が追加されていた.kind を使うと,Docker コンテナを Kubernetes ノードとして Kubernetes クラスターを構築し,簡単に「マルチノード構成」を実現できる.今回は kind を試す.

github.com

今回 kind のベースとして使う Docker Desktop for Mac "Edge" では「Kubernetes 設定」を無効化した.また,ドキュメントには Docker Desktop のメモリを「6GB ~ 8GB」確保すると書いてある.今回は Mac のリソース的に厳しいため,少ないけど「4GB」にした.

Mac に kind をインストールする 🐳

まず Homebrewkind をインストールする.ドキュメントは以下にまとまっている.

$ brew install kind

$ kind version
kind v0.9.0 go1.15.2 darwin/amd64

Kubernetes クラスターを構築する 🐳

kind では kind create cluster コマンドを使えば,簡単に Kubernetes クラスターを構築することができる.さらに「configuration file(設定ファイル)」に Kubernetes クラスター構成を記述することもできる.今回は「1 コントロールプレーン」「3 データプレーン」「マルチノード構成」で構築するため,YAML を以下のように作成した.

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker

作成した設定ファイル kind-config.yaml を指定して kind create cluster コマンドを実行すると,以下のように簡単に Kubernetes クラスターを構築できた.今回インストールした kind v0.9.0 を使うと,デフォルトでは Kubernetes v1.19.1 になる.

$ kind create cluster --config kind-config.yaml
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.19.1) 🖼
 ✓ Preparing nodes 📦 📦 📦 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
 ✓ Joining worker nodes 🚜
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Thanks for using kind! 😊

コンテキストは自動的に kind-kind に切り替わっていた.そして,設定ファイルに記述した通り「マルチノード構成」になっている.便利!

$ kubectl config get-contexts
CURRENT   NAME             CLUSTER          AUTHINFO         NAMESPACE
          docker-desktop   docker-desktop   docker-desktop
*         kind-kind        kind-kind        kind-kind

$ kubectl config current-context
kind-kind

$ kubectl get nodes
NAME                 STATUS   ROLES    AGE   VERSION
kind-control-plane   Ready    master   13m   v1.19.1
kind-worker          Ready    <none>   12m   v1.19.1
kind-worker2         Ready    <none>   12m   v1.19.1
kind-worker3         Ready    <none>   12m   v1.19.1

構築した Kubernetes クラスターを削除する場合は kind delete cluster コマンドを使う.

$ kind delete cluster
Deleting cluster "kind" ...

バージョン指定で Kubernetes クラスターを構築する 🐳

次に Kubernetes v1.19.1 ではなく Kubernetes v1.18.8 で Kubernetes クラスターを構築していく.設定ファイルに image フィールドを追加するとバージョンを指定できる.指定する「イメージ名」「タグ名」は GitHub の Releases に載っている.

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  image: kindest/node:v1.18.8@sha256:f4bcc97a0ad6e7abaf3f643d890add7efe6ee4ab90baeb374b4f41a4c95567eb
- role: worker
  image: kindest/node:v1.18.8@sha256:f4bcc97a0ad6e7abaf3f643d890add7efe6ee4ab90baeb374b4f41a4c95567eb
- role: worker
  image: kindest/node:v1.18.8@sha256:f4bcc97a0ad6e7abaf3f643d890add7efe6ee4ab90baeb374b4f41a4c95567eb
- role: worker
  image: kindest/node:v1.18.8@sha256:f4bcc97a0ad6e7abaf3f643d890add7efe6ee4ab90baeb374b4f41a4c95567eb

同じように kind create cluster コマンドを実行すると,今度は Kubernetes v1.18.8 で Kubernetes クラスターを構築できた.

$ kind create cluster --config kind-config.yaml
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.18.8) 🖼
 ✓ Preparing nodes 📦 📦 📦 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
 ✓ Joining worker nodes 🚜
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Have a nice day! 👋

$ kubectl get nodes
NAME                 STATUS   ROLES    AGE   VERSION
kind-control-plane   Ready    master   13m   v1.18.8
kind-worker          Ready    <none>   12m   v1.18.8
kind-worker2         Ready    <none>   12m   v1.18.8
kind-worker3         Ready    <none>   12m   v1.18.8

もう1度 Kubernetes クラスターを削除しておく.

$ kind delete cluster
Deleting cluster "kind" ...

Feature Gates を有効化して Kubernetes クラスターを構築する 🐳

最後は Feature Gates を有効化して Kubernetes クラスターを構築する.

kubernetes.io

今回は Kubernetes v1.18 (Alpha) で使えるようになった「Immutable ConfigMaps 機能(ConfigMap の値を更新できなくする)」を試す.

kubernetes.io

Feature Gates を有効化する場合,以下のように設定ファイルに featureGates を記述して ImmutableEphemeralVolumes など「Feature Gates 名」true にする.簡単!サンプルを検索すると kubeadmConfigPatches を記述する例も載っていたけど,今はもっと簡単に記述できるようになっていた.

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  image: kindest/node:v1.18.8@sha256:f4bcc97a0ad6e7abaf3f643d890add7efe6ee4ab90baeb374b4f41a4c95567eb
- role: worker
  image: kindest/node:v1.18.8@sha256:f4bcc97a0ad6e7abaf3f643d890add7efe6ee4ab90baeb374b4f41a4c95567eb
- role: worker
  image: kindest/node:v1.18.8@sha256:f4bcc97a0ad6e7abaf3f643d890add7efe6ee4ab90baeb374b4f41a4c95567eb
- role: worker
  image: kindest/node:v1.18.8@sha256:f4bcc97a0ad6e7abaf3f643d890add7efe6ee4ab90baeb374b4f41a4c95567eb
featureGates:
  ImmutableEphemeralVolumes: true

Feature Gates を有効化して,もう1度 Kubernetes クラスターを構築する.

$ kind create cluster --config kind-config.yaml
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.18.8) 🖼
 ✓ Preparing nodes 📦 📦 📦 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
 ✓ Joining worker nodes 🚜
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Have a nice day! 👋

次に immutable フィールドを含めた ConfigMap マニフェストを作成する.

apiVersion: v1
kind: ConfigMap
metadata:
  name: immutable-configmap
data:
  name: kakakakakku
immutable: true

マニフェストを適用する.

$ kubectl apply -f immutable-configmap.yaml
configmap/immutable-configmap created

今度はマニフェストを修正して kakakakakkuKAKAKAKAKKU にする.

apiVersion: v1
kind: ConfigMap
metadata:
  name: immutable-configmap
data:
  name: KAKAKAKAKKU
immutable: true

もう1度マニフェストを適用しようとすると,immutable フィールドによってエラーになった.Kubernetes v1.18ImmutableEphemeralVolumesFeature Gates が適切に有効化されていることが確認できた.

$ kubectl apply -f immutable-configmap.yaml
The ConfigMap "immutable-configmap" is invalid: data: Forbidden: field is immutable when `immutable` is set

まとめ 🐳

「Kubernetes 完全ガイド 第2版」に載っていた kind を使って,Kubernetes クラスターを構築してみた.簡単に「マルチノード構成」を実現できるし,設定ファイルに Kubernetes クラスター構成を記述できるのも便利だった.今後は kind を使っていく!

Kubernetes完全ガイド 第2版 impress top gearシリーズ

Kubernetes完全ガイド 第2版 impress top gearシリーズ

  • 作者:青山真也
  • 発売日: 2020/08/17
  • メディア: Kindle版