Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature/Idea] Add/Adjust node label(s) on what node has the VIP active #3

Open
soakes opened this issue Jun 10, 2018 · 4 comments
Open

Comments

@soakes
Copy link

soakes commented Jun 10, 2018

Just an idea, it would be good if you could add say a label called vip=active or something on any node which has the VIP active.

But the issue is, no access to kubectl and even if that's on the image, that's not really very secure and I don't know k8s well enough yet to find an alternative solution. So if anyone got any ideas, please let me know.

Without this feature, you can't like bring up a service which has host-based networking which can follow around the VIP.

i.e. changing the script to something like this:

    #!/bin/bash
    echo "Executing vip-notify script for Hetzner Cloud"
    ENDSTATE=$3
    NAME=$2
    TYPE=$1
    if [ "$ENDSTATE" == "MASTER" ] ; then
        HOST_IP=$(ip route get 8.8.8.8 | awk '{print $7 }')
        ACTIVE_HOST=$(/bin/hostname -s)
        export SERVER_ID=$(curl -s -H "Authorization: Bearer $HETZNER_TOKEN" "https://api.hetzner.cloud/v1/servers?name=$HOSTNAME" | grep -C 2 servers | grep id | awk '{ print $2 }' | sed -e s/,//)
        export FLOATING_IP_ID=$(curl -s -H "Authorization: Bearer $HETZNER_TOKEN" "https://api.hetzner.cloud/v1/floating_ips" | grep "\"ip\": \"$FLOATING_IP" -B 3  | grep id | awk '{ print $2 }' | sed -e s/,//)
        echo "Installing dnsutils"
        apt update && apt install -y dnsutils
        echo "Setting Failover IP (Floating IP): $FLOATING_IP to Server IP:  $HOST_IP"
        curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $HETZNER_TOKEN" -d "{\"server\":$SERVER_ID}" "https://api.hetzner.cloud/v1/floating_ips/$FLOATING_IP_ID/actions/assign"
        echo "Clearing VIP label from all nodes"
        kubectl get nodes --show-labels|grep vip|awk '{print $1}'|while read i; do kubectl label nodes $i vip-;done
        echo "Setting VIP label on ACTIVE node"
        kubectl label nodes "${ACTIVE_HOST}" vip=active
    fi

Update
Found away without using kubectl

curl -k -v -H "Accept: application/json" -XPATCH -d '{"metadata":{"labels":{"vip":"active"}}}' -H "Content-Type: application/merge-patch+json" http://127.0.0.1:8080/api/v1/nodes/node01-k8s

-Working on some updates will post when done.-

Update
This is quick and dirty, but this does work.

$ cat configmap-script.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: vip-notify
data:
  notify.sh: |
    #!/bin/bash
    echo "Executing vip-notify script for Hetzner Cloud"
    ENDSTATE=$3
    NAME=$2
    TYPE=$1
    if [ "$ENDSTATE" == "MASTER" ] ; then
        HOST_IP=$(ip route get 8.8.8.8 | awk '{print $7 }')
        SHOST=$(echo $HOSTNAME|awk -F. '{print $1}')
        export SERVER_ID=$(curl -s -H "Authorization: Bearer $HETZNER_TOKEN" "https://api.hetzner.cloud/v1/servers?name=$HOSTNAME" | grep -C 2 servers | grep id | awk '{ print $2 }' | sed -e s/,//)
        export FLOATING_IP_ID=$(curl -s -H "Authorization: Bearer $HETZNER_TOKEN" "https://api.hetzner.cloud/v1/floating_ips" | grep "\"ip\": \"$FLOATING_IP" -B 3  | grep id | awk '{ print $2 }' | sed -e s/,//)
        echo "Setting Failover IP (Floating IP): $FLOATING_IP to Server IP:  $HOST_IP"
        curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $HETZNER_TOKEN" -d "{\"server\":$SERVER_ID}" "https://api.hetzner.cloud/v1/floating_ips/$FLOATING_IP_ID/actions/assign"
        echo "Configure VIP label on all nodes to false"
        curl -s http://127.0.0.1:8080/api/v1/nodes|grep selfLink|awk -F"/" '{print $5}' | awk -F\" '{print $1}' |sed 1d|while read i; do curl -k -v -H "Accept: application/json" -XPATCH -d '{"metadata":{"labels":{"vip":"false"}}}' -H "Content-Type: application/merge-patch+json" http://127.0.0.1:8080/api/v1/nodes/$i;done
        echo "Setting VIP label on ACTIVE node to true"
        curl -k -v -H "Accept: application/json" -XPATCH -d '{"metadata":{"labels":{"vip":"true"}}}' -H "Content-Type: application/merge-patch+json" http://127.0.0.1:8080/api/v1/nodes/"${SHOST}"
    fi

This sets vip=false to every node and then sets just vip=true on the node which has the VIP.

I am sure there's a better way to do it but currently, this is the only way ive found, while not elegant, it does work for now.

@exocode
Copy link
Owner

exocode commented Jun 12, 2018

Glad to hear 👂🏾. When I have time I will add support for multiple IPs too.

@soakes
Copy link
Author

soakes commented Jun 13, 2018

Hi there,

I should have some time at the weekend to look further into it but anything you can come up with would be great, always can tweak and send the tweaks to you. I've been going through the code which you have created and I think I see how it's done. I have made a few minor tweaks to the script atm and will post a revised one soon. This just adds an extra-label right now to the nodes so you can tie it to containers easily (i.e. containers follow VIP around). As for the extra IP, not sure yet how that's done, the bash side I can see but the k8s I don't (currently).

I must admit I am just starting on the k8s path myself too, its that side I don't yet fully understand but have been a docker swarm user for a long time now, so docker itself isn't a problem, it's just the k8s way that is.

Kind Regards.

@exocode
Copy link
Owner

exocode commented Jun 13, 2018

Maybe we could "loop" through a "key/value pair array" like fips="123.456.789.0=www.domain.com,11aa::11aa::11aa:11aa=another.domain.com. These could include ipv6 as well as ipv4 domains. Or we split it like fipv4 and fipv6 parameter. And write them into the configmap. Cornelius had made a PR on the notify script repo to be able to use the official one.

@soakes
Copy link
Author

soakes commented Jun 13, 2018

Nice idea.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants