May 21, 2017

Kubernetes (ㄧ):Run Kubernetes Locally

前一陣子想了解 kubernetes,所以就註冊了 Google Cloud Platform,練習了一下,雖然現在註冊就送 300 美,但在熟悉這些名詞與相關的關係之前,總是會頻繁的新增 cluster 與砍 cluster,某天在逛 awesome-kubernetes 發現了 minikube 這個能在 local 端執行 kubernetes 的工具,簡直開心。在這邊就簡單的介紹一下 minikube 的使用方式。

前置作業

  1. 在 macOS 上,可以很方便的透過 brew 來安裝。
$ brew cask install minikube
  1. 安裝 Google Cloud SDK。
$ curl https://sdk.cloud.google.com | bash
$ gcloud init
  1. 透過剛安裝好的 Google Cloud SDK 來安裝 kubernetes。
$ gcloud components install kubectl

以上前置作業就大概完成,可以檢查 minikube 是否能正確啟動。其實就是開個 VM 環境來當作測試的環境。

$ minikube start
Starting local Kubernetes cluster...
Kubectl is now configured to use the cluster.

minikube 實際上就是建立一台虛擬機器,預設是使用 VirtualBox。在 macOS 上另外還支援 xhyve driver 以及 VMware Fusion。

KeLgTBg

Project 練習

前置作業都完成後,就進入這次練習的目標,透過使用 node.js 寫個 application,並且使用 Docker build 出 images,然後透過 kubernets 來管理。

建立 Cluster

minikube start 指令會建立一個預設名稱為 minikube 的 kubectl context。

$ minikube start

由於我們是在 local 練習,就先將 kubectl 要操作的目標 context 切換為 minikue

$ kubectl config use-context minikube

如果不做切換的話,也是可以在下指令的時候去指定對哪個 context 做操作

$ kubectl get pods --context=minikube

建立簡單的 Node.js Application

var http = require('http');

var handleRequest = function(request, response) {
  response.writeHead(200);
  response.end('Hello World!');
};
var www = http.createServer(handleRequest);
www.listen(8080);

建立 Docker Container Image

建立 Dockerfile

FROM node:6.9.2
EXPOSE 8080
COPY server.js .
CMD node server.js

在這邊產生出來的 images,因為只是單純在 local 環境跑,所以不需要將 image push 到例如 google cloud container registry 中。在這邊是讓 minikube 中的 docker daemon 就直接使用 local 端的 docker daemon。

$ eval $(minikube docker-env)

接著 build Docker image,並且加上 hello-node:v1 的 tag。

$ docker build -t hello-node:v1 .
$ docker images
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
hello-node                                            v1                  26c151489537        1 minutes ago       655MB

建立 Deployment

Deployment 主要的功用是負責管理 Pod,監控著每個 Pod 的運作狀態並且確保指定數量的 Pod 正常運行,不過先不要碰到太複雜的設定,只先建立一個 Pod,而這個 Pod 是基於剛剛 build 出來的 Docker image。

$ kubectl run hello-node --image=hello-node:v1 --port=8080

檢查 deployment 是否正確建立。

$ kubectl get deployments

NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-node   1         1         1            1           23s

也可透過 minikube dashborad 來看是否有新增成功

Dashborad 畫面

建立 Service

Service 負責定義如何去存取 Pods,簡單的來說就是能將外部流量導入 Pod 中。

$ kubectl expose deployment hello-node --type=LoadBalancer
$ kubectl get services

NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGE
hello-node   10.0.0.171   <pending>     8080:32229/TCP   1m
kubernetes   10.0.0.1     <none>        443/TCP          7d

到目前為止,所有設定已完成,只要再透過 minikube 跑下面指令,就能透過定義好的 service 來提供對外存取的入口點。

最後使用以下指令,瀏覽器就會自動開啟新的分頁,顯示 Node.js Application 的內容。

$ minikube service hello-node

  1. DevOps 學習 Kubernetes 筆記之一: 透過單機版的 Kubernetes (miniKube) 來玩 K8S
  2. Getting started with Kubernetes
  3. Kubernetes Community Resources