Conor Ladrigan
Conor Ladrigan

Reputation: 77

Ingress configuration issue in Docker kubernetes cluster

I am recently new to Kubernetes and Docker in general and am experiencing issues.

I am running a single local Kubernetes cluster via Docker and am using skaffold to control the build up and teardown of objects within the cluster. When I run skaffold dev the build seems successful, yet when I attempt to make a request to my cluster via Postman the request hangs. I am using an ingress-nginx controller and I feel the bug lies somewhere here. My request handling logic is simple and so I feel the issue is not in the route handling but the configuration of my cluster, specifically with the ingress controller. I will post below my skaffold yaml config and my ingress yaml config.

Any help is greatly appreciated as I have struggled with this bug for sometime.

ingress yaml config :

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: 'true'
spec:
  rules:
    - host: ticketing.dev
      http:
        paths:
          - path: /api/users/?(.*)
            pathType: Prefix
            backend:
              service:
                name: auth-srv
                port:
                  number: 3000

Note that I have a redirect in my /etc/hosts file from ticketing.dev to 127.0.0.1

Auth service yaml config :

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: conorl47/auth
---

kind: Service
metadata:
  name: auth-srv
spec:
  selector:
    app: auth
  ports:
    - name: auth
      protocol: TCP
      port: 3000
      targetPort: 3000

skaffold yaml config :

apiVersion: skaffold/v2alpha3
kind: Config
deploy:
  kubectl:
    manifests:
      - ./infra/k8s/*
build:
  local:
    push: false
  artifacts:
    - image: conorl47/auth
      context: auth
      docker:
        dockerfile: Dockerfile
      sync:
        manual:
          - src: 'src/**/*.ts'
            dest: .

For installing the ingress nginx controller I followed the installation instructions at https://kubernetes.github.io/ingress-nginx/deploy/ , namely the Docker desktop installation instruction.

After running that command I see the following two Docker containers running in Docker desktop

enter image description here

The two services created in the ingress-nginx namespace are :

❯ k get services -n ingress-nginx
NAME                                 TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.103.6.146   <pending>     80:30036/TCP,443:30465/TCP   22m
ingress-nginx-controller-admission   ClusterIP      10.108.8.26    <none>        443/TCP                      22m

When I kubectl describe both of these services I see the following :

❯ kubectl describe service ingress-nginx-controller -n ingress-nginx
Name:                     ingress-nginx-controller
Namespace:                ingress-nginx
Labels:                   app.kubernetes.io/component=controller
                          app.kubernetes.io/instance=ingress-nginx
                          app.kubernetes.io/managed-by=Helm
                          app.kubernetes.io/name=ingress-nginx
                          app.kubernetes.io/version=1.0.0
                          helm.sh/chart=ingress-nginx-4.0.1
Annotations:              <none>
Selector:                 app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
Type:                     LoadBalancer
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.103.6.146
IPs:                      10.103.6.146
Port:                     http  80/TCP
TargetPort:               http/TCP
NodePort:                 http  30036/TCP
Endpoints:                10.1.0.10:80
Port:                     https  443/TCP
TargetPort:               https/TCP
NodePort:                 https  30465/TCP
Endpoints:                10.1.0.10:443
Session Affinity:         None
External Traffic Policy:  Local
HealthCheck NodePort:     32485
Events:                   <none>

and :

❯ kubectl describe service ingress-nginx-controller-admission -n ingress-nginx
Name:              ingress-nginx-controller-admission
Namespace:         ingress-nginx
Labels:            app.kubernetes.io/component=controller
                   app.kubernetes.io/instance=ingress-nginx
                   app.kubernetes.io/managed-by=Helm
                   app.kubernetes.io/name=ingress-nginx
                   app.kubernetes.io/version=1.0.0
                   helm.sh/chart=ingress-nginx-4.0.1
Annotations:       <none>
Selector:          app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.108.8.26
IPs:               10.108.8.26
Port:              https-webhook  443/TCP
TargetPort:        webhook/TCP
Endpoints:         10.1.0.10:8443
Session Affinity:  None
Events:            <none>

Upvotes: 1

Views: 560

Answers (1)

The Fool
The Fool

Reputation: 20420

As it seems, you have made the ingress service of type LoadBalancer, this will usually provision an external loadbalancer from your cloud provider of choice. That's also why It's still pending. Its waiting for the loadbalancer to be ready, but it will never happen.

If you want to have that ingress service reachable outside your cluster, you need to use type NodePort.

Since their docs are not great on this point, and it seems to be by default like this. You could download the content of https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/cloud/deploy.yaml and modify it before applying. Or you use helm, then you probably can configure this.

You could also do it in this dirty fashion.

kubectl apply --dry-run=client -o yaml -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/cloud/deploy.yaml \
  | sed s/LoadBalancer/NodePort/g \
  | kubectl apply -f -

You could also edit in place.

kubectl edit svc ingress-nginx-controller-admission -n ingress-nginx

Upvotes: 2

Related Questions