使用 kubectl 从 gke 应用程序中删除外部 ip 地址

Remove external ip address from gke application with kubectl

getting Prometheus up for a gke cluster之后,我运行为Grafana添加外部IP地址的步骤:

kubectl patch svc "prometheus-1-grafana" --namespace "cluster-1" \
  -p '{"spec": {"type": "LoadBalancer"}}'

但现在不再希望通过外部 ip 访问 Grafana。

我试过 运行 -p '{"spec": {"type": "ClusterIP"}}' 但我只是得到错误:

The Service "prometheus-1-prometheus" is invalid: 
spec.ports[0].nodePort: Forbidden: may not be used when
`type` is 'ClusterIP'

如何执行上述 kubectl patch svc 命令来删除外部 ip?

当您将服务更改为 LoadBalancer 时,NodePort 将归因于该服务。

为了 return 到 ClusterIP 你还需要删除 NodePort.

  • 使用kubectl patch我们将NodePort设置为NULL,这里是命令:
kubectl patch svc "prometheus-1-grafana" --namespace "cluster-1" --type="merge" \
-p '{"spec":{"ports":[{"nodePort":null,"port":<PORT_NUMBER>}],"type":"ClusterIP"}}'

注意: Kubernetes 不允许单独将 nodePort 设置为 null,因为 Port 字段是必填项,make一定要检查正确的端口并进行更改,我以 http 服务器为例。

  • 您可以选择创建 patch.yaml:
spec:
  ports:
  - port: <PORT_NUMBER>
    protocol: TCP
    targetPort: <TARGET_PORT_NUMBER>
  type: ClusterIP

并应用它:

kubectl patch svc "prometheus-1-grafana" --namespace "cluster-1" \
--type="merge" --patch "$(cat patch.yaml)"  

复制:

$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
echo-svc     ClusterIP   10.0.13.9    <none>        80/TCP    65m

$ kubectl patch svc "echo-svc" -p '{"spec": {"type": "LoadBalancer"}}'                                                                
service/echo-svc patched

$ kubectl get svc
NAME         TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
echo-svc     LoadBalancer   10.0.13.9    <pending>     80:32021/TCP   65m

$ kubectl patch svc "echo-svc" --type="merge" -p '{"spec":{"ports":[{"nodePort":null,"port":80}],"type":"ClusterIP"}}'
service/echo-svc patched

$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
echo-svc     ClusterIP   10.0.13.9    <none>        80/TCP    66m

$ kubectl patch svc "echo-svc" -p '{"spec": {"type": "LoadBalancer"}}'                                                                
service/echo-svc patched

$ kubectl get svc
NAME         TYPE           CLUSTER-IP   EXTERNAL-IP      PORT(S)        AGE
echo-svc     LoadBalancer   10.0.13.9    35.223.145.193   80:30394/TCP   66m

$ cat patch.yaml 
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  type: ClusterIP

$ kubectl patch svc "echo-svc" --type="merge" --patch "$(cat patch.yaml)"                                                             
service/echo-svc patched

$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
echo-svc     ClusterIP   10.0.13.9    <none>        80/TCP    66m

参考文献: