--- apiVersion: v1 kind: ServiceAccount metadata: name: node-external-ip-labeler namespace: kube-system labels: app: node-external-ip-labeler --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: node-external-ip-labeler labels: app: node-external-ip-labeler rules: - apiGroups: [""] resources: ["nodes"] verbs: ["get", "list", "patch", "update"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: node-external-ip-labeler labels: app: node-external-ip-labeler roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: node-external-ip-labeler subjects: - kind: ServiceAccount name: node-external-ip-labeler namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: node-external-ip-labeler namespace: kube-system labels: app: node-external-ip-labeler rules: - apiGroups: ["batch"] resources: ["jobs"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: node-external-ip-labeler namespace: kube-system labels: app: node-external-ip-labeler roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: node-external-ip-labeler subjects: - kind: ServiceAccount name: node-external-ip-labeler namespace: kube-system --- apiVersion: batch/v1 kind: CronJob metadata: name: node-external-ip-labeler namespace: kube-system labels: app: node-external-ip-labeler spec: schedule: "17 3 * * *" concurrencyPolicy: Forbid successfulJobsHistoryLimit: 3 failedJobsHistoryLimit: 3 jobTemplate: spec: backoffLimit: 1 template: metadata: labels: app: node-external-ip-labeler spec: serviceAccountName: node-external-ip-labeler restartPolicy: Never tolerations: - operator: Exists containers: - name: fanout image: bitnami/kubectl:latest imagePullPolicy: IfNotPresent command: - /bin/bash - -lc args: - | set -euo pipefail clean_name() { echo "$1" \ | tr '[:upper:]' '[:lower:]' \ | tr -c 'a-z0-9-' '-' \ | sed 's/^-*//;s/-*$//' \ | cut -c1-45 } for NODE_NAME in $(kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}'); do NODE_CLEAN="$(clean_name "${NODE_NAME}")" JOB_NAME="node-external-ip-${NODE_CLEAN}" kubectl delete job "${JOB_NAME}" -n kube-system --ignore-not-found=true --wait=true --timeout=60s cat <