Instalación de kind y creación de un cluster de kubernetes

Í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 .
comments powered by Disqus

Relacionados

Configuración de un proxy inverso en Apache2

A través de un caso práctica se muestran diferentes ejemplos de configuración de un proxy inverso usando Apache2.

Leer

Guía básica de configuración de Nginx

En este post se recoge una guía básica del uso del servidor web Nginx a partir de un supuesto práctico.

Leer

Instalación de WordPress en Rocky Linux 9

En este post se instala WordPress en un equipo con Rocky Linux 9 en el que se ha instalado el servidor web de Apache httpd y que se conecta a una base de datos instalada en otro servidor basado en Ubuntu 22.04.

Leer