LoginSignup
1

More than 3 years have passed since last update.

HelloMinikubeでk8sのお勉強

Last updated at Posted at 2019-10-19

Kubernetesはじめました

世間的には結構前から話題になっていますが、仕事でこれから少しKubernetesをさわることになるため、ただいま必死こいて勉強中です。自宅でもKubernetesを勉強したいですが、なんせ使っているMacBookAirが弱小なので・・・お手軽だと噂のMinikubeを試してみました。

勉強するにあたり、以下の本を数日前に購入し、サラーっと最後まで読みましたが、
Kubernetesってカバー範囲が広いし、ほんと奥が深いのね・・・。

Minikubeとは?

WindowsやMacなど手元のマシン上にローカルKubernetesを簡単に構築・実行することが出来るツールです。手軽な反面、Kubernetesの一部機能が使えないなどの制約があります。
MinikubeはVMにMasterとNodeを立てるので、VirtualBoxやHyper-Vなどのハイパーバイザーが必要になります。

my環境

  • MacBook Air (13-inch, Mid 2012)
    • OS : macOS Catalina(10.15)
    • プロセッサ : 1.8 GHz デュアルコアIntel Core i5
    • メモリ : 4 GB 1600 MHz DDR3
    • ディスク : 128GB (外部ストレージ : 1TB)
ツール バージョン
VirtualBox 6.0.12 r133076 (Qt5.6.3)
Kubernetes v1.16.0
Docker 18.09.9
Minikube v1.4.0 on Darwin 10.15
kubectl (Client) v1.10.3 → v1.16.0
kubectl (Server) v1.16.0

絵にすると多分こんな感じだと思います。
名称未設定.png

Kubernetesでは、コンテナ(Pod)が稼働するNodeと、コンテナのスケジューリングなどKubernetesを管理するMasterはそれぞれ別ノード(サーバ)で動かしますが、Minikubeでは1つのVM内に両方が稼働しています。

それぞれのノードは複数のコンポーネントから構成されており、VM内ではそれらがDockerコンテナとして稼働しています。コンポーネント詳細については公式ドキュメントなどを参考にして見てください。

Hello Minikubeやってみた

Hello MinikubeをベースにMinikubeと戯れてみました。

0. 事前準備

  • Homebrewをアップデート
$ brew update
  • VirtualBoxをインストール
$ brew cask install virtualbox

1. Minikubeをインストール

$ brew cask install minikube

2. Minikubeを起動

$ minikube start --vm-driver=virtualbox

😄  minikube v1.4.0 on Darwin 10.15
💡  Tip: Use 'minikube start -p <name>' to create a new cluster, or 'minikube delete' to delete this one.
🔄  Starting existing virtualbox VM for "minikube" ...
⌛  Waiting for the host to be provisioned ...
🐳  Preparing Kubernetes v1.16.0 on Docker 18.09.9 ...
💾  Downloading kubelet v1.16.0
💾  Downloading kubeadm v1.16.0
🔄  Relaunching Kubernetes using kubeadm ... 
⌛  Waiting for: apiserver proxy etcd scheduler controller dns
🏄  Done! kubectl is now configured to use "minikube"

VirtualBoxでminikubeというVMが作られました。

スクリーンショット 2019-10-11 22.53.15.png

Kubernetesと同じ画面がMinikubeにもついています。
いわゆるdashboardというやつです。

$ minikube dashboard
🤔  Verifying dashboard health ...
🚀  Launching proxy ...
🤔  Verifying proxy health ...
🎉  Opening http://127.0.0.1:50668/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...

ブラウザが自動起動し画面が表示されました。まだ見方がさっぱりん...

スクリーンショット 2019-10-11 23.08.56.png

3. Developmentを作成

まずは、コンテナ(Development)を起動します。

$ kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node

error: no matches for kind "Deployment" in version "extensions/v1beta1"

ん・・・!?エラーになった。
extensions/v1beta1というバージョンにはDeploymentがないと言っている!?
めちゃくちゃググったけどそれっぽい情報が全然HITせず...

試しにkubectlのバージョンを調べてみる。

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.3", GitCommit:"2bba0127d85d5a46ab4b778548be28623b32d0b0", GitTreeState:"clean", BuildDate:"2018-05-21T09:17:39Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.0", GitCommit:"2bd9643cee5b3b3a5ecbd3af49d09018f0773c77", GitTreeState:"clean", BuildDate:"2019-09-18T14:27:17Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}

クライアントのkubectlが古そうなので、バージョンアップしてみる。

$ curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.16.0/bin/darwin/amd64/kubectl
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin/kubectl
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.0", GitCommit:"2bd9643cee5b3b3a5ecbd3af49d09018f0773c77", GitTreeState:"clean", BuildDate:"2019-09-18T14:36:53Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.0", GitCommit:"2bd9643cee5b3b3a5ecbd3af49d09018f0773c77", GitTreeState:"clean", BuildDate:"2019-09-18T14:27:17Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}

クライアントもサーバと同じv1.16.0になったので、改めてコマンドを実施してみる。

$ kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node
deployment.apps/hello-node created

おっ!今度は出来たっぽい! (ここまでたどり着くのにかなりの時間を要してしまいました...)

$ kubectl get deployments
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
hello-node   1/1     1            1           27m

ダッシュボードで見ると、Deployment、Pod、ReplicaSetが作られています。

スクリーンショット 2019-10-16 23.50.50.png

Podというのがコンテナの実体で、ReplicaSetはPodの監視を行い指定されたレプリカ数になるように調整をしてくれます。さらに、DeploymentがReplicaSetを管理し、ローリングアップデートやロールバックを実現してくれます。

少しややこしいですが、、DeploymentがReplicaSetを管理し、ReplicaSetがPodを管理する3層の親子関係になっています。

4. Serviceを作成

作成したコンテナへアクセスできるように、ネットワーク(Service)を作成します。

$ kubectl expose deployment hello-node --type=LoadBalancer --port=8080
service/hello-node exposed

出来たServiceを確認します。

$ kubectl get services
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
hello-node   LoadBalancer   10.110.214.34   <pending>     8080:30341/TCP   99s
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP          5d

今回作成したLoadBalancerサービスは、Kubernetesクラスタ外のLoadBalancerに外部疎通性のある仮想IPを払い出しますが、クラスタが構築されているインフラがこの仕組みに対応している必要があります。

GCPやAWSなどのクラウドサービスでKubernetesを使うケースではほぼ対応していますが、今回のようにローカルで立ち上げるケースでは残念ながら対応していないことが多いので仮想IPは払い出されません。EXTERNAL-IPはずっと<pending>のままです。

LoadBalancerサービスを作成すると、同時にClusterIPNodePortも同時に作成されます。
ClusterIPというのは、コンテナ内からの通信に利用されるIPで、クラスタ内からしか接続できません。今回は「10.110.214.34」というIPが振り出されています。
NodePortは、外部からのアクセスを受け付けるために振り出されるポート番号で、今回は「30341」です。もしLoadBalancerサービスがうまく機能すれば、イメージ的にはクラスタ外のLoadBalancerからNodePort宛にバランシングされる感じです。

5. 画面を表示

minikube serviceを使ってサービスを起動します。

$ minikube service hello-node
|-----------|------------|-------------|-----------------------------|
| NAMESPACE |    NAME    | TARGET PORT |             URL             |
|-----------|------------|-------------|-----------------------------|
| default   | hello-node |             | http://192.168.99.101:30341 |
|-----------|------------|-------------|-----------------------------|
🎉  Opening kubernetes service  default/hello-node in default browser...

スクリーンショット 2019-10-17 0.03.01.png

ブラウザが自動起動して「Hello World!」が表示されました。
URLの192.168.99.101:30341は「VMのアドレス:NodePort」です。

参考までに、MinikubeのVMからもClusterIPを使ってアクセスしてみます。
minikube sshを使えばノードにssh接続出来ます。便利ですね。

$ minikube ssh
                         _             _            
            _         _ ( )           ( )           
  ___ ___  (_)  ___  (_)| |/')  _   _ | |_      __  
/' _ ` _ `\| |/' _ `\| || , <  ( ) ( )| '_`\  /'__`\
| ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )(  ___/
(_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)

$ curl 10.110.214.34:8080
Hello World!

おぉ〜!ちゃんとアクセス出来ましたね。

ここまで構築した環境を図にまとめてみました。こんな感じかな。

qiita投稿用 (1).png

6. クリーンアップ

最後に作成したServiceとDeploymentを削除します。

$ kubectl delete service hello-node
service "hello-node" deleted
$ kubectl delete deployment hello-node
deployment.apps "hello-node" deleted

おしまい。

最後に

なかなか自前の環境でKubernetesを動かすのは難しいので、手軽に触ってみるという意味でMinikubeは最適ですね。Hello Minikubeはサンプルとは言いながらも1つ1つが何をしているのか、どういう構成を構築しているのかを理解しようと思うと結構大変でした。KubernetesはDockerやる上でほぼデファクトなので、色んなコマンドを試しつつ引き続き勉強に励みたいと思います。

おまけ

上記インストールしなくても、Hello MinikubeのサイトではWeb上でMinikubeを試せるKatacodaというサービスも提供されているので、よりお手軽に試せるのでそちらもオススメです。ひと昔前と比べるとやる気さえあれば誰でも勉強しやすい環境になりましたよね。

参考リンク

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1