What do I need to do in order to get my local browser to and request a resource to a web service running inside Minikube instance running locally on my machine?
I am getting a
Connection refused when trying to
My workflow is:
- Creating Dockerfile with web service on
- Start minikube in docker
- Build docker image
- Import image locally into Minikube
- Created a deployment with one container and a NodePort service
- Applied deployment/service
- Ran kubectl port-forward (to hopefully forward requests to my container)
- Open browser to 127.0.0.1:31000
Port Configuration Summary
- Expose: 80
- uvicorn: 80
- NodePort Service:
- Port: 80
- Target Port: 80
- Node Port: 31000
- NodePort Service:
- Kubectl Command: 8500:31000
- Browser: 127.0.0.1:8500
Setup and run through
dev.dockerfile (Step 1)
FROM python:3.11-buster # Some Debian Python image... I built my own COPY ../sources/api/ /app/ RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt ENV PYTHONPATH=/app/ EXPOSE 80 CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]
Build Sequence (Steps 2 to 4)
# 2 - start minikube minikube start --bootstrapper=kubeadm --vm-driver=docker minikube docker-env ## 3 - build image docker build -f ../../service1/deploy/dev.dockerfile ../../service1 -t acme-app.service1:latest ## 4 - load image into minikube minikube image load acme-app.service1:latest
Deployment (Step 5 and 6)
--- apiVersion: apps/v1 kind: Deployment metadata: name: acme-service-1-deployment namespace: acme-app-dev labels: app: service-1 spec: replicas: 1 selector: matchLabels: app: service-1 template: metadata: labels: app: service-1 spec: containers: - name: service1-container image: docker.io/library/acme-app.service1:latest imagePullPolicy: Never ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: service-1-service namespace: acme-app-dev spec: type: NodePort selector: app: service-1 ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 31000
kubectl apply -f deployment.yaml
kubectl port forward (Step 7)
kubectl get pods -n acme-app-dev NAME READY STATUS RESTARTS AGE acme-service-1-deployment-76748d7ff6-llcsr 1/1 Running 0 11s
Port Forward to pod
port-forward acme-service-1-deployment-76748d7ff6-llcsr 8500:31000 -n acme-app-dev Forwarding from 127.0.0.1:8500 -> 31000 Forwarding from [::1]:8500 -> 31000
Test in Browser (Step 8)
Open favorite browser and navigate to 127.0.0.1:31000.
The console running the port forward now outputs:
E0123 14:54:16.208010 25932 portforward.go:406] an error occurred forwarding 8500 -> 31000: error forwarding port 31000 to pod d4c0fa6cb16ce02335a05cad904fbf2ab7818e2073d7c7ded8ad05f193aa37e7, uid : exit status 1: 2023/01/23 14:54:16 socat E connect(5, AF=2 127.0.0.1:31000, 16): Connection refused E0123 14:54:16.213268 25932 portforward.go:234] lost connection to pod
What have I looked at?
I’ve tried looking through the docs on kubernetes website as well as issues on here (yes there are similar). This is pretty similar – although no marked answer and still an issue by the looks of it. I couldn’t see a solution for my issue here.
NodePort exposed Port connection refused
I am running Minikube on Windows and I’m just setting out on a kubernetes journey.
The image itself works in docker from a docker compose. I can see the pod is up and running in minikube from the logs (minikube dashboard).
You got your wires crossed:
- The pod is listening on port 80
- The NodePort service is listening on port 31000 on the node, but its underlying ClusterIP service is listening on port 80 as well.
- You are trying to port-forward to port 31000 on the Pod. This will not work.
Call one of the following instead:
kubectl port-forward -n acme-app-dev deploy/acme-service-1-deployment 8500:80
kubectl port-forward -n acme-app-dev service/service-1-service 8500:80
- or use
minikube service -n acme-app-dev service-1-serviceand use the provided URL.