#Setting Up a Kind Cluster with Cilium and NGINX Ingress Controller

This guide will walk you through the process of deploying a Kubernetes (K8s) cluster using Kind (Kubernetes IN Docker), setting up the Cilium CNI (Container Network Interface), and deploying the NGINX Ingress Controller.

#Prerequisites

  • Kind: Make sure that Kind is installed on your local machine. Follow the Kind installation guide if necessary.
  • Helm: Make sure that Helm is installed. Follow the Helm installation guide if necessary.
  • Cilium: Make sure that Cilium system requirements are fullfiled. Follow the Cilium installation guide if necessary.

#Deploy Kind cluster

Create a Kind configuration file named kind-config.yaml with the following content:

# kind-config.yaml kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane kubeadmConfigPatches: - | kind: InitConfiguration nodeRegistration: kubeletExtraArgs: node-labels: "ingress-ready=true" extraPortMappings: - containerPort: 80 hostPort: 80 listenAddress: 127.0.0.1 protocol: TCP - containerPort: 443 hostPort: 443 listenAddress: 127.0.0.1 protocol: TCP - role: worker - role: worker - role: worker networking: disableDefaultCNI: true kubeProxyMode: none

This configuration sets up a Kind cluster with one control-plane node and three worker nodes. It also maps ports 80 and 443 from the host to the control-plane node, making the cluster ready for ingress traffic.

Deploy the cluster using Kind:

kind create cluster --config kind-config.yaml

Verify the cluster is running:

kubectl cluster-info

You should see output indicating that the Kubernetes control plane and CoreDNS are running.

Kubernetes control plane is running at https://127.0.0.1:43899 CoreDNS is running at https://127.0.0.1:43899/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

#Deploy Cilium

Create a Cilium configuration file named cilium-helm-values.yaml with the following content:

# cilium-helm-values.yaml kubeProxyReplacement: true k8sServiceHost: kind-control-plane k8sServicePort: 6443 hostServices: enabled: false externalIPs: enabled: true nodePort: enabled: true hostPort: enabled: true image: pullPolicy: IfNotPresent ipam: mode: kubernetes hubble: enabled: true relay: enabled: true ui: enabled: true ingress: enabled: true annotations: kubernetes.io/ingress.class: nginx hosts: - hubble-ui.127.0.0.1.nip.io

This configuration enables Cilium with kube-proxy replacement and various service options, including Hubble for network observability.

Install Cilium using Helm:

# Don't forget to use correct cluster context # Add the Cilium Helm repository helm repo add cilium https://helm.cilium.io/ # Deploy Cilium with the specified values helm upgrade --install --namespace kube-system --repo https://helm.cilium.io cilium cilium --values cilium-helm-values.yaml

Check the status of the Cilium pods to ensure they are running:

kubectl get pods -n kube-system

You should see the Cilium and Hubble components running without issues.

NAME READY STATUS RESTARTS AGE cilium-2ldns 1/1 Running 0 30h cilium-b877s 1/1 Running 0 30h cilium-mhs9c 1/1 Running 0 30h cilium-operator-7fc58985c4-m2kbv 1/1 Running 0 30h cilium-operator-7fc58985c4-mq5pc 1/1 Running 0 30h cilium-sqrdv 1/1 Running 0 30h coredns-7db6d8ff4d-ltcjq 1/1 Running 0 30h coredns-7db6d8ff4d-s6c6f 1/1 Running 0 30h etcd-kind-control-plane 1/1 Running 0 30h hubble-relay-6d88849768-2wcjn 1/1 Running 0 30h hubble-ui-59bb4cb67b-g79pz 2/2 Running 0 30h kube-apiserver-kind-control-plane 1/1 Running 0 30h kube-controller-manager-kind-control-plane 1/1 Running 0 30h kube-scheduler-kind-control-plane 1/1 Running 0 30h

#Deploy NGINX Ingress Controller

Deploy the NGINX Ingress Controller using the following command:

# Replace with the latest version from the official repository kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.1/deploy/static/provider/kind/deploy.yaml

Verify the NGINX Ingress Controller is running:

kubectl get pods -n ingress-nginx

You should see the NGINX Ingress Controller pod running.

NAME READY STATUS RESTARTS AGE ingress-nginx-admission-create-2p9jm 0/1 Completed 0 30h ingress-nginx-admission-patch-tmnrp 0/1 Completed 0 30h ingress-nginx-controller-d45d995d4-lqgr6 1/1 Running 0 30h