In order to access the Kubernetes Dashboard remotely, I have tried to replace the ClusterIP
with nodePort
as recomended here and here. However the edit always fails with the following error:
Invalid value: "The edited file failed validation": ValidationError(Service.spec): unknown field "nodePort" in io.k8s.api.core.v1.ServiceSpec
The command recommended by the references above is:
kubectl edit svc/kubernetes-dashboard --namespace=kube-system
Here is the yaml
what I was trying after changing:
apiVersion: v1
kind: Service
metadata
creationTimestamp: "2019-07-24T13:03:48Z"
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
resourceVersion: "2238"
selfLink: /api/v1/namespaces/kube-system/services/kubernetes-dashboard
uid: 79c37d2b-ae13-11e9-b2a1-0026b95c3009
spec:
NodePort: 10.110.154.246
ports:
- port: 80
protocol: TCP
targetPort: 9090
selector:
k8s-app: kubernetes-dashboard
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
And the output of client and server version is as follows:
$kubectl version
Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.2", GitCommit:"cff46ab41ff0bb44d8584413b598ad8360ec1def", GitTreeState:"clean", BuildDate:"2019-01-10T23:35:51Z", GoVersion:"go1.11.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.8", GitCommit:"0c6d31a99f81476dfc9871ba3cf3f597bec29b58", GitTreeState:"clean", BuildDate:"2019-07-08T08:38:54Z", GoVersion:"go1.11.5", Compiler:"gc", Platform:"linux/amd64"}
I finally reinstalled the Kuberbetes Dashboard
, here is the final version of the file that worked following the guide given here .
apiVersion: v1
kind: Service
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"k8s-
app":"kubernetes-dashboard"},"name":"kubernetes-dashboard","namespace":"kube-
system"},"spec":{"ports":[{"port":443,"targetPort":8443}],"selector":{"k8s-
app":"kubernetes-dashboard"}}}
creationTimestamp: "2019-07-24T15:20:27Z"
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
resourceVersion: "13109"
selfLink: /api/v1/namespaces/kube-system/services/kubernetes-dashboard
uid: 90cb249d-ae26-11e9-b2a1-0026b95c3009
spec:
clusterIP: 10.109.202.107
externalTrafficPolicy: Cluster
ports:
- nodePort: 30255
port: 443
protocol: TCP
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
You were using the wrong configuration. There is no field in the spec
of Kubernetes Service named NodePort
. The doc you shared told you to change the value of the field spec.type
from ClusterIP
to NodePort
. On the hand, you are adding a new field spec.NodePort
which is totally invalid. See, https://kubernetes.io/docs/concepts/services-networking/service/#nodeport
Try like this, while doing kubectl edit
:
apiVersion: v1
kind: Service
metadata
...
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
...
spec:
ports:
- port: 80
protocol: TCP
targetPort: 9090
...
type: NodePort
...
Or just run this:
kubectl get svc -n kube-system kubernetes-dashboard -o yaml | sed 's/type: ClusterIP/type: NodePort/' | kubectl replace -f -