kubernetesload-balancingminikube

Access Minikube Loadbalancer Service From Host Machine


I am trying to learn how to use Kubernetes with Minikube and have the following deployment and service:

---
kind: Service
apiVersion: v1
metadata:
  name: exampleservice
spec:
  selector:
    app: myapp
  ports:
  - protocol: "TCP"
    # Port accessible inside cluster
    port: 8081
    # Port to forward to inside the pod
    targetPort: 8080
    # Port accessible outside cluster
    nodePort: 30002
  type: LoadBalancer
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: myappdeployment
spec:
  replicas: 5
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: tutum/hello-world
        ports:
        - containerPort: 8080

I expect to be able to hit this service from my local machine at

http://192.168.64.2:30002

As per the command: minikube service exampleservice --url but when I try to access this from the browser I get a site cannot be reached error.

Some information that may help debugging:

kubectl get services --all-namespaces:

NAMESPACE     NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
default       exampleservice         LoadBalancer   10.104.248.158   <pending>     8081:30002/TCP           26m
default       kubernetes             ClusterIP      10.96.0.1        <none>        443/TCP                  2h
default       user-service-service   LoadBalancer   10.110.181.202   <pending>     8080:30001/TCP           42m
kube-system   kube-dns               ClusterIP      10.96.0.10       <none>        53/UDP,53/TCP,9153/TCP   2h
kube-system   kubernetes-dashboard   ClusterIP      10.110.65.24     <none>        80/TCP                   2h

I am running minikube on OSX.


Solution

  • You can use External IPs, as described in k8s docs. Update the service as shown below (where I assume 192.168.64.2 is your minikube IP):

    kind: Service
    apiVersion: v1
    metadata:
      name: exampleservice
    spec:
      selector:
        app: myapp
      ports:
      - protocol: "TCP"
        # Port accessible inside cluster
        port: 8081
        # Port to forward to inside the pod
        targetPort: 80
        # Port accessible outside cluster
        nodePort: 30002
      type: LoadBalancer
      externalIPs:
      - 192.168.64.2
    

    Now you can access your application at http://192.168.64.2:8081/


    If you need to access the application at 30002, you can use it like this

        kind: Service
        apiVersion: v1
        metadata:
          name: exampleservice
        spec:
          selector:
            app: myapp
          ports:
          - protocol: "TCP"
            # Port accessible inside cluster
            port: 8081
            # Port to forward to inside the pod
            targetPort: 80
            # Port accessible outside cluster
            nodePort: 30002
          type: NodePort
    

    Your deployment file does not look correct to me.

    delete it kubectl delete deploy/myappdeployment

    use this to create again.

    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      labels:
        app: myapp
      name: myappdeployment
    spec:
      replicas: 5
      selector:
        matchLabels:
          app: myapp
      strategy: {}
      template:
        metadata:
          labels:
            app: myapp
        spec:
          containers:
          - image: tutum/hello-world
            name: myapp
            ports:
            - containerPort: 80