如何让已经暴露的服务不暴露?
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),因此您可以使用以下方式更改它:
- 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
- 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
- kubectl 应用
您可以编辑您的 Yaml 并删除 spec.type
或者有 2 个带有 ClusterIP
和 LoadBalancer
的 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
- 使用一些第 3 方软件在集群中进行更改,例如 Helm 和使用模板。
我在我的 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),因此您可以使用以下方式更改它:
- 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
- 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
- kubectl 应用
您可以编辑您的 Yaml 并删除 spec.type
或者有 2 个带有 ClusterIP
和 LoadBalancer
的 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
- 使用一些第 3 方软件在集群中进行更改,例如 Helm 和使用模板。