Invalid value: "The edited file failed validation": ValidationError(Service.spec): unknown field "nodePort" in io.k8s.api.core.v1.ServiceSpec

7/24/2019

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"}
-- SyCode
kubernetes
kubernetes-service

2 Answers

7/24/2019

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: {}
-- SyCode
Source: StackOverflow

7/24/2019

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 - 
-- Shudipta Sharma
Source: StackOverflow