kubernetes-dashboard(1.8.3)部署與踩坑

Kubernetes Dashboard 是一個管理Kubernetes集羣的全功能Web界面,旨在以UI的方式徹底替代命令行工具(kubectl 等)。html

目錄node

  1. 部署
  2. 建立用戶
  3. 集成Heapster
  4. 訪問

部署

Dashboard須要用到k8s.gcr.io/kubernetes-dashboard的鏡像,因爲網絡緣由,能夠採用預先拉取並打Tag或者修改yaml文件中的鏡像地址,本文使用後者:git

kubectl apply -f http://mirror.faasx.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

上面使用的yaml只是將 https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml 中的 k8s.gcr.io 替換爲了 reg.qiniu.com/k8sgithub

而後可使用kubectl get pods命令來查看部署狀態:json

kubectl get pods --all-namespaces # 輸出 NAMESPACE NAME READY STATUS RESTARTS AGE kube-system kubernetes-dashboard-7d5dcdb6d9-mf6l2 1/1 Running 0 9m

若是要在本地訪問dashboard,咱們須要建立一個安全通道,可運行以下命令:ubuntu

kubectl proxy

如今就能夠經過 http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/ 來訪問Dashborad UI了。api

k8s-dashboard-login

建立用戶

如上圖,跳轉到了登陸頁面,那咱們就先建立個用戶:瀏覽器

1.建立服務帳號

首先建立一個叫admin-user的服務帳號,並放在kube-system名稱空間下:安全

# admin-user.yaml apiVersion: v1 kind: ServiceAccount metadata:  name: admin-user  namespace: kube-system

執行kubectl create命令:bash

kubectl create -f admin-user.yaml

2.綁定角色

默認狀況下,kubeadm建立集羣時已經建立了admin角色,咱們直接綁定便可:

# admin-user-role-binding.yaml apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata:  name: admin-user roleRef:  apiGroup: rbac.authorization.k8s.io  kind: ClusterRole  name: cluster-admin subjects: - kind: ServiceAccount  name: admin-user  namespace: kube-system

執行kubectl create命令:

kubectl create -f admin-user-role-binding.yaml

3.獲取Token

如今咱們須要找到新建立的用戶的Token,以便用來登陸dashboard:

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

輸出相似:

Name:         admin-user-token-qrj82
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name=admin-user
              kubernetes.io/service-account.uid=6cd60673-4d13-11e8-a548-00155d000529

Type:  kubernetes.io/service-account-token

Data
====
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXFyajgyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI2Y2Q2MDY3My00ZDEzLTExZTgtYTU0OC0wMDE1NWQwMDA1MjkiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.C5mjsa2uqJwjscWQ9x4mEsWALUTJu3OSfLYecqpS1niYXxp328mgx0t-QY8A7GQvAr5fWoIhhC_NOHkSkn2ubn0U22VGh2msU6zAbz9sZZ7BMXG4DLMq3AaXTXY8LzS3PQyEOCaLieyEDe-tuTZz4pbqoZQJ6V6zaKJtE9u6-zMBC2_iFujBwhBViaAP9KBbE5WfREEc0SQR9siN8W8gLSc8ZL4snndv527Pe9SxojpDGw6qP_8R-i51bP2nZGlpPadEPXj-lQqz4g5pgGziQqnsInSMpctJmHbfAh7s9lIMoBFW7GVE8AQNSoLHuuevbLArJ7sHriQtDB76_j4fmA
ca.crt:     1025 bytes
namespace:  11 bytes

而後把Token複製到登陸界面的Token輸入框中,登入後顯示以下:

k8s-overview

集成Heapster

Heapster是容器集羣監控和性能分析工具,自然的支持Kubernetes和CoreOS。

Heapster支持多種儲存方式,本示例中使用influxdb,直接執行下列命令便可:

kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/influxdb.yaml kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/grafana.yaml kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/heapster.yaml kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/rbac/heapster-rbac.yaml

上面命令中用到的yaml是從 https://github.com/kubernetes/heapster/tree/master/deploy/kube-config/influxdb 複製的,並將k8s.gcr.io修改成國內鏡像。

而後,查看一下Pod的狀態:

raining@raining-ubuntu:~/k8s/heapster$ kubectl get pods --namespace=kube-system NAME READY STATUS RESTARTS AGE ... heapster-5869b599bd-kxltn 1/1 Running 0 5m monitoring-grafana-679f6b46cb-xxsr4 1/1 Running 0 5m monitoring-influxdb-6f875dc468-7s4xz 1/1 Running 0 6m ...

等待狀態變成Running,刷新一下瀏覽器,最新的效果以下:

k8s-heapsterng

關於Heapster更詳細的用法可參考官方文檔:https://github.com/kubernetes/heapster

訪問

Kubernetes提供瞭如下四種訪問服務的方式:

kubectl proxy

在上面的示例中,咱們使用的即是kubectl proxy,它在您的機器與Kubernetes API之間建立一個代理,默認狀況下,只能從本地訪問(啓動它的機器)。

咱們可使用kubectl cluster-info命令來檢查配置是否正確,集羣是否能夠訪問等:

raining@raining-ubuntu:~$ kubectl cluster-info
Kubernetes master is running at https://192.168.0.8:6443
Heapster is running at https://192.168.0.8:6443/api/v1/namespaces/kube-system/services/heapster/proxy
KubeDNS is running at https://192.168.0.8:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
monitoring-grafana is running at https://192.168.0.8:6443/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy
monitoring-influxdb is running at https://192.168.0.8:6443/api/v1/namespaces/kube-system/services/monitoring-influxdb/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

啓動代理只需執行以下命令:

$ kubectl proxy Starting to serve on 127.0.0.1:8001

咱們也可使用--address--accept-hosts參數來容許外部訪問:

kubectl proxy --address='0.0.0.0' --accept-hosts='^*$'

而後咱們在外網訪問http://<master-ip>:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/,能夠成功訪問到登陸界面,可是卻沒法登陸,這是由於Dashboard只容許localhost127.0.0.1使用HTTP鏈接進行訪問,而其它地址只容許使用HTTPS。所以,若是須要在非本機訪問Dashboard的話,只能選擇其餘訪問方式。

NodePort

NodePort是將節點直接暴露在外網的一種方式,只建議在開發環境,單節點的安裝方式中使用。

啓用NodePort很簡單,只需執行kubectl edit命令進行編輯:

kubectl -n kube-system edit service kubernetes-dashboard

輸出以下:

apiVersion: v1 kind: Service metadata:  annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"k8s-app":"kubernetes-dashboard"},"name":"kubernetes-dashboard","namespace":"kube-system"},"spec":{"ports":[{"port":443,"targetPort":8443}],"selector":{"k8s-app":"kubernetes-dashboard"}}}  creationTimestamp: 2018-05-01T07:23:41Z  labels:  k8s-app: kubernetes-dashboard  name: kubernetes-dashboard  namespace: kube-system  resourceVersion: "1750"  selfLink: /api/v1/namespaces/kube-system/services/kubernetes-dashboard  uid: 9329577a-4d10-11e8-a548-00155d000529 spec:  clusterIP: 10.103.5.139  ports:  - port: 443  protocol: TCP  targetPort: 8443  selector:  k8s-app: kubernetes-dashboard  sessionAffinity: None  type: ClusterIP status:  loadBalancer: {}

而後咱們將上面的type: ClusterIP修改成type: NodePort,保存後使用kubectl get service命令來查看自動生產的端口:

kubectl -n kube-system get service kubernetes-dashboard

輸出以下:

NAME                   TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE
kubernetes-dashboard   NodePort   10.103.5.139   <none>        443:31795/TCP   4h

如上所示,Dashboard已經在31795端口上公開,如今能夠在外部使用https://<cluster-ip>:31795進行訪問。須要注意的是,在多節點的集羣中,必須找到運行Dashboard節點的IP來訪問,而不是Master節點的IP,在本文的示例,我部署了兩臺服務器,MatserIP爲192.168.0.8,ClusterIP爲192.168.0.10

可是最後訪問的結果可能以下:

k8s-dashboard-nodeport-notsecure

遺憾的是,因爲證書問題,咱們沒法訪問,須要在部署Dashboard時指定有效的證書,才能夠訪問。因爲在正式環境中,並不推薦使用NodePort的方式來訪問Dashboard,故再也不多說,關於如何爲Dashboard配置證書可參考:Certificate management

API Server

若是Kubernetes API服務器是公開的,並能夠從外部訪問,那咱們能夠直接使用API Server的方式來訪問,也是比較推薦的方式。

Dashboard的訪問地址爲:
https://<master-ip>:<apiserver-port>/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/,可是返回的結果可能以下:

{ "kind": "Status", "apiVersion": "v1", "metadata": { }, "status": "Failure", "message": "services \"https:kubernetes-dashboard:\" is forbidden: User \"system:anonymous\" cannot get services/proxy in the namespace \"kube-system\"", "reason": "Forbidden", "details": { "name": "https:kubernetes-dashboard:", "kind": "services" }, "code": 403 }

這是由於最新版的k8s默認啓用了RBAC,併爲未認證用戶賦予了一個默認的身份:anonymous

對於API Server來講,它是使用證書進行認證的,咱們須要先建立一個證書:

1.首先找到kubectl命令的配置文件,默認狀況下爲/etc/kubernetes/admin.conf,在 上一篇 中,咱們已經複製到了$HOME/.kube/config中。

2.而後咱們使用client-certificate-dataclient-key-data生成一個p12文件,可以使用下列命令:

# 生成client-certificate-data grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt # 生成client-key-data grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key # 生成p12 openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"

3.最後導入上面生成的p12文件,從新打開瀏覽器,顯示以下:

k8s-api-server-select-certificate

點擊肯定,即可以看到熟悉的登陸界面了:

k8s-api-server-login

咱們可使用一開始建立的admin-user用戶的token進行登陸,一切OK。

對於生產系統,咱們應該爲每一個用戶應該生成本身的證書,由於不一樣的用戶會有不一樣的命名空間訪問權限。

Ingress

Ingress將開源的反向代理負載均衡器(如 Nginx、Apache、Haproxy等)與k8s進行集成,並能夠動態的更新Nginx配置等,是比較靈活,更爲推薦的暴露服務的方式,但也相對比較複雜,之後再來介紹。

引自:https://www.cnblogs.com/RainingNight/p/deploying-k8s-dashboard-ui.html

相關文章
相關標籤/搜索