Expose kubernetes dashboard

8/30/2019

I've applied the yaml for the kubernetes dashboard.

Now I want to expose this service with the public IP of my server: https://kubernetes.io/docs/tutorials/stateless-application/expose-external-ip-address/#objectives

But there is no service/deployment on my cluster:

$ sudo kubectl get services kubernetes
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   63d
$ sudo kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE

What did I do wrong?

Thanks for the help

-- Warok
kubectl
kubernetes

3 Answers

8/30/2019

Oky thanks, now I get the right name:

sudo kubectl -n kube-system get deployment
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
calico-kube-controllers   1/1     1            1           63d
coredns                   2/2     2            2           63d
kubernetes-dashboard      1/1     1            1           103m
tiller-deploy             0/1     1            0           63d

But I still can't expose the service

sudo kubectl expose deployment kubernetes-dashboard
Error from server (NotFound): deployments.extensions "kubernetes-dashboard" not found

As mentionned here

-- Warok
Source: StackOverflow

9/2/2019

SO, to reproduce and show how does it works - I spawned new fresh cluster on GKE.

Lets see what we have after applying dashboard yaml:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
secret/kubernetes-dashboard-certs created
serviceaccount/kubernetes-dashboard created
role.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
deployment.apps/kubernetes-dashboard created
service/kubernetes-dashboard created


kubectl get deployment kubernetes-dashboard -n kube-system
NAME                   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-dashboard   1         1         1            1           3m22s


kubectl get services kubernetes-dashboard -n kube-system
NAME                   TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes-dashboard   ClusterIP   10.0.6.26    <none>        443/TCP   5m1

kubectl describe service kubernetes-dashboard -n kube-system
Name:              kubernetes-dashboard
Namespace:         kube-system
Labels:            k8s-app=kubernetes-dashboard
Annotations:       kubectl.kubernetes.io/last-applied-configuration:
                     {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"k8s-app":"kubernetes-dashboard"},"name":"kubernetes-dashboard"...
Selector:          k8s-app=kubernetes-dashboard
Type:              ClusterIP
IP:                10.0.6.26
Port:              <unset>  443/TCP
TargetPort:        8443/TCP
Endpoints:         10.40.1.5:8443
Session Affinity:  None
Events:            <none>

During this deployment: 1) kubernetes-dashboard deployment has been created. Note that it was created with the k8s-app=kubernetes-dashboard label. 2) kubernetes-dashboard service was created and works using k8s-app=kubernetes-dashboard [selector](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/.

So basically when you receive such an error - this is expected. Because kubectl expose deployment kubernetes-dashboard -n kube-system is trying to create new service with the kubernetes-dashboard name. Just to play with it - you can easily expose the same, but use another service names, for example:

kubectl expose deployment kubernetes-dashboard -n kube-system --name kube-dashboard-service2
service/kube-dashboard-service2 exposed

Note that default kubernetes-dashboard service is created using ClusterIP type - so you are able right now to access it
1) withing the cluster 2) using kubectl proxy from local machine

$ kubectl proxy
In browser: http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

If you want to expose the same - you can use: 1) Ingress

2) Nodeport service type In 2 words: edit clusterIP --> Nodeport type while kubectl -n kube-system edit service kubernetes-dashboard and access dashboard using https://[node_ip]:[port]

More detailed article is here: How To Access Kubernetes Dashboard Externally

3) Loadbalancer service type. This is Cloud specific feature, so it will work only with cloud providers

Traffic from the external load balancer is directed at the backend Pods. The cloud provider decides how it is load balanced.

Some cloud providers allow you to specify the loadBalancerIP. In those cases, the load-balancer is created with the user-specified loadBalancerIP. If the loadBalancerIP field is not specified, the loadBalancer is set up with an ephemeral IP address. If you specify a loadBalancerIP but your cloud provider does not support the feature, the loadbalancerIP field that you set is ignored.

-- VKR
Source: StackOverflow

8/30/2019

The command that you ran is fetching objects in default namespace.

However, Dashboard is deployed on kube-system namespace.

kubectl -n kube-system get services kubernetes
kubectl -n kube-system get deployment

I am giving you this info according to the link that you share kubernetes dashboard . And namely the YAML file

-- Abdennour TOUMI
Source: StackOverflow