如何让已经暴露的服务不暴露?

how to make already exposed service not to be exposed?

我在我的 minikube 集群上为一个 pod 部署了一个 (LoadBalancer) 服务,然后通过 minikube service [my_service] 命令公开它。现在我试图“关闭曝光”但找不到任何方法来做到这一点,除了删除它我想避免的。是否可以只关闭暴露,而不是删除(并重新部署)现有的已经暴露的服务?

背景

在关于 ServiceTypes, you can find information that if you want to expose your cluster outside you have to use NodePort or LoadBalancer.

的 Kubernetes 文档中

如果你想将你的 service/application 保留在集群中,你应该使用 ClusterIP:

Exposes the Service on a cluster-internal IP. Choosing this value makes the Service only reachable from within the cluster. This is the default ServiceType.

取决于您的版本,您可以对其进行编辑或使用解决方法。例如,在 K8s 1.16 中,您将无法使用,因为可能会发生一些错误。

$ kubectl get svc
NAME         TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)        AGE
kubernetes   ClusterIP      10.8.0.1      <none>          443/TCP        3d20h
my-nginx     LoadBalancer   10.8.14.224   34.121.77.108   80:32039/TCP   3m16s
$ kubectl patch service my-nginx -p '{"spec":{"type":"ClusterIP"}}'
The Service "my-nginx" is invalid: spec.ports[0].nodePort: Forbidden: may not be used when `type` is 'ClusterIP'

解决方案

然而,由于您使用的是 Minikube,所以我猜您使用的是较新的版本 (1.20),因此您可以使用以下方式更改它:

  1. kubectl edit

kubectl edit svc <yourSvcName> 并将类型更改为 ClusterIP。 它将打开 Vi 编辑器,您可以在其中将 spec.type 更改为 ClusterIP 或将其删除,因为 Kubernetes 服务的默认类型是 ClusterIP 因此如果不指定, Kubernetes 会自动使用 ClusterIP.

$ kubectl get svc
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1        <none>        443/TCP        25s
my-nginx     LoadBalancer   10.107.129.201   <pending>     80:30173/TCP   8s
minikube-new:~$ kubectl edit svc my-nginx
service/my-nginx edited
sekreta@minikube-new:~$ kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   46s
my-nginx     ClusterIP   10.107.129.201   <none>        80/TCP    29s
  1. kubectl 补丁

$ kubectl patch service <yourServiceName> -p '{"spec":{"type":"ClusterIP"}}'

$ kubectl get svc
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1        <none>        443/TCP        10m
my-nginx     LoadBalancer   10.107.129.201   <pending>     80:30456/TCP   2m
minikube-new:~$ kubectl patch service my-nginx -p '{"spec":{"type":"ClusterIP"}}'
service/my-nginx patched
minikube-new:~$ kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   10m
my-nginx     ClusterIP   10.107.129.201   <none>        80/TCP    3m
  1. kubectl 应用

您可以编辑您的 Yaml 并删除 spec.type 或者有 2 个带有 ClusterIPLoadBalancer 的 Yaml,并根据您的需要切换它们。

$ kubectl apply -f svc.yaml 
service/my-nginx configured
minikube-new:~$ kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   22m
my-nginx     ClusterIP   10.111.237.133   <none>        80/TCP    16s
  1. 使用一些第 3 方软件在集群中进行更改,例如 Helm 和使用模板。