https://www.cnblogs.com/panwenbin-logs/p/10052554.html html
一章、部署dashboardgit
做爲Kubernetes的Web用戶界面,用戶能夠經過Dashboard在Kubernetes集羣中部署容器化的應用,對應用進行問題處理和管理,並對集羣自己進行管理。經過Dashboard,用戶能夠查看集羣中應用的運行狀況,同時也可以基於Dashboard建立或修改部署、任務、服務等Kubernetes的資源。經過部署嚮導,用戶可以對部署進行擴縮容,進行滾動更新、重啓Pod和部署新應用。github
項目地址:https://github.com/kubernetes/dashboard,根據項目中的介紹,咱們本身在線安裝便可,可是實際上咱們國內用戶沒法本身安裝,須要下載後修改文件才能使用docker
下載yaml文件json
[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的類型api
修改完成後,應用yaml文件bash
[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進行訪問,正常應該會出現下面的界面app
從界面中能夠看到訪問dashboard須要經過config或者token受權才能登錄,可是dashboard自己不提供受權,由於dashborad是一個pod,實際上咱們是使用這個pod認證到k8s的集羣中去的,咱們須要爲dashborad的pod提供config或者token認證,因此這裏的認證主體應該是serviceaccount負載均衡
若是出現如下界面ide
這是由於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.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYa9hcmQtYWRtaW4tdG9rZW4tcGJzajkiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYjI0ZmIyZWItZjVlMS0xMWU4LTg5NjktNTI1NDAwMWIwN2RiIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.jDtIZFrcAPkr71pSStWm1AD4_gJA9A4JeYics3Nxs0hm2NQSCgL_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