home

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 90e1700d7afc70e11fbe5791de1601a3bbf285e8
parent 6115b484e7551e1b0223f094b464f326b34ff1a6
Author: Vincent Demeester <vincent@sbr.pm>
Date:   Wed, 25 Nov 2020 17:14:51 +0100

tools: add bekind…

a tool to manage kind cluster on remote machines

Signed-off-by: Vincent Demeester <vincent@sbr.pm>

Diffstat:
Moverlays/sbr.nix | 1+
Mpkgs/default.nix | 1+
Atools/bekind/README.org | 9+++++++++
Atools/bekind/bekind | 155+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atools/bekind/default.nix | 13+++++++++++++
Atools/bekind/profiles/1n.yaml | 11+++++++++++
Atools/bekind/profiles/3n.yaml | 26++++++++++++++++++++++++++
Musers/vincent/containers/kubernetes.nix | 1+
8 files changed, 217 insertions(+), 0 deletions(-)

diff --git a/overlays/sbr.nix b/overlays/sbr.nix @@ -18,6 +18,7 @@ rec { vde-thinkpad = import ../pkgs/vde-thinkpad { inherit (self) stdenv lib; }; + bekind = super.callPackage ../tools/bekind { }; my = import ../pkgs { inherit (self) pkgs; diff --git a/pkgs/default.nix b/pkgs/default.nix @@ -37,6 +37,7 @@ rec { vrsync = pkgs.callPackage ./vrsync { }; vde-thinkpad = pkgs.callPackage ./vde-thinkpad { }; bus = pkgs.callPackage ../tools/bus { }; + bekind = pkgs.callPackage ../tools/bekind { }; # Mine ape = pkgs.callPackage ./ape { }; diff --git a/tools/bekind/README.org b/tools/bekind/README.org @@ -0,0 +1,9 @@ +# bekind + +=bekind= is my personnal command line to manage kind cluster in my developement +environment. Here is a list of features: + +- create a kind cluster on a remote machine (using =ssh=) +- create a kind cluster based on a /profile/ (1 node, 3 nodes, with ingress, …) +- list kind cluster on a given remote machine +- remove/re-create a kind cluster diff --git a/tools/bekind/bekind b/tools/bekind/bekind @@ -0,0 +1,155 @@ +#!/usr/bin/env bash +bekind=$(basename $0) +bekind_dir=$(dirname "$(readlink -f "$0")") +profile_dir="./profiles" + +bekind_help(){ + echo "Usage: $ProgName <subcommand> [options]\n" + echo "Subcommands:" + echo " clean clean all kind clusters" + echo " create create a kind cluster" + echo " delete delete a kind cluster" + echo " list list kind clusters" + echo "" + echo "For help with each subcommand run:" + echo "$ProgName <subcommand> -h|--help" + echo "" +} + +bekind_create(){ + profile="" + host="" + port="8443" + while [[ $# -gt 1 ]] + do + case $1 in + "--profile" | "-p") + shift + profile=$1 + shift + ;; + "--port") + shift + port=$1 + shift + ;; + "--host") + shift + host=$1 + shift + ;; + esac + done + name="$1" + shift + if [[ -z "${name}" ]]; then + name="kind" + fi + env="" + configfile="config.${name}" + if [[ -n "${host}" ]]; then + env="DOCKER_HOST=ssh://${host}" + configfile="${configfile}.${host}" + fi + args="" + if [[ -n "${profile}" ]]; then + if [[ -z "${host}" ]]; then + echo "Cannot use profile ${profile} without an host" 1>&2 + exit 1 + fi + # does the profile exists + profile_file="${profile_dir}/${profile}.yaml" + if [[ -f "${profile_file}" ]]; then + tmpfile=$(mktemp /tmp/bekind.XXXXXX) + hostip=$(getent hosts ${host} | awk '{ print $1 }') + sed "s/HOST/${hostip}/g" "${profile_file}" > ${tmpfile} + sed -i "s/PORT/${port}/g" ${tmpfile} + args="${args} --config ${tmpfile}" + else + echo "Profile ${profile} doesn't exists" 1>&2 + exit 1 + fi + # replace hosts in there + fi + echo "> Create the cluster (name: ${name}, args: ${args})" + env $env kind create cluster --name ${name} ${args} + echo "> Write the kubeconfig in ~/.kube/${configfile}" + env $env kind get kubeconfig --name ${name} > ~/.kube/${configfile} +} + +bekind_delete() { + while [[ $# -gt 1 ]] + do + case $1 in + "--host") + shift + host=$1 + shift + ;; + esac + done + name="$1" + shift + env="" + if [[ -z "${name}" ]]; then + name="kind" + fi + if [[ -n "${host}" ]]; then + env="DOCKER_HOST=ssh://${host}" + fi + echo "> Delete kind cluster ${name} from ${host}" + env $env kind delete cluster --name ${name} +} + +bekind_list() { + while [[ $# -gt 0 ]] + do + case $1 in + "--host") + shift + host=$1 + shift + ;; + esac + done + env="" + if [[ -n "$host" ]]; then + env="DOCKER_HOST=ssh://${host}" + fi + env $env kind get clusters +} + +bekind_clean() { + while [[ $# -gt 1 ]] + do + case $1 in + "--host") + shift + host=$1 + shift + ;; + esac + done + env="" + if [[ -n "$host" ]]; then + env="DOCKER_HOST=ssh://${host}" + fi + echo "> Clean kind clusters from ${host}" + env $env kind delete clusters --all +} + +subcommand=$1 +case $subcommand in + "" | "-h" | "--help") + bekind_help + ;; + *) + shift + bekind_${subcommand} $@ + if [ $? = 127 ]; then + echo "Error: '$subcommand' is not a known subcommand." >&2 + echo " Run '$ProgName --help' for a list of known subcommands." >&2 + exit 1 + fi + ;; +esac diff --git a/tools/bekind/default.nix b/tools/bekind/default.nix @@ -0,0 +1,13 @@ +{ stdenv }: + +stdenv.mkDerivation { + name = "bekind"; + src = ./.; + phases = [ "installPhase" "fixupPhase" ]; + installPhase = '' + mkdir -p $out $out/bin $out/share/bekind + sed "s%profile_dir=\"./profiles\"%profile_dir=$out/share/bekind/profiles%g" $src/bekind > $out/bin/bekind + chmod +x $out/bin/bekind + cp -r $src/profiles $out/share/bekind/ + ''; +} diff --git a/tools/bekind/profiles/1n.yaml b/tools/bekind/profiles/1n.yaml @@ -0,0 +1,11 @@ +kind: Cluster +apiVersion: kind.x-k8s.io/v1alpha4 +networking: + apiServerAddress: HOST + apiServerPort: PORT +containerdConfigPatches: +- |- + [plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:5000"] + endpoint = ["http://sakhalin.home:5000"] +nodes: +- role: control-plane diff --git a/tools/bekind/profiles/3n.yaml b/tools/bekind/profiles/3n.yaml @@ -0,0 +1,26 @@ +kind: Cluster +apiVersion: kind.x-k8s.io/v1alpha4 +networking: + apiServerAddress: HOST + apiServerPort: 8443 +containerdConfigPatches: +- |- + [plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:5000"] + endpoint = ["http://sakhalin.home:5000"] +nodes: +- role: control-plane + kubeadmConfigPatches: + - | + kind: InitConfiguration + nodeRegistration: + kubeletExtraArgs: + node-labels: "ingress-ready=true" + extraPortMappings: + - containerPort: 80 + hostPort: 80 + protocol: TCP + - containerPort: 443 + hostPort: 443 + protocol: TCP +- role: worker +- role: worker diff --git a/users/vincent/containers/kubernetes.nix b/users/vincent/containers/kubernetes.nix @@ -21,5 +21,6 @@ in my.kss # our own scripts knd + bekind ]; }