Stream closed EOF for pod in kubernetes cluster - docker

I am deploying django-react web app on kubernetes I have created the pod for backend its created fine and have status running but I have followed the same steps for the frontend but the pods is not cretaed successfully. Its status changes to CrashLoopBackOff right after Completed when I check its logs it showing this error "Stream closed EOF for default/frontend-deployment-56948f4cd4-nsfqx (frontend)".
I am using microk8s and have pushed frontend image to microk8s default docker registry.
frontend.Dockerfile
FROM node:13.12.0-alpine
WORKDIR /app/frontend
COPY package.json package-lock.json ./
RUN npm install
RUN npm install react-scripts#3.4.1 -g
COPY . ./
EXPOSE 3000
frontend-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name : frontend-deployment
spec:
replicas: 1
selector:
matchLabels:
component: frontend
template:
metadata:
labels:
component: frontend
spec:
containers:
- name: frontend
image: localhost:32000/frontend:latest
command: ["npm", "start"]
ports:
- containerPort: 3000
What am I doing wrong?

Related

ASP.NET Core 6 Web API + aks + Application Gateway not working together

I've been struggling for two weeks now. So, any help is welcome.
I created an AKS and I tried to host my apps there.
What is done:
All the containers are tested locally and working perfectly.
All CI/CD are done properly
The main services exposed to internet are frontend (Angular 13) and ASP.NET Core 6 Web API
The frontend is working properly using tls (without certificate for now). I can access it with no problem using a host url. Exposed using ingress on the app gateway.
The problems starts :) The Web API pod is running. I can access it using the load balancer + static ip (kubernetes service type LoadBalancer). But I'm unable to expose it using ingress on the app gateway.
No errors on my pod when I run a kubectl logs podname
The Web API ingress is a copy/paste of frontend api (may be the mistake)
Final thing: when I change the api service to LoadBalancer type, I can access the api from outside using the load balancer.
I believe something's wrong in my ingress definition
Here the two ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress
namespace: test
annotations:
kubernetes.io/ingress.class: azure/application-gateway
spec:
rules:
- host: "testapi.url.ca"
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: api-svc
port:
number: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
namespace: test
annotations:
kubernetes.io/ingress.class: azure/application-gateway
appgw.ingress.kubernetes.io/ssl-redirect: "true"
spec:
tls:
- secretName: url-tls
hosts:
- test.url.ca
- test.url.com
rules:
- host: "test.url.ca"
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: web-svc
port:
number: 80
My api service:
apiVersion: v1
kind: Service
metadata:
name: api-svc
namespace: test
spec:
selector:
app: api
ports:
- name: regular
port: 80
targetPort: 80
protocol: TCP
Finaly the docker file to create the image:
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80/tcp
EXPOSE 443/tcp
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ./Lib/Contract ./Lib/Contract
COPY ./Lib/Framework ./Lib/Framework
COPY ./Output/Api ./Output/Api
WORKDIR /src/Output/Api
RUN dotnet restore Api.csproj --disable-parallel
RUN dotnet build Api.csproj --no-restore -c Release
FROM build AS publish
RUN dotnet publish Api.csproj --no-restore --no-build -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app/SensitiveData/localhost1.pfx /https/localhost1.pfx
COPY --from=publish /app .
RUN ls -l /app
ENTRYPOINT ["dotnet", "Api.dll"]
Thank for your help
I tried different Microsoft tutorials with no success.
I also tried to use the kubernetes ingress but i faced other problems and i decided to come back to my path.

Skaffold Error: deployment failed because of cleaning up

I have tried so many times to run skaffold from my project directory. It keeps me returning the same error: 1/1 deployment(s) failed
Skaffold.yaml file:
apiVersion: skaffold/v2alpha3
kind: Config
deploy:
kubectl:
manifests:
- ./infra/k8s/*
build:
local:
push: false
artifacts:
- image: ankan00/auth
context: auth
docker:
dockerfile: Dockerfile
sync:
manual:
- src: 'src/**/*.ts'
dest: .
Created a docker image of ankan00/auth by docker build -t ankan00/auth .
It ran successfully when I was working with this project. But I had to uninstall docker for some reason and then when I reinstalled docker built the image again(after deleting the previous instance of the image in docker desktop), then skaffold is not working anymore. I tried to delete skaffold folder and reinstall skaffold but the problem remains the same. Everytime it ends up in cleaning up and throwing 1/1 deployment(s) failed.
My Dockerfile:
FROM node:alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
CMD ["npm", "start"]
my auth-depl.yaml file which is in infra\k8s directory
apiVersion: apps/v1
kind: Deployment
metadata:
name: auth-depl
spec:
replicas: 1
selector:
matchLabels:
app: auth
template:
metadata:
labels:
app: auth
spec:
containers:
- name: auth
image: ankan00/auth
---
apiVersion: v1
kind: Service
metadata:
name: auth-srv
spec:
selector:
app: auth
ports:
- name: auth
protocol: TCP
port: 3000
targetPort: 3000
Okay! I resolved the isses by re-installing the docker desktop and not enabling Kubernetes in it. I installed Minikube and then I ran skaffold dev and this time it was not giving error in deployments to stabilize... stage. Looks like Kubernetes desktop is the culprit? I am not sure though because I ran it successfully before.
New Update!!! I worked again on the Kubernetes desktop. I deleted Minikube because Minicube uses the same port that the ingress-Nginx server uses to run the project. So, I had decided to put back Kubernetes desktop, also Google cloud Kubernetes engine. And scaffold works perfectly this time.

Kubernetes Service connection refused, how to access a service?

Hello Im new to minikube and I cant connect to an exposed service. I created an Api .Net Core, I builded the image, go it into my private registry and then i created an deployment with an yml file that works.
But i cant expose that deployment as service. Everytime after I expose it its all fine but I cant connect to it via the port and the minikube ip adress.
If I try to connect to the ipadress:port I get connection refused.
Deployment yml file:
kind: Deployment
apiVersion: apps/v1
metadata:
name: testapp1-deployment
labels:
app: testapp1
spec:
replicas: 2
selector:
matchLabels:
app: testapp1
template:
metadata:
labels:
app: testapp1
version: v0.1
spec:
containers:
- name: testapp1-deployment
image: localhost:5000/testapp1
imagePullPolicy: Never
resources:
requests:
cpu: 120m
ports:
- containerPort: 80
Service yml file:
apiVersion: v1
kind: Service
metadata:
name: testapp1-service
spec:
type: NodePort
selector:
app: testapp1
ports:
- protocol: TCP
port: 80
targetPort: 80
The problem was my dockerfile and I wasn't enabling docker support in my app in ASP .NET Core. I enabled the docker support and changed the dockerfile a bit then I rebuild it and it worked for me.
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app
COPY *.csproj ./
RUN dotnet restore
COPY . ./
RUN dotnet publish -c Release -o out
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
that's the dockerfile Im using for my app at the moment so if someone else face the same problem as me try to use the dockerfile. If it still won't work look up in previous comments.

skaffold does not reload golang code in minikube

I've been experimenting with skaffold with a local minikube installation. It's a nice to be able to develop your project on something that is as close as possible to production.
If I use the getting-started example provided on skaffold github repo, everything works just fine, my IDE (intellij idea) stops on the breakpoints and when I modify my code, the changes are reflected instantly.
Now on my personal project which is a bit more complicated than a simple main.go file, things don't work as expected. The IDE stops on the breakpoint but hot code reload are not happening even though I see in the console that skaffold detected the changes made on that particular file but unfortunately the changes are not reflected/applied.
A docker file is used to build an image, the docker file is the following
FROM golang:1.14 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /app.o ./cmd/shortener/shortener.go
FROM alpine:3.12
COPY --from=builder /app.o ./
COPY --from=builder /app ./
EXPOSE 3000
ENV GOTRACEBACK=all
CMD ["./app.o"]
On kubernetes side, I'm creating a deployment and a service as follows:
apiVersion: apps/v1
kind: Deployment
metadata:
name: url-shortener-deployment
spec:
selector:
matchLabels:
app: url-shortener
template:
metadata:
labels:
app: url-shortener
spec:
containers:
- name: url-shortener
image: url_shortener
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name: url-shortener-service
spec:
selector:
app: url-shortener
ports:
- port: 3000
nodePort: 30000
type: NodePort
As for skaffold, here's the skaffold.yaml file:
apiVersion: skaffold/v2beta5
kind: Config
metadata:
name: url-shortener
build:
artifacts:
- image: url_shortener
context: shortener
docker:
dockerfile: build/docker/Dockerfile.dev
noCache: false
deploy:
kubectl:
manifests:
- stack/mongo/mongo.yaml
- shortener/deployments/kubernetes/shortener.yaml
I've enabled verbose logging and I notice this in the output whenever I save (CTRL+S) a source code file.
time="2020-07-05T22:51:08+02:00" level=debug msg="Found dependencies for dockerfile: [{go.mod /app true} {go.sum /app true} {. /app true}]"
time="2020-07-05T22:51:08+02:00" level=info msg="files modified: [shortener/internal/handler/rest/rest.go]"
I'm assuming that this means that the change has been detected.
breakpoints works correctly in the IDE but code swap in kubernetes don't seem to be happening
The debug functionality deliberately disables Skaffold's file-watching, which rebuilds and redeploys containers on file change. The redeploy causes existing containers to be terminated, which tears down any ongoing debug sessions. It's really disorienting and aggravating to have your carefully-constructed debug session be torn down because you accidentally saved a change to a comment! 😫
But we're looking at how to better support this more iterative debugging within Cloud Code.
If you're using Skaffold directly, we recently added the ability to re-enable file-watching via skaffold debug --auto-build --auto-deploy (present in v1.12).

Accesing nodejs process.env variables in CRA prod build in containerized Kubernetes deployment

I have created a production build from CRA in it there is a connection string
that when trying to get it into kubernetes via a service, I set it up in this way :
The minified version prod ready of CRA translate it to this
"http://"+Object({NODE_ENV:"production",PUBLIC_URL:""}).APISERVER_SERVICE_HOST+":"+Object({NODE_ENV:"production",PUBLIC_URL:""}).APISERVER_SERVICE_PORT
process.env does not have any container ENV.
Could it be that the build just "baked-in" the env variables at build time and that's the reason the client sees them as strings rather that key/values while in the pod ?
The goal is to access the api url utilize env variables within the container via process.env.VARIABLE_NAME once the pod are deployed
The thing is when it gets deployed the uri is undefined meaning the code is unable to convert/detect/translate proccess.env.VARIABLE to its value
Even console.log(process.env) returns undefined
If I get into the pod/container and check env variables they are working correctly
Why am I not getting the values of env variables in my build?
Do I have to build it at a certain time?
What am I missing?
Dockerfile
FROM node:10 as build-deps
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
ENV PATH /usr/src/app/node_modules/.bin:$PATH
COPY package.json /usr/src/app/package.json
RUN npm install --silent
RUN npm install react-scripts -g --silent
COPY . /usr/src/app
RUN npm run build
RUN echo $APISERVER_SERVICE_HOST
FROM nginx:1.12-alpine
RUN apk update && apk add nodejs
RUN rm -rf /etc/nginx/conf.d
COPY conf /etc/nginx
COPY --from=build-deps /usr/src/app/build /usr/share/nginx/html
RUN echo $APISERVER_SERVICE_HOST
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Service and Deployment kubernetes
#Service for readable
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
run: readable-deployment
name: readable
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: readable-deployment
type: LoadBalancer
status:
loadBalancer: {}
---
#Deployment for Readable
apiVersion: apps/v1beta1
kind: Deployment
metadata:
creationTimestamp: null
labels:
run: readable-deployment
name: readable-deployment
spec:
replicas: 1
selector:
matchLabels:
run: readable-deployment
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
run: readable-deployment
spec:
containers:
- image: gcr.io/kuberneteseval/readable:latest-01
name: readable-deployment
ports:
- containerPort: 80
resources: {}
status: {}
First of all, This is for a create-react-app production build
As of today Aug 24 2018 there is still a open issue for this and how it should be done.
No matter what I did the API url was always a "key string" and not the value of the env variables.
What I did: (just a workaround and does not get service variables at runtime)
I created .env.production file and added REACT_APP_SERVICE_HOST and REACT_APP_SERVICE_PORT
The problem with this is that at docker build time in my local machine there is no way of getting the values of the cluster service variables hence you would have to set the values manually. like so: REACT_APP_APISERVER_SERVICE_HOST=35.15.5.0and REACT_APP_APISERVER_SERVICE_PORT=3008
Other Alternatives:
I try this Apparently it does grab the services variables. Couldn't make it work for me
I also tried Ejecting and use the Environment plugin which is a shorthand of the define Plugin used by CRA but again your not gonna have access to the services variables at build time...

Resources