Search code examples
kuberneteskubectlkubernetes-serviceamazon-ecr

Cannot access a LoadBalancer service at Kubernetes


I managed to deploy a python app at the kubernetes cluster . The python app image is deployed at AWS ECR (Elastic Container Registry).
My deployment is:

(NAME)charting-rest-server
(READY)1/1
(UP-TO-DATE)1
(AVAILABLE)1
(AGE)33m
(CONTAINERS)charting-rest-server
(IMAGES) *****.dkr.ecr.eu-west-2.amazonaws.com/charting-rest-server:latest
(SELECTOR)app=charting-rest-server

And my service is:

(NAME)charting-rest-server-service
(TYPE)LoadBalancer
(CLUSTER-IP)10.100.4.207
(EXTERNAL-IP)*******.eu-west-2.elb.amazonaws.com
(PORT(s))8765:32735/TCP
(AGE)124m
(SELECTOR)app=charting-rest-server

According to this AWS guide , when I do curl *****.us-west-2.elb.amazonaws.com:80 I should be able to externally access the Load Balancer , who is going to route me to my pod's ip.
But all I get is

(6) Could not resolve host: *******.eu-west-2.elb.amazonaws.com



And come to think about it if I want to have access to my pod and send some requests I should have an external-ip like 111.111.111.111 (obv an example).


EDIT


the deployment's yaml is:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: charting-rest-server
spec:
  selector:
    matchLabels:
      app: charting-rest-server
  replicas: 1
  template:
    metadata:
      labels:
        app: charting-rest-server
    spec:
      containers:
      - name: charting-rest-server
        image: *****.eu-west-2.amazonaws.com/charting-rest-server:latest
        ports: 
          - containerPort: 5000


the service's yaml:

apiVersion: v1
kind: Service
metadata:
  name:  charting-rest-server-service
spec:
  type: LoadBalancer
  selector:
    app: charting-rest-server
  ports:
    - protocol: TCP
      port: 80
      targetPort: 5000

I already tried with the suggestions from the comments , using an ingress instance but I only ended up spending a huge amount of time trying to understand how they work , "am I doing something wrong"?/etc .

I will put the yaml file I used here but it made no change since my ADDRESS field was empty - no ip to use.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: charting-rest-server-ingress
spec:
  rules:
  - host: charting-rest-server-service
    http:
      paths:
      - path:/
        backend:
          serviceName: charting-rest-server-service
          servicePort: 80

I am stuck in that problem for so much time so I would appreciate some help.


Solution

  • You already created a Service with type LoadBalancer, but it looks like you have incorrect ports configured.

    Your Deployment is created with containerPort: 5000 and your Service is pointing to targetPort: 9376. Those needs to match for the Deployment to be exposed.

    If you are having a hard time writing yaml for the Service you can expose the Deployment using following kubectl command:

    kubectl expose --namespace=tick deployment charting-rest-server --type=LoadBalancer --port=8765 --target-port=5000 --name=charting-rest-server-service
    

    Once you fix those ports you will be able to access the service from outside using it's hostname:

    status:
      loadBalancer:
        ingress:
        - hostname: aba02b223436111ea85ea06a051f04d8-1294697222.eu-west-2.elb.amazonaws.com
    

    I also recommend this guide Tutorial: Expose Services on your AWS Quick Start Kubernetes cluster.

    If you need more control over the http rules please consider using ingress, you can read more about ALB Ingress Controller on Amazon EKS also Using a Network Load Balancer with the NGINX Ingress Controller on Amazon EKS.