以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 記錄最后邊操作欄,點擊 “刪除”,彈出框點擊 “刪除”。
參考資料