1. 程式人生 > >[k8s集群系列-09]Kubernetes 組件 Dashboard

[k8s集群系列-09]Kubernetes 組件 Dashboard

ply sfc manage update block dep lbs auth accept

Kubernetes Dashboard是Kubernetes集群的通用基於Web的UI。它允許用戶管理在群集中運行的應用程序並對其進行故障排除,並管理群集本身。

部署Dashboard

項目github地址
官方文檔參考

獲取yaml文件

curl -O https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml   # https訪問的 選這個
curl -O https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/alternative/kubernetes-dashboard.yaml   # http方式訪問

修改yaml文件中的鏡像地址

查看鏡像地址

>  grep image kubernetes-dashboard.yaml 
        image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3   # 這個地址被墻,可以去docker-hub搜索此鏡像上傳至自己的鏡像庫中

替換鏡像地址

這裏我們直接使用docker-hub上的鏡像
鏡像地址

> grep image kubernetes-dashboard.yaml 
        image: anjia0532/kubernetes-dashboard-amd64:v1.8.3

在deployment段加一個配置
- --heapster-host=http://heapster

引入yaml文件

> kubectl apply -f kubernetes-dashboard.yaml 

> kubectl get pods -n kube-system | grep dashboard
kubernetes-dashboard-bbc7b8b5-rj8hf   1/1       Running   0          10m

> kubectl get svc -n kube-system | grep dashboard 
kubernetes-dashboard   ClusterIP   10.254.61.253   <none>        80/TCP          43s

要從本地工作站訪問儀表板,您必須為您的Kubernetes集群創建一個安全通道。
運行以下命令:

kubectl proxy

現在訪問dashboard

http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/.    # 可惜本地的服務器沒有瀏覽器和GUI,可以使用elinks試下

身份認證

登錄dashboard 的時候支持Kubeconfig 和token 兩種認證方式,Kubeconfig 中也依賴token 字段,所以生成token 這一步是必不可少的。

創建用戶及rbac

我們創建一個admin用戶並授予admin 角色綁定,使用下面的yaml文件創建admin用戶並賦予他管理員權限,然後就可以通過token 登陸dashbaord,這種認證方式本質實際上是通過Service Account 的身份認證加上Bearer token請求 API server 的方式實現,參考 Kubernetes 中的認證

# cat k8s-dashboard-admin-rbac.yaml 
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: admin
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
  name: admin
  namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin
  namespace: kube-system
  labels:
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile

創建

kubectl apply -f k8s-dashboard-admin-rbac.yaml

獲取token

上面的admin用戶創建完成後我們就可以獲取到該用戶對應的token了,如下命令:

> kubectl get secret -n kube-system|grep admin-token
admin-token-ph8sh                  kubernetes.io/service-account-token   3         11m

> kubectl get secret admin-token-ph8sh -o jsonpath={.data.token} -n kube-system |base64 -d 
eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi10b2tlbi1waDhzaCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImYwYmM5ZjFmLTc2MDUtMTFlOC05YWQ1LTAwNTA1Njk4MDRmYyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTphZG1pbiJ9.TcGnYLj7008BNATdddz070f4Pu_FfXty0DjJdAey_TII9KTQnsfCpGDqDcMEl5XzeKrHRt7WH_3jP7LTv6ZDwU24cJB2MtAPWAOsLPasOyooIRAej53JzNcY_uP3NB0rF1xqBO28GtVHal-snzDPANcFTDtHHvvF2BCsa-dP__jCwG88vPHTa1h4TWVGHdsP2KcbH_56NTDdfeJg7CtXxs-KCWRS3K_3R4nwa1s1rSCSePot8OtbJ-SpVGZu9-G3-5XPNCqKk_TuCWMIPP2ZkWIJscudoPXwXX-8uC1_0WMpLuyvWnpQlVjGpVnhiOQHcNhSvsfZMeDXv4HoVskHgA 

這個token有效期只針對於當前生命周期內的dashborad,如果刪除後再創建,需要生成新的token

集成Heapster插件

Heapster是容器集群監控和性能分析工具,天然的支持Kubernetes和CoreOS。Kubernetes有個出名的監控cAdvisor。在每個kubernetes Node上都會運行cAdvisor,它會收集本機以及容器的監控數據(cpu,memory,filesystem,network,uptime)。
在較新的版本中,K8S已經將cAdvisor功能集成到kubelet組件中。每個Node節點可以直接進行web訪問。cAdvisor web界面訪問: http://< Node-IP >:4194
cAdvisor也提供Restful API: https://github.com/google/cadvisor/blob/master/docs/api.md

到heapster release 頁面下載最新版的heapster

獲取文件

> wget https://github.com/kubernetes/heapster/archive/v1.5.3.tar.gz
> tar -xf v1.5.3.tar.gz 

# 相關文件
> cd heapster-1.5.3/deploy/kube-config/
> ls rbac/ && ls influxdb/
heapster-rbac.yaml
grafana.yaml  heapster.yaml  influxdb.yaml

鏡像地址修改

查看鏡像地址

> grep image influxdb/*
influxdb/grafana.yaml:        image: gcr.io/google_containers/heapster-grafana-amd64:v4.4.3
influxdb/heapster.yaml:        image: gcr.io/google_containers/heapster-amd64:v1.5.3
influxdb/influxdb.yaml:        image: gcr.io/google_containers/heapster-influxdb-amd64:v1.3.3

修改鏡像地址

> grep image influxdb/*      
influxdb/grafana.yaml:        image: anjia0532/heapster-grafana-amd64:v4.4.3
influxdb/heapster.yaml:        image: anjia0532/heapster-amd64:v1.5.3
influxdb/influxdb.yaml:        image: anjia0532/heapster-influxdb-amd64:v1.3.3

引入yaml文件

> cp rbac/heapster-rbac.yaml influxdb/
> cd influxdb/
> ls
grafana.yaml  heapster-rbac.yaml  heapster.yaml  influxdb.yaml
> kubectl create -f .

查看pod,svc

> kubectl get svc -n kube-system -o wide 
NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE       SELECTOR
coredns                ClusterIP   10.254.0.2       <none>        53/UDP,53/TCP   7d        k8s-app=coredns
heapster               ClusterIP   10.254.76.86     <none>        80/TCP          24s       k8s-app=heapster
kubernetes-dashboard   ClusterIP   10.254.61.253    <none>        80/TCP          1h        k8s-app=kubernetes-dashboard
monitoring-grafana     ClusterIP   10.254.234.193   <none>        80/TCP          24s       k8s-app=grafana
monitoring-influxdb    ClusterIP   10.254.83.156    <none>        8086/TCP        24s       k8s-app=influxdb

> kubectl get pod -n kube-system -o wide    
NAME                                   READY     STATUS    RESTARTS   AGE       IP            NODE
coredns-66c9f6f9f7-5k9fb               1/1       Running   1          3d        172.18.16.2   k8s-n2-16-239
heapster-d59d66579-gr8sf               1/1       Running   0          33s       172.18.29.3   k8s-n3-16-240
kubernetes-dashboard-bbc7b8b5-rj8hf    1/1       Running   0          1h        172.18.29.2   k8s-n3-16-240
monitoring-grafana-bff95c48c-7kfjm     1/1       Running   0          10m       172.18.16.3   k8s-n2-16-239
monitoring-influxdb-5d474bf6d5-56pxq   1/1       Running   0          34s       172.18.52.2   k8s-n1-16-238

訪問方式

kubectl proxy

本地訪問方式

我們之前使用kubectl proxy就是只能loclahost訪問

使用--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/  # 也是半天沒出來

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-06-22T09:56:05Z
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
  resourceVersion: "1715288"
  selfLink: /api/v1/namespaces/kube-system/services/kubernetes-dashboard
  uid: 7abab091-7602-11e8-80c7-00505698f5d8
spec:
  clusterIP: 10.254.61.253
  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.254.61.253   <none>        443:30054/TCP   2hs

> kubectl -n kube-system get pod  -o wide | grep dashboard
kubernetes-dashboard-9d85bdcb6-n5ngf   1/1       Running   0          14m       172.18.16.4   k8s-n2-16-239

訪問

https://192.168.16.239:30054/#!/login   # 登錄界面,輸入之前的令牌就可以登錄

API Server

如果Kubernetes API服務器是公開的,並可以從外部訪問,那我們可以直接使用API Server的方式來訪問,也是比較推薦的方式。
Dashboard的訪問地址為:

https://<master-ip>:<apiserver-port>/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
https://api.kubernetes.master/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-data和client-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文件,重新打開瀏覽器

因為證書無法簽證通過,還是無法訪問到

Ingress

使用開源的反向代理負載均衡軟件(nginx,haproxy)與k8s集成,更為方便靈活的服務暴露方式,推薦使用這種,在下面的Ingress我們會將dashboard service使用traefik暴露出來進行訪問的

參考blog地址

[k8s集群系列-09]Kubernetes 組件 Dashboard