#!/bin/bash set -o errexit create() { set +e kind get clusters | grep "${NAME}" exitCode=$? set -e if [ $exitCode -eq "0" ]; then echo "kind cluster already exists" kubectl config use-context "kind-${NAME}" exit 0 fi # create registry container unless it already exists reg_name='kind-registry' reg_port='5000' running="$(docker inspect -f '{{.State.Running}}' "${reg_name}" 2>/dev/null || true)" if [ "${running}" != 'true' ]; then docker run \ -d --restart=always -p "127.0.0.1:${reg_port}:5000" --name "${reg_name}" \ registry:2 fi # create a cluster with the local registry enabled in containerd cat <<EOF | kind create cluster --wait 2m0s --name ${NAME} --config=- kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 containerdConfigPatches: - |- [plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:${reg_port}"] endpoint = ["http://${reg_name}:${reg_port}"] EOF # connect the registry to the cluster network # (the network may already be connected) docker network connect "kind" "${reg_name}" || true # Document the local registry # https://github.com/kubernetes/enhancements/tree/master/keps/sig-cluster-lifecycle/generic/1755-communicating-a-local-registry cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ConfigMap metadata: name: local-registry-hosting namespace: kube-public data: localRegistryHosting.v1: | host: "localhost:${reg_port}" help: "https://kind.sigs.k8s.io/docs/user/local-registry/" EOF } delete() { kind delete cluster --name "${NAME}" } usage() { echo "Usage: $0 [-h help] [-a <delete|[create]>] [-n <kind-test>]" 1>&2; exit 1; } NAME="kind-test" ACTION="create" while getopts ":a:n:h" o; do case "${o}" in a) ACTION="${OPTARG}" ;; n) NAME="${OPTARG}" ;; h) usage exit 0 ;; *) echo "Invalid flag ${OPTARG};" usage exit 1 esac done shift $((OPTIND-1)) if [[ "${ACTION}" == "create" ]]; then create elif [[ "${ACTION}" == "delete" ]]; then delete fi