k8s dashboard部署

giserinchina發表於2019-01-03

dashboard

本文件基於 dashboard 1.10.0版本,k8s版本 1.11.x。因 dashboard 1.7 以後預設開啟了自帶的登陸驗證機制,因此不同版本登陸有差異:

  • 舊版(<= 1.6)建議通過apiserver訪問,直接通過apiserver 認證授權機制去控制 dashboard許可權,詳見舊版文件
  • 新版(>= 1.7)可以使用自帶的登陸介面,使用不同Service Account Tokens 去控制訪問 dashboard的許可權

部署

如果之前已按照本專案部署dashboard1.6.3,先刪除舊版本:kubectl delete -f /etc/ansible/manifests/dashboard/1.6.3/

新版配置檔案參考官方文件

  • 增加了通過api-server方式訪問dashboard
  • 增加了NodePort方式暴露服務,這樣叢集外部可以使用 https://NodeIP:NodePort (注意是https不是http,區別於1.6.3版本) 直接訪問 dashboard。

安裝部署

# 部署dashboard 主yaml配置檔案
$ kubectl apply -f /etc/ansible/manifests/dashboard/kubernetes-dashboard.yaml
# [可選]部署基本密碼認證配置,使用apiserver 方式訪問需要
$ kubectl apply -f /etc/ansible/manifests/dashboard/ui-admin-rbac.yaml
$ kubectl apply -f /etc/ansible/manifests/dashboard/ui-read-rbac.yaml
# 建立可讀可寫 admin Service Account
$ kubectl apply -f /etc/ansible/manifests/dashboard/admin-user-sa-rbac.yaml
# 建立只讀 read Service Account
$ kubectl apply -f /etc/ansible/manifests/dashboard/read-user-sa-rbac.yaml

驗證

# 檢視pod 執行狀態
kubectl get pod -n kube-system | grep dashboard
kubernetes-dashboard-7c74685c48-9qdpn   1/1       Running   0          22s
# 檢視dashboard service
kubectl get svc -n kube-system|grep dashboard
kubernetes-dashboard   NodePort    10.68.219.38   <none>        443:24108/TCP                   53s
# 檢視叢集服務
kubectl cluster-info|grep dashboard
kubernetes-dashboard is running at https://192.168.1.1:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy
# 檢視pod 執行日誌
kubectl logs kubernetes-dashboard-7c74685c48-9qdpn -n kube-system
  • 由於還未部署 Heapster 外掛,當前 dashboard 不能展示 Pod、Nodes 的 CPU、記憶體等 metric 圖形,後續部署 heapster後自然能夠看到

訪問控制

因為dashboard 作為k8s 原生UI,能夠展示各種資源資訊,甚至可以有修改、增加、刪除許可權,所以有必要對訪問進行認證和控制,本專案部署的叢集有以下安全設定:詳見 apiserver配置模板

  • 啟用 TLS認證 RBAC授權等安全特性
  • 關閉 apiserver非安全埠8080的外部訪問--insecure-bind-address=127.0.0.1
  • 關閉匿名認證--anonymous-auth=false
  • 補充啟用基本密碼認證 --basic-auth-file=/etc/kubernetes/ssl/basic-auth.csv密碼檔案模板中按照每行(密碼,使用者名稱,序號)的格式,可以定義多個使用者

新版 dashboard可以有多層訪問控制,首先與舊版一樣可以使用apiserver 方式登陸控制:

  • 第一步通過api-server本身安全認證流程,與之前1.6.3版本相同,這裡不再贅述
  • 第二步通過dashboard自帶的登陸流程,使用Kubeconfig Token等方式登陸

演示使用 https://NodeIP:NodePort 方式訪問 dashboard,支援兩種登入方式:Kubeconfig、令牌(Token)

  • 令牌登入(admin)

選擇“令牌(Token)”方式登陸,複製下面輸出的admin token 欄位到輸入框

# 建立Service Account 和 ClusterRoleBinding
$ kubectl apply -f /etc/ansible/manifests/dashboard/admin-user-sa-rbac.yaml
# 獲取 Bearer Token,找到輸出中 ‘token:’ 開頭那一行
$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
  • 令牌登入(只讀)

選擇“令牌(Token)”方式登陸,複製下面輸出的read token 欄位到輸入框

# 建立Service Account 和 ClusterRoleBinding
$ kubectl apply -f /etc/ansible/manifests/dashboard/read-user-sa-rbac.yaml
# 獲取 Bearer Token,找到輸出中 ‘token:’ 開頭那一行
$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep read-user | awk '{print $1}')
  • Kubeconfig登入(admin) Admin kubeconfig檔案預設位置:/root/.kube/config,該檔案中預設沒有token欄位,使用Kubeconfig方式登入,還需要將token追加到該檔案中,完整的檔案格式如下:
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdxxxxxxxxxxxxxx
    server: https://192.168.1.2:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: admin
  name: kubernetes
current-context: kubernetes
kind: Config
preferences: {}
users:
- name: admin
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRxxxxxxxxxxx
    client-key-data: LS0tLS1CRUdJTxxxxxxxxxxxxxx
    token: eyJhbGcixxxxxxxxxxxxxxxx

參考

相關文章