Can not apply Service as "type: ClusterIP" in my GKE cluster

11/4/2019

I want to deploy my service as a ClusterIP but am not able to apply it for the given error message:

[xetra11@x11-work coopr-infrastructure]$ kubectl apply -f teamcity-deployment.yaml 
deployment.apps/teamcity unchanged
ingress.extensions/teamcity unchanged
The Service "teamcity" is invalid: spec.ports[0].nodePort: Forbidden: may not be used when `type` is 'ClusterIP'

This here is my .yaml file:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: teamcity
  labels:
    app: teamcity
spec:
  replicas: 1
  selector:
    matchLabels:
      app: teamcity
  template:
    metadata:
      labels:
        app: teamcity
    spec:
      containers:
      - name: teamcity-server
        image: jetbrains/teamcity-server:latest
        ports:
        - containerPort: 8111
---
apiVersion: v1
kind: Service
metadata:
  name: teamcity
  labels:
    app: teamcity
spec:
  type: ClusterIP
  ports:
  - port: 8111
    targetPort: 8111
    protocol: TCP
  selector:
    app: teamcity
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: teamcity
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  backend:
    serviceName: teamcity
    servicePort: 8111
-- xetra11
google-kubernetes-engine
kubernetes
kubernetes-ingress
kubernetes-service

3 Answers

11/4/2019

On GKE the ingress can only point to a service of type LoadBalancer or NodePort you can see the error output of the ingress by running:

kubectl describe ingress teamcity

You can see an error, as per your yaml if you are using an nginx controller you have to use the service of type NodePort

Somo documentation:

https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md#gce-gke

-- wolmi
Source: StackOverflow

11/5/2019

Did you just recently change the service description from NodePort to ClusterIP?

Then it might be this issue github.com/kubernetes/kubectl/issues/221.

You need to use kubectl replace or kubectl apply --force.

-- yvesonline
Source: StackOverflow

11/5/2019

Apply a configuration to the resource by filename:

kubectl apply -f [.yaml file] --force

This resource will be created if it doesn't exist yet. To use 'apply', always create the resource initially with either 'apply' or 'create --save-config'.

2) If the first one fails, you can force replace, delete and then re-create the resource:

kubectl replace -f grav-deployment.yml

This command is only used when grace-period=0. If true, immediately remove resources from API and bypass graceful deletion. Note that immediate deletion of some resources may result in inconsistency or data loss and requires confirmation.

-- Md Daud Walizarif
Source: StackOverflow