如何在不更改服务外部IP的情况下更新名称空间?
最初,它没有名称空间,并且已部署:
kind: Service
metadata:
name: my-app
labels:
app: my-app
spec:
type: LoadBalancer
ports:
port: 80
protocol: TCP
selector:
app: my-app
它创建外部IP地址,并指向DNS。现在,我想更新命名空间以使其更有条理。因此,我创建了名称空间。
apiVersion: v1
kind: Namespace
metadata:
name: my-namespace
,并且我已经使用名称空间更新了该服务。
kind: Service
metadata:
name: my-app
namespace: my-namespace
labels:
app: my-app
spec:
type: LoadBalancer
ports:
port: 80
protocol: TCP
selector:
app: my-app
以上文件在my-namespace
中创建了另一个服务,并且External-IP不相同。有没有一种方法可以在不重新创建的情况下更新名称空间?
如果您需要任何信息,请告诉我。谢谢!
答案 0 :(得分:3)
某些云提供商允许您使用https://kubernetes.io/docs/concepts/services-networking/service/#external-ips指定服务的外部IP,如果可以使用它,则应该能够实现所需的功能。但这不会是零停机时间操作,因为您首先需要删除当前服务,并在指定了externalIP的其他命名空间下重新创建它。
答案 1 :(得分:1)
您所追求的似乎是一个静态的公共IP地址,即,您已保留并超过了群集的地址。如果您拥有其中之一,则可以为LoadBalancer
指定它,如上面@Radek所述,或者可以使用提供者特定的注释。这样,您就可以在LoadBalancer
个之间移动IP地址了(Ingress
也是如此)。
但是,看来您尚未分配静态公共IP。这可能是个不错的时机,但是由于Azure似乎不允许您将动态IP“升级”为静态IP,因此这里并不能直接为您提供帮助(*)。
因此,您剩下的工作就是使用新的公共IP创建新的LoadBalancer
资源。为了帮助过渡并避免停机,您可以使用外部DNS条目将用户从第1个LoadBalancer IP地址切换到第2个,如果设置正确,则可以无缝无缝地进行,而无需停机。但是,转换确实需要一些时间:只有在完成DNS TTL周期后,才可以安全删除第一个LoadBalancer
。
如果您没有外部DNS,这说明了为什么设置它是个好主意。
(*)GCP确实允许您执行此操作,我怀疑AWS可以这样做。
答案 2 :(得分:0)
解决此问题的最佳方法是引入nginx入口控制器。让Externel LB将呼叫路由到入口控制器。只需使用正确的服务映射更新入口规则。
优点是您可以通过入口从单个外部IP公开任何数量的应用程序/服务。如果没有进入,您将不得不为要向外界公开的每个应用程序/服务设置一个外部LB