run flask app kubernetes

7/4/2018

this might be a silly question but how can i get my https://localhost:5000 working through my flask kuberenetes app to ensure its returning back the right info?

This is my workflow so far:

$ eval $(minikube docker-env)
$ docker build ...
$ kubectl apply -f deploy.yaml (contains deployment & service)
$ kubectl set image...

kubectl logs... returns this below: also my pods are up and running so nothing is failing

 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on https://0.0.0.0:5000/  (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 443-461-677

the only thing is when i go to that address in my browser it says the site can't be reached. when i curl https://localhost:5000 or curl https://0.0.0.0:5000/ i get a failed to connect error. i feel like my enviroment/set up is wrong somehow. any tips/suggestions? thank you!

also heres my deploy.yaml file:

apiVersion: apps/v1beta1 
kind: Deployment
metadata:
  name: myapp
  namespace: test-space
spec:
  selector:
    matchLabels:
      app: myapp
  replicas: 3 
  template: 
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - name: secret-volume
          mountPath: /etc/secret-volume
        ports: 
        - containerPort: 80
        env:
        - name: "SECRET_KEY"
          value: /etc/secret-volume/secret-key
        - name: "SECRET_CRT"
          value: /etc/secret-volume/secret-crt
      volumes:
        - name: secret-volume
          secret: 
            secretName: my-secret3
---
apiVersion: v1
kind: Service
metadata:
  name: myapp
  namespace: test-space
spec:
  type: NodePort
  selector:
    app: myapp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 5000
    nodePort: 30000

Dockerfile:

FROM python:2

RUN mkdir -p /usr/src/app

WORKDIR /usr/src/app

COPY requirements.txt /usr/src/app/

RUN pip install --no-cache-dir -r requirements.txt

COPY . /usr/src/app

EXPOSE 5000

CMD ["python", "app.py"]
-- helloworld
docker
flask
kubernetes
minikube
python

2 Answers

1/22/2019

You need to create service with label selector myapp. But there is another way you can do curl by logging into running pod and execute curl from inside the pod.

Just do

kubectl exec -it podname /bin/bash This will open bash shell Then you can do curl localhost:5000

-- Rohit
Source: StackOverflow

7/5/2018

As you have exposed Port 5000 in the Dockerfile, you need to expose the same Port in the container in your Deployment. After that, you need to configure your Service to use this Port.

It should look like this:

apiVersion: apps/v1beta1 
kind: Deployment
metadata:
  name: myapp
  namespace: test-space
spec:
  selector:
    matchLabels:
      app: myapp
  replicas: 3 
  template: 
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - name: secret-volume
          mountPath: /etc/secret-volume
        ports: 
        - containerPort: 5000 #<<<PORT FIXED
        env:
        - name: "SECRET_KEY"
          value: /etc/secret-volume/secret-key
        - name: "SECRET_CRT"
          value: /etc/secret-volume/secret-crt
      volumes:
        - name: secret-volume
          secret: 
            secretName: my-secret3
---
apiVersion: v1
kind: Service
metadata:
  name: myapp
  namespace: test-space
spec:
  type: NodePort
  selector:
    app: myapp
  ports:
  - protocol: TCP
    port: 5000 #<<<PORT FIXED
    targetPort: 5000
    nodePort: 30000

After that, you can reach you application on <any-kubernetes-node-IP>:30000

-- Artem Golenyaev
Source: StackOverflow