fix: pre-pull kube-vip images before waiting for VIP
Deploy Cluster / Terraform (push) Successful in 29s
Deploy Cluster / Ansible (push) Failing after 43m31s

The primary control plane was stalling because kubelet still had to pull both
the Rancher pause image and the kube-vip image before the DaemonSet pod could
become Ready. Pre-pull those images into containerd, extend the readiness wait,
and emit pod diagnostics if kube-vip still does not come up.
This commit is contained in:
2026-04-23 03:55:52 +00:00
parent 4151027e01
commit 1156dc0203
2 changed files with 40 additions and 1 deletions
@@ -2,3 +2,6 @@
kube_vip_version: v1.1.2 kube_vip_version: v1.1.2
kube_vip_interface: "{{ ansible_default_ipv4.interface | default('eth0') }}" kube_vip_interface: "{{ ansible_default_ipv4.interface | default('eth0') }}"
kube_vip_address: "{{ kube_api_endpoint }}" kube_vip_address: "{{ kube_api_endpoint }}"
kube_vip_prepull_images:
- docker.io/rancher/mirrored-pause:3.6
- ghcr.io/kube-vip/kube-vip:{{ kube_vip_version }}
+37 -1
View File
@@ -1,4 +1,13 @@
--- ---
- name: Pre-pull kube-vip bootstrap images into containerd
command: /usr/local/bin/ctr -n k8s.io images pull {{ item }}
register: kube_vip_image_pull
retries: 12
delay: 15
until: kube_vip_image_pull.rc == 0
loop: "{{ kube_vip_prepull_images }}"
changed_when: true
- name: Render kube-vip control plane manifest - name: Render kube-vip control plane manifest
template: template:
src: kube-vip-control-plane.yaml.j2 src: kube-vip-control-plane.yaml.j2
@@ -18,9 +27,36 @@
register: kube_vip_pod_ready register: kube_vip_pod_ready
changed_when: false changed_when: false
until: kube_vip_pod_ready.stdout == "True" until: kube_vip_pod_ready.stdout == "True"
retries: 18 retries: 30
delay: 10 delay: 10
- name: Show kube-vip pod status on failure
command: kubectl -n kube-system get pods -l app.kubernetes.io/name=kube-vip -o wide
register: kube_vip_pods
changed_when: false
failed_when: false
when: kube_vip_pod_ready is failed
- name: Describe kube-vip pod on failure
shell: >-
kubectl -n kube-system describe pod
$(kubectl -n kube-system get pods -l app.kubernetes.io/name=kube-vip --field-selector spec.nodeName={{ inventory_hostname }} -o jsonpath='{.items[0].metadata.name}')
register: kube_vip_pod_describe
changed_when: false
failed_when: false
when: kube_vip_pod_ready is failed
- name: Fail with kube-vip diagnostics
fail:
msg: |
kube-vip failed to become ready on {{ inventory_hostname }}.
Pods:
{{ kube_vip_pods.stdout | default('n/a') }}
Describe:
{{ kube_vip_pod_describe.stdout | default('n/a') }}
when: kube_vip_pod_ready is failed
- name: Wait for API VIP on 6443 - name: Wait for API VIP on 6443
wait_for: wait_for:
host: "{{ kube_vip_address }}" host: "{{ kube_vip_address }}"