You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

335 lines
9.0 KiB

  1. # Copyright 2017 The Kubernetes Authors.
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. # Configuration to deploy release version of the Dashboard UI compatible with
  15. # Kubernetes 1.8.
  16. #
  17. # Example usage: kubectl create -f <this_file>
  18. {% if dashboard_namespace != "kube-system" %}
  19. ---
  20. apiVersion: v1
  21. kind: Namespace
  22. metadata:
  23. name: {{ dashboard_namespace }}
  24. labels:
  25. name: {{ dashboard_namespace }}
  26. {% endif %}
  27. ---
  28. # ------------------- Dashboard Secrets ------------------- #
  29. apiVersion: v1
  30. kind: Secret
  31. metadata:
  32. labels:
  33. k8s-app: kubernetes-dashboard
  34. name: kubernetes-dashboard-certs
  35. namespace: {{ dashboard_namespace }}
  36. type: Opaque
  37. ---
  38. apiVersion: v1
  39. kind: Secret
  40. metadata:
  41. labels:
  42. k8s-app: kubernetes-dashboard
  43. name: kubernetes-dashboard-csrf
  44. namespace: {{ dashboard_namespace }}
  45. type: Opaque
  46. data:
  47. csrf: ""
  48. ---
  49. apiVersion: v1
  50. kind: Secret
  51. metadata:
  52. labels:
  53. k8s-app: kubernetes-dashboard
  54. name: kubernetes-dashboard-key-holder
  55. namespace: {{ dashboard_namespace }}
  56. type: Opaque
  57. ---
  58. # ------------------- Dashboard ConfigMap ------------------- #
  59. kind: ConfigMap
  60. apiVersion: v1
  61. metadata:
  62. labels:
  63. k8s-app: kubernetes-dashboard
  64. name: kubernetes-dashboard-settings
  65. namespace: {{ dashboard_namespace }}
  66. ---
  67. # ------------------- Dashboard Service Account ------------------- #
  68. apiVersion: v1
  69. kind: ServiceAccount
  70. metadata:
  71. labels:
  72. k8s-app: kubernetes-dashboard
  73. name: kubernetes-dashboard
  74. namespace: {{ dashboard_namespace }}
  75. ---
  76. # ------------------- Dashboard Role & Role Binding ------------------- #
  77. kind: Role
  78. apiVersion: rbac.authorization.k8s.io/v1
  79. metadata:
  80. labels:
  81. k8s-app: kubernetes-dashboard
  82. name: kubernetes-dashboard
  83. namespace: {{ dashboard_namespace }}
  84. rules:
  85. # Allow Dashboard to get, update and delete Dashboard exclusive secrets.
  86. - apiGroups: [""]
  87. resources: ["secrets"]
  88. resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]
  89. verbs: ["get", "update", "delete"]
  90. # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
  91. - apiGroups: [""]
  92. resources: ["configmaps"]
  93. resourceNames: ["kubernetes-dashboard-settings"]
  94. verbs: ["get", "update"]
  95. # Allow Dashboard to get metrics.
  96. - apiGroups: [""]
  97. resources: ["services"]
  98. resourceNames: ["heapster", "dashboard-metrics-scraper"]
  99. verbs: ["proxy"]
  100. - apiGroups: [""]
  101. resources: ["services/proxy"]
  102. resourceNames: ["heapster", "http:heapster:", "https:heapster:", "dashboard-metrics-scraper", "http:dashboard-metrics-scraper"]
  103. verbs: ["get"]
  104. ---
  105. apiVersion: rbac.authorization.k8s.io/v1
  106. kind: RoleBinding
  107. metadata:
  108. labels:
  109. k8s-app: kubernetes-dashboard
  110. name: kubernetes-dashboard
  111. namespace: {{ dashboard_namespace }}
  112. roleRef:
  113. apiGroup: rbac.authorization.k8s.io
  114. kind: Role
  115. name: kubernetes-dashboard
  116. subjects:
  117. - kind: ServiceAccount
  118. name: kubernetes-dashboard
  119. namespace: {{ dashboard_namespace }}
  120. ---
  121. apiVersion: rbac.authorization.k8s.io/v1
  122. kind: ClusterRoleBinding
  123. metadata:
  124. name: kubernetes-dashboard
  125. roleRef:
  126. apiGroup: rbac.authorization.k8s.io
  127. kind: ClusterRole
  128. name: kubernetes-dashboard
  129. subjects:
  130. - kind: ServiceAccount
  131. name: kubernetes-dashboard
  132. namespace: {{ dashboard_namespace }}
  133. ---
  134. # ------------------- Dashboard Deployment ------------------- #
  135. kind: Deployment
  136. apiVersion: apps/v1
  137. metadata:
  138. labels:
  139. k8s-app: kubernetes-dashboard
  140. name: kubernetes-dashboard
  141. namespace: {{ dashboard_namespace }}
  142. spec:
  143. replicas: {{ dashboard_replicas }}
  144. revisionHistoryLimit: 10
  145. selector:
  146. matchLabels:
  147. k8s-app: kubernetes-dashboard
  148. template:
  149. metadata:
  150. labels:
  151. k8s-app: kubernetes-dashboard
  152. spec:
  153. securityContext:
  154. seccompProfile:
  155. type: RuntimeDefault
  156. priorityClassName: system-cluster-critical
  157. containers:
  158. - name: kubernetes-dashboard
  159. image: {{ dashboard_image_repo }}:{{ dashboard_image_tag }}
  160. imagePullPolicy: {{ k8s_image_pull_policy }}
  161. resources:
  162. limits:
  163. cpu: {{ dashboard_cpu_limit }}
  164. memory: {{ dashboard_memory_limit }}
  165. requests:
  166. cpu: {{ dashboard_cpu_requests }}
  167. memory: {{ dashboard_memory_requests }}
  168. ports:
  169. - containerPort: 8443
  170. protocol: TCP
  171. args:
  172. - --namespace={{ dashboard_namespace }}
  173. {% if dashboard_use_custom_certs %}
  174. - --tls-key-file={{ dashboard_tls_key_file }}
  175. - --tls-cert-file={{ dashboard_tls_cert_file }}
  176. {% else %}
  177. - --auto-generate-certificates
  178. {% endif %}
  179. {% if dashboard_skip_login %}
  180. - --enable-skip-login
  181. {% endif %}
  182. - --authentication-mode=token
  183. # Uncomment the following line to manually specify Kubernetes API server Host
  184. # If not specified, Dashboard will attempt to auto discover the API server and connect
  185. # to it. Uncomment only if the default does not work.
  186. # - --apiserver-host=http://my-address:port
  187. - --token-ttl={{ dashboard_token_ttl }}
  188. volumeMounts:
  189. - name: kubernetes-dashboard-certs
  190. mountPath: /certs
  191. # Create on-disk volume to store exec logs
  192. - mountPath: /tmp
  193. name: tmp-volume
  194. livenessProbe:
  195. httpGet:
  196. scheme: HTTPS
  197. path: /
  198. port: 8443
  199. initialDelaySeconds: 30
  200. timeoutSeconds: 30
  201. securityContext:
  202. allowPrivilegeEscalation: false
  203. readOnlyRootFilesystem: true
  204. runAsUser: 1001
  205. runAsGroup: 2001
  206. volumes:
  207. - name: kubernetes-dashboard-certs
  208. secret:
  209. secretName: {{ dashboard_certs_secret_name }}
  210. - name: tmp-volume
  211. emptyDir: {}
  212. serviceAccountName: kubernetes-dashboard
  213. {% if dashboard_master_toleration %}
  214. tolerations:
  215. - key: node-role.kubernetes.io/control-plane
  216. effect: NoSchedule
  217. {% endif %}
  218. ---
  219. # ------------------- Dashboard Service ------------------- #
  220. kind: Service
  221. apiVersion: v1
  222. metadata:
  223. labels:
  224. k8s-app: kubernetes-dashboard
  225. name: kubernetes-dashboard
  226. namespace: {{ dashboard_namespace }}
  227. spec:
  228. ports:
  229. - port: 443
  230. targetPort: 8443
  231. selector:
  232. k8s-app: kubernetes-dashboard
  233. ---
  234. # ------------------- Metrics Scraper Service Account ------------------- #
  235. kind: ClusterRole
  236. apiVersion: rbac.authorization.k8s.io/v1
  237. metadata:
  238. labels:
  239. k8s-app: kubernetes-dashboard
  240. name: kubernetes-dashboard
  241. rules:
  242. # Allow Metrics Scraper to get metrics from the Metrics server
  243. - apiGroups: ["metrics.k8s.io"]
  244. resources: ["pods", "nodes"]
  245. verbs: ["get", "list", "watch"]
  246. ---
  247. # ------------------- Metrics Scraper Service ------------------- #
  248. kind: Service
  249. apiVersion: v1
  250. metadata:
  251. labels:
  252. k8s-app: kubernetes-metrics-scraper
  253. name: dashboard-metrics-scraper
  254. namespace: {{ dashboard_namespace }}
  255. spec:
  256. ports:
  257. - port: 8000
  258. targetPort: 8000
  259. selector:
  260. k8s-app: kubernetes-metrics-scraper
  261. ---
  262. # ------------------- Metrics Scraper Deployment ------------------- #
  263. kind: Deployment
  264. apiVersion: apps/v1
  265. metadata:
  266. labels:
  267. k8s-app: kubernetes-metrics-scraper
  268. name: kubernetes-metrics-scraper
  269. namespace: {{ dashboard_namespace }}
  270. spec:
  271. replicas: 1
  272. revisionHistoryLimit: 10
  273. selector:
  274. matchLabels:
  275. k8s-app: kubernetes-metrics-scraper
  276. template:
  277. metadata:
  278. labels:
  279. k8s-app: kubernetes-metrics-scraper
  280. spec:
  281. securityContext:
  282. seccompProfile:
  283. type: RuntimeDefault
  284. priorityClassName: system-cluster-critical
  285. containers:
  286. - name: kubernetes-metrics-scraper
  287. image: {{ dashboard_metrics_scraper_repo }}:{{ dashboard_metrics_scraper_tag }}
  288. ports:
  289. - containerPort: 8000
  290. protocol: TCP
  291. livenessProbe:
  292. httpGet:
  293. scheme: HTTP
  294. path: /
  295. port: 8000
  296. initialDelaySeconds: 30
  297. timeoutSeconds: 30
  298. securityContext:
  299. allowPrivilegeEscalation: false
  300. readOnlyRootFilesystem: true
  301. runAsUser: 1001
  302. runAsGroup: 2001
  303. volumeMounts:
  304. - mountPath: /tmp
  305. name: tmp-volume
  306. serviceAccountName: kubernetes-dashboard
  307. volumes:
  308. - name: tmp-volume
  309. emptyDir: {}
  310. {% if dashboard_master_toleration %}
  311. tolerations:
  312. - key: node-role.kubernetes.io/control-plane
  313. effect: NoSchedule
  314. {% endif %}