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.ServiceSpecThe command recommended by the references above is:
kubectl edit svc/kubernetes-dashboard --namespace=kube-systemHere 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 -