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.

424 lines
8.5 KiB

  1. apiVersion: v1
  2. kind: Namespace
  3. metadata:
  4. name: metallb-system
  5. labels:
  6. app: metallb
  7. ---
  8. apiVersion: policy/v1beta1
  9. kind: PodSecurityPolicy
  10. metadata:
  11. labels:
  12. app: metallb
  13. name: controller
  14. namespace: metallb-system
  15. spec:
  16. allowPrivilegeEscalation: false
  17. allowedCapabilities: []
  18. allowedHostPaths: []
  19. defaultAddCapabilities: []
  20. defaultAllowPrivilegeEscalation: false
  21. fsGroup:
  22. ranges:
  23. - max: 65535
  24. min: 1
  25. rule: MustRunAs
  26. hostIPC: false
  27. hostNetwork: false
  28. hostPID: false
  29. privileged: false
  30. readOnlyRootFilesystem: true
  31. requiredDropCapabilities:
  32. - ALL
  33. runAsUser:
  34. ranges:
  35. - max: 65535
  36. min: 1
  37. rule: MustRunAs
  38. seLinux:
  39. rule: RunAsAny
  40. supplementalGroups:
  41. ranges:
  42. - max: 65535
  43. min: 1
  44. rule: MustRunAs
  45. volumes:
  46. - configMap
  47. - secret
  48. - emptyDir
  49. ---
  50. {% if metallb_speaker_enabled %}
  51. apiVersion: policy/v1beta1
  52. kind: PodSecurityPolicy
  53. metadata:
  54. labels:
  55. app: metallb
  56. name: speaker
  57. namespace: metallb-system
  58. spec:
  59. allowPrivilegeEscalation: false
  60. allowedCapabilities:
  61. - NET_ADMIN
  62. - NET_RAW
  63. - SYS_ADMIN
  64. allowedHostPaths: []
  65. defaultAddCapabilities: []
  66. defaultAllowPrivilegeEscalation: false
  67. fsGroup:
  68. rule: RunAsAny
  69. hostIPC: false
  70. hostNetwork: true
  71. hostPID: false
  72. hostPorts:
  73. - max: {{ metallb_port }}
  74. min: {{ metallb_port }}
  75. privileged: true
  76. readOnlyRootFilesystem: true
  77. requiredDropCapabilities:
  78. - ALL
  79. runAsUser:
  80. rule: RunAsAny
  81. seLinux:
  82. rule: RunAsAny
  83. supplementalGroups:
  84. rule: RunAsAny
  85. volumes:
  86. - configMap
  87. - secret
  88. - emptyDir
  89. {% endif %}
  90. ---
  91. apiVersion: v1
  92. kind: ServiceAccount
  93. metadata:
  94. labels:
  95. app: metallb
  96. name: controller
  97. namespace: metallb-system
  98. ---
  99. {% if metallb_speaker_enabled %}
  100. apiVersion: v1
  101. kind: ServiceAccount
  102. metadata:
  103. labels:
  104. app: metallb
  105. name: speaker
  106. namespace: metallb-system
  107. {% endif %}
  108. ---
  109. apiVersion: rbac.authorization.k8s.io/v1
  110. kind: ClusterRole
  111. metadata:
  112. labels:
  113. app: metallb
  114. name: metallb-system:controller
  115. rules:
  116. - apiGroups:
  117. - ''
  118. resources:
  119. - services
  120. verbs:
  121. - get
  122. - list
  123. - watch
  124. - update
  125. - apiGroups:
  126. - ''
  127. resources:
  128. - services/status
  129. verbs:
  130. - update
  131. - apiGroups:
  132. - ''
  133. resources:
  134. - events
  135. verbs:
  136. - create
  137. - patch
  138. - apiGroups:
  139. - policy
  140. resourceNames:
  141. - controller
  142. resources:
  143. - podsecuritypolicies
  144. verbs:
  145. - use
  146. ---
  147. {% if metallb_speaker_enabled %}
  148. apiVersion: rbac.authorization.k8s.io/v1
  149. kind: ClusterRole
  150. metadata:
  151. labels:
  152. app: metallb
  153. name: metallb-system:speaker
  154. rules:
  155. - apiGroups:
  156. - ''
  157. resources:
  158. - services
  159. - endpoints
  160. - nodes
  161. verbs:
  162. - get
  163. - list
  164. - watch
  165. - apiGroups:
  166. - ''
  167. resources:
  168. - events
  169. verbs:
  170. - create
  171. - patch
  172. - apiGroups:
  173. - policy
  174. resourceNames:
  175. - speaker
  176. resources:
  177. - podsecuritypolicies
  178. verbs:
  179. - use
  180. {% endif %}
  181. ---
  182. apiVersion: rbac.authorization.k8s.io/v1
  183. kind: Role
  184. metadata:
  185. labels:
  186. app: metallb
  187. name: config-watcher
  188. namespace: metallb-system
  189. rules:
  190. - apiGroups:
  191. - ''
  192. resources:
  193. - configmaps
  194. verbs:
  195. - get
  196. - list
  197. - watch
  198. ---
  199. apiVersion: rbac.authorization.k8s.io/v1
  200. kind: Role
  201. metadata:
  202. labels:
  203. app: metallb
  204. name: pod-lister
  205. namespace: metallb-system
  206. rules:
  207. - apiGroups:
  208. - ''
  209. resources:
  210. - pods
  211. verbs:
  212. - list
  213. ---
  214. apiVersion: rbac.authorization.k8s.io/v1
  215. kind: ClusterRoleBinding
  216. metadata:
  217. labels:
  218. app: metallb
  219. name: metallb-system:controller
  220. roleRef:
  221. apiGroup: rbac.authorization.k8s.io
  222. kind: ClusterRole
  223. name: metallb-system:controller
  224. subjects:
  225. - kind: ServiceAccount
  226. name: controller
  227. namespace: metallb-system
  228. ---
  229. {% if metallb_speaker_enabled %}
  230. apiVersion: rbac.authorization.k8s.io/v1
  231. kind: ClusterRoleBinding
  232. metadata:
  233. labels:
  234. app: metallb
  235. name: metallb-system:speaker
  236. roleRef:
  237. apiGroup: rbac.authorization.k8s.io
  238. kind: ClusterRole
  239. name: metallb-system:speaker
  240. subjects:
  241. - kind: ServiceAccount
  242. name: speaker
  243. namespace: metallb-system
  244. {% endif %}
  245. ---
  246. apiVersion: rbac.authorization.k8s.io/v1
  247. kind: RoleBinding
  248. metadata:
  249. labels:
  250. app: metallb
  251. name: config-watcher
  252. namespace: metallb-system
  253. roleRef:
  254. apiGroup: rbac.authorization.k8s.io
  255. kind: Role
  256. name: config-watcher
  257. subjects:
  258. - kind: ServiceAccount
  259. name: controller
  260. - kind: ServiceAccount
  261. name: speaker
  262. ---
  263. apiVersion: rbac.authorization.k8s.io/v1
  264. kind: RoleBinding
  265. metadata:
  266. labels:
  267. app: metallb
  268. name: pod-lister
  269. namespace: metallb-system
  270. roleRef:
  271. apiGroup: rbac.authorization.k8s.io
  272. kind: Role
  273. name: pod-lister
  274. subjects:
  275. - kind: ServiceAccount
  276. name: speaker
  277. ---
  278. {% if metallb_speaker_enabled %}
  279. apiVersion: apps/v1
  280. kind: DaemonSet
  281. metadata:
  282. labels:
  283. app: metallb
  284. component: speaker
  285. name: speaker
  286. namespace: metallb-system
  287. spec:
  288. selector:
  289. matchLabels:
  290. app: metallb
  291. component: speaker
  292. template:
  293. metadata:
  294. annotations:
  295. prometheus.io/port: '{{ metallb_port }}'
  296. prometheus.io/scrape: 'true'
  297. labels:
  298. app: metallb
  299. component: speaker
  300. spec:
  301. containers:
  302. - args:
  303. - --port={{ metallb_port }}
  304. - --config=config
  305. env:
  306. - name: METALLB_NODE_NAME
  307. valueFrom:
  308. fieldRef:
  309. fieldPath: spec.nodeName
  310. - name: METALLB_HOST
  311. valueFrom:
  312. fieldRef:
  313. fieldPath: status.hostIP
  314. - name: METALLB_ML_BIND_ADDR
  315. valueFrom:
  316. fieldRef:
  317. fieldPath: status.podIP
  318. # needed when another software is also using memberlist / port 7946
  319. #- name: METALLB_ML_BIND_PORT
  320. # value: "7946"
  321. - name: METALLB_ML_LABELS
  322. value: "app=metallb,component=speaker"
  323. - name: METALLB_ML_NAMESPACE
  324. valueFrom:
  325. fieldRef:
  326. fieldPath: metadata.namespace
  327. - name: METALLB_ML_SECRET_KEY
  328. valueFrom:
  329. secretKeyRef:
  330. name: memberlist
  331. key: secretkey
  332. image: {{ metallb_speaker_image_repo }}:{{ metallb_version }}
  333. imagePullPolicy: {{ k8s_image_pull_policy }}
  334. name: speaker
  335. ports:
  336. - containerPort: {{ metallb_port }}
  337. name: monitoring
  338. resources:
  339. limits:
  340. cpu: {{ metallb_limits_cpu }}
  341. memory: {{ metallb_limits_mem }}
  342. securityContext:
  343. allowPrivilegeEscalation: false
  344. capabilities:
  345. add:
  346. - NET_ADMIN
  347. - NET_RAW
  348. - SYS_ADMIN
  349. drop:
  350. - ALL
  351. readOnlyRootFilesystem: true
  352. hostNetwork: true
  353. nodeSelector:
  354. kubernetes.io/os: linux
  355. serviceAccountName: speaker
  356. terminationGracePeriodSeconds: 2
  357. {% if metallb_speaker_nodeselector %}
  358. nodeSelector:
  359. {{ metallb_speaker_nodeselector | to_nice_yaml | indent(width=8) }}
  360. {%- endif %}
  361. {% if metallb_speaker_tolerations %}
  362. tolerations:
  363. {{ metallb_speaker_tolerations | to_nice_yaml(indent=2) | indent(width=8) }}
  364. {% endif %}
  365. {% endif %}
  366. ---
  367. apiVersion: apps/v1
  368. kind: Deployment
  369. metadata:
  370. labels:
  371. app: metallb
  372. component: controller
  373. name: controller
  374. namespace: metallb-system
  375. spec:
  376. revisionHistoryLimit: 3
  377. selector:
  378. matchLabels:
  379. app: metallb
  380. component: controller
  381. template:
  382. metadata:
  383. annotations:
  384. prometheus.io/port: '{{ metallb_port }}'
  385. prometheus.io/scrape: 'true'
  386. labels:
  387. app: metallb
  388. component: controller
  389. spec:
  390. {% if metallb_controller_nodeselector %}
  391. nodeSelector:
  392. {{ metallb_controller_nodeselector | to_nice_yaml | indent(width=8) }}
  393. {%- endif %}
  394. {% if metallb_controller_tolerations %}
  395. tolerations:
  396. {{ metallb_controller_tolerations | to_nice_yaml(indent=2) | indent(width=8) }}
  397. {% endif %}
  398. containers:
  399. - args:
  400. - --port={{ metallb_port }}
  401. - --config=config
  402. image: {{ metallb_controller_image_repo }}:{{ metallb_version }}
  403. imagePullPolicy: {{ k8s_image_pull_policy }}
  404. name: controller
  405. ports:
  406. - containerPort: {{ metallb_port }}
  407. name: monitoring
  408. resources:
  409. limits:
  410. cpu: {{ metallb_limits_cpu }}
  411. memory: {{ metallb_limits_mem }}
  412. securityContext:
  413. allowPrivilegeEscalation: false
  414. capabilities:
  415. drop:
  416. - all
  417. readOnlyRootFilesystem: true
  418. nodeSelector:
  419. kubernetes.io/os: linux
  420. securityContext:
  421. runAsNonRoot: true
  422. runAsUser: 65534
  423. serviceAccountName: controller
  424. terminationGracePeriodSeconds: 0