1. 程式人生 > >kubernetes學習筆記之十一:kubernetes dashboard認證及分級授權

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

第一章、部署dashboard

作為Kubernetes的Web使用者介面,使用者可以通過Dashboard在Kubernetes叢集中部署容器化的應用,對應用進行問題處理和管理,並對叢集本身進行管理。通過Dashboard,使用者可以檢視叢集中應用的執行情況,同時也能夠基於Dashboard建立或修改部署、任務、服務等Kubernetes的資源。通過部署嚮導,使用者能夠對部署進行擴縮容,進行滾動更新、重啟Pod和部署新應用。

專案地址:https://github.com/kubernetes/dashboard,根據專案中的介紹,我們自己線上安裝即可,但是實際上我們國內使用者無法自己安裝,需要下載後修改檔案才能使用

下載yaml檔案

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

修改yaml檔案中映象的地址及service的型別

修改完成後,應用yaml檔案

[[email protected] 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 [[email protected]-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 [[email protected]-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有問題,我們需要手動建立一個證書來進行認證,下面我們建立一個證書

[[email protected] dashboard]# cd /etc/kubernetes/pki/
[[email protected]-master01 pki]# (umask 077; openssl genrsa -out dashboard.key 2048)  #建立一個證書
Generating RSA private key, 2048 bit long modulus
............................................................................................+++
.............+++
e is 65537 (0x10001)
[[email protected]-master01 pki]# openssl req -new -key dashboard.key -out dashboard.csr -subj "/O=qiangungun/CN=kubernetes-dashboard"    #建立證書的簽署請求
[[email protected]-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
[[email protected]-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檔案

[[email protected] dashboard]# kubectl delete  -f kubernetes-dashboard.yaml 
[[email protected]-master01 dashboard]# kubectl apply  -f kubernetes-dashboard.yaml 

再次訪問應該就正常了

第二章、建立以token方式登入dashborad的使用者

1.建立具有叢集管理許可權的使用者登入dashborad

[[email protected] dashboard]# kubectl create serviceaccount dashboard-admin -n kube-system #建立用於登入dashborad的serviceaccount賬號
serviceaccount "dashboard-admin" created
[[email protected]-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   
[[email protected]-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
.....
[[email protected]-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

[[email protected] dashboard]# kubectl create serviceaccount default-ns-admin -n default #再次建立一個serviceaccount,指定名稱空間為default
serviceaccount "default-ns-admin" created
[[email protected]-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
[[email protected]-master01 dashboard]# kubectl get secret 
NAME                           TYPE                                  DATA      AGE
......
default-ns-admin-token-26xgs   kubernetes.io/service-account-token   3         2m
......
[[email protected]-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作為認證資訊

[[email protected] dashboard]# cd /etc/kubernetes/pki/
[[email protected]-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.
[[email protected]-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: []
[[email protected]-master01 pki]# cd 
[[email protected]-master01 ~]# kubectl get secret 
[[email protected]-master01 ~]# DEF_NS_ADMIN_TOKEN=$(kubectl get secret default-ns-admin-token-26xgs -o jsonpath={.data.token}|base64 -d) #k8s生成的token為base64加密,所有需要使用base64進行解密
[[email protected]-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.
[[email protected]-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-[email protected]
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
[[email protected]-master01 manifests]# kubectl config use-context [email protected] --kubeconfig=/root/def-ns-admin.conf #設定當前serviceaccount的上下文
Switched to context "[email protected]".
[[email protected]-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-[email protected]
current-context: def-ns-[email protected]
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