Kind == Mini Kubernetes Cluster
If you need to run a local (mini) Kubernetes cluster for some simple tests, you can try “Kind”. In seems to runs inside a single docker image (so you need docker on your machine).
See https://kind.sigs.k8s.io/docs/user/quick-start/ on how to install it.
Example installation (GoLang example):
# if you have GoLang installed, you can try it like this (see kind site for latest version to use):
go install sigs.k8s.io/kind@v0.11.1
Code language: Bash (bash)
If Kind was installed, you can use a simple cluster create command:
kind create cluster
Code language: Bash (bash)
Or create it like this (from Linux command line) if you need special settings -for example needed if you want to use kubectl debug
:
cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
kubeadmConfigPatches:
# enable EphemeralContainers feature gate
- |
kind: ClusterConfiguration
metadata:
name: config
apiServer:
extraArgs:
"feature-gates": "EphemeralContainers=true"
scheduler:
extraArgs:
"feature-gates": "EphemeralContainers=true"
controllerManager:
extraArgs:
"feature-gates": "EphemeralContainers=true"
- |
kind: InitConfiguration
metadata:
name: config
nodeRegistration:
kubeletExtraArgs:
"feature-gates": "EphemeralContainers=true"
- |
kind: KubeletConfiguration
featureGates:
EphemeralContainers: true
- |
kind: KubeProxyConfiguration
featureGates:
EphemeralContainers: true
EOF
Code language: Bash (bash)
After creation, your local .kube/config is updated to point to the created cluster.
To delete the cluster after use, execute:
kind delete cluster
Code language: Bash (bash)
If you have helm3 installed locally, you can for example install an ingress controller using this:
helm3 repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm3 repo update
helm3 install ingress-nginx ingress-nginx/ingress-nginx
Code language: Bash (bash)
And assuming you have kubectl installed, you can check upon the cluster:
kubectl get nodes
kubectl get pods --all-namespaces
Code language: Bash (bash)
And just for fun, if you want to connect to the network layer of the running ingress controller, you can use:
# start debug container, using network layer of the named pod
kubectl debug -it ingress-nginx-controller-54bfb9bb-tnvpk --image=ubuntu
# inside the ubuntu pod, type (to use curl on the ingress container):
apt-get update
apt-get install -y curl net-tools
curl -v http://127.0.0.1/test
# or in the ubuntu pod, type (to show/trace network traffic):
apt-get update
apt-get install -y tcpdump net-tools
# then find the network interface (probably is eth0:):
ifconfig
#start tcpdump (use your network interface in the spot of eth0 if it was different)
tcpdump -i eth0 -Al -s0 port 80
# then from another command line, start a test pod which executes a wget and exits:
kubectl run busybox -i --rm --image=busybox --restart=Never -- wget http://ingress-nginx-controller/test -O -
# This should show the wget request in the tcpdump output...
Code language: Bash (bash)
If you want to talk to ingress using your hosts web browser or command line, you can find the IP-address and port to use like this:
# find the ip address of the docker image which runs the full k8s cluster:
docker inspect kind-control-plane | grep IPAddress
# In my example it showed: "IPAddress": "172.18.0.2"
# Now find the port to use:
kubectl get svc ingress-nginx-controller
# In my case this did show: PORT(S) 80:32246/TCP,443:30823/TCP
# So the address to use from the host or command line: http://172.18.0.2:32246/
curl -v http://172.18.0.2:32246/
Code language: Bash (bash)
The above trick works for any kubernetes service which has a NodePort, or LoadBalancer service type. And if you need it for another service, just run a kubectl edit svc
on it to change the type to NodePort.
Another option to reach a pod/service inside your Kind cluster is to use port forwarding. Note: this seems to use another route than the normal one, and does NOT show up in the tcpdump if you were testing that example. But for normal tests, it works fine:
# send http://127.0.0.1:8123/ to the mentioned service, port 80:
kubectl port-forward service/ingress-nginx-controller 8123:80
Code language: Bash (bash)