|
| 1 | +apiVersion: v1 |
| 2 | +kind: ConfigMap |
| 3 | +metadata: |
| 4 | + name: entrypoint |
| 5 | + labels: |
| 6 | + app: default-init |
| 7 | +data: |
| 8 | + entrypoint.sh: | |
| 9 | + #!/usr/bin/env bash |
| 10 | +
|
| 11 | + set -euo pipefail |
| 12 | +
|
| 13 | + DEBIAN_FRONTEND=noninteractive |
| 14 | + ROOT_MOUNT_DIR="${ROOT_MOUNT_DIR:-/root}" |
| 15 | +
|
| 16 | + echo "Loading PTP-KVM Kernel module" |
| 17 | + chroot "${ROOT_MOUNT_DIR}" modprobe ptp_kvm |
| 18 | + echo "ptp_kvm" >${ROOT_MOUNT_DIR}/etc/modules-load.d/ptp_kvm.conf |
| 19 | +
|
| 20 | +
|
| 21 | + echo "Configuring chrony to leverage PTP-KVM" |
| 22 | + grep -v "^log " ${ROOT_MOUNT_DIR}/etc/chrony/chrony.conf > /tmp/chrony_new.conf && mv /tmp/chrony_new.conf ${ROOT_MOUNT_DIR}/etc/chrony/chrony.conf |
| 23 | + grep -v "^server " ${ROOT_MOUNT_DIR}/etc/chrony/chrony.conf > /tmp/chrony_new.conf && mv /tmp/chrony_new.conf ${ROOT_MOUNT_DIR}/etc/chrony/chrony.conf |
| 24 | + grep -v "^pool " ${ROOT_MOUNT_DIR}/etc/chrony/chrony.conf > /tmp/chrony_new.conf && mv /tmp/chrony_new.conf ${ROOT_MOUNT_DIR}/etc/chrony/chrony.conf |
| 25 | + grep "^refclock " ${ROOT_MOUNT_DIR}/etc/chrony/chrony.conf > /dev/null || echo "refclock PHC /dev/ptp_kvm poll -1 prefer" >> ${ROOT_MOUNT_DIR}/etc/chrony/chrony.conf |
| 26 | + grep "^log " ${ROOT_MOUNT_DIR}/etc/chrony/chrony.conf > /dev/null || echo "log rawmeasurements refclocks selection statistics tracking" >> ${ROOT_MOUNT_DIR}/etc/chrony/chrony.conf |
| 27 | + grep "^logdir " ${ROOT_MOUNT_DIR}/etc/chrony/chrony.conf > /dev/null || echo "logdir /var/log/chrony" >> ${ROOT_MOUNT_DIR}/etc/chrony/chrony.conf |
| 28 | + chroot "${ROOT_MOUNT_DIR}" mkdir -p /var/log/chrony |
| 29 | + chroot "${ROOT_MOUNT_DIR}" chown ntp: /var/log/chrony || echo "Chown failed - OK on Ubuntu" |
| 30 | +
|
| 31 | + echo "Restarting chrony" |
| 32 | + chroot "${ROOT_MOUNT_DIR}" systemctl restart chronyd |
| 33 | +
|
| 34 | + function untaint() { |
| 35 | + echo "Node name is: ${NODE_NAME}" |
| 36 | + echo "Finding the taint" |
| 37 | +
|
| 38 | + TAINT_KEY=startup-taint.cluster-autoscaler.kubernetes.io/node-initializer |
| 39 | + TAINT_VALUE=true |
| 40 | + TAINT_EFFECT=NoSchedule |
| 41 | +
|
| 42 | + LABEL_KEY=node-initializer |
| 43 | + LABEL_VALUE=done |
| 44 | +
|
| 45 | + # In case that the untaint patch failed due to a conflict, keep retrying until the taint cannot be found. |
| 46 | + while true |
| 47 | + do |
| 48 | + taint=$(${ROOT_MOUNT_DIR}/home/kubernetes/bin/kubectl get node "${NODE_NAME}" \ |
| 49 | + -o jsonpath="{.spec.taints[?(@.key==\"${TAINT_KEY}\")]}") |
| 50 | +
|
| 51 | + if [[ -n "$taint" ]]; then |
| 52 | + echo "Found the taint. Untainting." |
| 53 | + ${ROOT_MOUNT_DIR}/home/kubernetes/bin/kubectl taint nodes ${NODE_NAME} \ |
| 54 | + ${TAINT_KEY}:${TAINT_EFFECT}- |
| 55 | + ${ROOT_MOUNT_DIR}/home/kubernetes/bin/kubectl label nodes ${NODE_NAME} \ |
| 56 | + ${LABEL_KEY}=${LABEL_VALUE} |
| 57 | + else |
| 58 | + echo "Didn't find the taint. Nothing to do." |
| 59 | + return |
| 60 | + fi |
| 61 | + done |
| 62 | + } |
| 63 | + # Give chrony a second to stabilize the clock |
| 64 | + sleep 1 |
| 65 | + untaint |
0 commit comments