Minikube體驗


本文的環境如下:

操作系統: Mac OSX EI Caption

Docker:Docker version 18.03.1-ce, build 9ee9f40

Minikube:minikube version: v0.27.0

Kubernetes: v1.10.0

Minikube 介紹

Minikube支持Kubenetes的以下特性:

  • DNS
  • NodePorts
  • ConfigMaps and Secrets
  • Dashboards
  • Container Runtime: Docker, rkt and CRI-O
  • Enabling CNI (Container Network Interface)
  • Ingress

Minikube 安裝

因為 Google 在國內沒辦法訪問,我使用了阿里版的 Minikube 。

Minikube運行要求安裝有VirtualBox或VMWare Fusion,我用的是VirtualBox。

VirtualBox安裝很簡單,從 官方下載DMG 安裝即可。

下載安裝 Minikube

curl -Lo minikube http://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v0.27.0/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/

啟動 Minikube

minikube start --registry-mirror=https://registry.docker-cn.com

如果你遇到這個錯誤,Error restarting cluster: restarting kube-proxy: waiting for kube-proxy to be up for configmap update: timed out waiting for the condition

通過 minikube delete,minikube start 可以解決

打開 Minikube 控制檯

minikube dashboard

隨後瀏覽器中會自動打開這個界面。

Minikube體驗

使用

Minikube在本地虛擬機環境中部署 Kubernetes。

Minikube體驗

啟動 Cluster

bogon:k8s rousseau$ minikube start
Starting local Kubernetes v1.10.0 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.
Loading cached images from config file.

該命令創建並配置一個運行了單個Kubernetes節點的虛擬機。Minikube 啟動過程中,可以用--extra-config=component.key=value的形式給 Kubernetes 指定參數。

停止 Cluster

bogon:k8s rousseau$ minikube stop

刪除 Cluster

bogon:k8s rousseau$ minikube delete

訪問服務

minikube service [-n NAMESPACE] [--url] NAME

網絡

前面的原理圖說明了Minikube啟動了一個虛擬機,這個虛擬機的地址是Host-Only的,要獲得主機IP,執行。

bogon:k8s rousseau$ minikube ip
192.168.99.100

存儲

簡單的示例

構建一個 Node 服務

構建一個簡單的Node網頁程序,用戶訪問的時候輸出hello world。

var http = require('http');
var handleRequest = function(request, response) {
console.log('Received request for URL: ' + request.url);
response.writeHead(200);
response.end('Hello World!');
};
var www = http.createServer(handleRequest);
www.listen(8080);

可以在終端中執行node server.js並通過http://localhost:8080查看效果

生成鏡像

編寫 Dockerfile 文件

FROM node:6.9.2
EXPOSE 8080

COPY server.js .
CMD node server.js

因為我們使用的是 Minikube ,不需要把鏡像放到鏡像倉庫中,只需要放在Minikube VM中。

bogon:k8s rousseau$ eval $(minikube docker-env)
bogon:k8s rousseau$ docker build -t hello-node:v1 .
Sending build context to Docker daemon 3.072kB
Step 1/4 : FROM node:6.9.2
6.9.2: Pulling from library/node
75a822cd7888: Pull complete
57de64c72267: Pull complete
4306be1e8943: Pull complete
871436ab7225: Pull complete
0110c26a367a: Pull complete
1f04fe713f1b: Pull complete
ac7c0b5fb553: Pull complete
Digest: sha256:2e95be60faf429d6c97d928c762cb36f1940f4456ce4bd33fbdc34de94a5e043
Status: Downloaded newer image for node:6.9.2
---> faaadb4aaf9b
Step 2/4 : EXPOSE 8080
---> Running in a3229e6d0438
Removing intermediate container a3229e6d0438
---> f8e1aa12de28
Step 3/4 : COPY server.js .
---> 5254ea79c7a4
Step 4/4 : CMD node server.js
---> Running in 060ef7e6f713
Removing intermediate container 060ef7e6f713
---> 2fe0fd2e98d7
Successfully built 2fe0fd2e98d7
Successfully tagged hello-node:v1

部署

使用 kubectl 命令行部署應用。

bogon:k8s rousseau$ kubectl run hello-node --image=hello-node:v1 --port=8080
deployment.apps "hello-node" created
bogon:k8s rousseau$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
hello-node 1 1 1 1 26s

bogon:k8s rousseau$ kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-node-658d8f6754-7mz28 1/1 Running 0 37s

Pods在Kubernetes中是一組容器的集合,在這個例子中只有一個容器實例,所以看到的各項統計數字都是1。

創建服務

默認情況下,Pod只能通過內部地址訪問,為了讓 hello-node 可以從外部訪問,需要將Pod暴露為 Kubernetes 的服務。

bogon:k8s rousseau$ kubectl expose deployment hello-node --type=LoadBalancer
service "hello-node" exposed
bogon:k8s rousseau$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-node LoadBalancer 10.108.143.198 8080:32386/TCP 7s
kubernetes ClusterIP 10.96.0.1 443/TCP 1h

--type=LoadBalancer參數表示我們希望將我們的服務暴露在外面,在雲的環境中支持負載均衡情況下,只需要提供負載均衡的地址。在Minikube中,LoadBanlancer類型讓服務可以通過minikube service來訪問

minikube service hello-node

這個命令會自動打開瀏覽器窗口訪問服務,使用本地IP。

更新應用

假設我們更新了應用,輸出新的一段話。

response.end('Hello World Again!');

生成鏡像

docker build -t hello-node:v2 .

更新部署

kubectl set image deployment/hello-node hello-node=hello-node:v2

查看更新

minikube service hello-node

銷燬服務

kubectl delete service hello-node
kubectl delete deployment hello-node


分享到:


相關文章: