💻

minikube ではじめるローカルk8s開発環境

2020/09/27に公開

はじめに

kubernetes (k8s) のローカル環境として有名な minikube でちょっと遊んでみます。
なお、 Macでの利用を想定しています。

minikube とは?

https://minikube.sigs.k8s.io/

minikube is local Kubernetes, focusing on making it easy to learn and develop for Kubernetes.

特徴

  • インストールが簡単
  • 軽い
  • 最新の k8s が利用可能
  • addons あり
  • ノード が docker の 1 コンテナとして起動する

類似のツール

minikube インストール

Docker インストール

こちらを参考にDockerをインストールします。
https://docs.docker.com/docker-for-mac/install/

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

https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/

yaml と kubectl の基本

k8s について、少し記載します。(知っている方は飛ばしてください。)

yaml

k8s の yaml の構造は基本的に↓のようになっている。

  • apiVersion: どのバージョンを利用するか?
  • kind: どの種類のオブジェクトを作成するか?
  • metadata: オブジェクトを一意に特定するための情報
  • spec: オブジェクトを一意に特定するための情報

https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/kubernetes-objects/

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

https://kubernetes.io/ja/docs/concepts/workloads/pods/pod-overview/

Podは、アプリケーションのコンテナ(いくつかの場合においては複数のコンテナ)、ストレージリソース、ユニークなネットワークIP、およびコンテナの実行方法を管理するオプションをカプセル化します。Podはデプロイメントの単位、すなわちKubernetesのアプリケーションの単一インスタンス で、単一のコンテナまたは密結合なリソースを共有する少数のコンテナで構成される場合があります。

要は、1つ以上のコンテナの集合を Pod という。

Deployment

https://kubernetes.io/ja/docs/concepts/workloads/controllers/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

https://kubernetes.io/ja/docs/concepts/services-networking/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