create-dashboard-kubeconfig-fixed.sh 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #!/bin/bash
  2. # create-dashboard-kubeconfig-fixed.sh
  3. echo "🔧 创建 Kubernetes Dashboard 可用的 kubeconfig 文件..."
  4. # 1. 确保 dashboard-user 存在并具有权限
  5. cat <<EOF | kubectl apply -f -
  6. apiVersion: v1
  7. kind: ServiceAccount
  8. metadata:
  9. name: dashboard-user
  10. namespace: kubernetes-dashboard
  11. ---
  12. apiVersion: rbac.authorization.k8s.io/v1
  13. kind: ClusterRoleBinding
  14. metadata:
  15. name: dashboard-user-binding
  16. roleRef:
  17. apiGroup: rbac.authorization.k8s.io
  18. kind: ClusterRole
  19. name: cluster-admin
  20. subjects:
  21. - kind: ServiceAccount
  22. name: dashboard-user
  23. namespace: kubernetes-dashboard
  24. EOF
  25. # 2. 等待 secret 创建完成
  26. sleep 3
  27. # 3. 获取正确的 token
  28. # 方法1:使用 create token 命令(推荐)
  29. TOKEN=$(kubectl create token dashboard-user -n kubernetes-dashboard --duration=8760h)
  30. # 如果方法1失败,使用方法2
  31. if [ -z "$TOKEN" ] || [ "$TOKEN" == "" ]; then
  32. echo "⚠️ 方法1失败,尝试方法2..."
  33. SECRET_NAME=$(kubectl get serviceaccount dashboard-user -n kubernetes-dashboard -o jsonpath='{.secrets[0].name}')
  34. TOKEN=$(kubectl get secret $SECRET_NAME -n kubernetes-dashboard -o jsonpath='{.data.token}' | base64 --decode)
  35. fi
  36. # 验证 token 是否有效
  37. if [ -z "$TOKEN" ] || [ "$TOKEN" == "" ]; then
  38. echo "❌ 无法获取 token,正在创建新的 secret..."
  39. # 删除现有的 secret(如果有)
  40. kubectl delete secret dashboard-user-token -n kubernetes-dashboard 2>/dev/null || true
  41. # 创建新的 secret
  42. kubectl apply -f - <<EOF
  43. apiVersion: v1
  44. kind: Secret
  45. metadata:
  46. name: dashboard-user-token
  47. namespace: kubernetes-dashboard
  48. annotations:
  49. kubernetes.io/service-account.name: dashboard-user
  50. type: kubernetes.io/service-account-token
  51. EOF
  52. # 关联 secret 到 service account
  53. kubectl patch serviceaccount dashboard-user -n kubernetes-dashboard --patch "{\"secrets\": [{\"name\": \"dashboard-user-token\"}]}"
  54. sleep 3
  55. TOKEN=$(kubectl get secret dashboard-user-token -n kubernetes-dashboard -o jsonpath='{.data.token}' | base64 --decode)
  56. fi
  57. # 4. 获取集群信息
  58. SERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
  59. # 如果 server 地址是 localhost,需要改为节点 IP
  60. if [[ $SERVER == *"localhost"* ]] || [[ $SERVER == *"127.0.0.1"* ]]; then
  61. NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}')
  62. SERVER="https://${NODE_IP}:6443"
  63. fi
  64. # 5. 创建 kubeconfig 文件
  65. cat > dashboard-kubeconfig.yaml <<EOF
  66. apiVersion: v1
  67. clusters:
  68. - cluster:
  69. insecure-skip-tls-verify: true
  70. server: ${SERVER}
  71. name: kubernetes-cluster
  72. contexts:
  73. - context:
  74. cluster: kubernetes-cluster
  75. user: dashboard-user
  76. namespace: kubernetes-dashboard
  77. name: dashboard-context
  78. current-context: dashboard-context
  79. kind: Config
  80. preferences: {}
  81. users:
  82. - name: dashboard-user
  83. user:
  84. token: ${TOKEN}
  85. EOF
  86. # 6. 验证 kubeconfig
  87. echo "🔍 验证 kubeconfig 文件内容..."
  88. echo "=========================================="
  89. cat dashboard-kubeconfig.yaml
  90. echo "=========================================="
  91. # 7. 测试 kubeconfig
  92. echo "🧪 测试 kubeconfig 是否有效..."
  93. if kubectl --kubeconfig=dashboard-kubeconfig.yaml get nodes > /dev/null 2>&1; then
  94. echo "✅ kubeconfig 测试成功!"
  95. else
  96. echo "⚠️ kubeconfig 测试失败,尝试另一种格式..."
  97. # 尝试使用证书方式
  98. cat > dashboard-kubeconfig-alternative.yaml <<EOF
  99. apiVersion: v1
  100. clusters:
  101. - cluster:
  102. certificate-authority-data: $(kubectl get secret $(kubectl get serviceaccount dashboard-user -n kubernetes-dashboard -o jsonpath='{.secrets[0].name}') -n kubernetes-dashboard -o jsonpath='{.data.ca\.crt}')
  103. server: ${SERVER}
  104. name: kubernetes-cluster
  105. contexts:
  106. - context:
  107. cluster: kubernetes-cluster
  108. user: dashboard-user
  109. name: dashboard-context
  110. current-context: dashboard-context
  111. kind: Config
  112. users:
  113. - name: dashboard-user
  114. user:
  115. token: ${TOKEN}
  116. EOF
  117. echo "🔄 已创建替代格式的 kubeconfig"
  118. mv dashboard-kubeconfig-alternative.yaml dashboard-kubeconfig.yaml
  119. fi
  120. echo ""
  121. echo "📋 使用说明:"
  122. echo "1. 文件已创建: $(pwd)/dashboard-kubeconfig.yaml"
  123. echo "2. 访问 Dashboard: https://192.168.92.96:8443"
  124. echo "3. 选择 'Kubeconfig' 登录方式"
  125. echo "4. 选择刚才创建的文件"
  126. echo ""
  127. echo "🔑 Token 值(备用):"
  128. echo "${TOKEN:0:50}..."
  129. echo ""
  130. echo "📝 如果仍然失败,请尝试以下步骤:"
  131. echo " a. 检查 token 长度: ${#TOKEN} 字符"
  132. echo " b. 确保 token 不为空"
  133. echo " c. 尝试使用 Token 方式直接登录"