minikube部署運行實例


以tomcat 鏡像為例,演示部署服務,發布服務,擴容縮容服務等操作。

1、創建並啟動 minikube 虛擬機
$ minikube start
Starting local Kubernetes cluster...
Running pre-create checks...
Creating machine...
Starting local Kubernetes cluster...
 
2、創建 hello-minikube 部署
$ kubectl run hello-minikube --image=tomcat:8.0 --port=8080
deployment "hello-minikube" created
 
3、發布服務 hello-minikube
$ kubectl expose deployment hello-minikube --type=NodePort
service "hello-minikube" exposed
 
4、查看 pods
$ kubectl get pods
NAME                             READY     STATUS              RESTARTS   AGE
hello-minikube-598805112-3bzmf   1/1       ContainerCreating   0          5s
注意:剛開始時,pod 沒有完全創建好的時候,狀態是 ContainerCreating,當部署完成后,狀態就變成 Running。
 
$ kubectl get pods
NAME                             READY     STATUS    RESTARTS   AGE
hello-minikube-598805112-3bzmf   1/1       Running   0          25s
 
5、獲取服務地址
$ minikube service hello-minikube --url
http://192.168.99.102:30724
$ minikube service hello-minikube 將直接打開地址到默認瀏覽器上。
 
6、停止 minikube 虛擬機
$ minikube stop
Stopping local Kubernetes cluster...
Stopping "minikube"...

注意:在部署過程中可能會出現問題,大部分跟網絡相關,下載 images 時會超時報錯,解決辦法是一安裝翻牆工具,二是替代需要翻牆下載的 images。以下是我本機實驗遇到的問題,以及解決方法。

問題一:命令行下載 tomcat:8.0 鏡像,執行 docker pull tomcat:8.0 沒有任何反應,初步分析可能是 minikube 虛擬機里沒有連接到本地 docker 服務。

$ minikube docker-env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.102:2376"
export DOCKER_CERT_PATH="/Users/wanyang3/.minikube/certs"
export DOCKER_API_VERSION="1.23"

執行 eval $(minikube docker-env),即設置 minikube 虛擬機的 docker 環境變量即可。

問題二:執行完畢上邊 2 和 3 步驟后,發現 hello-minikube 服務並沒有成功啟動。

$ kubectl get pods
NAME                             READY     STATUS              RESTARTS   AGE
hello-minikube-598805112-3bzmf   0/1       ContainerCreating   0          15s

發現 hello-minikube 的狀態一直是 ContainerCreating,並且 READY 為 0/1,通過 minikube logs 查看日志可以看出,有一個鏡像 gcr.io/google_containers/pause-amd64:3.0 顯示拉取失敗,分析原因應該是 gcr.io 這個地址被牆了。

# 替換鏡像
$ docker pull visenzek8s/pause-amd64:3.0
$ docker tag visenzek8s/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0
 
# 顯式設置拉取策略為 IfNotPresent
$ kubectl run hello-minikube --image=tomcat:8.0 --port=8080 --image-pull-policy=IfNotPresent

方案就是替換該鏡像,然后可以設置拉取策略為優先本地獲取,本地沒有再去遠程獲取。因為這里服務啟動策略為 always,會定時自動重新拉取,所以一旦本地拉取該鏡像后,我們會發現上邊 hello-minikube 一會就啟動成功了。

下邊介紹一下 kubectl 一些其他常用操作。

1、創建資源的兩種方式

1.1 通過 Yaml 或 Json 文件創建

$ kubectl create -f <file_path>/xxx.yaml | <file_path>/xxx.json --[options]
eg:kubectl create -f ./redis.yaml

簡單的 redis.yaml 示例:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: hello-redis
  namespace: my-kube
spec:
  replicas: 2
  template:
    metadata:
      labels:
        group: hello-scm
        my-kube: hello-redis
        k8s-app: redis
    spec:
      containers:
      - name: redis
        image: redis:latest
---
apiVersion: v1
kind: Service
metadata:
  labels:
    group: hello-scm
    kubernetes.io/cluster-service: 'true'
    kubernetes.io/name: hello-redis
  name: hello-redis
  namespace: my-kube
spec:
  ports:
  - port: 6379
    targetPort: 6379
  selector:
    k8s-app: redis
  • yaml 文件要符合 kubernetes 的規范,可以參考官網對 yaml 語法定義,可以自學一下,這里就不展開來說了。

1.2 指定鏡像啟動

$ kubectl run --image=xxxx:xx --[options]
eg: kubectl run hello-minikube --image=tomcat:8.0 --port=8080

2、復制多個部署 pod

$ kubectl scale --replicas=3 deployment/hello-minikube
deployment "hello-minikube" scaled
$ kubectl get pods
NAME                             READY     STATUS    RESTARTS   AGE
hello-minikube-598805112-3bzmf   1/1       Running   1          1d
hello-minikube-598805112-vrskz   1/1       Running   1          1d
hello-minikube-598805112-xwq55   1/1       Running   1          1d
 
也可以在啟動時,指定復制數量
$ kubectl run hello-minikube --image=tomcat:8.0 --port=8080 --replicas=3

3、暴露 pod (po), service (svc), replicationcontroller (rc), deployment (deploy), replicaset (rs) 成新的服務

$ kubectl expose po | svc | rc | delpoy | rs --[options]
eg:kubectl expose deployment hello-minikube --type=NodePort # 暴露名稱為 hello-minikube 部署為類型為 NodePort 的服務
eg:kubectl expose rc hello-nginx --port=80 --target-port=8000 --type=NodePort # 暴漏名稱為 nginx 的副本為指定服務端口80,連接該服務端口8000,類型為 NodePort 的服務
 
$ kubectl get service
NAME             TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGE
hello-minikube   NodePort    10.0.0.176   <none>        8080:30724/TCP   1d
hello-nginx      NodePort    10.0.0.94    <none>        80:8000/TCP      1d
kubernetes       ClusterIP   10.0.0.1     <none>        443/TCP          1d

4、重新加載某個資源

$ kubectl apply -f <file_path>/xxx.yaml | <file_path>/xxx.json --[options]
eg:kubectl apply -f ./redis.yaml

5、查看 pod, service, replicationcontroller, deployment, replicaset 各種類型資源信息列表

$ kubectl get po | svc | rc | deploy | rs # 查看默認 namespace 下各類型資源信息列表
$ kubectl get po | svc | rc | deploy | rs --all-namespaces # 查看所有 namespace 下各類型資源信息列表

6、查看 pod, service, replicationcontroller, deployment, replicaset 各種類型資源日志信息或描述信息

$ kubectl logs <resource_type>/<resource_name> [options]
eg:kubectl logs -f po/hello-minikube-598805112-3bzmf # 查看指定 pod 的日志
eg:kubectl logs deploy/hello-nginx -n my-kube # 查看指定 delpoy 和 namespace 的日志
 
$ kubectl describe <resource_type>/<resource_name> [options]
eg:kubectl describe pods # 查看所有 pod 的描述信息
eg:kubectl describe po/hello-minikube-598805112-3bzmf # 查看指定 pod 的描述信息
eg:kubectl describe deploy/hello-nginx -n my-kube # 查看指定 delpoy 和 namespace 的描述信息

7、查看集群信息

$ kubectl cluster-info
Kubernetes master is running at https://192.168.99.102:8443

8、Kubernetes Dashboard 安裝

默認安裝完了 minikube,我們會發現他會自動安裝 Dashboard,但是我們通過 minikube dashboard 命令並不能在瀏覽器上打開 Dashboard 網頁。這是啥原因呢?

$ kubectl get pods --all-namespaces
NAMESPACE     NAME                               READY     STATUS              RESTARTS   AGE
...
kube-system   kube-addon-manager-minikube        0/1       ContainerCreating   1          10s
kube-system   kube-dns-910330662-653vt           0/3       ContainerCreating   1          15s
kube-system   kubernetes-dashboard-9k5vl         0/1       ContainerCreating   1          15s
...

在通過命令,我們發現 kube-dns 和 kubernetes-dashboard 並沒有啟動成功,最后通過查看下日志信息 minikube logs 或 kubectl logs -f pods/kubernetes-dashboard-9k5vl -n kube-system kubectl logs -f pods/kube-dns-910330662-653vt -n kube-system,我們發現這幾個服務依賴的 images 沒有拉取下來,又被牆了。。。 解決方案就是搭梯子或找替代 image。

替代各依賴的 images
docker pull wymr/kubernetes-dashboard-amd64-v1.6.3:v1.6.3 
docker tag wymr/kubernetes-dashboard-amd64-v1.6.3:v1.6.3 gcr.io/google_containers/kubernetes-dashboard-amd64:v1.6.3
 
docker pull googlecontainer/kube-addon-manager:v6.4-beta.2
docker tag googlecontainer/kube-addon-manager:v6.4-beta.2 gcr.io/google-containers/kube-addon-manager:v6.4-beta.2 
 
docker pull zhaoqing/k8s-dns-dnsmasq-nanny-amd64:1.14.4
docker tag zhaoqing/k8s-dns-dnsmasq-nanny-amd64:1.14.4 gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.4
 
docker pull zhaoqing/k8s-dns-kube-dns-amd64:1.14.4
docker tag zhaoqing/k8s-dns-kube-dns-amd64:1.14.4 gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.4
 
docker pull zhaoqing/k8s-dns-sidecar-amd64:1.14.4
docker tag zhaoqing/k8s-dns-sidecar-amd64:1.14.4 gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.4

好了,通過替換上邊幾個依賴的鏡像之后,稍等一會,我們就會發現服務都正常啟動起來了。

$ kubectl get pods -n kube-system
NAME                                   READY     STATUS    RESTARTS   AGE
kube-addon-manager-minikube            1/1       Running   1          1d
kube-dns-910330662-653vt               3/3       Running   1          1d
kubernetes-dashboard-9k5vl             1/1       Running   1          1d

此時我們通過 minikube dashboard 或者 minikube dashboard --url 瀏覽器訪問 dashboard 地址,就可以正常打開監控頁面了。

這里寫圖片描述

9、Heapster 插件安裝

上邊默認安裝后的 Kubernetes Dashboard,是無法圖形化展現集群度量指標信息的,此時我們可以通過插件 Heapser,圖形化展示集群的信息,這樣監控頁面就更加直觀明了。

首先我們去 GitHub 下載 Heapster 最新穩定版代碼到本地指定目錄,然后通過 yaml 文件創建並啟動各個服務。這里我們選擇 InfluxDB 作為后端數據存儲,Grafana 作為圖形化展示。

$ cd /Users/wanyang3/docker/kubernetes/
$ git clone https://github.com/kubernetes/heapster.git
$ ls -l deploy/kube-config/influxdb/
total 24
-rw-r--r--  1 wanyang3  staff  2291 10 19 14:49 grafana.yaml
-rw-r--r--  1 wanyang3  staff  1162 10 20 15:01 heapster.yaml
-rw-r--r--  1 wanyang3  staff   974 10 19 14:49 influxdb.yaml

這里要注意一下,這三個 yaml 文件分別對應 heapster、influxdb 和 grafana,他們都分別需要依賴對應的 images,由於網絡的問題,要么搭梯子或者替換鏡像。

依賴鏡像入下:
gcr.io/google_containers/heapster-amd64:v1.4.0
gcr.io/google_containers/heapster-influxdb-amd64:v1.3.3
gcr.io/google_containers/heapster-grafana-amd64:v4.4.3
 
替換鏡像如下:
docker pull wanghkkk/heapster-amd64-v1.4.0:v1.4.0
docker pull wanghkkk/heapster-influxdb-amd64-v1.3.3:v1.3.3
docker pull wanghkkk/heapster-grafana-amd64-v4.4.3:v4.4.3

可對應上邊 yaml 文件分別修改 image 為以上對應鏡像,也可以 docker tag ... 改成對應鏡像名。修完完畢之后,可以通過命令創建 pod 了。

$ kubectl create -f deploy/kube-config/influxdb/
delpoyment "heapster" created
service "heapster" created
deployment "monitoring-influxdb" created
service "monitoring-influxdb" created
deployment "monitoring-grafana" created
service "monitoring-grafana" created
 
$ kubectl get pods -n kube-system
NAME                                   READY     STATUS    RESTARTS   AGE
heapster-3848557544-1548b              1/1       Running   0          1d
kube-addon-manager-minikube            1/1       Running   0          1d
kube-dns-910330662-653vt               3/3       Running   0          1d
kubernetes-dashboard-9k5vl             1/1       Running   0          1d
monitoring-grafana-2175968514-7tl3w    1/1       Running   0          1d
monitoring-influxdb-1957622127-x28mz   1/1       Running   0          1d

好了,Heapster 插件已經啟動完畢了,如果一切正常的話,稍等幾分鍾(也不一定哈,我的就等了差不多20分鍾才出來。。。),采集數據需要些時間,再次刷新 dashboard,就能看到集群度量指標信息將以圖形化方式展現出來。

這里寫圖片描述

但是,如果你等了很長時間,Dashboard 還是更以前一樣,沒有任何變化的話,那很有可能是服務並沒有正確運行起來,我們可以通過查看日志來排查原因。

$kubectl logs -f pod/monitoring-grafana-2175968514-7tl3w -n kube-system
$kubectl logs -f pod/monitoring-influxdb-1957622127-x28mz -n kube-system
$kubectl logs -f pod/heapster-3848557544-1548b -n kube-system

通過日志可以發現,在 heapster-3848557544-1548b 這個 pod 的日志中,發現有錯誤:

...
Failed to list *api.Node: Get https://kubernetes.default/api/v1/nodes?resourceVersion=0: 
x509: certificate is valid for server, not kubernetes.default
...

通過 heapster.yaml 文件可以看到,

command:
    - /heapster
    - --source=kubernetes:https://kubernetes.default
    - --sink=influxdb:http://monitoring-influxdb.kube-system.svc:8086

默認連接 kubernetes 的數據源地址為 https://kubernetes.default 后端存儲數據服務為 http://monitoring-influxdb.kube-system.svc:8086,但是這里出現了由於認證問題獲取 kubernetes 服務失敗的情況。

解決方法有兩種:

1、通過參考 Github Heapster 配置數據源文檔 Heapster source-configuration,修改配置數據源為 --source=kubernetes:http://<address-of-kubernetes-master>:<http-port>?inClusterConfig=false,采用 insecure-port 的方式連接,因為 kube-apiserver 針對 insecure-port 接入的請求沒有任何限制機制。
2、通過命令獲取 kubernetes ClusterIP,直接使用 ClusterIP 也是可以的。

$ kubectl get service
NAME             TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
kubernetes       ClusterIP   10.0.0.1     <none>        443/TCP        1d
...
 
修改 heapster.yaml 
 
command:
    - /heapster
    #- --source=kubernetes:https://kubernetes.default
    - --source=kubernetes:https://10.0.0.1
    - --sink=influxdb:http://monitoring-influxdb.kube-system.svc:8086

以上兩種方式修改配置完成后,使用 kubectl apply -f deploy/kube-config/influxdb/heapster.yaml 重新 apply 一下該 pod。再次稍等幾分鍾,再次刷新 dashboard,就能看到了。

這里寫圖片描述

9、簡單演示使用 Dashboard

通過 kubernetes dashboard 我們除了可以直觀的查看各種資源信息,日志信息,查看工作負荷信息,監控 CPU 以及內存資源使用率等之外,我們還可以創建部署容器應用,刪除各種資源,編輯更新資源文件等等操作。下邊就演示下如何在 dashboard 上創建一個容器應用部署,並且編輯更新該部署,最后刪除部署信息。

9.1 創建容器應用部署

瀏覽器打開 kubernetes dashboard 的 Web UI 頁面,點擊右上角 “+ 創建”,進入創建應用頁面,這里有兩種方式創建應用,一種是通過頁面填寫應用詳情,二種是上傳 YAML 或 JSON 文件的方式。為了方便,我們使用第二種方式,上傳本地寫好的一個 redis.yaml 文件,點擊上傳即可。

redis.yaml 文件

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: hello-redis
  namespace: my-kube
spec:
  replicas: 2
  template:
    metadata:
      labels:
        group: hello-scm
        my-kube: hello-redis
        k8s-app: redis
    spec:
      containers:
      - name: redis
        image: redis:latest
---
apiVersion: v1
kind: Service
metadata:
  labels:
    group: hello-scm
    kubernetes.io/cluster-service: 'true'
    kubernetes.io/name: hello-redis
  name: hello-redis
  namespace: my-kube
spec:
  ports:
  - port: 6379
    targetPort: 6379
  selector:
    k8s-app: redis

說明一下,這里我創建了一個 Deployment 名為 hello-redis,並歸屬到 my-kube 的命名空間下,並且指定初始副本數為 2,使用鏡像 redis:latest,同時創建了一個 Service 名為 hello-redis,開放 6379 端口,並分別給他們打上對應的 tag 標簽。

這里寫圖片描述

這里寫圖片描述

從上圖可以看到已經創建好了 hello-redis 部署,以及初始化的2個副本容器組。

9.2 編輯更新該部署

現在我們將 hello-redis 副本容器組擴大到 4 個,點擊左側 “工作負荷 —》 部署”,右側會列出當前節點下所有的部署,點擊 hello-redis 進入到部署頁點擊右上角 “編輯”,彈出 Yaml 文件編輯彈框,修改 replicas: 4,點擊 “更新” 即可。也可以在部署列表中 hello-reids 記錄最后邊操作欄,點擊 “查看/編輯 YAML”,彈出框修改。

這里寫圖片描述

這里寫圖片描述

稍等一會,去 hello-redis 副本集中查看,副本數就變成 4 個了。

這里寫圖片描述

這里寫圖片描述

9.3 刪除部署信息

點擊左側 “工作負荷 —》 部署”,右側會列出當前節點下所有的部署,點擊 hello-redis,進入到部署頁點擊右上角 “刪除”,彈出框點擊 “刪除” 即可。也可以在部署列表中 hello-reids 記錄最后邊操作欄,點擊 “刪除”,彈出框點擊 “刪除”。

這里寫圖片描述

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM