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.

371 lines
12 KiB

  1. ---
  2. - name: Calico | Write Calico cni config
  3. template:
  4. src: "cni-calico.conflist.j2"
  5. dest: "/etc/cni/net.d/{% if calico_version is version('v3.3.0', '>=') %}calico.conflist.template{% else %}10-calico.conflist{% endif %}"
  6. owner: kube
  7. - name: Calico | Create calico certs directory
  8. file:
  9. dest: "{{ calico_cert_dir }}"
  10. state: directory
  11. mode: 0750
  12. owner: root
  13. group: root
  14. - name: Calico | Link etcd certificates for calico-node
  15. file:
  16. src: "{{ etcd_cert_dir }}/{{ item.s }}"
  17. dest: "{{ calico_cert_dir }}/{{ item.d }}"
  18. state: hard
  19. force: yes
  20. with_items:
  21. - {s: "ca.pem", d: "ca_cert.crt"}
  22. - {s: "node-{{ inventory_hostname }}.pem", d: "cert.crt"}
  23. - {s: "node-{{ inventory_hostname }}-key.pem", d: "key.pem"}
  24. - name: Calico | Install calicoctl container script
  25. template:
  26. src: calicoctl-container.j2
  27. dest: "{{ bin_dir }}/calicoctl"
  28. mode: 0755
  29. owner: root
  30. group: root
  31. changed_when: false
  32. - name: Calico | Copy cni plugins
  33. unarchive:
  34. src: "{{ local_release_dir }}/cni-plugins-{{ image_arch }}-{{ cni_version }}.tgz"
  35. dest: "/opt/cni/bin"
  36. mode: 0755
  37. remote_src: yes
  38. - name: Calico | Set cni directory permissions
  39. file:
  40. path: /opt/cni/bin
  41. state: directory
  42. owner: kube
  43. recurse: true
  44. mode: 0755
  45. - name: Calico | Copy cni plugins from calico/cni container
  46. command: "{{ docker_bin_dir }}/docker run --rm -v /opt/cni/bin:/cnibindir {{ calico_cni_image_repo }}:{{ calico_cni_image_tag }} sh -c 'cp /opt/cni/bin/* /cnibindir/'"
  47. register: cni_task_result
  48. until: cni_task_result.rc == 0
  49. retries: 4
  50. delay: "{{ retry_stagger | random + 3 }}"
  51. changed_when: false
  52. when:
  53. - "overwrite_hyperkube_cni|bool"
  54. tags:
  55. - hyperkube
  56. - upgrade
  57. - name: Calico | wait for etcd
  58. uri:
  59. url: "{{ etcd_access_addresses.split(',') | first }}/health"
  60. validate_certs: no
  61. client_cert: "{{ etcd_cert_dir }}/node-{{ inventory_hostname }}.pem"
  62. client_key: "{{ etcd_cert_dir }}/node-{{ inventory_hostname }}-key.pem"
  63. register: result
  64. until: result.status == 200 or result.status == 401
  65. retries: 10
  66. delay: 5
  67. run_once: true
  68. - name: Calico | Check if calico network pool has already been configured
  69. shell: >
  70. {{ bin_dir }}/calicoctl get ippool | grep -w "{{ calico_pool_cidr | default(kube_pods_subnet) }}" | wc -l
  71. register: calico_conf
  72. retries: 4
  73. delay: "{{ retry_stagger | random + 3 }}"
  74. delegate_to: "{{ groups['kube-master'][0] }}"
  75. run_once: true
  76. changed_when: false
  77. - name: Calico | Ensure that calico_pool_cidr is within kube_pods_subnet when defined
  78. assert:
  79. that: "[calico_pool_cidr] | ipaddr(kube_pods_subnet) | length == 1"
  80. msg: "{{ calico_pool_cidr }} is not within or equal to {{ kube_pods_subnet }}"
  81. delegate_to: localhost
  82. run_once: true
  83. when:
  84. - 'calico_conf.stdout == "0"'
  85. - calico_pool_cidr is defined
  86. - name: Calico | Configure calico network pool (v3.0.0 <= version < v3.3.0)
  87. shell: >
  88. echo "
  89. { "kind": "IPPool",
  90. "apiVersion": "projectcalico.org/v3",
  91. "metadata": {
  92. "name": "{{ calico_pool_name }}",
  93. },
  94. "spec": {
  95. "cidr": "{{ calico_pool_cidr | default(kube_pods_subnet) }}",
  96. "ipipMode": "{{ ipip_mode }}",
  97. "natOutgoing": {{ nat_outgoing|default(false) and not peer_with_router|default(false) }} }} " | {{ bin_dir }}/calicoctl create -f -
  98. run_once: true
  99. delegate_to: "{{ groups['kube-master'][0] }}"
  100. when:
  101. - 'calico_conf.stdout == "0"'
  102. - calico_version is version("v3.0.0", ">=")
  103. - calico_version is version("v3.3.0", "<")
  104. - name: Calico | Configure calico network pool (version >= v3.3.0)
  105. shell: >
  106. echo "
  107. { "kind": "IPPool",
  108. "apiVersion": "projectcalico.org/v3",
  109. "metadata": {
  110. "name": "{{ calico_pool_name }}",
  111. },
  112. "spec": {
  113. "blockSize": "{{ kube_network_node_prefix }}",
  114. "cidr": "{{ calico_pool_cidr | default(kube_pods_subnet) }}",
  115. "ipipMode": "{{ ipip_mode }}",
  116. "natOutgoing": {{ nat_outgoing|default(false) and not peer_with_router|default(false) }} }} " | {{ bin_dir }}/calicoctl create -f -
  117. run_once: true
  118. delegate_to: "{{ groups['kube-master'][0] }}"
  119. when:
  120. - 'calico_conf.stdout == "0"'
  121. - calico_version is version("v3.3.0", ">=")
  122. - name: Calico | Configure calico network pool (legacy)
  123. shell: >
  124. echo '
  125. { "kind": "ipPool",
  126. "spec": {"disabled": false, "ipip": {"enabled": {{ ipip }}, "mode": "{{ ipip_mode|lower }}"},
  127. "nat-outgoing": {{ nat_outgoing|default(false) and not peer_with_router|default(false) }}},
  128. "apiVersion": "v1",
  129. "metadata": {"cidr": "{{ calico_pool_cidr | default(kube_pods_subnet) }}"}
  130. }' | {{ bin_dir }}/calicoctl apply -f -
  131. environment:
  132. NO_DEFAULT_POOLS: true
  133. run_once: true
  134. delegate_to: "{{ groups['kube-master'][0] }}"
  135. when:
  136. - 'calico_conf.stdout == "0"'
  137. - calico_version is version("v3.0.0", "<")
  138. - name: "Determine nodeToNodeMesh needed state"
  139. set_fact:
  140. nodeToNodeMeshEnabled: "false"
  141. when:
  142. - peer_with_router|default(false) or peer_with_calico_rr|default(false)
  143. - inventory_hostname in groups['k8s-cluster']
  144. run_once: yes
  145. - name: Calico | Set global as_num
  146. shell: >
  147. echo '
  148. { "kind": "BGPConfiguration",
  149. "apiVersion": "projectcalico.org/v3",
  150. "metadata": {
  151. "name": "default",
  152. },
  153. "spec": {
  154. "logSeverityScreen": "Info",
  155. "nodeToNodeMeshEnabled": {{ nodeToNodeMeshEnabled|default('true') }} ,
  156. "asNumber": {{ global_as_num }} }} ' | {{ bin_dir }}/calicoctl create --skip-exists -f -
  157. run_once: true
  158. delegate_to: "{{ groups['kube-master'][0] }}"
  159. when:
  160. - calico_version is version('v3.0.0', '>=')
  161. - name: Calico | Set global as_num (legacy)
  162. command: "{{ bin_dir}}/calicoctl config set asNumber {{ global_as_num }}"
  163. run_once: true
  164. when:
  165. - calico_version is version('v3.0.0', '<')
  166. - name: Calico | Disable node mesh (legacy)
  167. command: "{{ bin_dir }}/calicoctl config set nodeToNodeMesh off"
  168. run_once: yes
  169. when:
  170. - calico_version is version('v3.0.0', '<')
  171. - nodeToMeshEnabled|default(True)
  172. - name: Calico | Configure node asNumber for per node peering
  173. shell: >
  174. echo '{
  175. "apiVersion": "projectcalico.org/v3",
  176. "kind": "Node",
  177. "metadata": {
  178. "name": "{{ inventory_hostname }}"
  179. },
  180. "spec": {
  181. "bgp": {
  182. "asNumber": "{{ local_as }}"
  183. },
  184. "orchRefs":[{"nodeName":"{{ inventory_hostname }}","orchestrator":"k8s"}]
  185. }}' | {{ bin_dir }}/calicoctl create --skip-exists -f -
  186. retries: 4
  187. delay: "{{ retry_stagger | random + 3 }}"
  188. when:
  189. - calico_version is version('v3.0.0', '>=')
  190. - peer_with_router|default(false)
  191. - inventory_hostname in groups['k8s-cluster']
  192. - local_as is defined
  193. - groups['calico-rr'] | default([]) | length == 0
  194. - name: Calico | Configure node asNumber for per node peering (legacy)
  195. shell: >
  196. echo '{
  197. "apiVersion": "v1",
  198. "kind": "node",
  199. "metadata": {
  200. "name": "{{ inventory_hostname }}"
  201. },
  202. "spec": {
  203. "bgp": {
  204. "asNumber": "{{ local_as }}"
  205. },
  206. "orchRefs":[{"nodeName":"{{ inventory_hostname }}","orchestrator":"k8s"}]
  207. }}' | {{ bin_dir }}/calicoctl create --skip-exists -f -
  208. retries: 4
  209. delay: "{{ retry_stagger | random + 3 }}"
  210. when:
  211. - calico_version is version('v3.0.0', '<')
  212. - peer_with_router|default(false)
  213. - inventory_hostname in groups['k8s-cluster']
  214. - local_as is defined
  215. - groups['calico-rr'] | default([]) | length == 0
  216. - name: Calico | Configure peering with router(s) at node scope
  217. shell: >
  218. echo '{
  219. "apiVersion": "projectcalico.org/v3",
  220. "kind": "BGPPeer",
  221. "metadata": {
  222. "name": "{{ inventory_hostname }}-{{ item.router_id }}"
  223. },
  224. "spec": {
  225. "asNumber": "{{ item.as }}",
  226. "node": "{{ inventory_hostname }}",
  227. "peerIP": "{{ item.router_id }}"
  228. }}' | {{ bin_dir }}/calicoctl create --skip-exists -f -
  229. retries: 4
  230. delay: "{{ retry_stagger | random + 3 }}"
  231. with_items:
  232. - "{{ peers|selectattr('scope','undefined')|list|default([]) | union(peers|selectattr('scope','defined')|selectattr('scope','equalto', 'node')|list|default([])) }}"
  233. when:
  234. - calico_version is version('v3.0.0', '>=')
  235. - peer_with_router|default(false)
  236. - inventory_hostname in groups['k8s-cluster']
  237. - name: Calico | Configure peering with router(s) at node scope (legacy)
  238. shell: >
  239. echo '{
  240. "kind": "bgpPeer",
  241. "spec": {"asNumber": "{{ item.as }}"},
  242. "apiVersion": "v1",
  243. "metadata": {"node": "{{ inventory_hostname }}", "scope": "node", "peerIP": "{{ item.router_id }}"}
  244. }'
  245. | {{ bin_dir }}/calicoctl create --skip-exists -f -
  246. retries: 4
  247. delay: "{{ retry_stagger | random + 3 }}"
  248. with_items: "{{ peers|selectattr('scope','undefined')|list|default([]) | union(peers|selectattr('scope','defined')|selectattr('scope','equalto', 'node')|list|default([])) }}"
  249. when:
  250. - calico_version | version_compare('v3.0.0', '<')
  251. - peer_with_router|default(false)
  252. - inventory_hostname in groups['k8s-cluster']
  253. - name: Calico | Configure peering with router(s) at global scope
  254. shell: >
  255. echo '{
  256. "apiVersion": "projectcalico.org/v3",
  257. "kind": "BGPPeer",
  258. "metadata": {
  259. "name": "global-{{ item.router_id }}"
  260. },
  261. "spec": {
  262. "asNumber": "{{ item.as }}",
  263. "peerIP": "{{ item.router_id }}"
  264. }}' | {{ bin_dir }}/calicoctl create --skip-exists -f -
  265. retries: 4
  266. delay: "{{ retry_stagger | random + 3 }}"
  267. with_items:
  268. - "{{ peers|selectattr('scope','defined')|selectattr('scope','equalto', 'global')|list|default([]) }}"
  269. run_once: true
  270. when:
  271. - calico_version | version_compare('v3.0.0', '>=')
  272. - peer_with_router|default(false)
  273. - inventory_hostname in groups['k8s-cluster']
  274. - name: Calico | Configure peering with router(s) at global scope (legacy)
  275. shell: >
  276. echo '{
  277. "kind": "bgpPeer",
  278. "spec": {"asNumber": "{{ item.as }}"},
  279. "apiVersion": "v1",
  280. "metadata": {"scope": "global", "peerIP": "{{ item.router_id }}"}
  281. }'
  282. | {{ bin_dir }}/calicoctl create --skip-exists -f -
  283. retries: 4
  284. delay: "{{ retry_stagger | random + 3 }}"
  285. with_items: "{{ peers|selectattr('scope','defined')|selectattr('scope','equalto', 'global')|default([]) }}"
  286. run_once: true
  287. when:
  288. - calico_version is version('v3.0.0', '<')
  289. - peer_with_router|default(false)
  290. - inventory_hostname in groups['k8s-cluster']
  291. - name: Calico | Configure peering with route reflectors
  292. shell: >
  293. echo '{
  294. "apiVersion": "projectcalico.org/v3",
  295. "kind": "BGPPeer",
  296. "metadata": {
  297. "name": "{{ inventory_hostname }}-{{ hostvars[item]["calico_rr_ip"]|default(hostvars[item]["ip"])|default(fallback_ips[item]) }}"
  298. },
  299. "spec": {
  300. "asNumber": "{{ local_as | default(global_as_num)}}",
  301. "node": "{{ inventory_hostname }}",
  302. "peerIP": "{{ hostvars[item]["calico_rr_ip"]|default(hostvars[item]["ip"])|default(fallback_ips[item]) }}"
  303. }}' | {{ bin_dir }}/calicoctl create --skip-exists -f -
  304. retries: 4
  305. delay: "{{ retry_stagger | random + 3 }}"
  306. with_items:
  307. - "{{ groups['calico-rr'] | default([]) }}"
  308. when:
  309. - calico_version is version('v3.0.0', '>=')
  310. - peer_with_calico_rr|default(false)
  311. - inventory_hostname in groups['k8s-cluster']
  312. - hostvars[item]['cluster_id'] == cluster_id
  313. - name: Calico | Configure peering with route reflectors (legacy)
  314. shell: >
  315. echo '{
  316. "kind": "bgpPeer",
  317. "spec": {"asNumber": "{{ local_as | default(global_as_num)}}"},
  318. "apiVersion": "v1",
  319. "metadata": {"node": "{{ inventory_hostname }}",
  320. "scope": "node",
  321. "peerIP": "{{ hostvars[item]["calico_rr_ip"]|default(hostvars[item]["ip"])|default(fallback_ips[item]) }}"}
  322. }'
  323. | {{ bin_dir }}/calicoctl create --skip-exists -f -
  324. retries: 4
  325. delay: "{{ retry_stagger | random + 3 }}"
  326. with_items: "{{ groups['calico-rr'] | default([]) }}"
  327. when:
  328. - calico_version is version('v3.0.0', '<')
  329. - not calico_upgrade_enabled
  330. - peer_with_calico_rr|default(false)
  331. - hostvars[item]['cluster_id'] == cluster_id
  332. - name: Calico | Create calico manifests
  333. template:
  334. src: "{{item.file}}.j2"
  335. dest: "{{kube_config_dir}}/{{item.file}}"
  336. with_items:
  337. - {name: calico-config, file: calico-config.yml, type: cm}
  338. - {name: calico-node, file: calico-node.yml, type: ds}
  339. - {name: calico, file: calico-node-sa.yml, type: sa}
  340. - {name: calico, file: calico-cr.yml, type: clusterrole}
  341. - {name: calico, file: calico-crb.yml, type: clusterrolebinding}
  342. register: calico_node_manifests
  343. when:
  344. - inventory_hostname in groups['kube-master']
  345. - rbac_enabled or item.type not in rbac_resources