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.

431 lines
17 KiB

  1. apiVersion: kubeadm.k8s.io/v1beta2
  2. kind: InitConfiguration
  3. {% if kubeadm_token is defined %}
  4. bootstrapTokens:
  5. - token: "{{ kubeadm_token }}"
  6. description: "kubespray kubeadm bootstrap token"
  7. ttl: "24h"
  8. {% endif %}
  9. localAPIEndpoint:
  10. advertiseAddress: {{ ip | default(fallback_ips[inventory_hostname]) }}
  11. bindPort: {{ kube_apiserver_port }}
  12. {% if kubeadm_certificate_key is defined %}
  13. certificateKey: {{ kubeadm_certificate_key }}
  14. {% endif %}
  15. nodeRegistration:
  16. {% if kube_override_hostname|default('') %}
  17. name: {{ kube_override_hostname }}
  18. {% endif %}
  19. {% if inventory_hostname in groups['kube_control_plane'] and inventory_hostname not in groups['kube_node'] %}
  20. taints:
  21. - effect: NoSchedule
  22. key: node-role.kubernetes.io/master
  23. {% else %}
  24. taints: []
  25. {% endif %}
  26. criSocket: {{ cri_socket }}
  27. {% if cloud_provider is defined and cloud_provider in ["external"] %}
  28. kubeletExtraArgs:
  29. cloud-provider: external
  30. {% endif %}
  31. ---
  32. apiVersion: kubeadm.k8s.io/v1beta2
  33. kind: ClusterConfiguration
  34. clusterName: {{ cluster_name }}
  35. etcd:
  36. {% if not etcd_kubeadm_enabled %}
  37. external:
  38. endpoints:
  39. {% for endpoint in etcd_access_addresses.split(',') %}
  40. - {{ endpoint }}
  41. {% endfor %}
  42. caFile: {{ etcd_cert_dir }}/{{ kube_etcd_cacert_file }}
  43. certFile: {{ etcd_cert_dir }}/{{ kube_etcd_cert_file }}
  44. keyFile: {{ etcd_cert_dir }}/{{ kube_etcd_key_file }}
  45. {% elif etcd_kubeadm_enabled %}
  46. local:
  47. imageRepository: "{{ etcd_image_repo | regex_replace("/etcd$","") }}"
  48. imageTag: "{{ etcd_image_tag }}"
  49. dataDir: "{{ etcd_data_dir }}"
  50. extraArgs:
  51. metrics: {{ etcd_metrics }}
  52. election-timeout: "{{ etcd_election_timeout }}"
  53. heartbeat-interval: "{{ etcd_heartbeat_interval }}"
  54. auto-compaction-retention: "{{ etcd_compaction_retention }}"
  55. {% if etcd_snapshot_count is defined %}
  56. snapshot-count: "{{ etcd_snapshot_count }}"
  57. {% endif %}
  58. {% if etcd_quota_backend_bytes is defined %}
  59. quota-backend-bytes: "{{ etcd_quota_backend_bytes }}"
  60. {% endif %}
  61. {% if etcd_log_package_levels is defined %}
  62. log-package-levels: "{{ etcd_log_package_levels }}"
  63. {% endif %}
  64. {% for key, value in etcd_extra_vars.items() %}
  65. {{ key }}: "{{ value }}"
  66. {% endfor %}
  67. {% if host_architecture != "amd64" %}
  68. etcd-unsupported-arch: {{host_architecture}}
  69. {% endif %}
  70. serverCertSANs:
  71. {% for san in etcd_cert_alt_names %}
  72. - {{ san }}
  73. {% endfor %}
  74. {% for san in etcd_cert_alt_ips %}
  75. - {{ san }}
  76. {% endfor %}
  77. peerCertSANs:
  78. {% for san in etcd_cert_alt_names %}
  79. - {{ san }}
  80. {% endfor %}
  81. {% for san in etcd_cert_alt_ips %}
  82. - {{ san }}
  83. {% endfor %}
  84. {% endif %}
  85. dns:
  86. type: CoreDNS
  87. imageRepository: {{ coredns_image_repo | regex_replace('/coredns.*$','') }}
  88. imageTag: {{ coredns_image_tag }}
  89. networking:
  90. dnsDomain: {{ dns_domain }}
  91. serviceSubnet: "{{ kube_service_addresses }}{{ ',' + kube_service_addresses_ipv6 if enable_dual_stack_networks else '' }}"
  92. podSubnet: "{{ kube_pods_subnet }}{{ ',' + kube_pods_subnet_ipv6 if enable_dual_stack_networks else '' }}"
  93. {% if kubeadm_feature_gates %}
  94. featureGates:
  95. {% for feature in kubeadm_feature_gates %}
  96. {{ feature|replace("=", ": ") }}
  97. {% endfor %}
  98. {% endif %}
  99. kubernetesVersion: {{ kube_version }}
  100. {% if kubeadm_config_api_fqdn is defined %}
  101. controlPlaneEndpoint: {{ kubeadm_config_api_fqdn }}:{{ loadbalancer_apiserver.port | default(kube_apiserver_port) }}
  102. {% else %}
  103. controlPlaneEndpoint: {{ ip | default(fallback_ips[inventory_hostname]) }}:{{ kube_apiserver_port }}
  104. {% endif %}
  105. certificatesDir: {{ kube_cert_dir }}
  106. imageRepository: {{ kube_image_repo }}
  107. apiServer:
  108. extraArgs:
  109. {% if kube_apiserver_pod_eviction_not_ready_timeout_seconds is defined %}
  110. default-not-ready-toleration-seconds: "{{ kube_apiserver_pod_eviction_not_ready_timeout_seconds }}"
  111. {% endif %}
  112. {% if kube_apiserver_pod_eviction_unreachable_timeout_seconds is defined %}
  113. default-unreachable-toleration-seconds: "{{ kube_apiserver_pod_eviction_unreachable_timeout_seconds }}"
  114. {% endif %}
  115. {% if kube_api_anonymous_auth is defined %}
  116. anonymous-auth: "{{ kube_api_anonymous_auth }}"
  117. {% endif %}
  118. authorization-mode: {{ authorization_modes | join(',') }}
  119. bind-address: {{ kube_apiserver_bind_address }}
  120. {% if kube_apiserver_insecure_port|string != "0" %}
  121. insecure-bind-address: {{ kube_apiserver_insecure_bind_address }}
  122. {% endif %}
  123. insecure-port: "{{ kube_apiserver_insecure_port }}"
  124. {% if kube_apiserver_enable_admission_plugins|length > 0 %}
  125. enable-admission-plugins: {{ kube_apiserver_enable_admission_plugins | join(',') }}
  126. {% endif %}
  127. {% if kube_apiserver_disable_admission_plugins|length > 0 %}
  128. disable-admission-plugins: {{ kube_apiserver_disable_admission_plugins | join(',') }}
  129. {% endif %}
  130. apiserver-count: "{{ kube_apiserver_count }}"
  131. endpoint-reconciler-type: lease
  132. {% if etcd_events_cluster_enabled %}
  133. etcd-servers-overrides: "/events#{{ etcd_events_access_addresses_semicolon }}"
  134. {% endif %}
  135. service-node-port-range: {{ kube_apiserver_node_port_range }}
  136. service-cluster-ip-range: "{{ kube_service_addresses }}{{ ',' + kube_service_addresses_ipv6 if enable_dual_stack_networks else '' }}"
  137. kubelet-preferred-address-types: "{{ kubelet_preferred_address_types }}"
  138. profiling: "{{ kube_profiling }}"
  139. request-timeout: "{{ kube_apiserver_request_timeout }}"
  140. enable-aggregator-routing: "{{ kube_api_aggregator_routing }}"
  141. {% if kube_token_auth|default(true) %}
  142. token-auth-file: {{ kube_token_dir }}/known_tokens.csv
  143. {% endif %}
  144. {% if kube_oidc_auth|default(false) and kube_oidc_url is defined and kube_oidc_client_id is defined %}
  145. oidc-issuer-url: "{{ kube_oidc_url }}"
  146. oidc-client-id: "{{ kube_oidc_client_id }}"
  147. {% if kube_oidc_ca_file is defined %}
  148. oidc-ca-file: "{{ kube_oidc_ca_file }}"
  149. {% endif %}
  150. {% if kube_oidc_username_claim is defined %}
  151. oidc-username-claim: "{{ kube_oidc_username_claim }}"
  152. {% endif %}
  153. {% if kube_oidc_groups_claim is defined %}
  154. oidc-groups-claim: "{{ kube_oidc_groups_claim }}"
  155. {% endif %}
  156. {% if kube_oidc_username_prefix is defined %}
  157. oidc-username-prefix: "{{ kube_oidc_username_prefix }}"
  158. {% endif %}
  159. {% if kube_oidc_groups_prefix is defined %}
  160. oidc-groups-prefix: "{{ kube_oidc_groups_prefix }}"
  161. {% endif %}
  162. {% endif %}
  163. {% if kube_webhook_token_auth|default(false) %}
  164. authentication-token-webhook-config-file: {{ kube_config_dir }}/webhook-token-auth-config.yaml
  165. {% endif %}
  166. {% if kube_webhook_authorization|default(false) %}
  167. authorization-webhook-config-file: {{ kube_config_dir }}/webhook-authorization-config.yaml
  168. {% endif %}
  169. {% if kube_encrypt_secret_data %}
  170. encryption-provider-config: {{ kube_cert_dir }}/secrets_encryption.yaml
  171. {% endif %}
  172. storage-backend: {{ kube_apiserver_storage_backend }}
  173. {% if kube_api_runtime_config|length > 0 %}
  174. runtime-config: {{ kube_api_runtime_config | join(',') }}
  175. {% endif %}
  176. allow-privileged: "true"
  177. {% if kubernetes_audit or kubernetes_audit_webhook %}
  178. audit-policy-file: {{ audit_policy_file }}
  179. {% endif %}
  180. {% if kubernetes_audit %}
  181. audit-log-path: "{{ audit_log_path }}"
  182. audit-log-maxage: "{{ audit_log_maxage }}"
  183. audit-log-maxbackup: "{{ audit_log_maxbackups }}"
  184. audit-log-maxsize: "{{ audit_log_maxsize }}"
  185. {% endif %}
  186. {% if kubernetes_audit_webhook %}
  187. audit-webhook-config-file: {{ audit_webhook_config_file }}
  188. audit-webhook-mode: {{ audit_webhook_mode }}
  189. {% if audit_webhook_mode == "batch" %}
  190. audit-webhook-batch-max-size: "{{ audit_webhook_batch_max_size }}"
  191. audit-webhook-batch-max-wait: "{{ audit_webhook_batch_max_wait }}"
  192. {% endif %}
  193. {% endif %}
  194. {% for key in kube_kubeadm_apiserver_extra_args %}
  195. {{ key }}: "{{ kube_kubeadm_apiserver_extra_args[key] }}"
  196. {% endfor %}
  197. {% if kube_feature_gates %}
  198. feature-gates: {{ kube_feature_gates|join(',') }}
  199. {% endif %}
  200. {% if cloud_provider is defined and cloud_provider in ["openstack", "azure", "vsphere", "aws"] %}
  201. cloud-provider: {{ cloud_provider }}
  202. cloud-config: {{ kube_config_dir }}/cloud_config
  203. {% endif %}
  204. {% if tls_min_version is defined %}
  205. tls-min-version: {{ tls_min_version }}
  206. {% endif %}
  207. {% if tls_cipher_suites is defined %}
  208. tls-cipher-suites: {% for tls in tls_cipher_suites %}{{ tls }}{{ "," if not loop.last else "" }}{% endfor %}
  209. {% endif %}
  210. {% if event_ttl_duration is defined %}
  211. event-ttl: {{ event_ttl_duration }}
  212. {% endif %}
  213. {% if kubelet_rotate_server_certificates %}
  214. kubelet-certificate-authority: {{ kube_cert_dir }}/ca.crt
  215. {% endif %}
  216. {% if kubernetes_audit or kube_token_auth|default(true) or kube_webhook_token_auth|default(false) or ( cloud_provider is defined and cloud_provider in ["openstack", "azure", "vsphere", "aws"] ) or apiserver_extra_volumes or ssl_ca_dirs|length %}
  217. extraVolumes:
  218. {% if cloud_provider is defined and cloud_provider in ["openstack", "azure", "vsphere", "aws"] %}
  219. - name: cloud-config
  220. hostPath: {{ kube_config_dir }}/cloud_config
  221. mountPath: {{ kube_config_dir }}/cloud_config
  222. {% endif %}
  223. {% if kube_token_auth|default(true) %}
  224. - name: token-auth-config
  225. hostPath: {{ kube_token_dir }}
  226. mountPath: {{ kube_token_dir }}
  227. {% endif %}
  228. {% if kube_webhook_token_auth|default(false) %}
  229. - name: webhook-token-auth-config
  230. hostPath: {{ kube_config_dir }}/webhook-token-auth-config.yaml
  231. mountPath: {{ kube_config_dir }}/webhook-token-auth-config.yaml
  232. {% endif %}
  233. {% if kube_webhook_authorization|default(false) %}
  234. - name: webhook-authorization-config
  235. hostPath: {{ kube_config_dir }}/webhook-authorization-config.yaml
  236. mountPath: {{ kube_config_dir }}/webhook-authorization-config.yaml
  237. {% endif %}
  238. {% if kubernetes_audit or kubernetes_audit_webhook %}
  239. - name: {{ audit_policy_name }}
  240. hostPath: {{ audit_policy_hostpath }}
  241. mountPath: {{ audit_policy_mountpath }}
  242. {% if audit_log_path != "-" %}
  243. - name: {{ audit_log_name }}
  244. hostPath: {{ audit_log_hostpath }}
  245. mountPath: {{ audit_log_mountpath }}
  246. readOnly: false
  247. {% endif %}
  248. {% endif %}
  249. {% for volume in apiserver_extra_volumes %}
  250. - name: {{ volume.name }}
  251. hostPath: {{ volume.hostPath }}
  252. mountPath: {{ volume.mountPath }}
  253. readOnly: {{ volume.readOnly | d(not (volume.writable | d(false))) }}
  254. {% endfor %}
  255. {% if ssl_ca_dirs|length %}
  256. {% for dir in ssl_ca_dirs %}
  257. - name: {{ dir | regex_replace('^/(.*)$', '\\1' ) | regex_replace('/', '-') }}
  258. hostPath: {{ dir }}
  259. mountPath: {{ dir }}
  260. readOnly: true
  261. {% endfor %}
  262. {% endif %}
  263. {% endif %}
  264. certSANs:
  265. {% for san in apiserver_sans %}
  266. - {{ san }}
  267. {% endfor %}
  268. timeoutForControlPlane: 5m0s
  269. controllerManager:
  270. extraArgs:
  271. node-monitor-grace-period: {{ kube_controller_node_monitor_grace_period }}
  272. node-monitor-period: {{ kube_controller_node_monitor_period }}
  273. cluster-cidr: "{{ kube_pods_subnet }}{{ ',' + kube_pods_subnet_ipv6 if enable_dual_stack_networks else '' }}"
  274. service-cluster-ip-range: "{{ kube_service_addresses }}{{ ',' + kube_service_addresses_ipv6 if enable_dual_stack_networks else '' }}"
  275. {% if enable_dual_stack_networks %}
  276. node-cidr-mask-size-ipv4: "{{ kube_network_node_prefix }}"
  277. node-cidr-mask-size-ipv6: "{{ kube_network_node_prefix_ipv6 }}"
  278. {% else %}
  279. node-cidr-mask-size: "{{ kube_network_node_prefix }}"
  280. {% endif %}
  281. profiling: "{{ kube_profiling }}"
  282. terminated-pod-gc-threshold: "{{ kube_controller_terminated_pod_gc_threshold }}"
  283. bind-address: {{ kube_controller_manager_bind_address }}
  284. leader-elect-lease-duration: {{ kube_controller_manager_leader_elect_lease_duration }}
  285. leader-elect-renew-deadline: {{ kube_controller_manager_leader_elect_renew_deadline }}
  286. {% if kube_feature_gates %}
  287. feature-gates: {{ kube_feature_gates|join(',') }}
  288. {% endif %}
  289. {% for key in kube_kubeadm_controller_extra_args %}
  290. {{ key }}: "{{ kube_kubeadm_controller_extra_args[key] }}"
  291. {% endfor %}
  292. {% if cloud_provider is defined and cloud_provider in ["openstack", "azure", "vsphere", "aws"] %}
  293. cloud-provider: {{ cloud_provider }}
  294. cloud-config: {{ kube_config_dir }}/cloud_config
  295. {% endif %}
  296. {% if kube_network_plugin is defined and kube_network_plugin not in ["cloud"] %}
  297. configure-cloud-routes: "false"
  298. {% endif %}
  299. {% if kubelet_flexvolumes_plugins_dir is defined %}
  300. flex-volume-plugin-dir: {{kubelet_flexvolumes_plugins_dir}}
  301. {% endif %}
  302. {% if tls_min_version is defined %}
  303. tls-min-version: {{ tls_min_version }}
  304. {% endif %}
  305. {% if tls_cipher_suites is defined %}
  306. tls-cipher-suites: {% for tls in tls_cipher_suites %}{{ tls }}{{ "," if not loop.last else "" }}{% endfor %}
  307. {% endif %}
  308. {% if cloud_provider is defined and cloud_provider in ["openstack", "azure", "vsphere", "aws"] or controller_manager_extra_volumes %}
  309. extraVolumes:
  310. {% if cloud_provider is defined and cloud_provider in ["openstack"] and openstack_cacert is defined %}
  311. - name: openstackcacert
  312. hostPath: "{{ kube_config_dir }}/openstack-cacert.pem"
  313. mountPath: "{{ kube_config_dir }}/openstack-cacert.pem"
  314. {% endif %}
  315. {% if cloud_provider is defined and cloud_provider in ["openstack", "azure", "vsphere", "aws"] %}
  316. - name: cloud-config
  317. hostPath: {{ kube_config_dir }}/cloud_config
  318. mountPath: {{ kube_config_dir }}/cloud_config
  319. {% endif %}
  320. {% for volume in controller_manager_extra_volumes %}
  321. - name: {{ volume.name }}
  322. hostPath: {{ volume.hostPath }}
  323. mountPath: {{ volume.mountPath }}
  324. readOnly: {{ volume.readOnly | d(not (volume.writable | d(false))) }}
  325. {% endfor %}
  326. {% endif %}
  327. scheduler:
  328. extraArgs:
  329. bind-address: {{ kube_scheduler_bind_address }}
  330. config: {{ kube_config_dir }}/kubescheduler-config.yaml
  331. {% if kube_feature_gates %}
  332. feature-gates: {{ kube_feature_gates|join(',') }}
  333. {% endif %}
  334. {% if kube_kubeadm_scheduler_extra_args|length > 0 %}
  335. {% for key in kube_kubeadm_scheduler_extra_args %}
  336. {{ key }}: "{{ kube_kubeadm_scheduler_extra_args[key] }}"
  337. {% endfor %}
  338. {% endif %}
  339. {% if tls_min_version is defined %}
  340. tls-min-version: {{ tls_min_version }}
  341. {% endif %}
  342. {% if tls_cipher_suites is defined %}
  343. tls-cipher-suites: {% for tls in tls_cipher_suites %}{{ tls }}{{ "," if not loop.last else "" }}{% endfor %}
  344. {% endif %}
  345. extraVolumes:
  346. - name: kubescheduler-config
  347. hostPath: {{ kube_config_dir }}/kubescheduler-config.yaml
  348. mountPath: {{ kube_config_dir }}/kubescheduler-config.yaml
  349. readOnly: true
  350. {% if scheduler_extra_volumes %}
  351. {% for volume in scheduler_extra_volumes %}
  352. - name: {{ volume.name }}
  353. hostPath: {{ volume.hostPath }}
  354. mountPath: {{ volume.mountPath }}
  355. readOnly: {{ volume.readOnly | d(not (volume.writable | d(false))) }}
  356. {% endfor %}
  357. {% endif %}
  358. ---
  359. apiVersion: kubeproxy.config.k8s.io/v1alpha1
  360. kind: KubeProxyConfiguration
  361. bindAddress: {{ kube_proxy_bind_address }}
  362. clientConnection:
  363. acceptContentTypes: {{ kube_proxy_client_accept_content_types }}
  364. burst: {{ kube_proxy_client_burst }}
  365. contentType: {{ kube_proxy_client_content_type }}
  366. kubeconfig: {{ kube_proxy_client_kubeconfig }}
  367. qps: {{ kube_proxy_client_qps }}
  368. clusterCIDR: "{{ kube_pods_subnet }}{{ ',' + kube_pods_subnet_ipv6 if enable_dual_stack_networks else '' }}"
  369. configSyncPeriod: {{ kube_proxy_config_sync_period }}
  370. conntrack:
  371. maxPerCore: {{ kube_proxy_conntrack_max_per_core }}
  372. min: {{ kube_proxy_conntrack_min }}
  373. tcpCloseWaitTimeout: {{ kube_proxy_conntrack_tcp_close_wait_timeout }}
  374. tcpEstablishedTimeout: {{ kube_proxy_conntrack_tcp_established_timeout }}
  375. enableProfiling: {{ kube_proxy_enable_profiling }}
  376. healthzBindAddress: {{ kube_proxy_healthz_bind_address }}
  377. hostnameOverride: {{ kube_override_hostname }}
  378. iptables:
  379. masqueradeAll: {{ kube_proxy_masquerade_all }}
  380. masqueradeBit: {{ kube_proxy_masquerade_bit }}
  381. minSyncPeriod: {{ kube_proxy_min_sync_period }}
  382. syncPeriod: {{ kube_proxy_sync_period }}
  383. ipvs:
  384. excludeCIDRs: {{ kube_proxy_exclude_cidrs }}
  385. minSyncPeriod: {{ kube_proxy_min_sync_period }}
  386. scheduler: {{ kube_proxy_scheduler }}
  387. syncPeriod: {{ kube_proxy_sync_period }}
  388. strictARP: {{ kube_proxy_strict_arp }}
  389. tcpTimeout: {{ kube_proxy_tcp_timeout }}
  390. tcpFinTimeout: {{ kube_proxy_tcp_fin_timeout }}
  391. udpTimeout: {{ kube_proxy_udp_timeout }}
  392. metricsBindAddress: {{ kube_proxy_metrics_bind_address }}
  393. mode: {{ kube_proxy_mode }}
  394. nodePortAddresses: {{ kube_proxy_nodeport_addresses }}
  395. oomScoreAdj: {{ kube_proxy_oom_score_adj }}
  396. portRange: {{ kube_proxy_port_range }}
  397. udpIdleTimeout: {{ kube_proxy_udp_idle_timeout }}
  398. {% if kube_feature_gates %}
  399. featureGates:
  400. {% for feature in kube_feature_gates %}
  401. {{ feature|replace("=", ": ") }}
  402. {% endfor %}
  403. {% endif %}
  404. {# DNS settings for kubelet #}
  405. {% if enable_nodelocaldns %}
  406. {% set kubelet_cluster_dns = [nodelocaldns_ip] %}
  407. {% elif dns_mode in ['coredns'] %}
  408. {% set kubelet_cluster_dns = [skydns_server] %}
  409. {% elif dns_mode == 'coredns_dual' %}
  410. {% set kubelet_cluster_dns = [skydns_server,skydns_server_secondary] %}
  411. {% elif dns_mode == 'manual' %}
  412. {% set kubelet_cluster_dns = [manual_dns_server] %}
  413. {% else %}
  414. {% set kubelet_cluster_dns = [] %}
  415. {% endif %}
  416. ---
  417. apiVersion: kubelet.config.k8s.io/v1beta1
  418. kind: KubeletConfiguration
  419. clusterDNS:
  420. {% for dns_address in kubelet_cluster_dns %}
  421. - {{ dns_address }}
  422. {% endfor %}
  423. {% if kube_feature_gates %}
  424. featureGates:
  425. {% for feature in kube_feature_gates %}
  426. {{ feature|replace("=", ": ") }}
  427. {% endfor %}
  428. {% endif %}