How to get browsable url from Docker-for-mac or Docker-for-Windows?

5/14/2018

In minikube I can get a service's url via minikube service kubedemo-service --url. How do I get the URL for a type: LoadBalancer service in Docker for Mac or Docker for Windows in Kubernetes mode?

service.yml is:

apiVersion: v1
kind: Service
metadata:
  name: kubedemo-service
spec:
  type: LoadBalancer
  selector:
    app: kubedemo
  ports:
  - port: 80
    targetPort: 80

When I switch to type: NodePort and run kubectl describe svc/kubedemo-service I see:

...
Type:                     NodePort
LoadBalancer Ingress:     localhost
...
NodePort:                 <unset>  31838/TCP
...

and I can browse to http://localhost:31838/ to see the content. Switching to type: LoadBalancer, I see localhost ingress lines in kubectl describe svc/kubedemo-service but I get ERR_CONNECTION_REFUSED browsing to it.

(I'm familiar with http://localhost:8080/api/v1/namespaces/kube-system/services/kubedemo-service/proxy/ though this changes the root directory of the site, breaking css and js references that assume a root directory. I'm also familiar with kubectl port-forward pods/pod-name though this only connects to pods until k8s 1.10.)

How do I browse to a type: LoadBalancer service in Docker for Win or Docker for Mac?

-- robrich
docker
docker-for-mac
docker-for-windows
kubernetes

2 Answers

5/14/2018

LoadBalancer will work on Docker-for-Mac and Docker-for-Windows as long as you're running a recent build. Flip the type back to LoadBalancer and update. When you check the describe command output look for the Port: <unset> 80/TCP line. And try hitting http://localhost:80.

-- allingeek
Source: StackOverflow

5/14/2018

How do I browse to a type: ClusterIP service or type: LoadBalancer service in Docker for Win or Docker for Mac?

This is usual confusion when it comes to scope of kubernetes network levels, and exposures on service level. Here is quick overview of types and scope:

  • A ClusterIP service is the default Kubernetes service. It gives you a service inside your cluster that other apps inside your cluster can access. There is no external access. To access it outside of cluster, you would need to run kube proxy (such as in standard dashboard example).

  • A LoadBalancer service is the standard way to expose a service to the internet. Load balancer access and setup is dependent on cloud provider.

  • A NodePort service is the most primitive way to get external traffic directly to your service. NodePort, as the name implies, opens a specific port on all the Nodes (the VMs), and any traffic that is sent to this port is forwarded to the service.

This said, only way to access your service while on ClusteIP is from within one of the containers from the cluster or with help of proxy, and for LoadBalancer you need cloud provider. You can also mimic LoadBalancer with ingress of your own (upstream proxy such as nginx, sitting in front of ClusterIP type of service).

Useful link with more in-depth explanation and nice images: https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0

Updated for LoadBalancer discussion:

As for using LoadBalancer, here is useful reference from documentation (https://kubernetes.io/docs/tutorials/stateless-application/hello-minikube/):

The --type=LoadBalancer flag indicates that you want to expose your Service outside of the cluster.

  • On cloud providers that support load balancers, an external IP address would be provisioned to access the Service.
  • On Minikube, the LoadBalancer type makes the Service accessible through the minikube service command.

    minikube service name-of-the-service

    This automatically opens up a browser window using a local IP address that serves your app on service port.

-- Const
Source: StackOverflow