跳到主要內容

使用 minikube 輕鬆上手 kubernetes

安裝minikube


macOS只需要透過brew即可快速安裝...

brew cask install minikube

Linux環境可以直接下載執行檔,放到環境變數可以吃到的路徑即可...

curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && \
chmod +x minikube && \
sudo mv minikube /usr/local/bin/

Windows的下載網址如下:

如果您的kubectl尚未安裝,可以直接使用google cloud sdk來安裝:

curl https://sdk.cloud.google.com | bash
gcloud components install kubectl

安裝完成後,原則上minikube會在本地端加入minikube的k8s context,我們可以透過下面指令來使用該context…

kubectl config use-context minikube

然後,可檢查一下您的minikube node是否正常運作....

$ kubectl get node -o wide
NAME       STATUS    AGE       VERSION   EXTERNAL-IP   OS-IMAGE            KERNEL-VERSION
minikube   Ready     2d        v1.7.5            Buildroot 2017.02   4.9.13

基本使用

由於這邊主要介紹minikube,先暫時不介紹kubernetes的概念與操作... 有需要可以先切換到kubernetes的基本篇來看看^^

在minikube中,有提供一些不錯的工具,可以供您操作minikube的環境... 我們可以用minikube help來檢視可以使用的指令...

$ minikube help
Minikube is a CLI tool that provisions and manages single-node Kubernetes clusters optimized for development workflows.

Usage:
 minikube [command]

Available Commands:
 addons           Modify minikube's kubernetes addons
 completion       Outputs minikube shell completion for the given shell (bash)
 config           Modify minikube config
 dashboard        Opens/displays the kubernetes dashboard URL for your local cluster
 delete           Deletes a local kubernetes cluster
 docker-env       Sets up docker env variables; similar to '$(docker-machine env)'
 get-k8s-versions Gets the list of available kubernetes versions available for minikube
 ip               Retrieves the IP address of the running cluster
 logs             Gets the logs of the running localkube instance, used for debugging minikube, not user code
 mount            Mounts the specified directory into minikube
 profile          Profile sets the current minikube profile
 service          Gets the kubernetes URL(s) for the specified service in your local cluster
 ssh              Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'
 ssh-key          Retrieve the ssh identity key path of the specified cluster
 start            Starts a local kubernetes cluster
 status           Gets the status of a local kubernetes cluster
 stop             Stops a running local kubernetes cluster
 update-context   Verify the IP address of the running cluster in kubeconfig.
 version          Print the version of minikube

Flags:
     --alsologtostderr                  log to standard error as well as files
 -b, --bootstrapper string              The name of the cluster bootstrapper that will set up the kubernetes cluster. (default "localkube")
     --log_backtrace_at traceLocation   when logging hits line file:N, emit a stack trace (default :0)
     --log_dir string                   If non-empty, write log files in this directory
     --loglevel int                     Log level (0 = DEBUG, 5 = FATAL) (default 1)
     --logtostderr                      log to standard error instead of files
 -p, --profile string                   The name of the minikube VM being used.
This can be modified to allow for multiple minikube instances to be run independently (default "minikube")
     --stderrthreshold severity         logs at or above this threshold go to stderr (default 2)
 -v, --v Level                          log level for V logs
     --vmodule moduleSpec               comma-separated list of pattern=N settings for file-filtered logging

Use "minikube [command] --help" for more information about a command.

啟動與關閉minikube


畢竟minikube會實際使用主機的資源,如果在不需要操作時候,可以透過stop將minikube關閉,當然,也可以start他...

$ minikube stop
Stopping local Kubernetes cluster...
Machine stopped.
$ minikube start
Starting local Kubernetes v1.7.5 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.

確認minikube狀態

minikube啟動後,我們可以透過status來確認目前minikube的執行狀態,他也會同時顯示minikube所在的ip位置...

$ minikube status
minikube: Running
cluster: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100

檢視minikube實際ip位置

minikube另外提供一個更簡單的指令來顯示ip位置,未來可以透過這個指令來結合一些自動化程式...

$ minikube ip
192.168.99.100

切入minikube所在的linux環境

由於minikube也是啟動在linux的環境上,所以minikube也提供了讓您連入minikube底層linux的指令...

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

連線minikube部署的服務

下面是我們透過簡單的k8s操作來建立起的服務,然後可以展示如何連線到minikube上的應用...

$ kubectl run nginx --image=nginx --port=80

deployment "nginx" created

$ kubectl get all
NAME                        READY     STATUS              RESTARTS   AGE
po/nginx-1423793266-svb16   0/1       ContainerCreating   0          1m

NAME             CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
svc/kubernetes   10.0.0.1             443/TCP   2d

NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deploy/nginx   1         1         1            0           1m

NAME                  DESIRED   CURRENT   READY     AGE
rs/nginx-1423793266   1         1         0         1m

$ kubectl expose deploy/nginx --type=NodePort
service "nginx" exposed

$ kubectl get all
NAME                        READY     STATUS    RESTARTS   AGE
po/nginx-1423793266-svb16   1/1       Running   0          2m

NAME             CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
svc/kubernetes   10.0.0.1             443/TCP        2d
svc/nginx        10.0.0.227          80:31659/TCP   1m

NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deploy/nginx   1         1         1            1           2m

NAME                  DESIRED   CURRENT   READY     AGE
rs/nginx-1423793266   1         1         1         2m

$ minikube service nginx --url
http://192.168.99.100:31659

上面的步驟中,主要是先建立nginx的deployment,然後透過export service來將nginx deployment的端口呈現在minikube的node上... 最後,我們可以透過minikube來show出該service最後binding在哪個位置...

如果您嚐試建立mysql的服務... 您會發現最後minikube service還是會用http來顯示連線資訊... 這部分是因為service連接layer 4的網路,在協定上有太多可能性.. minikube無法逐一判斷,因此用一個大家最熟悉也最可能的方式呈現,最主要的資訊其實是port,minikube已經很人性化了^^... 另外,如果沒有加上”--url”的參數,則minikube會直接使用browser開啟網頁,就可以直接瀏覽了ㄛ^^

開啟minikube的擴充套件

minikube提供addons來擴充minikube,我們可以使用minikube addons list來查看哪些addons可以使用... 然後把他enable或是disable...

開啟ingress服務

上面所介紹的簡單操作,最後minikube service nginx是以k8s service的部分顯示nginx可以連線的位置,由於minikube為單機服務,因此也沒有很需要使用真正的service(真正的service將會有特定的主機擔任traffic forwarding的任務,在開通的過程中,會需要通知該主機把port對應上所要導向的pod… 而在雲服務,service則會與layer 4 load balancer結合...)。而ingress因為為layer 7層的網路服務,其中包含load balancer的特殊功能,因此minikube特地把ingress放在addons list中,讓使用者可以快速的啟用他... 下面是檢視目前addons與啟用ingress的方式...

# minikube addons list
- addon-manager: enabled
- kube-dns: enabled
- heapster: enabled
- registry-creds: disabled
- dashboard: enabled
- default-storageclass: enabled
- ingress: enabled
- registry: disabled

# minikube addon enable ingress

啟用後,我們可以再次檢視是否已經完成啟用... 等待一切就緒,我們就可以建立一個ingress來試試...

首先,我們需要建立ingress的yaml檔案,以上面的nginx服務為例,我們以nginx service來建立80 port的服務對應... 把下面的檔案存成ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 name: nginx
spec:
 backend:
   serviceName: nginx
   servicePort: 80

儲存完成後,我們可以透過下面指令將ingress建立起來...

$ kubectl create -f ingress.yaml
ingress "nginx" created

接下來,我們需要等待一點時間,讓ingress取到可以用的ip位置...

$ kubectl get ingress
NAME      HOSTS     ADDRESS          PORTS     AGE
nginx     *         192.168.99.100   80        4m

然後我們就可以直接連線 http://192.168.99.100 來測試了,沒問題的話,應該可以直接顯示nginx的歡迎畫面...

由於ingress有不少東西可以玩,這邊不贅述ingress的功能,留給大家試試ingress強大的功能^^

開啟heapster服務

heapster是kubernetes中負責蒐集k8s內container運作的相關資訊的服務,他通常會結合Grafana來做BI的查詢... 同ingress的啟用方式,我們也可以快速的將heapster addon啟動...

$ minikube addon enable heapster

接下來可以開啟heapster的UI… 這邊會直接開啟Grafana作為客製化報表查詢的地方...

$ minikube addon open heapster

如果想要知道heapster的連線資訊,也可以直接用minikube service來show出url位置,但因為heapster是屬於kube-system這個namespace,所以這邊就需要多指定namespace為kube-system…

$ minikube service monitoring-grafana -n kube-system --url
http://192.168.99.100:31644


參考


這個網誌中的熱門文章

Oracle LISTAGG

同事介紹的一個Oracle的好用查詢:LISTAGG
SELECT A.GROUP_ID,A.KEY, LISTAGG(A.VALUE,'; ')WITHINGROUP(ORDERBYA.VALUE)as GG  fromSYS_PROPERTIESaGROUP byA.GROUP_ID,A.KEY
LISTAGG可以將group後的結果會總顯示於一個欄位 上述SQL原本A.VALUE會是一個row一個row的排列 使用LISTAGG之後,可以將A.VALUE顯示在同一個row中 並且可以指定間隔符號(在此設定為';') 針對某一些報表查詢非常有用唷 :D

使用GCP Cloud Builder建置CI/CD Flow

服務的建置通常是持續性的作業,而部署則一般是專案初期建置一次,未來可以沿用該部署設定... 這樣的流程走向自動化,在Container的環境又更是重要... 本篇介紹一下,在Google雲端,我們可以搭配Source Repository與Build Trigger等服務來完成服務的自動建置與部屬,讓封裝Container與部署到Container Engine的動作可以一氣呵成...
首先幾單瞭解一下一個Container Engine服務的建置與部屬過程...
使先,建立Container Engine Cluster,透過GCP Winzard可以很快速地開立您的GKE Cluster…

假設您的cluster是叫做demo-cluster,則可以透過下面的指令來跟GKE建立連線
$ gcloud container clusters get-credentials demo-cluster --zone asia-east1-a
這串指令不用記ㄛ~可以在Cluster的頁面找到他...

點選複製,即可貼到您的Terminal執行...

跟GKE建立鏈結後,接下來可以部署您的城市,這邊我們以我的一個範例程式Demoweb (https://github.com/peihsinsu/demoweb) 為例,

這個專案中,包含幾個重要結構:
app/ : 放置您的程式,在Dockerfile中會將該資料匣複製到Docker Image中 k8s/ : 放置k8s的deployment與service描述檔 Dockerfile : 封裝docker的描述檔,會以node.js的image為基礎來建置執行環境 cloudbuild.yaml : Google Cloud Build Trigger的步驟描述檔