參考文檔:
- Github介紹:https://github.com/kubernetes/dashboard
-
Github yaml文件: https://github.com/kubernetes/dashboard/blob/master/src/deploy/recommended/kubernetes-dashboard.yaml
或者(各服務模塊獨立保存):https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dashboard
- 訪問dashboard:https://github.com/kubernetes/dashboard/wiki/Accessing-Dashboard---1.7.X-and-above
- 訪問dashboard的問題(基於1.6.x版本):https://github.com/opsnull/follow-me-install-kubernetes-cluster/issues/5
Kubernetes-dashboard是kubernetes的ui網頁管理工具,可提供部署應用,資源對象管理,容器日志查詢,系統監控等常用的集群功能。
一.環境
1. 基礎環境
組件 |
版本 |
Remark |
kubernetes |
v1.9.2 |
|
kubernetes-dashboard |
v1.8.3 |
二.部署Kubernetes-dashboard
1. 准備images
kubernetes部署服務時,為避免部署時發生pull鏡像超時的問題,建議提前將相關鏡像pull到相關所有節點(實驗),或搭建本地鏡像系統。
- 基礎環境已做了鏡像加速,可參考:http://www.cnblogs.com/netonline/p/7420188.html
- 需要從gcr.io pull的鏡像,已利用Docker Hub的"Create Auto-Build GitHub"功能(Docker Hub利用GitHub上的Dockerfile文件build鏡像),在個人的Docker Hub build成功,可直接pull到本地使用。
# kubernetes-dashboard [root@kubenode1 ~]# docker pull netonline/kubernetes-dashboard-amd64:v1.8.3
2. 下載kubernetes-dashboard相關yaml范本
# https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dashboard # 也可以將多種服務資源置於1個yaml文件 [root@kubenode1 ~]# mkdir -p /usr/local/src/yaml/dashboard [root@kubenode1 ~]# cd /usr/local/src/yaml/dashboard # ConfigMap [root@kubenode1 dashboard]# wget https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dashboard/dashboard-configmap.yaml # Secret [root@kubenode1 dashboard]# wget https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dashboard/dashboard-secret.yaml # RBAC [root@kubenode1 dashboard]# wget https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dashboard/dashboard-rbac.yaml # dashboard-controller [root@kubenode1 dashboard]# wget https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dashboard/dashboard-controller.yaml # Service [root@kubenode1 dashboard]# wget https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dashboard/dashboard-service.yaml 本實驗使用yaml文件(修改版):https://github.com/Netonline2016/kubernetes/tree/master/addons/dashboard
3. dashboard-configmap.yaml
暫不修改,針對此次驗證,dashboard-controller也未使用到configmap。
4. dashboard-rbac.yaml
因api-server做了雙向數字證書認證,而dashboard的展示與操作都是通過調用api-server的接口實現的,所以需要為dashboard授權,采用rbac授權模式。
# 默認dashboard-rbac.yaml定義了1個name為”kubernetes-dashboard-minimal”的Role;並做了name為”kubernetes-dashboard-minimal”的RoleBinding,向name為”kubernetes-dashboard”的ServiceAccount授權; # 但默認的dashboard-rbac.yaml定義的Role權限太小,不太方便驗證; # 重新定義rbac,只需要定義新的ClusterRoleBinding: kubernetes-dashboard,將kubernetes自身的具有全部權限的ClusterRole: cluster-admin賦予ClusterRoleBinding;此授權方式在生產環境慎用; # 注意紅色加粗字體 [root@kubenode1 ~]# cd /usr/local/src/yaml/dashboard/ [root@kubenode1 dashboard]# vim dashboard-rbac.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: kubernetes-dashboard namespace: kube-system labels: k8s-app: kubernetes-dashboard addonmanager.kubernetes.io/mode: Reconcile roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: kubernetes-dashboard namespace: kube-system
5. dashboard-secret.yaml
kubernetes 1.8.x 與1.9.x版本中,dashboard服務默認啟用https端口,而非1.6.x版本中默認的http 9090端口,需要secret資源調用相關證書。
dashboard-secret.yaml不做修改。
6. dashboard-controller.yaml
# dashboard-controller.yaml定義了ServiceAccount資源(授權)與Deployment(服務Pod); # 修改第33行默認使用的dashboard鏡像 dashboard-controller.yaml [root@kubenode1 dashboard]# sed -i 's|k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3|netonline/kubernetes-dashboard-amd64:v1.8.3|g' dashboard-controller.yaml
7. dashboard-service.yaml
# dashboard-service.yaml定義服務,紅色加粗字體為修改或新增部分; # 定義”NodePort” type,為驗證通過控制節點直接訪問dashboard(生產環境中建議不使用 方式),”nodePort: 18443”定義具體的端口,不設置則在服務端口范圍中隨機產生 [root@kubenode1 dashboard]# vim dashboard-service.yaml apiVersion: v1 kind: Service metadata: name: kubernetes-dashboard namespace: kube-system labels: k8s-app: kubernetes-dashboard kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile spec: selector: k8s-app: kubernetes-dashboard type: NodePort ports: - port: 443 targetPort: 8443 nodePort: 18443
三.驗證Kubernetes-dashboard
1. 啟動dashboard
# 啟動rbac,secret,controller,service4個yaml文件定義的服務即可; # 或者kubectl create -f . [root@kubenode1 ~]# cd /usr/local/src/yaml/dashboard/ [root@kubenode1 dashboard]# kubectl create -f dashboard-rbac.yaml [root@kubenode1 dashboard]# kubectl create -f dashboard-secret.yaml [root@kubenode1 dashboard]# kubectl create -f dashboard-controller.yaml [root@kubenode1 dashboard]# kubectl create -f dashboard-service.yaml
2. 查看相關服務
# 查看service,已按定義的端口做了nodePort [root@kubenode1 dashboard]# kubectl get svc -n kube-system
# 查看deployment與pod服務 [root@kubenode1 dashboard]# kubectl get deployment -n kube-system [root@kubenode1 dashboard]# kubectl get pod -n kube-system
3. 通過kube-apiserver訪問dashboard
訪問dashboard有3種方式:
- 通過kube-apiserver訪問dashboar,;
- 通過kubectl proxy訪問dashboard;
- 通過nodePort訪問dashboard,建議在實驗環境中使用。
參考:https://github.com/kubernetes/dashboard/wiki/Accessing-Dashboard---1.7.X-and-above
1)生成kube-apiserver的訪問證書
# 因kube-apiserver啟用了雙向認證,而本地瀏覽器訪問kube-apiserver時使用匿名證書(在沒有導入相關證書時),導致授權失敗而不能訪問; # 客戶端工具kubectl訪問kube-apiserver的證書之前已經生成,這里只需要轉換為瀏覽器客戶端可識別的證書即可; # 轉換時輸入密碼可留空,否則導入時需要輸入密碼 [root@kubenode1 ~]# cd /etc/kubernetes/admin/ [root@kubenode1 admin]# openssl pkcs12 -export -in admin.pem -out admin-dashboard.p12 -inkey admin-key.pem
2)導入kube-apiserver的訪問證書
以firefox瀏覽器為例導入證書,密碼輸入轉換時使用的密碼,這里留空。
3)通過kube-apiserver訪問dashboard
# 獲取dashboard的kube-apiserver訪問地址 [root@kubenode1 ~]# kubectl cluster-info
瀏覽器安全方式訪問訪問https://<kube-apiserver>:<port>:https://172.30.200.10:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy
- 使用"Kubeconfig"訪問,需要導入kubeconfig文件,這里即生成客戶端工具kubectl訪問需要的kubeconfig文件:/etc/kubernetes/admin/admin.conf;
- 使用令牌訪問,需要輸入令牌,這里通過"kubectl get secret -n kube-system | grep kubernetes-dashboard-token"獲得令牌名名,再通過"kubectl describe secret kubernetes-dashboard-token-wl2wq -n kube-system"獲得令牌("kubernetes-dashboard-token-wl2wq "即令牌名);
- 或者直接"跳過"(前提是kubernetes-dashboard具有cluster-admin權限)。
進入kubernetes首頁后,默認在default命名空間。
4. 通過kube-proxy訪問dashboard
# kubectl proxy可啟用代理,代理不一定啟用在pod所在的節點,如下例pod在172.30.200.23節點,而在172.30.200.21節點啟動代理亦可 [root@kubenode1 dashboard]# kubectl get pod -n kube-system -o wide [root@kubenode1 dashboard]# kubectl proxy --address='172.30.200.21' --port=18001 --accept-hosts='^*$'
瀏覽器非安全方式訪問http://<代理節點>:<port>:http://172.30.200.21:18001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy
5. 通過NodePort訪問dashboard
在定義dashboard-service.yaml時,已定義"nodePort" type,並指定"nodePort: 18443",此方式在生產環境不建議采用。
通過瀏覽器安全訪問https://<node>:<port>(node可以是任意宿主機節點ip):https://172.30.200.23:18443