- 鈴木崇史
- 約 1,800 文字
- 4,300 View
目次
k8s学習環境が欲しい
こんにちはTIG鈴木です。
以前チームの輪読会でKuberntes完全ガイド(以下k8s本)を読みました。 k8s本は、GKEを例にしながら、k8sのCLIツールだったりマニフェストのyamlファイルを丁寧に紹介しており、実践的に勉強するの適しています。
そのため、手を動かしつつ勉強したいところですが、クラウドプロバイダーが提供するマネージドk8sはコストが高めで気分的にほいほい使えないところがあります。となるとローカル環境でk8sを用意したくなります。
k8s完全ガイドではminikubeだったりkindだったりが紹介されています。
ローカル環境もそれなりにめんどくさい
ところがminikubeだとGKEとは使い勝手が違っていて、k8s本通りに検証できない部分があり、初学者の私は混乱してしまいました。
ということで、私がひっかかったポイント(おもにServiceまわり)を踏まえて、k8s学習を進めるためのいくつかTipsを紹介します。
minikubeとは
ローカルk8sクラスタを簡単に構築できる定番のツールです。DockerやVirtualBoxで仮想マシンが立ち上がりその上にk8sが構築されます。
下の様にオプションなしで起動した場合、筆者環境ではDockerコンテナとして起動します。デフォルトでは1 nodeで構築されます。
minikube start |
Serviceまわり
NodePortは<ノードのIP>:< Port >への通信をPodに転送する形で、アプリケーションの外部疎通性を確保するリソースです。
kubectl create deployment test-deployment --image=nginx |
上記Deploymentにアクセスするには、ノードのIPアドレスを調べる必要があります。minikubeではコマンドが用意されており、minikube ip で調べられます。 実態はminikubeノードとして起動しているDockerコンテナのアドレスです。
minikube ip |
curlをしてみれば、疎通できることがわかります。
curl 192.168.49.2:31307 |
LoadBalancerを使う場合はminikube tunnel で EXTERNAL-IPを払い出し、ホストサーバからEXTERNAL-IPへルートを確保します。
kubectl expose deployment test-deployment --type=LoadBalancer --port=80 |
curl 10.108.139.68:80 で疎通が確認できます。
Ingress
Ingressを使う場合は、Ingressコントローラをデプロイする必要があります。
minikubeではそのためのaddonが用意されています。
minikube addons enable ingress |
以下のマニフェストでingressを作成してみます。
apiVersion: networking.k8s.io/v1 |
kubectl apply -f ing.yaml |
下のようにIngressが作成されたことがわかります。 ADDRESS に対してリクエストを送ればアプリケーションにアクセスできます。
kubectl get ingress |
ingress-dns addonを使えば、Ingressで設定したホスト名をホストサーバから解決できるらしいです。ちょっと試せていないですが、参考までに。
Horizontal Pod Autoscaler
Horizontal Pod Autoscaler(HPA)はCPUやメモリ消費に基づいてPodをスケールさせる機能です。HPAを使うためには、Podの消費するリソースをmetricsとして取得できる必要があります。minikubeではaddonとしてmetrics-serverを有効化します。
minikube addons enable metrics-server |
metrics-serverを有効化したので、kubectl top でpodのリソース消費を確認できます。
kubectl top pod test-nginx |
この状態であれば、HPAのチュートリアルで、HPAが機能することを確認できます。
Multi-Node Clusterとスケジューリング
minikubeはデフォルトで1 nodeで起動します。なのでそのままでは、Node AffinityやPod Affinityなど高度なスケジューリング機能の検証ができません。
ですが、minikubeでは--nodes オプションで複数ノードでクラスタを作成可能です。
minikube start --nodes 2 |
下のマニフェストでPod Anti Affinityを使ってみます。このDeploymentでは2つのPodが作成されますが、別々のノードに配置される設定になっています。
apiVersion: apps/v1 |
Podが異なるノードに配置されていることがわかります。
kubectl get pods -o wide |
まとめ
minikubeでk8sを学習していく際のTipsをご紹介しました。minikube以外にもmicrok8s, kindなどローカルk8sクラスタ構築ツールの選択肢はありますし、VMとkubeadmで構築するのも勉強になると思います。
入門者のお役に立てれば幸いです!