161 lines
5.0 KiB
Bash
Executable File
161 lines
5.0 KiB
Bash
Executable File
#!/bin/sh
|
|
# Launch of Weave Net pod - requires that init.sh has been run previously
|
|
|
|
set -e
|
|
|
|
[ -n "$WEAVE_DEBUG" ] && set -x
|
|
|
|
# If this is run from an older manifest, run the init script here
|
|
[ "${INIT_CONTAINER}" = "true" ] || "$(dirname "$0")/init.sh"
|
|
|
|
# Setup iptables backend to be legacy or nftable
|
|
setup_iptables_backend() {
|
|
if [ -n "${IPTABLES_BACKEND}" ]; then
|
|
mode=$IPTABLES_BACKEND
|
|
else
|
|
# auto-detect if iptables backend mode to use if not specified explicitly
|
|
num_legacy_lines=$( (iptables-legacy-save || true) 2>/dev/null | grep '^-' | wc -l)
|
|
num_nft_lines=$( (iptables-nft-save || true) 2>/dev/null | grep '^-' | wc -l)
|
|
if [ "${num_legacy_lines}" -ge 10 ]; then
|
|
mode="legacy"
|
|
else
|
|
if [ "${num_legacy_lines}" -ge "${num_nft_lines}" ]; then
|
|
mode="legacy"
|
|
else
|
|
mode="nft"
|
|
fi
|
|
fi
|
|
fi
|
|
printf "iptables backend mode: %s\n" "$mode"
|
|
if [ "$mode" = "nft" ]; then
|
|
[ -n "$WEAVE_DEBUG" ] && echo "Changing iptables symlinks..."
|
|
rm /sbin/iptables
|
|
rm /sbin/iptables-save
|
|
rm /sbin/iptables-restore
|
|
ln -s /sbin/iptables-nft /sbin/iptables
|
|
ln -s /sbin/iptables-nft-save /sbin/iptables-save
|
|
ln -s /sbin/iptables-nft-restore /sbin/iptables-restore
|
|
fi
|
|
}
|
|
|
|
setup_iptables_backend
|
|
|
|
# Default if not supplied - same as weave net default
|
|
IPALLOC_RANGE=${IPALLOC_RANGE:-10.32.0.0/12}
|
|
HTTP_ADDR=${WEAVE_HTTP_ADDR:-127.0.0.1:6784}
|
|
METRICS_ADDR=${WEAVE_METRICS_ADDR:-0.0.0.0:6782}
|
|
HOST_ROOT=${HOST_ROOT:-/host}
|
|
CONN_LIMIT=${CONN_LIMIT:-200}
|
|
DB_PREFIX=${DB_PREFIX:-/weavedb/weave-net}
|
|
|
|
# Check if the IP range overlaps anything existing on the host
|
|
/usr/bin/weaveutil netcheck $IPALLOC_RANGE weave
|
|
|
|
# Default for network policy
|
|
EXPECT_NPC=${EXPECT_NPC:-1}
|
|
|
|
STATUS_OPTS="--metrics-addr=$METRICS_ADDR"
|
|
# --status-addr exposes internal information, so only turn it on if asked to.
|
|
if [ -n "${WEAVE_STATUS_ADDR}" ]; then
|
|
STATUS_OPTS="$STATUS_OPTS --status-addr=$WEAVE_STATUS_ADDR"
|
|
fi
|
|
|
|
# Default is that npc will be running; allow caller to override
|
|
WEAVE_NPC_OPTS="--expect-npc"
|
|
if [ "${EXPECT_NPC}" = "0" ]; then
|
|
WEAVE_NPC_OPTS=""
|
|
fi
|
|
|
|
NO_MASQ_LOCAL_OPT="--no-masq-local"
|
|
if [ "${NO_MASQ_LOCAL}" = "0" ]; then
|
|
NO_MASQ_LOCAL_OPT=""
|
|
fi
|
|
|
|
# Kubernetes sets HOSTNAME to the host's hostname
|
|
# when running a pod in host namespace.
|
|
NICKNAME_ARG=""
|
|
if [ -n "$HOSTNAME" ] ; then
|
|
NICKNAME_ARG="--nickname=$HOSTNAME"
|
|
fi
|
|
|
|
router_bridge_opts() {
|
|
echo --datapath=datapath
|
|
[ -z "$WEAVE_MTU" ] || echo --mtu "$WEAVE_MTU"
|
|
[ -z "$WEAVE_NO_FASTDP" ] || echo --no-fastdp
|
|
}
|
|
|
|
if [ -z "$KUBE_PEERS" ]; then
|
|
if ! KUBE_PEERS=$(/home/weave/kube-utils); then
|
|
echo Failed to get peers >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
peer_count() {
|
|
echo $#
|
|
}
|
|
|
|
if [ -z "$IPALLOC_INIT" ]; then
|
|
IPALLOC_INIT="consensus=$(peer_count $KUBE_PEERS)"
|
|
fi
|
|
|
|
# Find out what peer name we will be using
|
|
PEERNAME=$(/home/weave/weaver $EXTRA_ARGS --print-peer-name --host-root=$HOST_ROOT --db-prefix="$DB_PREFIX")
|
|
if [ -z "$PEERNAME" ]; then
|
|
echo "Unable to get peer name" >&2
|
|
exit 2
|
|
fi
|
|
|
|
# If we have persisted data and peer reclaim is in use
|
|
if [ -f ${DB_PREFIX}data.db ]; then
|
|
if /usr/bin/weaveutil get-db-flag "$DB_PREFIX" peer-reclaim >/dev/null ; then
|
|
# If this peer name is not stored in the list then we were removed by another peer.
|
|
if /home/weave/kube-utils -check-peer-new -peer-name="$PEERNAME" -log-level=debug ; then
|
|
# In order to avoid a CRDT clash, clean up
|
|
echo "Peer not in list; removing persisted data" >&2
|
|
rm -f ${DB_PREFIX}data.db
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# flag that peer reclaim is now in use - note we have to do this before
|
|
# weaver is running as the DB can only be opened by one process at a time
|
|
/usr/bin/weaveutil set-db-flag "$DB_PREFIX" peer-reclaim ok
|
|
|
|
# couple more variables
|
|
WEAVE_KUBERNETES_VERSION=$(/home/weave/kube-utils -print-k8s-version)
|
|
WEAVE_KUBERNETES_UID=$(/home/weave/kube-utils -print-uid)
|
|
|
|
post_start_actions() {
|
|
# Wait for weave process to become responsive
|
|
while true ; do
|
|
curl $HTTP_ADDR/status >/dev/null 2>&1 && break
|
|
sleep 1
|
|
done
|
|
|
|
# Attempt to run the reclaim process, but don't halt the script if it fails
|
|
/home/weave/kube-utils -reclaim -node-name="$HOSTNAME" -peer-name="$PEERNAME" -log-level=debug || true
|
|
|
|
# Expose the weave network so host processes can communicate with pods
|
|
/home/weave/weave --local expose $WEAVE_EXPOSE_IP
|
|
|
|
# Mark network as up
|
|
/home/weave/kube-utils -set-node-status -node-name="$HOSTNAME"
|
|
|
|
/home/weave/kube-utils -run-reclaim-daemon -node-name="$HOSTNAME" -peer-name="$PEERNAME" -log-level=debug&
|
|
}
|
|
|
|
post_start_actions &
|
|
|
|
/home/weave/weaver $EXTRA_ARGS --port=6783 $(router_bridge_opts) \
|
|
--name="$PEERNAME" \
|
|
--http-addr=$HTTP_ADDR $STATUS_OPTS --docker-api='' --no-dns \
|
|
--db-prefix="$DB_PREFIX" \
|
|
--ipalloc-range=$IPALLOC_RANGE $NICKNAME_ARG \
|
|
--ipalloc-init $IPALLOC_INIT \
|
|
--conn-limit=$CONN_LIMIT \
|
|
$WEAVE_NPC_OPTS \
|
|
$NO_MASQ_LOCAL_OPT \
|
|
"$@" \
|
|
$KUBE_PEERS
|