TheRealFakeNews
TheRealFakeNews

Reputation: 8153

How to access app once deployed via Kubernetes?

I have a very simple Python app that works fine when I execute uvicorn main:app --reload. When I go to http://127.0.0.1:8000 on my machine, I'm able to interact with the API. (My app has no frontend, it is just an API built with FastAPI). However, I am trying to deploy this via Kubernetes, but am not sure how I can access/interact with my API.

Here is my deployment.yaml.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec: 
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.16.1
        ports:
        - containerPort: 80

When I enter kubectl describe deployments my-deployment in the terminal, I get back a print out of the deployment, the namespace it is in, the pod template, a list of events, etc. So, I am pretty sure it is properly deployed.

How can I access the application? What would the url be? I have tried a variety of localhost + port combinations to no avail. I am new to kubernetes so I'm trying to understand how this works.


Update:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
  namespace: default  
spec:  
  selector: 
    matchLabels:
      app: web
  replicas: 2  
  template:  
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: site
        image: nginx:1.16.1
        ports:
          - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: app-entrypoint
  namespace: default
spec:
  type: NodePort
  selector:
    app: web
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30001

Again, when I use the k8s CLI, I'm able to see my deployment, yet when I hit localhost:30001, I get an Unable to connect message.

Upvotes: 0

Views: 1632

Answers (2)

Kiruba
Kiruba

Reputation: 1377

By Default k8s application are exposed only within the cluster, if you want to access it from outside of the cluster then you can select any of the below options:

  1. Expose Deployment as a node port service (kubectl expose deployment my-deployment --name=my-deployment-service --type=NodePort), describe the service and get the node port assigned to it (kubectl describe svc my-deployment-service). Then try http://<node-IP:node-port>/

  2. For production grade cluster the best practice is to use LoadBalancer type (kubectl expose deployment my-deployment --name=my-deployment-service --type=LoadBalancer --target-port=8080) as part of this service you get an external IP which can be used to access your service http://EXTERNAL-IP:8080/

You can also see the details about the endpoint using kubectl get ep

Thanks,

Upvotes: 0

Arghya Sadhu
Arghya Sadhu

Reputation: 44579

You have given containerPort: 80 but if your app listens on port 8080 change it to 8080.

There are different ways to access an application deployed on kubernetes

  1. Port Forward using kubectl port-forward deployment/my-deployment 8080:8080
  2. Creare a NodePort service and use http://<NODEIP>:<NODEPORT>
  3. Create a LoadBalanceer service. This works only in supported cloud environment such as AWS, GKE etc.
  4. Use ingress controller such nginx to expose the application.

Upvotes: 4

Related Questions