问题描述
我为 minikube 集群上的 pod 部署了 (LoadBalancer) 服务,然后通过 minikube service [my_service]
命令公开它。现在我试图“关闭曝光”但找不到任何方法来做到这一点,除了删除它我想避免的。是否可以只关闭公开,而不删除(并重新部署)现有的已公开服务?
解决方法
背景
在关于 ServiceTypes 的 Kubernetes 文档中,您可以找到有关信息,如果您想在外部公开您的集群,您必须使用 NodePort 或 LoadBalancer。
如果您想将服务/应用程序保留在集群中,则应使用 ClusterIP
:
在 cluster-internal IP
上公开服务。 选择此值会使服务只能从集群内部访问。这是默认的 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 编辑
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 apply
您可以编辑您的 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
- 使用一些 3rd 方软件在您的集群中进行更改,例如 Helm 和使用模板。