Introdução: Por que implantar PHP no Kubernetes?
\n\nMuitos desenvolvedores ainda veem o PHP como uma linguagem para hospedagem "clássica" com FTP e phpMyAdmin. No entanto, na cultura DevOps moderna, as aplicações PHP estão cada vez mais sendo executadas em contêineres, e o gerenciamento delas fica a cargo do Kubernetes (K8s). Isso proporciona não apenas escalabilidade automática e tolerância a falhas, mas também uniformidade de ambiente em todas as etapas — do desenvolvimento à produção.
Neste guia, vamos abordar na prática como preparar um projeto PHP para implantação no Kubernetes: desde a criação da imagem Docker até a escrita de manifestos e execução no cluster. Você aprenderá como tornar o contêiner leve, como configurar corretamente o php-fpm e como conectar tudo ao Nginx. Vamos lá!
Passo 1: Preparação da aplicação PHP e da imagem Docker
\n\nAntes de enviar o código para o K8s, é necessário empacotá-lo em uma imagem Docker. Vamos considerar um projeto PHP típico em PHP puro (sem framework) — um script simples que exibe uma saudação e o phpinfo.
\n\n1.1. Estrutura do projeto
\n\nVamos criar uma estrutura mínima:
\n\nmy-php-app/\n├── src/\n│ └── index.php\n├── docker/\n│ ├── php.Dockerfile\n│ └── nginx.conf\n└── k8s/\n ├── deployment.yaml\n └── service.yaml\n\n\n1.2. Código da aplicação PHP
\n\nArquivo src/index.php:
<?php\necho "<h1>Olá, Kubernetes!</h1>";\necho "<p>Versão do PHP: " . phpversion() . "</p>";\necho "<p>Servidor: " . gethostname() . "</p>";\n?>\n\n\n1.3. Dockerfile para PHP-FPM
\n\nCriando docker/php.Dockerfile:
FROM php:8.2-fpm-alpine\n\n# Instala dependências (se necessário)\nRUN docker-php-ext-install pdo pdo_mysql\n\n# Copia o código da aplicação\nCOPY ./src /var/www/html\n\n# Permissões (importante para FPM)\nRUN chown -R www-data:www-data /var/www/html\n\nWORKDIR /var/www/html\n\nEXPOSE 9000\nCMD ["php-fpm"]\n\n\nPor que alpine? Ele fornece uma imagem de ~30 MB em vez de 200+ MB no Debian. Isso é crítico para carregamento rápido no cluster.
1.4. Configuração do Nginx
\n\nO PHP-FPM não consegue servir arquivos estáticos diretamente — é necessário um servidor web. Vamos criar docker/nginx.conf:
server {\n listen 80;\n server_name _;\n root /var/www/html;\n\n index index.php index.html;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_pass 127.0.0.1:9000;\n fastcgi_index index.php;\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n include fastcgi_params;\n }\n}\n\n\nNo Kubernetes, executaremos o Nginx e o PHP-FPM em um único Pod (como contêineres sidecar) ou como serviços separados. Para simplificar, usaremos um Pod com dois contêineres.
\n\nPasso 2: Criação e publicação das imagens
\n\nVamos criar a imagem PHP-FPM e a imagem Nginx com nossa configuração. Em um projeto real, você pode usar uma única imagem combinando Nginx e PHP com supervisord, mas faremos "corretamente" — separando.
Criação da imagem PHP:
\ndocker build -t my-php-app:latest -f docker/php.Dockerfile .\n\n\nCriação da imagem Nginx:
\nVamos criar um Dockerfile separado para o Nginx:
\nFROM nginx:alpine\nCOPY docker/nginx.conf /etc/nginx/conf.d/default.conf\nCOPY ./src /var/www/html\n\n\ndocker build -t my-nginx:latest -f docker/nginx.Dockerfile .\n\n\nEm seguida, envie as imagens para um registry (Docker Hub, GitLab Container Registry, etc.):
\ndocker tag my-php-app:latest seu-registry/my-php-app:latest\ndocker push seu-registry/my-php-app:latest\n\n\nPasso 3: Manifestos do Kubernetes
\n\nAgora a parte mais interessante — vamos descrever como o Kubernetes executará nossa aplicação.
\n\n