deploy-dashboard.yml 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. ---
  2. - name: Deploy Kubernetes Dashboard to k3s cluster
  3. hosts: master
  4. become: yes
  5. vars:
  6. dashboard_namespace: "kubernetes-dashboard"
  7. dashboard_version: "v2.7.0"
  8. metrics_scraper_version: "v1.0.8"
  9. tasks:
  10. - name: Create kubernetes dashboard namespace
  11. shell: |
  12. kubectl create namespace {{ dashboard_namespace }} --dry-run=client -o yaml | kubectl apply -f -
  13. register: namespace_result
  14. failed_when: false
  15. - name: Apply Kubernetes Dashboard manifests
  16. shell: |
  17. kubectl apply -f - << 'EOF'
  18. apiVersion: v1
  19. kind: ServiceAccount
  20. metadata:
  21. labels:
  22. k8s-app: kubernetes-dashboard
  23. name: kubernetes-dashboard
  24. namespace: {{ dashboard_namespace }}
  25. ---
  26. apiVersion: v1
  27. kind: Service
  28. metadata:
  29. labels:
  30. k8s-app: kubernetes-dashboard
  31. name: kubernetes-dashboard
  32. namespace: {{ dashboard_namespace }}
  33. spec:
  34. ports:
  35. - port: 443
  36. targetPort: 8443
  37. selector:
  38. k8s-app: kubernetes-dashboard
  39. type: ClusterIP
  40. ---
  41. apiVersion: v1
  42. kind: Secret
  43. metadata:
  44. labels:
  45. k8s-app: kubernetes-dashboard
  46. name: kubernetes-dashboard-certs
  47. namespace: {{ dashboard_namespace }}
  48. type: Opaque
  49. ---
  50. apiVersion: v1
  51. kind: Secret
  52. metadata:
  53. labels:
  54. k8s-app: kubernetes-dashboard
  55. name: kubernetes-dashboard-csrf
  56. namespace: {{ dashboard_namespace }}
  57. type: Opaque
  58. data:
  59. csrf: ""
  60. ---
  61. apiVersion: v1
  62. kind: Secret
  63. metadata:
  64. labels:
  65. k8s-app: kubernetes-dashboard
  66. name: kubernetes-dashboard-key-holder
  67. namespace: {{ dashboard_namespace }}
  68. type: Opaque
  69. ---
  70. apiVersion: v1
  71. kind: ConfigMap
  72. metadata:
  73. labels:
  74. k8s-app: kubernetes-dashboard
  75. name: kubernetes-dashboard-settings
  76. namespace: {{ dashboard_namespace }}
  77. ---
  78. apiVersion: rbac.authorization.k8s.io/v1
  79. kind: Role
  80. metadata:
  81. labels:
  82. k8s-app: kubernetes-dashboard
  83. name: kubernetes-dashboard
  84. namespace: {{ dashboard_namespace }}
  85. rules:
  86. - apiGroups: [""]
  87. resources: ["secrets"]
  88. resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]
  89. verbs: ["get", "update", "delete"]
  90. - apiGroups: [""]
  91. resources: ["configmaps"]
  92. resourceNames: ["kubernetes-dashboard-settings"]
  93. verbs: ["get", "update"]
  94. - apiGroups: [""]
  95. resources: ["services"]
  96. resourceNames: ["heapster", "dashboard-metrics-scraper"]
  97. verbs: ["proxy"]
  98. - apiGroups: [""]
  99. resources: ["services/proxy"]
  100. resourceNames: ["heapster", "http:heapster:", "https:heapster:"]
  101. verbs: ["get"]
  102. ---
  103. apiVersion: rbac.authorization.k8s.io/v1
  104. kind: ClusterRole
  105. metadata:
  106. labels:
  107. k8s-app: kubernetes-dashboard
  108. name: kubernetes-dashboard
  109. rules:
  110. - apiGroups: ["metrics.k8s.io"]
  111. resources: ["pods", "nodes"]
  112. verbs: ["get", "list", "watch"]
  113. ---
  114. apiVersion: rbac.authorization.k8s.io/v1
  115. kind: RoleBinding
  116. metadata:
  117. labels:
  118. k8s-app: kubernetes-dashboard
  119. name: kubernetes-dashboard
  120. namespace: {{ dashboard_namespace }}
  121. roleRef:
  122. apiGroup: rbac.authorization.k8s.io
  123. kind: Role
  124. name: kubernetes-dashboard
  125. subjects:
  126. - kind: ServiceAccount
  127. name: kubernetes-dashboard
  128. namespace: {{ dashboard_namespace }}
  129. ---
  130. apiVersion: rbac.authorization.k8s.io/v1
  131. kind: ClusterRoleBinding
  132. metadata:
  133. name: kubernetes-dashboard
  134. roleRef:
  135. apiGroup: rbac.authorization.k8s.io
  136. kind: ClusterRole
  137. name: kubernetes-dashboard
  138. subjects:
  139. - kind: ServiceAccount
  140. name: kubernetes-dashboard
  141. namespace: {{ dashboard_namespace }}
  142. ---
  143. apiVersion: apps/v1
  144. kind: Deployment
  145. metadata:
  146. labels:
  147. k8s-app: kubernetes-dashboard
  148. name: kubernetes-dashboard
  149. namespace: {{ dashboard_namespace }}
  150. spec:
  151. replicas: 1
  152. revisionHistoryLimit: 10
  153. selector:
  154. matchLabels:
  155. k8s-app: kubernetes-dashboard
  156. template:
  157. metadata:
  158. labels:
  159. k8s-app: kubernetes-dashboard
  160. spec:
  161. securityContext:
  162. seccompProfile:
  163. type: RuntimeDefault
  164. containers:
  165. - name: kubernetes-dashboard
  166. image: kubernetesui/dashboard:{{ dashboard_version }}
  167. imagePullPolicy: Always
  168. ports:
  169. - containerPort: 8443
  170. protocol: TCP
  171. args:
  172. - --auto-generate-certificates
  173. - --namespace={{ dashboard_namespace }}
  174. - --enable-skip-login
  175. - --enable-insecure-login
  176. volumeMounts:
  177. - name: kubernetes-dashboard-certs
  178. mountPath: /certs
  179. - mountPath: /tmp
  180. name: tmp-volume
  181. livenessProbe:
  182. httpGet:
  183. scheme: HTTPS
  184. path: /
  185. port: 8443
  186. initialDelaySeconds: 30
  187. timeoutSeconds: 30
  188. periodSeconds: 10
  189. failureThreshold: 3
  190. securityContext:
  191. allowPrivilegeEscalation: false
  192. readOnlyRootFilesystem: false
  193. runAsUser: 1001
  194. runAsGroup: 2001
  195. volumes:
  196. - name: kubernetes-dashboard-certs
  197. secret:
  198. secretName: kubernetes-dashboard-certs
  199. - name: tmp-volume
  200. emptyDir: {}
  201. serviceAccountName: kubernetes-dashboard
  202. nodeSelector:
  203. "kubernetes.io/os": linux
  204. tolerations:
  205. - key: node-role.kubernetes.io/master
  206. effect: NoSchedule
  207. - key: node-role.kubernetes.io/control-plane
  208. effect: NoSchedule
  209. ---
  210. apiVersion: v1
  211. kind: Service
  212. metadata:
  213. labels:
  214. k8s-app: dashboard-metrics-scraper
  215. name: dashboard-metrics-scraper
  216. namespace: {{ dashboard_namespace }}
  217. spec:
  218. ports:
  219. - port: 8000
  220. targetPort: 8000
  221. selector:
  222. k8s-app: dashboard-metrics-scraper
  223. ---
  224. apiVersion: apps/v1
  225. kind: Deployment
  226. metadata:
  227. labels:
  228. k8s-app: dashboard-metrics-scraper
  229. name: dashboard-metrics-scraper
  230. namespace: {{ dashboard_namespace }}
  231. spec:
  232. replicas: 1
  233. revisionHistoryLimit: 10
  234. selector:
  235. matchLabels:
  236. k8s-app: dashboard-metrics-scraper
  237. template:
  238. metadata:
  239. labels:
  240. k8s-app: dashboard-metrics-scraper
  241. spec:
  242. securityContext:
  243. seccompProfile:
  244. type: RuntimeDefault
  245. containers:
  246. - name: dashboard-metrics-scraper
  247. image: kubernetesui/metrics-scraper:{{ metrics_scraper_version }}
  248. ports:
  249. - containerPort: 8000
  250. protocol: TCP
  251. livenessProbe:
  252. httpGet:
  253. scheme: HTTP
  254. path: /
  255. port: 8000
  256. initialDelaySeconds: 30
  257. timeoutSeconds: 30
  258. periodSeconds: 10
  259. failureThreshold: 3
  260. volumeMounts:
  261. - mountPath: /tmp
  262. name: tmp-volume
  263. securityContext:
  264. allowPrivilegeEscalation: false
  265. readOnlyRootFilesystem: false
  266. runAsUser: 1001
  267. runAsGroup: 2001
  268. volumes:
  269. - name: tmp-volume
  270. emptyDir: {}
  271. serviceAccountName: kubernetes-dashboard
  272. nodeSelector:
  273. "kubernetes.io/os": linux
  274. tolerations:
  275. - key: node-role.kubernetes.io/master
  276. effect: NoSchedule
  277. - key: node-role.kubernetes.io/control-plane
  278. effect: NoSchedule
  279. EOF
  280. register: dashboard_result
  281. - name: Create admin user for dashboard
  282. shell: |
  283. kubectl apply -f - << 'EOF'
  284. apiVersion: v1
  285. kind: ServiceAccount
  286. metadata:
  287. name: admin-user
  288. namespace: {{ dashboard_namespace }}
  289. ---
  290. apiVersion: rbac.authorization.k8s.io/v1
  291. kind: ClusterRoleBinding
  292. metadata:
  293. name: admin-user
  294. roleRef:
  295. apiGroup: rbac.authorization.k8s.io
  296. kind: ClusterRole
  297. name: cluster-admin
  298. subjects:
  299. - kind: ServiceAccount
  300. name: admin-user
  301. namespace: {{ dashboard_namespace }}
  302. EOF
  303. register: admin_user_result
  304. - name: Wait for dashboard pods to be ready
  305. shell: |
  306. kubectl wait --for=condition=ready pod -l k8s-app=kubernetes-dashboard -n {{ dashboard_namespace }} --timeout=120s
  307. register: wait_result
  308. failed_when: false
  309. - name: Get dashboard service info
  310. shell: |
  311. kubectl get svc kubernetes-dashboard -n {{ dashboard_namespace }}
  312. register: svc_info
  313. - name: Display dashboard service info
  314. debug:
  315. msg: "{{ svc_info.stdout_lines }}"
  316. - name: Display deployment status
  317. debug:
  318. msg: "Kubernetes Dashboard deployed successfully in namespace {{ dashboard_namespace }}"