Instalación de kind y creación de un cluster de kubernetes
- Francisco Javier Huete
- Servicios
- March 9, 2025
Índice
Kind es una alternativa para instalar un cluster de Kubernetes que ejecuta sus diferentes nodos en contenedores docker.
Instalación de kind
En este caso, se trabaja en una máquina que ya tiene Docker y Go instalados.
❯ docker --version
Docker version 20.10.24+dfsg1, build 297e128
❯ go version
go version go1.19.8 linux/amd64
Con estas dependencias cumplidas, se puede usar instalar kind
usando go
.
❯ go install sigs.k8s.io/kind@v0.27.0
go: downloading sigs.k8s.io/kind v0.27.0
go: downloading github.com/spf13/pflag v1.0.5
go: downloading github.com/spf13/cobra v1.8.0
go: downloading github.com/pkg/errors v0.9.1
go: downloading al.essio.dev/pkg/shellescape v1.5.1
go: downloading github.com/mattn/go-isatty v0.0.20
go: downloading golang.org/x/sys v0.6.0
go: downloading github.com/pelletier/go-toml v1.9.5
go: downloading github.com/BurntSushi/toml v1.4.0
go: downloading github.com/evanphx/json-patch/v5 v5.6.0
go: downloading gopkg.in/yaml.v3 v3.0.1
go: downloading sigs.k8s.io/yaml v1.4.0
go: downloading github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2
Al instalar esta herramienta usando go install
es necesario exportar la variable de entorno de la ruta en la que esta herramienta instala los binarios.
export PATH=$PATH:$HOME/go/bin
Si se usa la orden kind create cluster
para crear un cluster, esta distribución de Kubernetes crea un cluster de un único nodo que funciona, a la vez, como controlador y como trabajador. Para crear distribuciones diferentes de Kubernetes hay que definirlas usando un fichero yaml. En este caso, por ejemplo, se crea un cluster con un nodo controlador y otros dos nodos trabajadores.
Además, para poder usar recursos de tipo ingress en el cluster es necesario que el nodo controlador cuente con una configuración específica como se explica en este tutorial.
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
protocol: TCP
- containerPort: 443
hostPort: 443
protocol: TCP
- role: worker
- role: worker
Ahora sí, a partir de esta configuración, se puede usar kind create
para crear el cluster definido en el fichero.
❯ kind create cluster --config=kind-cluster.yaml
Creating cluster "kind" ...
✓ Ensuring node image (kindest/node:v1.32.2) 🖼
✓ Preparing nodes 📦 📦 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
✓ Joining worker nodes 🚜
Set kubectl context to "kind-kind"
You can now use your cluster with:
kubectl cluster-info --context kind-kind
Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂
Tras la instalación, hay que indicar al cliente de línea de comandos de Kubernetes, en este caso kubectl
, que use el contexto de kind para controlar el cluster recién creado.
❯ kubectl cluster-info --context kind-kind
Kubernetes control plane is running at https://127.0.0.1:36771
CoreDNS is running at https://127.0.0.1:36771/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
Al instalar una nueva distribución de Kubernetes en una máquina en la que ya había otra instalada, se crea un nuevo contexto en el fichero de configuración del cliente kubectl
.
❯ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kind-kind kind-kind kind-kind
minikube minikube minikube default
Para cambiar el uso de kubectl
entre los diferentes contextos configurados se puede usar la opción use-context
de la herramienta.
kubectl config use-context minikube
kubectl config use-context kind-kind
Antes de comenzar a desplegar aplicaciones en el cluster, conviene instalar también el Ingress Controller. Para ello, kind ofrece en su web un despliegue para instalar este componente en el cluster. Este paso sólo se puede completar con éxito si se ha configurado el parámetro node-labels: "ingress-ready=true"
durante la creación del cluster como se muestra en el fichero yaml recogido anteriormente.
❯ kubectl apply -f https://kind.sigs.k8s.io/examples/ingress/deploy-ingress-nginx.yaml
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
serviceaccount/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
configmap/ingress-nginx-controller created
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
deployment.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
ingressclass.networking.k8s.io/nginx created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created
Despliegue de aplicaciones en kind
Para desplegar una aplicación en kind se sigue el mismo procedimiento que en cualquier otra distribución de Kubernetes. Por ejemplo, para desplegar la aplicación que se utiliza en este otro post, en primer lugar se crean los recursos de tipo configMap y secrets y después se aplican los ficheros de creación del resto de recursos.
kubectl create cm polls-datos --from-literal=bd_user=user_django \
--from-literal=bd_dbname=django \
--from-literal=bd_host=mariadb \
--from-literal=django_mail=mail@mail.org \
--from-literal=django_user=admin
kubectl create secret generic polls-passwords --from-literal=bd_password=password1234 \
--from-literal=bd_rootpassword=root1234 \
--from-literal=django_password=admin
kubectl apply -f .