maya's blog

About programming, aws and ubuntu

Getting Started - Kubernetes with Minikube

minikubeを使ってローカルマシンにKubernetesクラスタを構築する

動作環境

$ lsb_release -a
LSB Version:    core-10.2019031300ubuntu1-noarch:security-10.2019031300ubuntu1-noarch
Distributor ID: Ubuntu
Description:    Ubuntu 19.04
Release:        19.04
Codename:       disco

主要コマンド

  • kubectl: Kubernetesクラスタ管理コマンド
  • minikube: ローカルにKubernetesクラスタを構築するためのコマンド 開発用途

Install kubectl

Install and Set Up kubectl - Kubernetes

  1. kubectl コマンドインストール

    以下のインストール方法がある

    • kubectl binaryをcurl等でパスの通った場所に置く

        $ curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
        $ chmox +x kubectl
        $ ./kubectl version
      
    • aptsnap 等のパッケージマネージャを利用

    今回はsnapで入れた

  2. kubectl コマンドの補完有効

    bash-completionを先にinstallする必要がある

     sudo sh -c 'kubectl completion bash >/etc/bash_completion.d/kubectl'
    

    exec ${SHELL} またはbashを再起動して確認

     $ kubectl [TAB]
     annotate       convert        expose         rollout
     api-resources  cordon         get            run
     api-versions   cp             kustomize      scale
     apply          create         label          set
     attach         delete         logs           taint
     auth           describe       options        top
     autoscale      diff           patch          uncordon
     certificate    drain          plugin         version
     cluster-info   edit           port-forward   wait
     completion     exec           proxy
     config         explain        replace
     $ kubectl
    

    ok

  3. クラスタ確認

     $ kubectl cluster-info dump
     The connection to the server localhost:8080 was refused - did you specify the right host or port?
    

    ローカルで稼働しているクラスタの情報を取得できる 今は kubectl をインストールしただけで、クラスタは立ち上げてないので The connection to the server localhost:8080 was refused を怒られている

Install minikube

Linux | minikube

  1. 動作環境の確認

     $ egrep -q 'vmx|svm' /proc/cpuinfo && echo yes || echo no
     yes
    
    • 物理マシンであれば yes が表示され、minikube のdriverにVirtualbox等の仮想マシンが使える
    • 既に仮想マシン上であれば no が表示され、None driverを使う必要がある
  2. minikube コマンドバイナリをダウンロード

     $ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube
    

    パスが通った場所に置きたければ

     $ sudo install minikube /usr/local/bin
    
  3. minikube の補完

    kubectl の補完同様bash-completionを先にinstallしておく

     $ sudo sh -c 'minikube completion bash > /etc/bash_completion.d/minikube'
    

Execute minikube

Quickstart

  1. ローカルにクラスタ立ち上げ

     $ minikube start
     😄  minikube v1.3.1 on Ubuntu 19.04
     💿  Downloading VM boot image ...
     minikube-v1.3.0.iso.sha256: 65 B / 65 B [--------------------] 100.00% ? p/s 0s
     minikube-v1.3.0.iso: 131.07 MiB / 131.07 MiB [-------] 100.00% 8.17 MiB p/s 17s
     🔥  Creating virtualbox VM (CPUs=2, Memory=2000MB, Disk=20000MB) ...
     🐳  Preparing Kubernetes v1.15.2 on Docker 18.09.8 ...
     💾  Downloading kubeadm v1.15.2
     💾  Downloading kubelet v1.15.2
     🚜  Pulling images ...
     🚀  Launching Kubernetes ...
     ⌛  Waiting for: apiserver proxy etcd scheduler controller dns
     🏄  Done! kubectl is now configured to use "minikube"
    
  2. クラスタ状態確認

     $ minikube status
     host: Running
     kubelet: Running
     apiserver: Running
     kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100
     $ kubectl cluster-info
     Kubernetes master is running at https://192.168.99.100:8443
     KubeDNS is running at https://192.168.99.100:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
    
     To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
    
  3. echoserver イメージから hello-minikube Deploymentを作成

     $ kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.10 --port=8080
     kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future ver    sion. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
     deployment.apps/hello-minikube created
    
  4. Deploymentにアクセスできるようにするため、hello-minikube DeploymentをServiceとしてexpose

     $ kubectl expose deployment hello-minikube --type=NodePort
     service/hello-minikube exposed
    
  5. hello-minikube Podが立ち上がっているか確認

     $ kubectl get pod
     NAME                              READY   STATUS    RESTARTS   AGE
     hello-minikube-856979d68c-zpx4m   1/1     Running   0          101s
    

    立ち上げ中であれば STATUSContainerCreating になっている

  6. exposeされたServiceの詳細

     $ curl $(minikube service hello-minikube --url)
    
    
     Hostname: hello-minikube-856979d68c-zpx4m
    
     Pod Information:
             -no pod information available-
    
     Server values:
             server_version=nginx: 1.13.3 - lua: 10008
    
     Request Information:
             client_address=172.17.0.1
             method=GET
             real path=/
             query=
             request_version=1.1
             request_scheme=http
             request_uri=http://192.168.99.100:8080/
    
     Request Headers:
             accept=*/*
             host=192.168.99.100:32703
             user-agent=curl/7.65.1
    
     Request Body:
             -no body in request-
    
  7. 後始末

     $ kubectl delete service hello-minikube
     service "hello-minikube" deleted
     $ kubectl delete deployments hello-minikube
     deployment.extensions "hello-minikube" deleted
     $ minikube stop
     ✋  Stopping "minikube" in virtualbox ...
     🛑  "minikube" stopped.
     $ minikube delete
     🔥  Deleting "minikube" in virtualbox ...
     💔  The "minikube" cluster has been deleted.
    

minikube start は何をしているのか

minikube start の挙動をみる

まず minikube start 時の標準出力ログをみる

😄  minikube v1.3.1 on Ubuntu 19.04
💿  Downloading VM boot image ...
minikube-v1.3.0.iso.sha256: 65 B / 65 B [--------------------] 100.00% ? p/s 0s
minikube-v1.3.0.iso: 131.07 MiB / 131.07 MiB [-------] 100.00% 8.17 MiB p/s 17s
🔥  Creating virtualbox VM (CPUs=2, Memory=2000MB, Disk=20000MB) ...
🐳  Preparing Kubernetes v1.15.2 on Docker 18.09.8 ...
💾  Downloading kubeadm v1.15.2
💾  Downloading kubelet v1.15.2
🚜  Pulling images ...
🚀  Launching Kubernetes ...
⌛  Waiting for: apiserver proxy etcd scheduler controller dns
🏄  Done! kubectl is now configured to use "minikube"
  1. VMイメージのダウンロード
  2. VM立ち上げ
  3. docker上にKubernetesクラスタを立ち上げ準備
    1. kubeadm, kubelet のダウンロード クラスタ作成するためのAPIコマンドかな Creating a single control-plane cluster with kubeadm - Kubernetes
    2. pull image
  4. Kubernetesクラスタ立ち上げ
  5. Kubernetes Componentsのapiserver proxy etcd scheduler controller dnsの設定?

多分こんな感じ このあたりはクラスタ構築を実際にやってみないとわからなさそう EC2やraspiでできるぽいので今後やる

VM内のdockerでKubernetesクラスタを構築していることはわかった VirtualBox開くと確かにインスタンスが立っている

VM内でもよくわからんけどコンテナ立っている

$ minikube ssh
# または
# ssh -i ~/.minikube/machines/minikube/id_rsa docker@$(minikube ip)
~/Downloads › minikube ssh
                         _             _
            _         _ ( )           ( )
  ___ ___  (_)  ___  (_)| |/')  _   _ | |_      __
/' _ ` _ `\| |/' _ `\| || , <  ( ) ( )| '_`\  /'__`\
| ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )(  ___/
(_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)

$ docker ps
CONTAINER ID        IMAGE                                 COMMAND                  CREATED             STATUS              PORTS               NAMES
217bc553123b        gcr.io/google-samples/gb-frontend     "apache2-foreground"     About an hour ago   Up About an hour                        k8s_php-redis_frontend-678d98b8f7-rrtpd_default_bd71f389-9422-4960-beeb-a923b86bc26d_0
163838ee78ba        gcr.io/google-samples/gb-frontend     "apache2-foreground"     About an hour ago   Up About an hour                        k8s_php-redis_frontend-678d98b8f7-ch747_default_fd3624b5-4c58-4f46-86cf-f3d117e4f58e_0
540d93cbc264        gcr.io/google-samples/gb-frontend     "apache2-foreground"     About an hour ago   Up About an hour                        k8s_php-redis_frontend-678d98b8f7-tlttl_default_6d88b0fb-001e-4723-9d0b-5099ac99f7f0_0
c4a15d7bf25e        k8s.gcr.io/pause:3.1                  "/pause"                 About an hour ago   Up About an hour                        k8s_POD_frontend-678d98b8f7-ch747_default_fd3624b5-4c58-4f46-86cf-f3d117e4f58e_0
57ed8565820b        k8s.gcr.io/pause:3.1                  "/pause"                 About an hour ago   Up About an hour                        k8s_POD_frontend-678d98b8f7-rrtpd_default_bd71f389-9422-4960-beeb-a923b86bc26d_0
897a4f242907        k8s.gcr.io/pause:3.1                  "/pause"                 About an hour ago   Up About an hour                        k8s_POD_frontend-678d98b8f7-tlttl_default_6d88b0fb-001e-4723-9d0b-5099ac99f7f0_0
b349b07cd314        gcr.io/google_samples/gb-redisslave   "docker-entrypoint.s…"   About an hour ago   Up About an hour                        k8s_slave_redis-slave-546fc99d45-96x44_default_4c2e8abc-2873-4a28-bd2b-e61627f6795e_0
ded489d7ea75        gcr.io/google_samples/gb-redisslave   "docker-entrypoint.s…"   About an hour ago   Up About an hour                        k8s_slave_redis-slave-546fc99d45-bz7r9_default_9592f279-261a-4fd7-96b1-54cc74b13a3e_0
...

まとめ

  • kubectl, minikube コマンドをインストールした
  • minikubeでローカルにKubernetesクラスタを構築した
  • k8s.gcr.io/echoserver:1.10 イメージからDeploymentを作成、exposeしService作成し疎通確認をした

References