kubernetes-dashboard有兩種認證方式,一個token認證,另一個是Kubeconfig文件的認證。這個時候的認證不是UserAccount而是獲取kubernetes集群資源信息的serviceAccount。
token 認證
# 創建一個dashboard的私鑰
cd /etc/kubernetes/pki/
(umask 077; openssl genrsa -out dashboard.key 2048)
# 生成一個證書簽署請求
openssl req -new -key dashboard.key -out dashboard.csr -subj "/O=klvchen/CN=dashboard"
# 通過ca.key和ca.crt簽署證書
openssl x509 -req -in dashboard.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out dashboard.crt -days 365
# 通過簽署證書創建一個sercert
kubectl create secret generic dashboard-cert -n kube-system --from-file=dashboard.crt=./dashboard.crt --from-file=dashboard.key=./dashboard.key
# 創建一個專用的 serviceaccount 帳號 dashboard-admin
kubectl create serviceaccount dashboard-admin -n kube-system
# 綁定角色 cluster-admin
kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
# 查看 dashboard-admin 的 Tokens
kubectl describe serviceaccount dashboard-admin -n kube-system
# 根據上面顯示為 dashboard-admin-token-wrfng
kubectl get secret -n kube-system
kubectl describe secret dashboard-admin-token-wrfng -n kube-system
# 獲取 token 值,用來在填寫網頁登錄認證信息
# 創建 dashboard 所需要的資源
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.8.3/src/deploy/recommended/kubernetes-dashboard.yaml
kubectl get pods -n kube-system
kubectl get svc -n kube-system
# 修改 svc 的的網絡類型
kubectl patch svc kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}' -n kube-system
kubectl get svc -n kube-system
# 獲取 NodePort 映射的外網端口,這里是 32240
使用 火狐瀏覽器 訪問 https://192.168.0.205:32240 ,點擊 高級, 添加例外。這里使用 chrome 和 搜狗瀏覽器沒法出來界面。
Kubeconfig文件認證
# 創建一個訪問 default命令空間的 serviceaccount 賬號
cd /etc/kubernetes/pki
kubectl create serviceaccount def-ns-admin -n default
# 創建 rolebinding 把 def-ns-admin 與 admin 關聯,命名空間是 default
kubectl create rolebinding def-ns-admin --clusterrole=admin --serviceaccount=default:def-ns-admin
# 如果需要所有命名空間的權限,可以使用 clusterrolebinding 與 cluster-admin 關聯
kubectl create clusterrolebinding def-ns-admin --clusterrole=cluster-admin --serviceaccount=default:def-ns-admin
# 查看 def-ns-admin 的 token
kubectl get secret
kubectl describe secret def-ns-admin-token-8vzj5
# 創建一個kubeconfig配置文件(基於token配置)
kubectl config set-cluster kubernetes --certificate-authority=./ca.crt --server="https://192.168.0.205:6443" --embed-certs=true --kubeconfig=/root/def-ns-admin.conf
kubectl config view --kubeconfig=/root/def-ns-admin.conf
DEF_NS_ADMIN_TOKEN=$(kubectl get secret def-ns-admin-token-8vzj5 -o jsonpath={.data.token} |base64 -d)
kubectl config set-credentials def-ns-admin --token=$DEF_NS_ADMIN_TOKEN --kubeconfig=/root/def-ns-admin.conf
kubectl config view --kubeconfig=/root/def-ns-admin.conf
# 配置上下文
kubectl config set-context def-ns-admin@kubernetes --cluster=kubernetes --user=def-ns-admin --kubeconfig=/root/def-ns-admin.conf
# 配置當前上下文
kubectl config use-context def-ns-admin@kubernetes --kubeconfig=/root/def-ns-admin.conf
kubectl config view --kubeconfig=/root/def-ns-admin.conf
# 下載 def-ns-admin.conf
# 使用 火狐瀏覽器 訪問
https://192.168.0.205:31328
總結
#部署 Dashboard 的方法
1. 創建:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.8.3/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}'
DEF_NS_ADMIN_TOKEN=$(kubectl get secret def-ns-admin-token-8vzj5 -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