Showing posts with label Containers. Show all posts
Showing posts with label Containers. Show all posts

Instalando un cluster de Kubernetes


Instalando laboratorio de Kubernetes




Convenciones de Instalación 

hostname: masterk8s
SO: Ubuntu 16.04.6
IP: 192.168.0.150/24

hostname: node1k8s
SO: Ubuntu 16.04.6
IP: 192.168.0.151/24

Edite en su archivo de host las direcciones de los equipos que van a pertenecer al cluster 

192.168.0.150    masterk8s
192.168.0.151    node1k8s
192.168.0.151    node2k8s

Instalacion de Docker Engine 

sudo apt-get update && sudo apt-get install && apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88


sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable" 
sudo apt-get update 
sudo apt-get install docker-ce docker-ce-cli containerd.io 
sudo usermod -aG docker $USER

 Si deseas instalarlo en un Linux Arch, puedes seguir los pasos descritos en mi anterior post 

Para funcionar de forma correcta con Kubeadm, es necesario modificar el daemon de Docker, para lo cual sigue el siguiente procedimiento: 
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF
mkdir -p /etc/systemd/system/docker.service.d


Reinicia docker para aplicar cambios 
systemctl daemon-reload && systemctl restart docker


Instalacion de Kubeadm 

sudo nano /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
Reinica y aplica los cambios sobre sysctl  
sysctl --system

Agrega los repositorios necesarios para kubeadm 
sudo apt-get update && sudo apt-get install -y apt-transport-https curl

 

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

 

cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
Instala los paquetes de kubeadm  
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl 
Sobre el master cree el archivo de configuracion del cual seran leidos los valores principales para los nodos del cluster, esta configuracion primordialmente ayuda en la seleccion de nombres para el cluster y evitar que los nodos del cluster se conozcan a traves de direcciones IP, para ello genere un archivo en formato config.yaml 

apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: 1.20.1
controlPlaneEndpoint: "masterk8s:6443"
networking:
    podSubnet: 172.30.0.0/16
 kubeadm init --config=config.yaml --upload-certs 

para instalar versiones posteriores realiza la migracion de las configuraciones con kubeadm config migrate --old-config config.yaml --new-config new.yaml 


root@kubernetes001:/home/testing# kubeadm init --config=new.yaml --upload-certs 

[init] Using Kubernetes version: v1.25.4

[preflight] Running pre-flight checks

error execution phase preflight: [preflight] Some fatal errors occurred:

[ERROR CRI]: container runtime is not running: output: E1202 03:01:05.511612    7395 remote_runtime.go:948] "Status from runtime service failed" err="rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"

time="2022-12-02T03:01:05Z" level=fatal msg="getting status of runtime: rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"

, error: exit status 1

[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`

To see the stack trace of this error execute with --v=5 or higher


Para resolver este error solo elimine el archivo de configuracion en todos los nodos del cluster y reinicie el servicio: 

root@kubernetes001:/home/testing# rm /etc/containerd/config.toml

root@kubernetes001:/home/testing# systemctl restart containerd


Posterior a esto ejecute nuevamente el script de instalacion 

root@kubernetes001:/home/testing# kubeadm init --config=new.yaml --upload-certs 


Al finalizar este proceso se puede visualizar en pantalla instrucciones acerca de como setear nuestra consola para que tome los comando

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf

 Adicionalmente se nos indica los pasos que debemos seguir para agregar nodos y maestros, para ello sobre el node01 ejecuta 
 kubeadm join masterk8s:6443 --token by80hn.dplbnomhkkkzqse4 \  --discovery-token-ca-cert-hash sha256:6014e89f272bea84ff2a04bd750785433cf6edfa62dbaf050cffaea847866878
Posterior a eso si revisamos los nodos que estan activos


Si luego de realializar la instalacion estan tratando de ver los contenedores ejecutandose en CRI-O y estan obteniendo este problema: 

root@master01:/home/testing/Kubernetes-files/Dashboard# crictl ps
WARN[0000] runtime connect using default endpoints: [unix:///var/run/dockershim.sock unix:///run/containerd/containerd.sock unix:///run/crio/crio.sock unix:///var/run/cri-dockerd.sock]. As the default settings are now deprecated, you should set the endpoint instead.
WARN[0000] image connect using default endpoints: [unix:///var/run/dockershim.sock unix:///run/containerd/containerd.sock unix:///run/crio/crio.sock unix:///var/run/cri-dockerd.sock]. As the default settings are now deprecated, you should set the endpoint instead.
E0131 21:47:33.674916   10631 remote_runtime.go:390] "ListContainers with filter from runtime service failed" err="rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing dial unix /var/run/dockershim.sock: connect: no such file or directory\"" filter="&ContainerFilter{Id:,State:&ContainerStateValue{State:CONTAINER_RUNNING,},PodSandboxId:,LabelSelector:map[string]string{},}"
FATA[0000] listing containers: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial unix /var/run/dockershim.sock: connect: no such file or directory"

Pueden solucionarlo con el siguiente comando:

crictl config runtime-endpoint unix:///var/run/cri-dockerd.sock
crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock




Clase V -- Volumenes y Datos en Docker

Los volúmenes son el método de almacenamiento de datos de los containers en Docker. Cada vez que damos un "$docker run" generamos un espacio en disco en el cual se deben almacenar los datos que va a utilizar el contenedor. Esta información es volátil pues cuando el ciclo de vida del container termina; se va con el la información de este almacenamiento.

Dada esta condición es necesario separar del proceso de ejecución aislado la información con la que esta trabajando nuestro contenedor. Es por ello que mostraremos a continuación dos de los métodos mas convencionales de trabajo con el plano de datos separado del contenedor.

Share: Se trata de una carpeta alojada en el sistema operativo principal. Es una forma común de trabajar con los datos de forma externa al contenedor. Genera la posibilidad de modificaciones externas al contenedor lo cual lo hace flexible para trabajar, pero lo hace susceptible a modificaciones no controladas. Para ello simplemente tenemos que indicarle a nuestro contenedor cual sera la carpeta en donde estará alojados los datos:



** Visualizar los volumenes existentes**

docker volume ls
 
Limpiar los volumes no utilizados por ningun contenedor

docker volume prune
 
Crear un volumen

docker volume create datodb
Montar el volumen

docker run -d --name mongoIII --mount src=datodb,dst=/data/db mongo
docker exec -it mongoIII bash
mongo
use deimer
db.users.insert({"name": "Deimer"})
    WriteResult({ "nInserted" : 1 })
db.users.find()
  { "_id" : ObjectId("5cb3a76edea9a4451f789d44"), "name" : "Deimer" }

docker rm -f mongoIII 

docker run -d --name mongoIV --mount src=datodb,dst=/data/db mongo
docker exec -it mongoIV bash
mongo
db.users.find()
use deimer
db.users.find()
 { "_id" : ObjectId("5cb50e83b510b6a7303ade1a"), "name" : "Deimer" }
Crear volumen con tamaño especifico en Docker
docker volume create --driver local \
    --opt type=tmpfs \
    --opt device=tmpfs \
    --opt o=size=100m,uid=1000 \
    nombredelvolumen





Clase III -- Networking en Docker



Docker incorpora en sus funciones de comunicación la posibilidad de crear networking interactivo. Entre las opciones destacadas podemos encontrar los siguientes tipos de interfaces:

Host: utiliza los recursos de las interfaces de red activas en el equipo. Puede verse representado como las funciones de NAT en una red.
Bridge: La red por defecto en Docker, se puede ver reflejada en nuestro equipo como docker0 al ejecutar en la linea de comandos #ifconfig o #ip addr
none: significa que el contenedor no incluye adaptador de red, por defecto solo tendria la interfaz de loopback lo.



A continuación se muestran los comandos necesarios para generar y acceder a redes en Docker:


  •     docker network create [red] -- Crea una red.
  •     docker network connect -- Conecta un contenedor de una red.
  •     docker network ls -- Lista redes existentes en un host de docker.
  •     docker network rm -- Elimina una red.
  •     docker network disconnect -- Permite desconectar un contenedor de una red.
  • docker network inspect -- Muestra información sobre las redes de Docker.
--net [nombre de la red] -- Especificar la red en la cual estará un contenedor conectado.
--link [nombre del contenedor] -- Enlaza un contenedor a una red y así acceder a ellos por medio de su nombre.


Iniciar el proceso de creación de una red nos da acceso a muchas opciones entre las cuales se encuentran la posibilidad de agregas parámetros específicos de funcionamiento de la red que estamos creando. De las mas utilizadas se encuentran:

    •  Driver: Existen múltiples drivers de funcionamiento 
      • bridge: El controlador de crea una red privada interna al host para que los contenedores en esta red puedan comunicarse. El acceso externo se concede exponiendo puertos a contenedores:



      • Overlay: Este controlador utiliza un plano de datos VXLAN estándar de la industria que desacopla la red del contenedor de la red física subyacente. Esto tiene la ventaja de proporcionar la máxima portabilidad a través de varias redes en la nube y locales(Este driver solo esta disponible en host que corran con Swarm Manager...proximamente incluire las imagenes) 
      •  MACVLAN: Este tipo de configuración se puede usar para extender múltiples VLAN L2 a través de la interfaz del host directamente a los contenedores:




[
    {
        "Name": "macvlan-networ",
        "Id": "58283e617b9f7b7e3c86142b3ab9ce64514ac61f2ef36dc4d75c2f82cbee0f07",
        "Created": "2018-03-12T10:31:38.590583455-05:00",
        "Scope": "local",
        "Driver": "macvlan",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.100.0/24",
                    "Gateway": "192.168.100.254"
                }
            ]
 

En una próxima actualización de este post incluiré el tag de vlans en macvlan y la utilización de overlay. Espero que esta información sea de ayuda para ustedes.

Gracias por leerme.


Clase II.i -- Iniciando un contenedor en Docker --Basico



Llegamos al punto de estas clases que estaba esperando, como iniciar los contenedores. Al igual que cualquier otra plataforma existen diferentes parámetros que pueden ser configurados para establecer un comportamiento en el despliegue. Hablaremos en este post de los conceptos iniciales de arranque de contenedores. 

Despliegue Basico: 

Nombre:   Cada contenedor puede tener un nombre especifico único que lo identifique en nuestro Host. Esto lo podemos definir añadiendo en la sentencia de ejecución “--name”. Un ejemplo de ello: 

Nombre Container -- Docker


Interactúa con el container: Para habilitar una shell en el container deben ser habilitados al momento de ejecutar el parametro “-it”; para ello desde la consola ejecuta: 




Ya estando en la consola del container puedes ejecutar los comandos correspondientes a la imagen que has descargado, para el caso particular voy a realizar una actualización del S.O. 





Expone puertos al publico: Uno de los elementos primordiales de la ejecución del un container es poder consultar desde fuera de la maquina en la que estamos ejecutando el container. Para ello:





Durante el proceso de instalación de Docker, se genera una interfaz virtual en modo Bridge contra las interfaces disponibles en el equipo, en mi caso tengo activa la eth0

Al intentar acceder a la dirección IP de mi PC podre acceder al servicio anteriormente instalado en nuestro contenedor de Debian.

Como mencionaba anteriormente, docker genera una interfaz en modo bridge, la cual tambien puede ser accedida desde la web directamente.

Este es un pequeño preambulo de nuestro proximo post, en donde veremos como funciona el Networking en Docker.

Espero que les haya servido y que nos acompañen proximamente en un nuevo post. 








Clase II -- Comandos basicos de Docker



 Continuamos la segunda sección de nuestras clases. Para consultar la primera parte de la instalación, diríjase a este enlace. 

Esta sección trata de los comandos básicos que nos servirán para la ejecución de labores administrativas comunes en Docker. 

Tenga en cuenta que Docker es una herramienta con muchos componentes que varían el ambiente de ejecución por lo cual debemos tener en cuenta uno de los primeros comandos(De los mas utilizados al inicio, durante y después de mucho tiempo trabajando con Docker). El comando del que les hablo es “help”:

➜  ~ docker help  // Ayuda general sobre los comandos administrativos de Docker 
➜  ~ docker stats --help // Ayuda especifica sobre la utilización de un comando. El ejemplo muestra la ayuda para la opción "stats"


Docker info: contiene información sumatoria sobre el sistema operativo y el estado de los containers e imagenes existentes en el host 


Verifique la versión de Docker

Docker version: contiene información precisa tanto del servidor de Docker como del cliente de conexión. Recuerde que con el cliente de Docker usted puede acceder a diferentes host que corran el servicio de Docker y de esta forma realizar la administración remota de los containers que se ejecuten en diferentes host. 








¿Como consigo imagenes para mis proyectos?

Existe un amplio concentrador de imágenes de Docker que nos permiten agilizar el proceso de implementación de servicios. Con el comando #docker search podemos encontrar las imágenes de acuerdo a nuestras necesidades:

Para el ejemplo vamos a buscar una imagen de Debian, al buscar en el hub de Docker, vemos que la primera imagen en niveles de popularidad nues muestra a Ubuntu la cual es una distribución basada en Debian como la primera opción, posterior a esto muestra a Debian, nos indica que es la imagen oficial mantenida por la casa desarrolladora:





  Ejecutando nuestro primer container en Docker:

Desde la consola ejecute #docker run -it debian(En una entrega posterior se entrarán en detalles de ejecución de contenedores), tendran un cuadro similar a este:  



Al terminar el proceso de creación del contenedor veremos el cambio que hay en nuestra consola, al mostrarnos que nos encontramos como root@b57b32df8d94


Verificando la ejecución de contenedores en Docker: 

 Otro comando de uso regular es el de verificación de container en ejecución 






Estoy muy agradecido por visitar mi blog, en la próxima entrega estaré mostrando las funciones de ejecución de un container con mas detalles.  

Docker -- Iniciando en los Containers





Bienvenido a los Containers






Hace un par de días tome la decisión de compartir contenido en la web, con el objetivo de hacer mas sencillo el proceso para quienes quieren aprender el funcionamiento en tecnologías de la información y la comunicación. 

Esta iniciativa me hizo considerar el hecho de mostrar en español como avanzar en la tecnología de containers y una de las tecnologías emergentes mas aplicadas en la automatización escalado de servicios como lo es Docker. Para ello esta pequeña introducción en los Containers con Docker. El objetivo sera publicar estas etapas a través de este blog:

Clase III -- Networking en Docker
Clase IV -- Mi primer Dockerfile
Clase V -- Volumenes en Docker 
Clase VI -- Administración grafica de Docker
Clase VII -- Laboratorio Docker
Clase VIII -- Docker con Ansible



Espero puedan disfrutar tanto como yo esta tecnología. Si por algún motivo consideran que existe alguna incongruencia en la información hacérmelo saber a través de los comentarios 

Clase I -- Instalación de Docker en Linux




Bienvenido a los Containers


Esta es la guía de instalación de Docker, esta serie esta dirigida al entendimiento y el trabajo con "Contenedores". Si deseas tener un poco de información acerca de que es Docker y como funciona, lo podras hacer visitando la pagina https://www.redhat.com/en/topics/containers/what-is-docker o https://www.docker.com/what-container

Esta serie será elaborada en el siguiente ambiente de pruebas:

OS: Manjaro 17.1.4 Hakoila
Shell: zsh 5.4.2
DE: Budgie
CPU: Intel Core i5-7200U @ 4x 3.1GHz
GPU: Mesa DRI Intel(R) HD Graphics 620 (Kaby Lake GT2)
RAM:24 Gb

Recomiendo para usuarios que trabajen en ambientes Windows y Mac OSX trabajar desde una maquina virtual con Ubuntu o su distribución de preferencia, en este tutorial nos concentraremos en un ambiente de escritorio Linux Arch. Para detalles específicos de la distribución que utiliza, visite la pagina https://docs.docker.com/install/

Desde la consola de su sistema operativo ejecute los siguientes comandos:

Habilitamos el inicio automático de la aplicación y su ejecución con permisos de administrador:

➜  ~ sudo systemctl start docker 
➜  ~ sudo systemctl enable docker
➜  ~ sudo groupadd docker         
➜  ~ sudo usermod -aG docker $USER

En este punto ya nos encontramos listos para nuestro primer ¡Hola Mundo!


¡Felicitaciones!!!..Ya has corrido el primer contenedor en Docker. 

La correcta ejecución de este comando nos muestra que nuestra instalación de docker es correcta.