跳到主要內容

使用 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

新一代LB - Traefik

新一代LB-Traefik Traefik突破以往我們對loadbalancer的觀點,他是一套直接與docker整合的loadbalancer套件...透過Traefik,我們可以使用label的方式將後面啟動的dockerinstance掛載到loadbalancer中,且無需重新啟動Traefik,可直接生效... Traefik基本介紹 Traefik是以動態重載新加入的dockerinstance的方式來替有附加相同domainlabel的dockerinstance建立網路附載平衡的關聯...因此,設定上,與一般我們建立reverseproxy的過程剛好相反(一般我們會先建立服務,再建立reverseproxy將服務串連起來)... Step1-建立Traefik服務 下面我們用官方的composefile來說明... File:docker-compose.yaml version: '2' services: proxy: image: traefik command: --api --docker --docker.domain=docker.localhost --logLevel=DEBUG networks: - webgateway ports: - "80:80" - "8080:8080" volumes: - /var/run/docker.sock:/var/run/docker.sock - /dev/null:/traefik.toml networks: webgateway: driver: bridge 其中traefik啟動時候,我們需要指定docker.domain來告訴taefik要聆聽的domain是哪一個,然後要事先開啟對應的port,讓外部服務可以連到traefik...,另外,我們將dockersocket掛載進來,這是必要的設定,讓traefik可以透過dockersocket來操控一些東西...,最後,traefik.toml檔案,我們保留空的,讓treafik自己建立... 啟動: docker-compose -f docker…