Como criar um ambiente de desenvolvimento com Minikube

Se você está buscando uma forma prática e eficiente de criar um ambiente de desenvolvimento, o Minikube com VirtualBox pode ser a solução ideal. Este guia detalha como configurar um ambiente completo utilizando Minikube, uma ferramenta que facilita a execução do Kubernetes localmente, e VirtualBox, um software de virtualização gratuito.

Com este guia, você poderá criar pods, configurar acesso via ingress e até mesmo integrar um banco de dados MariaDB. Vamos explorar os pré-requisitos, o processo de instalação e as etapas para criar e gerenciar seu ambiente de desenvolvimento de forma descomplicada.

Pré-requisitos

Para começar, é essencial ter algumas ferramentas instaladas no seu sistema. Este guia foi elaborado utilizando o Windows 10 como ambiente base, mas os conceitos podem ser adaptados para outros sistemas operacionais.

  • Minikube: Utilize o VirtualBox como driver para o Minikube.
  • VirtualBox: Software de virtualização.
  • Git: Ferramenta de controle de versão.
  • Skaffold: Para facilitar a implantação de aplicações no Kubernetes.
  • Kubernetes: Ferramenta de orquestração de contêineres.

Para facilitar a instalação, você pode utilizar gerenciadores de pacotes como choco ou scoop, caso os tenha instalados.

Verificando as instalações

Após a instalação das ferramentas, é importante verificar se o Minikube está acessível através do PowerShell. Abra o PowerShell e execute o seguinte comando:

minikube version

O resultado deve exibir a versão do Minikube instalada. Por exemplo:

minikube version: v1.35.0
commit: dd5d320e41b5451cdf3c01891bc4e13d189586ed-dirty

Da mesma forma, verifique a versão do Git:

git -v
git version 2.47.1.windows.2

Agora, crie um projeto de teste para este guia. No PowerShell, execute os seguintes comandos:

cd Documents
mkdir projects
cd projects
mkdir test-project
cd test-project

Iniciando o Minikube (Minikube cluster)

Antes de prosseguir, é fundamental entender alguns termos importantes no contexto do Kubernetes.

Terminologia

O que são Contêineres?

Contêineres são ambientes de execução isolados e leves que empacotam um aplicativo e suas dependências. Eles garantem consistência em diferentes ambientes de computação.

O que são Pods?

Um Pod é a menor unidade implantável no Kubernetes, funcionando como um wrapper para um ou mais contêineres.

O que é um Cluster?

Um Cluster é o componente de mais alto nível no Kubernetes, consistindo em múltiplos nós de trabalho que executam Pods.

Iniciando um minikube cluster

Para iniciar o cluster Minikube, execute o seguinte comando:

minikube start --driver=virtualbox

Se você estivesse utilizando o driver docker, poderia usar opções de montagem como:

minikube start --mount --mount-string="$HOME:/src" --driver=docker

Essa opção não está disponível com o driver VirtualBox, mas o VirtualBox é uma alternativa gratuita ao Docker Desktop.

Agora, instale o kubectl através do Minikube:

minikube kubectl -- version

Após a instalação, a versão do Kubernetes será exibida:

minikube kubectl -- version
Client Version: v1.32.0
Kustomize Version: v5.5.0
Server Version: v1.32.0

Criando pods

Vamos criar um ambiente com PHP, Nginx e MariaDB. Primeiro, habilite o ingress:

minikube addons enable ingress

Salve o seguinte conteúdo como php-mariadb.yaml. Este arquivo contém a definição dos contêineres nos pods. Certifique-se de usar “LF” para as quebras de linha, e não “CRLF”:

# MariaDB Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  # Deployment name
  name: mariadb
  # Labels for identifying the deployment
  labels:
    app: mariadb
spec:
  # Number of MariaDB instances
  replicas: 1
  selector:
    # Matching labels for pods
    matchLabels:
      app: mariadb
  template:
    metadata:
      labels:
        app: mariadb
    spec:
      containers:
        - name: mariadb
          # Docker image for MariaDB
          image: mariadb:11.3
          # Port on which MariaDB runs
          ports:
            - containerPort: 3306
          # Environment variables for MariaDB
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: "rootpassword"
            - name: MYSQL_DATABASE
              value: "mydatabase"
            - name: MYSQL_USER
              value: "myuser"
            - name: MYSQL_PASSWORD
              value: "mypassword"
          # Volume mounting for MariaDB data storage
          volumeMounts:
            - name: mariadb-storage
              mountPath: /var/lib/mysql
      # Definition of volumes
      volumes:
        - name: mariadb-storage
          emptyDir: {}
---
# MariaDB Service
apiVersion: v1
kind: Service
metadata:
  # Service name for MariaDB
  name: mariadb
spec:
  ports:
    - port: 3306
  selector:
    # Selector for connecting to MariaDB pods
    app: mariadb
---
# PHP Application Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  # Deployment name
  name: php-app
  # Labels for identifying the PHP deployment
  labels:
    app: php-app
spec:
  # Number of PHP application instances
  replicas: 1
  selector:
    matchLabels:
      app: php-app
  template:
    metadata:
      labels:
        app: php-app
    spec:
      containers:
        - name: php-app
          # Docker image for PHP application
          image: php:8.3-apache
          # Port on which PHP Apache runs
          ports:
            - containerPort: 80
          # Volume mounting for PHP application code from host machine
          volumeMounts:
            - name: php-app-code
              mountPath: /var/www/html
            - name: apache-config
              mountPath: /etc/apache2/sites-enabled/000-default.conf
              subPath: default
      # Definition of volumes
      volumes:
        - name: php-app-code
          hostPath:
            path: "/mnt/project"
            type: Directory
        - name: apache-config
          configMap:
            name: apache-config
---
# ConfigMap for Apache Configuration
apiVersion: v1
kind: ConfigMap
metadata:
  name: apache-config
data:
  default: |
    <VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        <Directory "/var/www/html">
            Options Indexes FollowSymLinks
            AllowOverride All
            Require all granted
            DirectoryIndex index.html index.php
        </Directory>
        ErrorLog /var/log/apache2/error.log
        CustomLog /var/log/apache2/access.log combined
    </VirtualHost>
---
# PHP Application Service
apiVersion: v1
kind: Service
metadata:
  # Service name for PHP application
  name: php-app-service
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: 80
  selector:
    # Selector for connecting to PHP pods
    app: php-app
---
# Ingress resource for PHP Application
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: php-app-ingress
spec:
  ingressClassName: nginx
  rules:
    - host: localhost
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: php-app-service
                port:
                  number: 80

Salve o seguinte como skaffold.yaml:

apiVersion: skaffold/v4beta12
kind: Config
metadata:
  name: php-mariadb-app
deploy:
  kubectl: {}
manifests:
  rawYaml:
    - php-mariadb.yaml

Crie um diretório de montagem:

mkdir mounttest
minikube mount "$Home\\Documents\\projects\\test-project\\mounttest:/mnt/project"

Este comando de montagem continuará em execução. Para os comandos subsequentes, abra um novo terminal e execute os comandos nele.

Execute o seguinte comando (certifique-se de estar no diretório test-project):

cd {o diretório test-project}
skaffold delete
skaffold run --force

Este comando também continuará em execução. Para os comandos seguintes, abra um novo terminal e execute-os nele.

Aguarde a criação do seu ambiente Kubernetes no cluster Minikube. Isso pode levar algum tempo.

Para mais exemplos de skaffold, consulte: exemplos de skaffold.

Para os parâmetros disponíveis, consulte: parâmetros disponíveis.

Verifique se o PHP e o MariaDB estão em execução com o comando kubectl get pods:

kubectl get pods
NAME                      READY   STATUS    RESTARTS   AGE
mariadb-998f96ddb-84kqs   1/1     Running   0          64s
php-app-bf6f77579-454jl   1/1     Running   0          64s

Se ambos estiverem com “Ready 1/1”, seu ambiente está funcionando corretamente.

Estes são os pods:

mariadb-998f96ddb-84kqs (pod)
php-app-bf6f77579-454jl (pod)

Os contêineres definidos pelo arquivo yaml estão dentro dos pods. Um pod pode ter múltiplos contêineres dentro dele.

Às vezes, definimos um contêiner de logger e o colocamos no pod junto com um contêiner PHP. Tais contêineres são chamados de “contêineres sidecar“.

Se algum dos pods não estiver pronto, verifique o pod:

kubectl describe pod php-app-bf6f77579-454jl

Ou verifique a saída padrão:

kubectl logs php-app-bf6f77579-454jl

Para ver informações do cluster:

kubectl get events --sort-by='.metadata.creationTimestamp'

Após a criação, para acessar o ambiente Minikube a partir do host, execute:

minikube tunnel

Este comando continuará em execução. Para os comandos subsequentes, abra um novo terminal e execute os comandos nele.

Montando /var/www/html no PC host e acessando o arquivo através do ingress

Verifique se você pode acessar o ingress. Execute o seguinte comando e obtenha as informações do ingress:

kubectl get ingress
NAME              CLASS    HOSTS       ADDRESS          PORTS   AGE
php-app-ingress           localhost   192.168.59.100   80      103s

Seguindo essas informações, se você acessar 192.168.59.100 do seu navegador, verá um erro 404.

Se você vir o erro 404, está pronto para prosseguir.

Verifique o IP do ingress com:

kubectl get ingress
NAME              CLASS   HOSTS       ADDRESS          PORTS   AGE
php-app-ingress   nginx   localhost   192.168.59.100   80      93s

Meu IP é 192.168.59.100, então atualize a configuração do ingress no php-mariadb.yaml:

# Ingress resource for PHP Application
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: php-app-ingress
spec:
  ingressClassName: nginx
  rules:
    - host: 192.168.59.100.nip.io #!!! Change here !!!!
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: php-app-service
                port:
                  number: 80

Montamos nosso “mounttest” em “/mnt/project” (do Minikube) e este “/mnt/project” é montado novamente em “/var/www/html” do php-appache pod. Crie um arquivo index.php:

<?php
echo "Hello World!";

Salve-o na pasta mounttest do seu projeto.

Abra http://192.168.59.100.nip.io/ no seu navegador. Você deverá ver Hello World! Se você alterar o código PHP, a mudança será refletida em tempo real (caso contrário, desative o opcache no seu php.ini). Seu código PHP está funcionando em um cluster K8s!

Agora você pode editar seu PHP na pasta mounttest e a edição será refletida no php pod no cluster Kubernetes em tempo real. Se precisar, você pode até configurar o php debug para seu desenvolvimento. No entanto, se você estiver trabalhando com Minikube e Kubernetes localmente, não se esqueça de desativar o opcache no seu php.ini:

opcache.enable=0
opcache.validate_timestamps=1
opcache.revalidate_freq=0

Utilizando MariaDB a partir do PC host

Altere o serviço do MariaDB:

# MariaDB Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  # Deployment name
  name: mariadb
  # Labels for identifying the deployment
  labels:
    app: mariadb
spec:
  # Number of MariaDB instances
  replicas: 1
  selector:
    # Matching labels for pods
    matchLabels:
      app: mariadb
  template:
    metadata:
      labels:
        app: mariadb
    spec:
      containers:
        - name: mariadb
          # Docker image for MariaDB
          image: mariadb:11.3
          # Port on which MariaDB runs
          ports:
            - containerPort: 3306
          # Environment variables for MariaDB
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: "rootpassword"
            - name: MYSQL_DATABASE
              value: "mydatabase"
            - name: MYSQL_USER
              value: "myuser"
            - name: MYSQL_PASSWORD
              value: "mypassword"
          # Volume mounting for MariaDB data storage
          volumeMounts:
            - name: mariadb-storage
              mountPath: /var/lib/mysql
      # Definition of volumes
      volumes:
        - name: mariadb-storage
          emptyDir: {}
---
kind: Service
apiVersion: v1
metadata:
  name: mariadb
spec:
  type: NodePort
  selector:
    app: mariadb
  ports:
    - port: 3306
      targetPort: 3306
      protocol: TCP
      nodePort: 30036   # for example (must be within the allowed range, e.g., 30000-32767)
---
# PHP Application Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  # Deployment name
  name: php-app
  # Labels for identifying the PHP deployment
  labels:
    app: php-app
spec:
  # Number of PHP application instances
  replicas: 1
  selector:
    matchLabels:
      app: php-app
  template:
    metadata:
      labels:
        app: php-app
    spec:
      containers:
        - name: php-app
          # Docker image for PHP application
          image: php:8.3-apache
          # Port on which PHP Apache runs
          ports:
            - containerPort: 80
          # Volume mounting for PHP application code from host machine
          volumeMounts:
            - name: php-app-code
              mountPath: /var/www/html
            - name: apache-config
              mountPath: /etc/apache2/sites-enabled/000-default.conf
              subPath: default
      # Definition of volumes
      volumes:
        - name: php-app-code
          hostPath:
            path: "/mnt/project"
            type: Directory
        - name: apache-config
          configMap:
            name: apache-config
---
# ConfigMap for Apache Configuration
apiVersion: v1
kind: ConfigMap
metadata:
  name: apache-config
data:
  default: |
    <VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        <Directory "/var/www/html">
            Options Indexes FollowSymLinks
            AllowOverride All
            Require all granted
            DirectoryIndex index.html index.php
        </Directory>
        ErrorLog /var/log/apache2/error.log
        CustomLog /var/log/apache2/access.log combined
    </VirtualHost>
---
# PHP Application Service
apiVersion: v1
kind: Service
metadata:
  # Service name for PHP application
  name: php-app-service
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: 80
  selector:
    # Selector for connecting to PHP pods
    app: php-app
---
# Ingress resource for PHP Application
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: php-app-ingress
spec:
  ingressClassName: nginx
  rules:
    - host: 192.168.59.100.nip.io #!!! Change here !!!!
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: php-app-service
                port:
                  number: 80

O serviço MariaDB agora está utilizando NodePort.

Pare o skaffold run no terminal onde você executou o comando (com ctrl+c), e inicie novamente com:

cd {o diretório test-project}
skaffold delete
skaffold run --force

Verifique o IP do Minikube com:

minikube ip

Isso fornecerá o endereço IP do Minikube. Você pode usar este IP e o NodePort para acessar o MariaDB.

Para mim, o endereço IP era 192.168.59.100. O NodePort está definido como 30036 no arquivo yaml.

Portanto, usando 192.168.59.100:30036, você pode acessar o MariaDB. O ambiente do MariaDB está configurado da seguinte forma:

- name: MYSQL_ROOT_PASSWORD
  value: "rootpassword"
- name: MYSQL_DATABASE
  value: "mydatabase"
- name: MYSQL_USER
  value: "myuser"
- name: MYSQL_PASSWORD
  value: "mypassword"

Com este guia, você estará pronto para configurar um ambiente de desenvolvimento robusto e eficiente, utilizando o poder do Kubernetes com a praticidade do Minikube com VirtualBox.

Primeira: Este conteúdo foi auxiliado por Inteligência Artificiado, mas escrito e revisado por um humano.

Segunda: Via dev.to

Leave a Comment

Exit mobile version