kubernetes學習筆記之十一:kubernetes dashboard認證及分級授權


第一章、部署dashboard

作為Kubernetes的Web用戶界面,用戶可以通過Dashboard在Kubernetes集群中部署容器化的應用,對應用進行問題處理和管理,並對集群本身進行管理。通過Dashboard,用戶可以查看集群中應用的運行情況,同時也能夠基於Dashboard創建或修改部署、任務、服務等Kubernetes的資源。通過部署向導,用戶能夠對部署進行擴縮容,進行滾動更新、重啟Pod和部署新應用。

項目地址:https://github.com/kubernetes/dashboard,根據項目中的介紹,我們自己在線安裝即可,但是實際上我們國內用戶無法自己安裝,需要下載后修改文件才能使用

下載yaml文件

[root@k8s-master01 manifests]# mkdir dashboard^C [root@k8s-master01 manifests]# cd dashboard/ [root@k8s-master01 dashboard]# wget  https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

修改yaml文件中鏡像的地址及service的類型

修改完成后,應用yaml文件

[root@k8s-master01 dashboard]# kubectl apply -f kubernetes-dashboard.yaml serviceaccount "kubernetes-dashboard" unchanged role.rbac.authorization.k8s.io "kubernetes-dashboard-minimal" unchanged rolebinding.rbac.authorization.k8s.io "kubernetes-dashboard-minimal" unchanged deployment.apps "kubernetes-dashboard" configured service "kubernetes-dashboard" configured [root@k8s-master01 dashboard]# kubectl get pod -n kube-system  #dashborad存在於kube-system名稱空間中 NAME READY STATUS RESTARTS AGE ...... kubernetes-dashboard-7b689d867f-f67hm   1/1       Running   0 27s [root@k8s-master01 dashboard]# kubectl get svc -n kube-system #查看service和端口是否開啟 NAME TYPE CLUSTER-IP     EXTERNAL-IP PORT(S) AGE ...... kubernetes-dashboard   NodePort    10.101.22.15   <none>        443:32333/TCP   13m

通過masterIP:port進行訪問,正常應該會出現下面的界面

從界面中可以看到訪問dashboard需要通過config或者token授權才能登陸,但是dashboard本身不提供授權,因為dashborad是一個pod,實際上我們是使用這個pod認證到k8s的集群中去的,我們需要為dashborad的pod提供config或者token認證,所以這里的認證主體應該是serviceaccount

如果出現以下界面

這是因為yaml文件中創建secret有問題,我們需要手動創建一個證書來進行認證,下面我們創建一個證書

[root@k8s-master01 dashboard]# cd /etc/kubernetes/pki/ [root@k8s-master01 pki]# (umask 077; openssl genrsa -out dashboard.key 2048) #創建一個證書 Generating RSA private key, 2048 bit long modulus ............................................................................................+++ .............+++ e is 65537 (0x10001) [root@k8s-master01 pki]# openssl req -new -key dashboard.key -out dashboard.csr -subj "/O=qiangungun/CN=kubernetes-dashboard" #建立證書的簽署請求 [root@k8s-master01 pki]# openssl x509 -req -in dashboard.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out dashboard.crt -days 3650 #使用集群的ca來簽署證書 Signature ok subject=/O=qiangungun/CN=kubernetes-dashboard Getting CA Private Key [root@k8s-master01 pki]# kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.crt=./dashboard.crt --from-file=dashboard.key=./dashboard.key  -n kube-system #我們需要把我們創建的證書創建為secret給k8s使用 secret "kubernetes-dashboard-certs" created

注釋dashborad yaml文件中secret的配置

重新應用yaml文件

[root@k8s-master01 dashboard]# kubectl delete  -f kubernetes-dashboard.yaml [root@k8s-master01 dashboard]# kubectl apply  -f kubernetes-dashboard.yaml 

再次訪問應該就正常了

第二章、創建以token方式登錄dashborad的用戶

1.創建具有集群管理權限的用戶登錄dashborad

[root@k8s-master01 dashboard]# kubectl create serviceaccount dashboard-admin -n kube-system #創建用於登錄dashborad的serviceaccount賬號 serviceaccount "dashboard-admin" created [root@k8s-master01 dashboard]# kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin  #創建一個clusterrolebingding,將名稱為cluster-admin的clusterrole綁定到我們剛剛從的serviceaccount上,名稱空間和sa使用:作為間隔 clusterrolebinding.rbac.authorization.k8s.io "dashboard-cluster-admin" created [root@k8s-master01 dashboard]# kubectl get secret -n kube-system #創建完成后系統會自動創建一個secret,名稱以serviceaccount名稱開頭 NAME TYPE DATA AGE ...... dashboard-admin-token-pbsj9                      kubernetes.io/service-account-token   3 4m ..... [root@k8s-master01 dashboard]# kubectl describe secret dashboard-admin-token-pbsj9 -n kube-system #使用describe查看該secret的詳細信息,主要是token一段 Name: dashboard-admin-token-pbsj9 Namespace: kube-system Labels: <none> Annotations: kubernetes.io/service-account.name=dashboard-admin kubernetes.io/service-account.uid=b24fb2eb-f5e1-11e8-8969-5254001b07db Type: kubernetes.io/service-account-token Data ==== token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tcGJzajkiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYjI0ZmIyZWItZjVlMS0xMWU4LTg5NjktNTI1NDAwMWIwN2RiIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.jDtIZFrcAPkr71pSStWm1AD4_gJM9A4JeYics3Nxs0hm2NQSCgL_pAIlVlSiHELmn3TLasOcvy8SljQnZQJcLKSkP-ubSBe8IkzXJkBr3SOhEr6eHb1ZDHXtC9bx58QH6PEOnO3hwoUaEtcIMuzC8ULbMp5f4TCvZ5mSKL_WPwaVJgZZDteUBPOsZHfcfIyatjXOWZBhiWbD3UZIN47ghpZl6BdXVeqLT5ua8Z8G0qtRD-DoDiQOaQ5Z9nKo_yluyb5cLJgpAtAl9i4Df7exHgVRnPETk1fbnxCDTGYlEgmLKFU6tRCEKl5Q66O9TICpdJIeT4sUBJxDSFVScPNFrA ca.crt: 1025 bytes namespace:  11 bytes

復制secret中的token,來訪問dashborad

選擇令牌,並粘貼剛剛復制的token,點擊登錄

可以看到,可以管理集群中的所有資源

2、創建具有指定名稱空間管理權限的用戶登錄dashborad

[root@k8s-master01 dashboard]# kubectl create serviceaccount default-ns-admin -n default #再次創建一個serviceaccount,指定名稱空間為default serviceaccount "default-ns-admin" created [root@k8s-master01 dashboard]# kubectl create rolebinding default-ns-admin --clusterrole=admin --serviceaccount=default:default-ns-admin #使用rolebinding綁定clusterrole用戶admin到剛剛創建的serviceaccount上 rolebinding.rbac.authorization.k8s.io "default-ns-admin" created [root@k8s-master01 dashboard]# kubectl get secret NAME TYPE DATA AGE ...... default-ns-admin-token-26xgs   kubernetes.io/service-account-token   3 2m ...... [root@k8s-master01 dashboard]# kubectl describe secret default-ns-admin-token-26xgs Name: default-ns-admin-token-26xgs Namespace: default Labels: <none> Annotations: kubernetes.io/service-account.name=default-ns-admin kubernetes.io/service-account.uid=b13f19e9-f5ec-11e8-8969-5254001b07db Type: kubernetes.io/service-account-token Data ==== ca.crt: 1025 bytes namespace:  7 bytes token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtbnMtYWRtaW4tdG9rZW4tMjZ4Z3MiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdC1ucy1hZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImIxM2YxOWU5LWY1ZWMtMTFlOC04OTY5LTUyNTQwMDFiMDdkYiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQtbnMtYWRtaW4ifQ.T1TsD-SyHDgpMMLWk75TFtYxOzc6SQcUHD4FsNEEjx6p48G9smBoh7fO6_y9NIvZKCjIGvzKt-ZUhRg7Oxk6vL2JIODe2apQQQBYyIzzW2y1ZFSICPpEHs0FYwt84RsUefGLLfEq0BrGa22mV58UfcttSMZN9LAUuWYe_1UX81F9neAuknKO78BNzif854SFOLvOaqOqNfMSiXs8Fi3vWPLi8_QFihObrC_FkDBhzc62zYtXzpH8T7gzadfAIexLpX7__RmcY8Cuaf7XvRh-zn3SAcmwo8v2ydtwOwTOtPA-6gEXGSM2UfR-rZ0WloPCIvGonej8fbNgH8G9sT2KTg

使用此token登錄dashborad

可以看到,出來default名稱空間之外,無法看到其他名稱空間了

第三章、創建以config方式登錄dashborad的用戶

為了方面我們直接使用剛剛創建的serviceaccount的token作為認證信息

[root@k8s-master01 dashboard]# cd /etc/kubernetes/pki/ [root@k8s-master01 pki]# kubectl config set-cluster kubernetes --certificate-authority=./ca.crt --server="https://172.16.150.212:6443" --embed-certs=true --kubeconfig=/root/def-ns-admin.conf #新建一個cluster,名稱為kubernetes,使用當前集群的ca進行認證,並指定kubeconfig文件位置 Cluster "kubernetes" set. [root@k8s-master01 pki]# kubectl config view --kubeconfig=/root/def-ns-admin.conf #查看創建信息 apiVersion: v1 clusters: - cluster: certificate-authority-data: REDACTED server: https://172.16.150.212:6443
 name: kubernetes contexts: [] current-context: "" kind: Config preferences: {} users: [] [root@k8s-master01 pki]# cd  [root@k8s-master01 ~]# kubectl get secret [root@k8s-master01 ~]# DEF_NS_ADMIN_TOKEN=$(kubectl get secret default-ns-admin-token-26xgs -o jsonpath={.data.token}|base64 -d) #k8s生成的token為base64加密,所有需要使用base64進行解密 [root@k8s-master01 ~]# kubectl config set-credentials def-ns-admin --token=$DEF_NS_ADMIN_TOKEN --kubeconfig=/root/def-ns-admin.conf #創建一個serviceaccount的用戶 User "def-ns-admin" set. [root@k8s-master01 manifests]# kubectl config view --kubeconfig=/root/def-ns-admin.conf apiVersion: v1 clusters: - cluster: certificate-authority-data: REDACTED server: https://172.16.150.212:6443
 name: kubernetes contexts: - context: cluster: kubernetes user: def-ns-admin name: def-ns-admin@kubernetes current-context: "" kind: Config preferences: {} users: - name: def-ns-admin user: token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtbnMtYWRtaW4tdG9rZW4tMjZ4Z3MiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdC1ucy1hZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImIxM2YxOWU5LWY1ZWMtMTFlOC04OTY5LTUyNTQwMDFiMDdkYiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQtbnMtYWRtaW4ifQ.T1TsD-SyHDgpMMLWk75TFtYxOzc6SQcUHD4FsNEEjx6p48G9smBoh7fO6_y9NIvZKCjIGvzKt-ZUhRg7Oxk6vL2JIODe2apQQQBYyIzzW2y1ZFSICPpEHs0FYwt84RsUefGLLfEq0BrGa22mV58UfcttSMZN9LAUuWYe_1UX81F9neAuknKO78BNzif854SFOLvOaqOqNfMSiXs8Fi3vWPLi8_QFihObrC_FkDBhzc62zYtXzpH8T7gzadfAIexLpX7__RmcY8Cuaf7XvRh-zn3SAcmwo8v2ydtwOwTOtPA-6gEXGSM2UfR-rZ0WloPCIvGonej8fbNgH8G9sT2KTg [root@k8s-master01 manifests]# kubectl config use-context def-ns-admin@kubernetes --kubeconfig=/root/def-ns-admin.conf #設置當前serviceaccount的上下文 Switched to context "def-ns-admin@kubernetes". [root@k8s-master01 manifests]# kubectl config view --kubeconfig=/root/def-ns-admin.conf apiVersion: v1 clusters: - cluster: certificate-authority-data: REDACTED server: https://172.16.150.212:6443
 name: kubernetes contexts: - context: cluster: kubernetes user: def-ns-admin name: def-ns-admin@kubernetes current-context: def-ns-admin@kubernetes kind: Config preferences: {} users: - name: def-ns-admin user: token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtbnMtYWRtaW4tdG9rZW4tMjZ4Z3MiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdC1ucy1hZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImIxM2YxOWU5LWY1ZWMtMTFlOC04OTY5LTUyNTQwMDFiMDdkYiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQtbnMtYWRtaW4ifQ.T1TsD-SyHDgpMMLWk75TFtYxOzc6SQcUHD4FsNEEjx6p48G9smBoh7fO6_y9NIvZKCjIGvzKt-ZUhRg7Oxk6vL2JIODe2apQQQBYyIzzW2y1ZFSICPpEHs0FYwt84RsUefGLLfEq0BrGa22mV58UfcttSMZN9LAUuWYe_1UX81F9neAuknKO78BNzif854SFOLvOaqOqNfMSiXs8Fi3vWPLi8_QFihObrC_FkDBhzc62zYtXzpH8T7gzadfAIexLpX7__RmcY8Cuaf7XvRh-zn3SAcmwo8v2ydtwOwTOtPA-6gEXGSM2UfR-rZ0WloPCIvGonej8fbNgH8G9sT2KTg

導出/root/def-ns-admin.conf到客戶端上,並選擇kubeconfig方式登錄,點擊選擇文件即可

沒有問題,登錄成功

第四章、Dashboard使用

1 、Dashboard提供的功能

在默認情況下,Dashboard顯示默認(default)命名空間下的對象,也可以通過命名空間選擇器選擇其他的命名空間。在Dashboard用戶界面中能夠顯示集群大部分的對象類型。 1集群管理 集群管理視圖用於對節點、命名空間、持久化存儲卷、角色和存儲類進行管理。 節點視圖顯示CPU和內存的使用情況,以及此節點的創建時間和運行狀態。 命名空間視圖會顯示集群中存在哪些命名空間,以及這些命名空間的運行狀態。角色視圖以列表形式展示集群中存在哪些角色,這些角色的類型和所在的命名空間。 持久化存儲卷以列表的方式進行展示,可以看到每一個持久化存儲卷的存儲總量、訪問模式、使用狀態等信息;管理員也能夠刪除和編輯持久化存儲卷的YAML文件。 2工作負載 工作負載視圖顯示部署、副本集、有狀態副本集等所有的工作負載類型。在此視圖中,各種工作負載會按照各自的類型進行組織。 工作負載的詳細信息視圖能夠顯示應用的詳細信息和狀態信息,以及對象之間的關系。 3服務發現和負載均衡 服務發現視圖能夠將集群內容的服務暴露給集群外的應用,集群內外的應用可以通過暴露的服務調用應用,外部的應用使用外部的端點,內部的應用使用內部端點。 4存儲 存儲視圖顯示被應用用來存儲數據的持久化存儲卷申明資源。 5配置 配置視圖顯示集群中應用運行時所使用配置信息,Kubernetes提供了配置字典(ConfigMaps)和秘密字典(Secrets),通過配置視圖,能夠編輯和管理配置對象,以及查看隱藏的敏感信息。 6日志視圖 Pod列表和詳細信息頁面提供了查看日志視圖的鏈接,通過日志視圖不但能夠查看Pod的日志信息,也能夠查看Pod容器的日志信息。通過Dashboard能夠根據向導創建和部署一個容器化的應用,當然也可以通過手工的方式輸入指定應用信息,或者通過上傳YAML和JSON文件來創建和不受應用。

2 、部署應用

1手動創建應用 通過向導創建和部署容器化應用時,需要提供如下的一些信息: 應用名稱(App name 必需): 需要部署的應用的名稱。帶有此值的標簽將會被添加至部署和服務中。在當前的Kubernetes命名空間中,應用名稱必須是唯一的。同時,應用名稱必須以小寫字母開頭,以小寫字母和數字結尾,可以包含字母、數字和“-”。名稱最長為24個字母。 容器組個數(Number of pods 必需): 希望部署的容器組數量。值必須為整數。 描述(Description): 對於應用的描述,將被添加至部署的注釋中,並在應用詳細信息中顯示。 標簽(Labels): 應用的默認標簽為應用的名稱和版本。可以指定其它的標簽,這些標簽將會被應用至部署、服務、容器組等資源中。 命名空間(Namespace):在同一個物理集群中,Kubernetes支持多個虛擬集群。這些虛擬集群被稱為命名空間,通過命名空間可以將資源進行邏輯上的划分。通過下列菜單可以選擇已有的命名空間,當然也可以創建新的命名空間。命名空間的名稱最大的字符數為63,名詞可以使用字母、數字“-”,不能包含大寫字母,同時也不能全部使用數字。 鏡像拉取保密字典(Image Pull Secret): 如果Docker容器鏡像是私有的,則有可能需要保密證書。Dashboard通過下拉菜單提供了所有的可用的保密憑證,也允許創建新的保密字典。保密字典名稱必須遵循DNS域名語法,例如:new.image-pull.secret。保密字典的內容必須使用基於base64進行加密的,並在.dockercfg文件中進行指定。保密字典名稱最長不能超過253個字符。 環境變量(Environment variables): Kubernetes通過環境變量暴露服務, 可以創建環境變量或者使用環境變量的值將參數傳遞給命令。環境變量能夠被應用用來發現服務,環境變量的值可以通過¥(VAR_NAME)語法被其它變量引用。
2上傳YAML或JSON文件創建應用 通過編譯工具編寫容器化應用的YAML和JSON文件,在Dashboard用戶界面中通過上傳文件創建和部署應用。

部署步驟簡單總結:

1部署: kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
2將Service改為NodePort kubectl patch svc kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}' -n kube-system 3認證: 認證時的賬號必須為ServiceAccount:被dashboard pod拿來由kubernetes進行認證; token: (1)創建ServiceAccount,根據其管理目標,使用rolebinding或clusterrolebinding綁定至合理role或clusterrole; (2)獲取到此ServiceAccount的secret,查看secret的詳細信息,其中就有token; kubeconfig: 把ServiceAccount的token封裝為kubeconfig文件 (1)創建ServiceAccount,根據其管理目標,使用rolebinding或clusterrolebinding綁定至合理role或clusterrole; (2)kubectl get secret | awk '/^ServiceAccount/{print $1}' KUBE_TOKEN=$(kubectl get secret SERVCIEACCOUNT_SERRET_NAME -o jsonpath={.data.token} |base64 -d) (3)生成kubeconfig文件 kubectl config set-cluster --kubeconfig=/PATH/TO/SOMEFILE kubectl config set-credentials NAME --token=$KUBE_TOKEN --kubeconfig=/PATH/TO/SOMEFILE kubectl config set-context kubectl config use-context

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM