Skip to content

Commit 83d2daa

Browse files
mnietojiclaude
andcommitted
[multiple] Co-locate provisionserver with metal3 to prevent DHCP failures II
When metal3-dnsmasq pod restarts during a node's DHCP lease renewal on the provisioning network (172.23.0.0/24), NetworkManager fails to renew and sets ipv4.method=disabled. NMState operator then preserves this disabled state, causing permanent loss of provisioning network connectivity on that node. The issue occurs when OpenStackProvisionServer and metal3 pods run on different nodes. If metal3 restarts while a node is attempting DHCP renewal, the temporary unavailability of metal3-dnsmasq causes the renewal to fail. Solution: Automatically detect the node running metal3 pod (via k8s-app=metal3 label) and configure provisionServerNodeSelector in baremetalSetTemplate to schedule OpenStackProvisionServer on the same node. This ensures provisioning network connectivity is maintained because metal3-static-ip-manager maintains a static IP (172.23.0.3) on the metal3 node regardless of dnsmasq restarts. Signed-off-by: Miguel Angel Nieto Jimenez <mnietoji@redhat.com> Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent 190ce02 commit 83d2daa

8 files changed

Lines changed: 86 additions & 0 deletions

File tree

roles/ci_gen_kustomize_values/templates/nfv-ovs-dpdk-sriov-hci/edpm-nodeset-values/values.yaml.j2

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
{% set _original_nodeset = (original_content.data | default({})).nodeset | default({}) %}
55
{% set _original_nodes = _original_nodeset.nodes | default({}) %}
66
{% set _original_services = _original_nodeset['services'] | default([]) %}
7+
{% set _original_baremetal_template = (original_content.data | default({})).baremetalSetTemplate | default({}) %}
78
{% for _inst in cifmw_baremetal_hosts.keys() %}
89
{% set _ = instances_names.append(_inst) %}
910
{% endfor %}
@@ -43,3 +44,11 @@ data:
4344
- "{{ svc }}"
4445
{% endfor %}
4546
{% endif %}
47+
{% if cifmw_kustomize_deploy_metal3_node is defined %}
48+
baremetalSetTemplate:
49+
{% for key, value in _original_baremetal_template.items() %}
50+
{{ key }}: {{ value }}
51+
{% endfor %}
52+
provisionServerNodeSelector:
53+
kubernetes.io/hostname: "{{ cifmw_kustomize_deploy_metal3_node }}"
54+
{% endif %}

roles/ci_gen_kustomize_values/templates/ovs-dpdk-sriov-2nodesets/edpm-nodeset-values/values.yaml.j2

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
{% set _original_nodeset = (original_content.data | default({})).nodeset | default({}) %}
55
{% set _original_nodes = _original_nodeset.nodes | default({}) %}
66
{% set _original_services = _original_nodeset['services'] | default([]) %}
7+
{% set _original_baremetal_template = (original_content.data | default({})).baremetalSetTemplate | default({}) %}
78
{% if cifmw_baremetal_hosts | default([]) | length > 0 %}
89
{% for _inst in cifmw_baremetal_hosts.keys() %}
910
{% if (('label' in cifmw_baremetal_hosts[_inst]) and
@@ -56,3 +57,11 @@ data:
5657
- "{{ svc }}"
5758
{% endfor %}
5859
{% endif %}
60+
{% if cifmw_kustomize_deploy_metal3_node is defined %}
61+
baremetalSetTemplate:
62+
{% for key, value in _original_baremetal_template.items() %}
63+
{{ key }}: {{ value }}
64+
{% endfor %}
65+
provisionServerNodeSelector:
66+
kubernetes.io/hostname: "{{ cifmw_kustomize_deploy_metal3_node }}"
67+
{% endif %}

roles/ci_gen_kustomize_values/templates/ovs-dpdk-sriov-ipv6-2nodesets/edpm-nodeset-values/values.yaml.j2

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
{% set _original_nodeset = (original_content.data | default({})).nodeset | default({}) %}
55
{% set _original_nodes = _original_nodeset.nodes | default({}) %}
66
{% set _original_services = _original_nodeset['services'] | default([]) %}
7+
{% set _original_baremetal_template = (original_content.data | default({})).baremetalSetTemplate | default({}) %}
78
{% if cifmw_baremetal_hosts | default([]) | length > 0 %}
89
{% for _inst in cifmw_baremetal_hosts.keys() %}
910
{% if (('label' in cifmw_baremetal_hosts[_inst]) and
@@ -56,3 +57,11 @@ data:
5657
- "{{ svc }}"
5758
{% endfor %}
5859
{% endif %}
60+
{% if cifmw_kustomize_deploy_metal3_node is defined %}
61+
baremetalSetTemplate:
62+
{% for key, value in _original_baremetal_template.items() %}
63+
{{ key }}: {{ value }}
64+
{% endfor %}
65+
provisionServerNodeSelector:
66+
kubernetes.io/hostname: "{{ cifmw_kustomize_deploy_metal3_node }}"
67+
{% endif %}

roles/ci_gen_kustomize_values/templates/ovs-dpdk-sriov-ipv6/edpm-nodeset-values/values.yaml.j2

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
{% set _original_nodeset = (original_content.data | default({})).nodeset | default({}) %}
55
{% set _original_nodes = _original_nodeset.nodes | default({}) %}
66
{% set _original_services = _original_nodeset['services'] | default([]) %}
7+
{% set _original_baremetal_template = (original_content.data | default({})).baremetalSetTemplate | default({}) %}
78
{% for _inst in cifmw_baremetal_hosts.keys() %}
89
{% set _ = instances_names.append(_inst) %}
910
{% endfor %}
@@ -43,3 +44,11 @@ data:
4344
- "{{ svc }}"
4445
{% endfor %}
4546
{% endif %}
47+
{% if cifmw_kustomize_deploy_metal3_node is defined %}
48+
baremetalSetTemplate:
49+
{% for key, value in _original_baremetal_template.items() %}
50+
{{ key }}: {{ value }}
51+
{% endfor %}
52+
provisionServerNodeSelector:
53+
kubernetes.io/hostname: "{{ cifmw_kustomize_deploy_metal3_node }}"
54+
{% endif %}

roles/ci_gen_kustomize_values/templates/ovs-dpdk-sriov/edpm-nodeset-values/values.yaml.j2

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
{% set _original_nodeset = (original_content.data | default({})).nodeset | default({}) %}
55
{% set _original_nodes = _original_nodeset.nodes | default({}) %}
66
{% set _original_services = _original_nodeset['services'] | default([]) %}
7+
{% set _original_baremetal_template = (original_content.data | default({})).baremetalSetTemplate | default({}) %}
78
{% for _inst in cifmw_baremetal_hosts.keys() %}
89
{% set _ = instances_names.append(_inst) %}
910
{% endfor %}
@@ -43,3 +44,11 @@ data:
4344
- "{{ svc }}"
4445
{% endfor %}
4546
{% endif %}
47+
{% if cifmw_kustomize_deploy_metal3_node is defined %}
48+
baremetalSetTemplate:
49+
{% for key, value in _original_baremetal_template.items() %}
50+
{{ key }}: {{ value }}
51+
{% endfor %}
52+
provisionServerNodeSelector:
53+
kubernetes.io/hostname: "{{ cifmw_kustomize_deploy_metal3_node }}"
54+
{% endif %}

roles/ci_gen_kustomize_values/templates/ovs-dpdk/edpm-nodeset-values/values.yaml.j2

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
{% set _original_nodeset = (original_content.data | default({})).nodeset | default({}) %}
55
{% set _original_nodes = _original_nodeset.nodes | default({}) %}
66
{% set _original_services = _original_nodeset['services'] | default([]) %}
7+
{% set _original_baremetal_template = (original_content.data | default({})).baremetalSetTemplate | default({}) %}
78
{% for _inst in cifmw_baremetal_hosts.keys() %}
89
{% set _ = instances_names.append(_inst) %}
910
{% endfor %}
@@ -42,3 +43,11 @@ data:
4243
- "{{ svc }}"
4344
{% endfor %}
4445
{% endif %}
46+
{% if cifmw_kustomize_deploy_metal3_node is defined %}
47+
baremetalSetTemplate:
48+
{% for key, value in _original_baremetal_template.items() %}
49+
{{ key }}: {{ value }}
50+
{% endfor %}
51+
provisionServerNodeSelector:
52+
kubernetes.io/hostname: "{{ cifmw_kustomize_deploy_metal3_node }}"
53+
{% endif %}

roles/ci_gen_kustomize_values/templates/sriov/edpm-nodeset-values/values.yaml.j2

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
{% set _original_nodeset = (original_content.data | default({})).nodeset | default({}) %}
55
{% set _original_nodes = _original_nodeset.nodes | default({}) %}
66
{% set _original_services = _original_nodeset['services'] | default([]) %}
7+
{% set _original_baremetal_template = (original_content.data | default({})).baremetalSetTemplate | default({}) %}
78
{% for _inst in cifmw_baremetal_hosts.keys() %}
89
{% set _ = instances_names.append(_inst) %}
910
{% endfor %}
@@ -42,3 +43,11 @@ data:
4243
- "{{ svc }}"
4344
{% endfor %}
4445
{% endif %}
46+
{% if cifmw_kustomize_deploy_metal3_node is defined %}
47+
baremetalSetTemplate:
48+
{% for key, value in _original_baremetal_template.items() %}
49+
{{ key }}: {{ value }}
50+
{% endfor %}
51+
provisionServerNodeSelector:
52+
kubernetes.io/hostname: "{{ cifmw_kustomize_deploy_metal3_node }}"
53+
{% endif %}

roles/kustomize_deploy/tasks/execute_step.yml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,29 @@
138138
ansible.builtin.include_role:
139139
name: run_hook
140140

141+
- name: Detect metal3 pod node for baremetal nodeset provisioning
142+
when:
143+
- not cifmw_kustomize_deploy_generate_crs_only | bool
144+
- stage.path is defined
145+
- stage.path is match('.*/edpm/nodeset.*')
146+
block:
147+
- name: Get metal3 pod information
148+
kubernetes.core.k8s_info:
149+
kubeconfig: "{{ cifmw_openshift_kubeconfig }}"
150+
kind: Pod
151+
namespace: openshift-machine-api
152+
label_selectors:
153+
- k8s-app=metal3
154+
register: _cifmw_kustomize_deploy_metal3_pod_info
155+
156+
- name: Set metal3 node for provisionserver nodeSelector
157+
ansible.builtin.set_fact:
158+
cifmw_kustomize_deploy_metal3_node: "{{ _cifmw_kustomize_deploy_metal3_pod_info.resources[0].spec.nodeName }}"
159+
cacheable: true
160+
when:
161+
- _cifmw_kustomize_deploy_metal3_pod_info.resources is defined
162+
- _cifmw_kustomize_deploy_metal3_pod_info.resources | length > 0
163+
141164
- name: "Generate values.yaml for {{ stage.path }}"
142165
when:
143166
- _val.src_file is defined

0 commit comments

Comments
 (0)