Been dealing with a 502 Bad Gateway error on my Laravel Minikube setup. I started using one web deployment using PHP FPM and Nginx, with a custom image for Laravel / FPM.
I initially thought there were perhaps memory issues or timeout issues, but I soon found out I needed to change the two services to one and tweak the PHP Container setup.
When I check the Nginx container logs inside the web deployment I got:
kubectl logs web-699566497c-rpp2z nginx /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 10-listen-on-ipv6-by-default.sh: error: /etc/nginx/conf.d/default.conf is not a file or does not exist /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh /docker-entrypoint.sh: Configuration complete; ready for start up 2021/01/11 01:22:24 [error] 20#20: *1 connect() failed (110: Connection timed out) while connecting to upstream, client: 172.17.0.3, server: smart48k8.local, request: "HEAD / HTTP/1.1", upstream: "fastcgi://10.110.166.216:9000", host: "smart48k8.local" 172.17.0.3 - - [11/Jan/2021:01:22:24 +0000] "HEAD / HTTP/1.1" 502 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36" "192.168.64.1"
I had nothing in Laravel logs and no useful Ingress Nginx logs either.
I did change the timeout for Nginx fastcgi
# let Nginx wait for 600s on its backend. fastcgi_read_timeout 600s;
(solid tips by Ma.ttias.be) but still got no good feedback. Then I did some more digging. I changed from a separate deployment for Nginx and PHP FPM to one deployment for both called web.
In the end I realized I needed and a single service called web-service to point to port 80
apiVersion: v1 kind: Service metadata: name: web-service namespace: smt-local labels: tier: backend spec: selector: app: web tier: backend ports: - protocol: TCP port: 80
and I needed the PHP container to listen to port 80 as well:
- name: php envFrom: - configMapRef: name: laravel-config image: smart48/smt-laravel:2.1.2 imagePullPolicy: IfNotPresent ports: # https://stackoverflow.com/questions/52132193/kubernetes-nginx-php-deployment - containerPort: 80 resources: requests: cpu: 250m limits: cpu: 500m volumeMounts: - name: code-storage mountPath: /code
But I also needed to adjust the
fastcgi_pass: in the
# fastcgi_pass php-service:9000; # https://stackoverflow.com/questions/52132193/kubernetes-nginx-php-deployment fastcgi_pass 127.0.0.1:9000;
As I was no longer using a separate pod for PHP I needed to use the local loopback address.
Once I had adjusted all that I deleted the web deployment and added it anew
kubectl delete deployments.apps web kubectl apply -f deployments/web.yml
As soon as that was taken care of I started seeing familiar Laravel app errors again and could continue with one deployment for PHP FPM and Nginx and therefore do all the replicating / autoscaling with way more ease.