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