minikube ではじめるローカルk8s開発環境
はじめに
kubernetes (k8s) のローカル環境として有名な minikube でちょっと遊んでみます。
なお、 Macでの利用を想定しています。
minikube とは?
minikube is local Kubernetes, focusing on making it easy to learn and develop for Kubernetes.
特徴
- インストールが簡単
- 軽い
- 最新の k8s が利用可能
- addons あり
- ノード が docker の 1 コンテナとして起動する
類似のツール
-
Docker Desktop の kubernetes アドオン
https://docs.docker.com/docker-for-mac/#kubernetes
minikube インストール
Docker インストール
こちらを参考にDockerをインストールします。
kubectl インストール
$ brew install kubectl
$ kubectl version --client
minikube インストール
$ brew install minikube
$ minikube version
バージョン情報が出力されれば、成功です。
minikube コマンド
- 起動
$ minikube start
- ステータス
$ minikube status
- Node に ssh する。
$ minikube ssh
- 終了
$ minikube stop
minikube addons
$ minikube addons list
で addon 一覧が確認可能
- 例: dashboard
$ minikube dashboard
yaml と kubectl の基本
k8s について、少し記載します。(知っている方は飛ばしてください。)
yaml
k8s の yaml の構造は基本的に↓のようになっている。
-
apiVersion
: どのバージョンを利用するか? -
kind
: どの種類のオブジェクトを作成するか? -
metadata
: オブジェクトを一意に特定するための情報 -
spec
: オブジェクトを一意に特定するための情報
- 例
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- image: nginx
name: nginx
kubectl コマンド
kubectl コマンドを利用して、オブジェクトの参照・修正・適用・削除などができるようになっている。例えば、
-
kubectl get
: オブジェクトの一覧を表示する -
kubectl describe
: オブジェクトの詳細を確認する -
kubectl apply
: Yamlを適用して、オブジェクトを作成する -
kubectl delete
: オブジェクトを削除する
$ kubectl apply -f nginx.yaml
$ kubectl get pod
$ kubectl describe pod nginx
$ kubectl delete -f nginx.yaml
nginx on minikube
お試しで、 nginx を起動、ブラウザから確認してみたいと思います。
オブジェクト
重要なオブジェクトは3つだけ。
- Pod
- Deployment
- Service
実際は、 Deployment とServiceしか使いません。
Pod
Podは、アプリケーションのコンテナ(いくつかの場合においては複数のコンテナ)、ストレージリソース、ユニークなネットワークIP、およびコンテナの実行方法を管理するオプションをカプセル化します。Podはデプロイメントの単位、すなわちKubernetesのアプリケーションの単一インスタンス で、単一のコンテナまたは密結合なリソースを共有する少数のコンテナで構成される場合があります。
要は、1つ以上のコンテナの集合を Pod という。
Deployment
Deploymentにおいて_理想的な状態_ を記述すると、Deploymentコントローラーは指定された頻度で現在の状態を理想的な状態に変更します。
理想的な状態とはなにか?
どのようなPodをどこに、何個配置するという戦略(yaml)を維持してくれる。
- 例
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.19.1
name: nginx
ports:
- containerPort: 80
以下のコマンドで適用します。
$ kubectl apply -f nginx.yaml
Service
Podの集合で実行されているアプリケーションをネットワークサービスとして公開する抽象的な方法です。
Kubernetesでは、なじみのないサービスディスカバリーのメカニズムを使用するためにユーザーがアプリケーションの修正をする必要はありません。 KubernetesはPodにそれぞれのIPアドレス割り振りや、Podのセットに対する単一のDNS名を提供したり、それらのPodのセットに対する負荷分散が可能です。
要は、 複数のPod にアクセスするための入り口(Service)を作ってくれる。
ということで、Pod にアクセスできるようにしてみる。
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort
以下のコマンドで適用します。
$ kubectl apply -f service.yaml
確認
minikube service
コマンドでアクセスするURLが取得できます。
$ minikube service nginx-service --url
🏃 Starting tunnel for service nginx-service.
|-----------|---------------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|---------------|-------------|------------------------|
| default | nginx-service | | http://127.0.0.1:58630 |
|-----------|---------------|-------------|------------------------|
http://127.0.0.1:58630
❗ Because you are using a Docker driver on darwin, the terminal needs to be open to run it.
出力されたURL(上の例では、http://127.0.0.1:58630
)にアクセスすると、nginx のトップページが確認できます。
ローカルで開発
では、実際にローカル環境で開発するにはどうすればよいでしょうか。
都度、Container Registory に image をアップロードするのはめんどくさいので、
ローカルで build した image を利用できるようにします。
minikube 設定
$ eval $(minikube docker-env)
Dockerfile と Build
nginx に環境変数を設定して、それを適用してみます。
- Dockerfile を用意します。
FROM nginx
ENV HOGE FUGA
# Do something
- docker build
$ docker build -t foo/bar:v1 .
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
foo/bar v1 d588739b73b5 About a minute ago 133MB
...
deploy
先程の nginx.yaml を修正し、再度 apply します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: foo/bar:v1 # ここだけ変更
name: nginx
ports:
- containerPort: 80
$ kubectl apply -f nginx.yaml
設定が反映されているか確認します。
$ kubectl describe deployment nginx | grep Image
Image: foo/bar:v1
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-54b69c6595-cn8cd 1/1 Running 0 30s
nginx-54b69c6595-gd78k 1/1 Running 0 31s
$ kubectl exec -it nginx-54b69c6595-cn8cd -- env | grep FOO
FOO=BAR
大丈夫そうですね。
ということで、今回は minikube を紹介してみました。
Discussion