Reputation: 351
I am trying to deploy an app to Kubernetes. I have 2 containers: Angular app, hosted by nginx, and Node.js server. I run those containers in the same pod. The issue is that Angular app can't access the Node.js api. Here is my nginx's default.conf:
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
index index.html;
}
location /api/ {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
}
}
Here is my Dockerfile for the Angular app:
FROM node:lts-alpine AS build
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build:prod
FROM nginx:stable-alpine
COPY nginx/default.conf /etc/nginx/conf.d/default.conf
COPY --from=build /app/dist/mag-ui /usr/share/nginx/html
Here is my deploy.yml that I run on a Kubernetes cluster:
kind: Namespace
metadata:
name: mag
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: mag
name: mag
labels:
app: mag
spec:
replicas: 1
selector:
matchLabels:
app: mag
minReadySeconds: 10
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
template:
metadata:
labels:
app: mag
spec:
terminationGracePeriodSeconds: 10
containers:
- name: mag-api
image: mag-api
imagePullPolicy: "Always"
ports:
- containerPort: 3000
- name: mag-ui
image: mag-ui
imagePullPolicy: "Always"
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
namespace: mag
name: mag-svc
labels:
app: mag
spec:
ports:
- port: 80
name: ui
targetPort: 80
selector:
app: mag
So when I deploy this to my local cluster (and forward port 8080:80 of service/mag-svc) and browse localhost:8080, the ui app tries to query data from Node.js server and fails with: GET http://localhost:3000/api/mag/models net::ERR_CONNECTION_REFUSED
.
However, if I connect to Angular app container's shell and curl the localhost:3000/api/mag/models
, it works fine and I get the expected response.
Looks like it tries to access localhost of my host vm, instead of localhost of a container where the Angular app is running. So, how to make the Angular app call Node.js api, that runs in the same pod?
Upvotes: 1
Views: 1512
Reputation: 4132
angular
runs in your browser so the connections to http://localhost:3000
from the app running in your browser are to your PC's localhost:3000
.
You can create a Service
for the nodejs
container:
apiVersion: v1
kind: Service
metadata:
namespace: mag
name: mag-svc-api
labels:
app: mag
spec:
ports:
- port: 3000
name: mag-api
targetPort: 3000
selector:
app: mag
... then forward traffic for localhost:3000
to the Service
: kubectl port-forward -n mag mag-svc-api 3000:3000
. Connections from the app running in your browser to http://localhost:3000
would be forwarded to the Service
-> container running in Kubernetes.
Upvotes: 4