Solucionado (ver solução)
Solucionado
(ver solução)
10
respostas

Sistema de noticia não esta carregando corretamente

Meu sistema de noticia não carrega corretamente, já refiz varias vezes as imagens docker mais continua com erro e quando clico no painel ele sempre redireciona para o localhost. Desde de já agradeço o retorno segue os arauivos yml

apiVersion: apps/v1
kind: Deployment
metadata: 
  name: aplicacao-sistema-deployment
spec:
  selector:
    matchLabels:
      name: aplicacao-sistema-pod
  template:
    metadata:
      labels:
        name: aplicacao-sistema-pod
    spec:
      containers:
        - name: container-aplicacao-sistema
          image: joaopauloyhwh/noticia-alura:v2
          ports:
            - containerPort: 80


apiVersion: apps/v1
kind: Deployment
metadata: 
  name: aplicacao-noticia-deployment
spec:
  selector:
    matchLabels:
      name: aplicacao-noticia-pod
  template:
    metadata:
      labels:
        name: aplicacao-noticia-pod
    spec:
      containers:
        - name: container-aplicacao
          image: joaopauloyhwh/noticia-alura:v1
          ports:
            - containerPort: 80

apiVersion: v1
kind: Service
metadata: 
  name: servico-aplicacao-sistema
spec:
  type: LoadBalancer
  ports:
    - name: http
      port: 80
  selector: 
    name: aplicacao-sistema-pod

apiVersion: v1
kind: Service
metadata: 
  name: servico-aplicacao-noticia
spec:
  type: LoadBalancer
  ports:
    - name: http
      port: 80
  selector: 
    name: aplicacao-noticia-pod

FROM jnlucas/image-phpmysql:latest

# Utilizado para portal de noticia
#COPY noticias /var/www/html

# Utilizado para sistema de noticia
COPY sistema /var/www/html




erro aplicacao sistema:
PDOException Object ( [message:protected] => SQLSTATE[HY000] [2002] Connection timed out [string:Exception:private] => [code:protected] => 2002 [file:protected] => /var/www/html/funcoes.php [line:protected] => 7 [trace:Exception:private] => Array ( [0] => Array ( [file] => /var/www/html/funcoes.php [line] => 7 [function] => __construct [class] => PDO [type] => -> [args] => Array ( [0] => mysql:host=192.168.0.101;dbname=empresa [1] => root [2] => q1w2e3r4 ) ) [1] => Array ( [file] => /var/www/html/index.php [line] => 6 [args] => Array ( [0] => /var/www/html/funcoes.php ) [function] => include ) ) [previous:Exception:private] => [errorInfo] => )
10 respostas

Olá João Paulo, tudo bem? Os seus arquivos do Kubernetes aparentemente estão corretos, então precisamos verificar o container do MySQL, mais especificamente o IP, para podermos adicionar no arquivo bancodedados.php que fica dentro da pasta "sistema" do projeto, para isso primeiro execute o comando:

docker ps

Para listar todos os containers em execução, logo em seguida execute esse outro comando:

docker inspect <id-do-container-do-mysql>

Informando no lugar do atributo "id-do-container-do-mysql" o número (ID) de identificação do container do MySQL que foi exibido pelo comando docker ps. Feito isso, você verá a seção "NetworkSettings" e dentro dela tem a seção "Networks", você verá a configuração "IPAddress" semelhante a essa:

"IPAddress": "172.18.0.2"

E esse é o IP do container do MySQL que você devemos colocar na variável $host no arquivo bancodedados.php.

Caso não funcione, tente com o IP padrão do docker que é "172.17.0.1".

Se essa solução não funcionar então podemos fazer uma alteração no arquivo docker-compose.yml que está na raiz do projeto e tem o seguinte conteúdo:

version: '3.7'
services:
  noticias_web:
    container_name: container-kube-noticias
    image: jnlucas/image-phpmysql:latest
    volumes:
      - ./noticias:/var/www/html

    working_dir: /var/www/html/
    ports:
      - "8588:80"

  sistema_web:
    container_name: container-kube
    image: jnlucas/image-phpmysql:latest
    volumes:
      - ./sistema:/var/www/html

    working_dir: /var/www/html/
    ports:
      - "8587:80"

E então colocarmos o serviço do MySQL também e ainda colocarmos na mesma rede da seguinte forma:

version: '3.3'
services:
  noticias_web:
    container_name: container-kube-noticias
    image: jnlucas/image-phpmysql:latest
    networks: 
      - production-network
    volumes:
      - ./noticias:/var/www/html

    working_dir: /var/www/html/
    ports:
      - "8588:80"

  sistema_web:
    container_name: container-kube
    image: jnlucas/image-phpmysql:latest
    networks: 
      - production-network
    volumes:
      - ./sistema:/var/www/html

    working_dir: /var/www/html/
    ports:
      - "8587:80"

  db:
    image: mysql:5.7
    networks: 
      - production-network
    container_name: banco_mysql
    volumes:
      - ./mysql:/home

    ports:
      - '3306:3306'
    environment:
      MYSQL_DATABASE: 'empresa'
      MYSQL_USER: 'root'
      MYSQL_PASSWORD: 'q1w2e3r4'
      MYSQL_ROOT_PASSWORD: 'q1w2e3r4'

networks:
    production-network:
        driver: bridge

Fala pra gente se funcionou uma dessas duas formas!

Uma duvida Janilson, estou me referindo ao Kubernetes e não a Docker. por isso achei estranho sua resposta. Favor esclarecer. e desde de já muito obrigado pelo retorno.

docker ps (Não existe nenhum container rodando)

É verdade João Paulo, eu me equivoquei, pensei que você estava fazendo o processo Deploy com Docker Compose, peço desculpas pelo engano. Mas vamos tentar resolver o problema! O que está acontecendo é que o sistema em PHP não está conseguindo conectar com o banco de dados MySQL:

Connection timed out

O problema pode ser nesse caso duas coisas: Primeiro pode ser que o container do MySQL não esteja em execução, então verifica isso executando o comando docker ps e veja se o container está executando na porta "3306", porque mesmo usando o Kubernetes, o banco de dados ainda será um só e será executado fora do minukube, em um container Docker, então o container do MySQL tem que está em execução.

Segundo, se o container já estiver em execução, o que pode está acontecendo é que o sistema não consegue acessar o MySQL (que está no container em execução), então você pode verifica qual é o IP fisico da sua máquina na sua rede local, se for no Windows você pode verificar com o comando ipconfig no terminal, no Linux você pode verificar com o comando ifconfig, e depois você coloca esse IP real da sua máquina no arquivo bancodedados.php na variável $host e depois realizar o build de uma nova imagem, você pode fazer o mesmo processo que o professor fez no vídeo, e apenas mudar a tag para v3.

Faça o procedimento abaixo apenas se a solução acima não tenha funcionado:

Verifique IP do container do MySQL, para podermos adicionar no arquivo bancodedados.php que fica dentro da pasta "sistema" do projeto, para isso primeiro execute o comando:

docker ps

Para listar todos os containers em execução, logo em seguida execute esse outro comando:

docker inspect <id-do-container-do-mysql>

Informando no lugar do atributo "id-do-container-do-mysql" o número (ID) de identificação do container do MySQL que foi exibido pelo comando docker ps. Feito isso, você verá a seção "NetworkSettings" e dentro dela tem a seção "Networks", você verá a configuração "IPAddress" semelhante a essa:

"IPAddress": "172.18.0.2"

E esse é o IP do container do MySQL que você devemos colocar na variável $host no arquivo bancodedados.php.

E fazer novamente o processo de build da imagem da pasta sistema, agora com a nova configuração de banco de dados e colocando outra tag, nesse caso a tag v4.

Estou com o mesmo problema e ainda não resolvi. Vou relatar o que estou tentando.

Criei os 2 pods de noticias e sistema e o acesso a elas é feito sem exibir nada na página, somente a barra menu superior e um fundo azul. Depois de ler este tópico reparei eu que não tinha mais o banco sql rodando em container, então criei um usando o comando "docker-compose up" no diretório com um arquivo "docker-compose.yaml" com o conteúdo abaixo:

version: '3.3'
services:
  db:
    image: mysql:5.7
    networks: 
      - production-network
    container_name: banco_mysql
    volumes:
      - ./mysql:/home

    ports:
      - '3306:3306'
    environment:
      MYSQL_DATABASE: 'empresa'
      #MYSQL_USER: 'root'
      MYSQL_PASSWORD: 'q1w2e3r4'
      MYSQL_ROOT_PASSWORD: 'q1w2e3r4'

networks:
    production-network:
        driver: bridge
Foi criado o container do banco_mysql usando o docker e fiz a configuração do banco rodando o script dentro do container conforme comandos abaixo:
root@0e649ac07481:/home# chmod +x import.sh 
root@0e649ac07481:/home# ls
docker-compose.yml  empresa_noticias.sql  empresa_usuario.sql  import.sh
root@0e649ac07481:/home# ./import.sh 
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql: [Warning] Using a password on the command line interface can be insecure.

As páginas continuam sendo exibidas somente com uma bara de menu em cima e o fundo azul (me aprece que sem acesso ao bd ou não sei o motivo). Entrei no POD de sistema e alterei o caminho para o banco de dados, colocando o IP da minha máquina (estou usando um linux ubuntu) no arquivo "bancodedados.php". Nada mudou, as páginas abrem conforme falei acima. Gostaria de uma ajuda no que posso verificar agora. Detalhe que se eu fizer telnet na porta 3306 dentro de qualquer POD para o ip da minha máquina ele conecta no banco. Então acredito que deveria funcionar a conexão dos PODs com o BD.

Muito brigado. Marcos.

Marcos, você poderia tentar excluir esse container que você criou e subir o container a partir da pasta mysql do projeto disponibilizado pelo professor onde o arquivo docker-compose.yml tem o seguinte conteúdo:

version: '3.7'
services:
  db:
    image: mysql:5.7
    container_name: banco_mysql
    volumes:
      - ./:/home

    ports:
      - '3306:3306'
    environment:
      MYSQL_DATABASE: 'empresa'
      MYSQL_USER: 'root'
      MYSQL_PASSWORD: 'q1w2e3r4'
      MYSQL_ROOT_PASSWORD: 'q1w2e3r4'

Como você pode notar não tem a parte de rede (networks), e nos PODs você pode tentar alterar o IP da variável $host para o IP da sua máquina física, e testar se a conexão funciona.

Se não funcionar com o IP da máquina, você pode tentar colocar o IP do Docker host que por padrão é "172.17.0.1".

Caso o erro ainda persista, você pode também tentar o IP do container como na solução que indiquei acima:

Verifique IP do container do MySQL, para podermos adicionar no arquivo bancodedados.php que fica dentro da pasta "sistema" do projeto, para isso primeiro execute o comando:

docker ps

Para listar todos os containers em execução, logo em seguida execute esse outro comando:

docker inspect <id-do-container-do-mysql>

Informando no lugar do atributo "id-do-container-do-mysql" o número (ID) de identificação do container do MySQL que foi exibido pelo comando docker ps. Feito isso, você verá a seção "NetworkSettings" e dentro dela tem a seção "Networks", você verá a configuração "IPAddress" semelhante a essa:

"IPAddress": "172.26.0.2"

E esse é o IP do container do MySQL que você devemos colocar na variável $host no arquivo bancodedados.php.

E fazer novamente o processo de build da imagem da pasta sistema, agora com a nova configuração de banco de dados e colocando outra tag, nesse caso a tag v4 (outra).

Fala pra gente o resultado desses testes Marcos!

Boa noite Jonilson, o meu funcionou com o container do mysql, realmente era isso que estava faltando, agora esta com um comportamento estranho quando vou adicionar as imagens:

Warning: imagepng(uploads/img1586642631.png): failed to open stream: Permission denied in /var/www/html/uploadClass.php on line 114

Boa noite Jonilson, o meu funcionou com o container do mysql, realmente era isso que estava faltando, agora esta com um comportamento estranho quando vou adicionar as imagens:

Warning: imagepng(uploads/img1586642631.png): failed to open stream: Permission denied in /var/www/html/uploadClass.php on line 114

OBS: uso MAC, já setei a permissão 777 no diretorio uploads dentro da pasta sistema como segue abaixo: total 568 -rw-r--r--@ 1 joaopaulo staff 1537 29 Out 16:25 Dockerfile -rw-r--r--@ 1 joaopaulo staff 2749 29 Out 16:25 arquivos.php -rw-r--r--@ 1 joaopaulo staff 96 11 Abr 19:57 bancodedados.php -rw-r--r--@ 1 joaopaulo staff 494 29 Out 16:25 docker-compose.yml -rw-r--r--@ 1 joaopaulo staff 233 29 Out 16:25 excluir.php -rw-r--r--@ 1 joaopaulo staff 1437 29 Out 16:25 funcoes.php -rw-r--r--@ 1 joaopaulo staff 2689 29 Out 16:25 index.php -rw-r--r--@ 1 joaopaulo staff 7563 29 Out 16:25 inserir_noticias.php -rw-r--r--@ 1 joaopaulo staff 130 29 Out 16:25 noticias.php -rw-r--r--@ 1 joaopaulo staff 205 29 Out 16:25 notificacao.sh -rw-r--r--@ 1 joaopaulo staff 73738 29 Out 16:25 php.ini -rw-r--r--@ 1 joaopaulo staff 73738 29 Out 16:25 php.ini-development -rw-r--r--@ 1 joaopaulo staff 73738 29 Out 16:25 php.ini-production -rw-r--r--@ 1 joaopaulo staff 77 29 Out 16:25 sair.php drwxr-xr-x@ 18 joaopaulo staff 576 29 Out 16:25 theme -rw-r--r--@ 1 joaopaulo staff 242 29 Out 16:25 upload.php -rw-r--r--@ 1 joaopaulo staff 4011 29 Out 16:25 uploadClass.php drwxrwxrwx@ 3 joaopaulo staff 96 29 Out 16:25 uploads yhwh:sistema joaopaulo$ pwd /Users/joaopaulo/alura/kubernetes-orquestracao-containers/sistema

Oi Jonilson, obrigado pela resposta.

Deletei meu antigo mysql e refiz usando o arquivo "docker-compose.yml" dentro da pasta mysql, Foi criado ok. Acessei ele e fiz a configuração para popular o BD. Ok.

Quando eu abro as páginas dos PODs, acho que elas acessam o mysql, usando o ip da minha máquina no arquivo "bancodedados.php" , pois a página abre só com uma barra menu em cima e um fundo azul, porém se eu clicar no link "alura noticias" no lado esquerdo da barra, abre uma página em branco com duas chaves "[ ]" , isso deve ser o BD vazio, não sei.

Se eu retirar o IP da minha máquina e colocar o ip do mysql (do comando docker inspect) não aparece as chaves , aparece "página não pode ser exibida" depois de um timeout.

Por fim se eu colocar o IP de gateway do mysql (do comando docker inspect) também aparece as chaves ao clicar no link da página.

Detalhe que eu estou alterando o bancodedados.php acessando o POD com o comando "kubectl exec -it bash". Não estou alterando nos arquivos locais depois copiando para uma imagem e depois buildando uma V4, farei isso só quando descobrir a causa.

Obrigado, Marcos.

Que legal que conseguiu resolver João Paulo. Esse outro problema acontece pela questão de permissão de para escrita de arquivos, e o grupo de usuário, então nesse caso você pode ir pelo terminal e colocar as permissões, se você estiver usando um sistema Linux, você pode fazer isso indo até a pasta do projeto e executando o seguinte comando:

sudo chmod -R 755 /uploads

Espero ter ajudado!

solução!

Boa noite Jonilson, não sei se percebeu mais já tinha feito varias vezes (como informado acima) essa tentativa que vc mencionou e não funcionou entrando na pasta do projeto em meu note. a solução foi:

1 - entrar no container dentro do pod do kubernetes com o comando

$ kubectl exec -it aplicacao-sistema-deployment-5887fc6694-h2hxz bash

obs: Quando entrar no container você já fica no diretório /var/www/html e é nesse diretório que se encontra o diretório ** uploads **

2 - Configurar a permissão do diretorio com o comando abaixo:

$ chmod -R 777 uploads/

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software