diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a2b37b6e8..8a4136c295 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ - Add default `topology.kubernetes.io/region` and `topology.kubernetes.io/zone` topology labels on nodes - (PR[#3889](https://github.com/scality/metalk8s/pull/3889)) + (PR[#3897](https://github.com/scality/metalk8s/pull/3897)) - Add support for a `metalk8s.scality.com/force-lvcreate` annotation on `Volume` objects of type `LVMLogicalVolume` to force the creation of their LV (use with diff --git a/docs/installation/expansion.rst b/docs/installation/expansion.rst index ed94dc1f87..69c73d403c 100644 --- a/docs/installation/expansion.rst +++ b/docs/installation/expansion.rst @@ -135,8 +135,6 @@ following the template below: metalk8s.scality.com/ssh-user: 'root' labels: metalk8s.scality.com/version: '|version|' - topology.kubernetes.io/region: 'default' - topology.kubernetes.io/zone: 'default' spec: taints: diff --git a/examples/new-node.yaml b/examples/new-node.yaml index ba560670d5..0c905b20b6 100644 --- a/examples/new-node.yaml +++ b/examples/new-node.yaml @@ -15,8 +15,6 @@ metadata: metalk8s.scality.com/version: '2.0' node-role.kubernetes.io/master: '' node-role.kubernetes.io/etcd: '' - topology.kubernetes.io/region: 'default' - topology.kubernetes.io/zone: 'default' spec: taints: - effect: NoSchedule diff --git a/examples/new-node_vagrant.yaml b/examples/new-node_vagrant.yaml index 038e91e908..b54b084994 100644 --- a/examples/new-node_vagrant.yaml +++ b/examples/new-node_vagrant.yaml @@ -15,8 +15,6 @@ metadata: metalk8s.scality.com/version: '2.0' node-role.kubernetes.io/master: '' node-role.kubernetes.io/etcd: '' - topology.kubernetes.io/region: 'default' - topology.kubernetes.io/zone: 'default' spec: taints: - effect: NoSchedule diff --git a/salt/_states/metalk8s_kubernetes.py b/salt/_states/metalk8s_kubernetes.py index d65f34034b..209dc10622 100644 --- a/salt/_states/metalk8s_kubernetes.py +++ b/salt/_states/metalk8s_kubernetes.py @@ -219,3 +219,53 @@ def object_updated(name, manifest=None, **kwargs): ret["comment"] = "The object was updated" return ret + + +def labels_exist(name, labels, **kwargs): + """Ensure that labels exist. + + NOTE: This function do not update the labels if they + already exist + + Arguments: + name (str): Name of the object + labels (dict): Labels that should exist + """ + ret = {"name": name, "changes": {}, "result": True, "comment": ""} + + obj = __salt__["metalk8s_kubernetes.get_object"]( + name=name, saltenv=__env__, **kwargs + ) + + if not obj: + ret["result"] = False + ret["comment"] = f"The object {name} does not exist" + return ret + + labels_to_add = { + key: value + for key, value in labels.items() + if key not in obj["metadata"]["labels"] + } + + if not labels_to_add: + ret["comment"] = f"All labels already exist on object {name}" + return ret + + if __opts__["test"]: + ret["result"] = None + ret[ + "comment" + ] = f"Labels {', '.join(labels_to_add)} will be added to object {name}" + return ret + + __salt__["metalk8s_kubernetes.update_object"]( + name=name, + saltenv=__env__, + patch={"metadata": {"labels": labels_to_add}}, + **kwargs, + ) + + ret["comment"] = f"Object {name} labels has been added" + ret["changes"] = {"labels added": labels_to_add} + return ret diff --git a/salt/metalk8s/defaults.yaml b/salt/metalk8s/defaults.yaml index b5f376935a..de0b8c019e 100644 --- a/salt/metalk8s/defaults.yaml +++ b/salt/metalk8s/defaults.yaml @@ -12,6 +12,11 @@ metalk8s: kubernetes: cluster: kubernetes + nodes: + default_labels: + topology.kubernetes.io/region: default + topology.kubernetes.io/zone: default + kubeadm_preflight: mandatory: packages: diff --git a/salt/metalk8s/kubernetes/mark-control-plane/deployed.sls b/salt/metalk8s/kubernetes/mark-control-plane/deployed.sls index 4abb564f7f..c3dbfae90c 100644 --- a/salt/metalk8s/kubernetes/mark-control-plane/deployed.sls +++ b/salt/metalk8s/kubernetes/mark-control-plane/deployed.sls @@ -1,4 +1,5 @@ {%- from "metalk8s/map.jinja" import kubelet with context %} +{%- from "metalk8s/map.jinja" import kubernetes with context %} {%- set node_name = pillar.bootstrap_id %} {%- set cri_socket = kubelet.service.options['container-runtime-endpoint'] %} @@ -20,3 +21,12 @@ Mark node {{ node_name }} as bootstrap: cri_socket: {{ cri_socket }} - require: - test: Ensure node {{ node_name }} exists + +Ensure node {{ node_name }} default labels exist: + metalk8s_kubernetes.labels_exist: + - name: {{ node_name }} + - apiVersion: v1 + - kind: Node + - labels: {{ kubernetes.nodes.default_labels | tojson }} + - require: + - test: Ensure node {{ node_name }} exists diff --git a/salt/metalk8s/kubernetes/mark-control-plane/files/bootstrap_node_update.yaml.j2.in b/salt/metalk8s/kubernetes/mark-control-plane/files/bootstrap_node_update.yaml.j2.in index 361eb9ffb7..a76c9fe488 100644 --- a/salt/metalk8s/kubernetes/mark-control-plane/files/bootstrap_node_update.yaml.j2.in +++ b/salt/metalk8s/kubernetes/mark-control-plane/files/bootstrap_node_update.yaml.j2.in @@ -31,8 +31,6 @@ {%- endfor %} {%- endif %} -{%- set topology_labels = ["topology.kubernetes.io/region", "topology.kubernetes.io/zone"] %} - kind: Node apiVersion: v1 metadata: @@ -43,11 +41,6 @@ metadata: node-role.kubernetes.io/etcd: "" node-role.kubernetes.io/bootstrap: "" node-role.kubernetes.io/infra: "" - {%- for label in topology_labels %} - {%- if label not in node_obj["metadata"].get("labels", {}) %} - {{ label }}: default - {%- endif %} - {%- endfor %} annotations: kubeadm.alpha.kubernetes.io/cri-socket: {{ cri_socket }} {%- if update_taints %} diff --git a/salt/metalk8s/orchestrate/deploy_node.sls b/salt/metalk8s/orchestrate/deploy_node.sls index 10affc352a..5997bf3049 100644 --- a/salt/metalk8s/orchestrate/deploy_node.sls +++ b/salt/metalk8s/orchestrate/deploy_node.sls @@ -1,4 +1,5 @@ {%- from "metalk8s/map.jinja" import defaults with context %} +{%- from "metalk8s/map.jinja" import kubernetes with context %} {%- from "metalk8s/map.jinja" import networks with context %} {%- from "metalk8s/map.jinja" import repo with context %} @@ -120,6 +121,13 @@ Refresh the mine: - name: mine.update - tgt: '*' +Ensure node default labels exist: + metalk8s_kubernetes.labels_exist: + - name: {{ node_name }} + - apiVersion: v1 + - kind: Node + - labels: {{ kubernetes.nodes.default_labels | tojson }} + Cordon the node: metalk8s_cordon.node_cordoned: - name: {{ node_name }} diff --git a/tests/install/steps/files/control-plane-node.yaml.tpl b/tests/install/steps/files/control-plane-node.yaml.tpl index 45c50a005b..64db617650 100644 --- a/tests/install/steps/files/control-plane-node.yaml.tpl +++ b/tests/install/steps/files/control-plane-node.yaml.tpl @@ -7,8 +7,6 @@ metadata: node-role.kubernetes.io/master: '' node-role.kubernetes.io/etcd: '' node-role.kubernetes.io/infra: '' - topology.kubernetes.io/region: 'default' - topology.kubernetes.io/zone: 'default' annotations: metalk8s.scality.com/ssh-user: centos metalk8s.scality.com/ssh-port: "22" diff --git a/ui/src/ducks/app/nodes.js b/ui/src/ducks/app/nodes.js index 28cef0e9cf..fc74ef4d98 100644 --- a/ui/src/ducks/app/nodes.js +++ b/ui/src/ducks/app/nodes.js @@ -356,8 +356,6 @@ export function* createNode({ payload }) { name: payload.name, labels: { 'metalk8s.scality.com/version': clusterVersion, - 'topology.kubernetes.io/region': 'default', - 'topology.kubernetes.io/zone': 'default', }, annotations: { 'metalk8s.scality.com/ssh-user': payload.ssh_user,