Kubernetes:如何在不更改外部IP地址的情况下更新名称空间?

时间:2019-02-15 07:50:25

标签: kubernetes

如何在不更改服务外部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不相同。有没有一种方法可以在不重新创建的情况下更新名称空间?

如果您需要任何信息,请告诉我。谢谢!

3 个答案:

答案 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