寝ても覚めてもこんぴうた

プログラム書いたり、ネットワーク設計したり、サーバ構築したり、車いじったり、ゲームしたり。そんなひとにわたしはなりたい。 投げ銭は kyash_id : chidakiyo マデ

Running Kubernetes Locally via Minikube をなぞってみた

URL : https://kubernetes.io/docs/setup/minikube/

MinikubeはKubernetesの以下の機能をサポートしているそうだ

  • DNS
  • NodePorts
  • ConfigMaps と Secrets
  • Dashboards
  • コンテナランタイム、Docker、rkt、CRI-O(デフォルトはDockerかな)
  • CNI(Container Network Interface)
  • Ingress

Minikubeのインストール

適当にこの辺を見つつインストール
https://kubernetes.io/docs/setup/minikube/

クイックスタート!

Minikubeはいくつかのドライバをサポートしているようですが、virtualboxが楽な気がします。おすすめ。

以下のコマンドでminikubeを起動します

$ minikube start

どうやら minikube start を実行すると kubectl にクレデンシャルが自動的に設定されるようです。
その他のクラスタを並行して触っている場合、勝手に変わっていることがあるので注意しましょう。
私はDocker for Mac上で KubernetesのContext切り替え機能でクラスタのクレデンシャルを切り変えています。

クラスタのクレデンシャルとは、k8sクラスタに接続する鍵です

上記 start コマンドを実行するとクレデンシャルが設定されるので以下のコマンドで確認してみます。

$ kubectl get nodes

以下のようにminikube nodeが見えるはずです

NAME       STATUS    ROLES     AGE       VERSION
minikube   Ready     master    8m        v1.10.0

ちなみに、kubectlコマンドの引数は以下のように省略することも可能です

$ kubectl get no

クイックスタートのとおりに hello-minikube をデプロイしてみる

$ kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.10 --port=8080

デプロイメント hello-minikube のポートをexposeする。

$ kubectl expose deployment hello-minikube --type=NodePort

Podが起動していることを確認してみる

$ kubectl get pods

ステータスが Running になっていればOK.

デプロイしたPodに以下のコマンドでアクセスできる。

$ curl $(minikube service hello-minikube --url)

IPアドレスは動的に変更され、以下のコマンドでも取得可能のようだ。(接続するためにはポートがわからないが)

$ minikube ip

サービスを削除する

$ kubectl delete services hello-minikube

デプロイメントを削除する

$ kubectl delete deployment hello-minikube

minikubeを停止する

$ minikube stop

その他のランタイムを使うためには

CRI-O

以下のコマンドでminikubeを起動する

$ minikube start \
    --network-plugin=cni \
    --container-runtime=cri-o \
    --bootstrapper=kubeadm

拡張版として使う場合には以下のようにする

$ minikube start \
    --network-plugin=cni \
    --extra-config=kubelet.container-runtime=remote \
    --extra-config=kubelet.container-runtime-endpoint=/var/run/crio.sock \
    --extra-config=kubelet.image-service-endpoint=/var/run/crio.sock \
    --bootstrapper=kubeadm

rkt

$ minikube start \
    --network-plugin=cni \
    --container-runtime=rkt

クラスタの管理

バージョンを指定してクラスタを起動する

minikubeがサポートしているバージョンは以下のコマンドで確認できる

$ minikube get-k8s-versions

バージョンを指定してk8sクラスタを起動するには以下のコマンドのようにする

$ minikube start --kubernetes-version v1.10.0

クラスタとの対話

minikubeはコンテキストを自動で設定するが(なるほどやはり)手動で設定するには以下のコマンドを利用する

$ kubectl config use-context minikube

ダッシュボード

ダッシュボードを起動するには以下のコマンドを実行する

$ minikube dashboard

ノードポートを利用して公開しているサービスのURLを得るには以下のコマンドを利用する

$ minikube service [-n NAMESPACE] [--url] NAME

$ minikube service hello-minikube --url

例2
直接ブラウザを開く場合には --url を省略する

$ minikube service hello-minikube

Network

アクセスできるIPを取得するには minikube ip が利用できる。

ポートを取得したい場合には

$ kubectl get service hello-minikube --output='jsonpath="{.spec.ports[0].nodePort}"'

のような形で取得できる

Persistent Volumes

Minikubeでは hostPath と呼ばれるタイプのPersistentVolumesがサポートされている
これは、Minikube VM内のディレクトリにPersistentVolumeとしてマップされる。

Minikube VMはtmpfsで起動するのでほとんどのディレクトリは永続化されない(再起動で消える)
以下のディレクトリだけは永続化できる

/data
/var/lib/localcube
/var/lib/docker

dataディレクトリに永続化するためのPersistentVolume設定は以下のようになる

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv0001
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 5Gi
  hostPath:
    path: /data/pv0001/

ところどころ端折ってるけどこんな感じ。