【问题标题】:How to migrate ManagedCertificates from regional to zonal GKE cluster without down time如何在不停机的情况下将 ManagedCertificates 从区域性 GKE 集群迁移到区域性 GKE 集群
【发布时间】:2020-05-14 10:14:50
【问题描述】:

我目前正在运行一个区域性 GKE 集群,并希望迁移到一个新的区域性集群。旧集群有一个带有公共 IP 的 Ingress 对象,使用 Google 托管证书来终止 HTTPS。

我的迁移计划是:

  1. 创建新的地区集群。
  2. kubectl apply -f clusterConfig.yaml
  3. 将公共 IP 移至新集群。

最大的问题是,ManagedCertificates 至少需要 15 分钟。在 IP 移动以准备就绪后。这将使所有服务在此时间段内不可用。在新的 ManagedCertificates 准备好之前,有什么方法可以在新集群中使用旧的 ManagedCertificates 的密钥?

【问题讨论】:

  • 您需要重用旧集群的 IP?如果您使用 DNS,您可以创建一个新 IP,生成证书并在准备好后将 DNS 更改为新 IP。
  • 感谢您的评论。一个新的 IP 是可能的,但是如何在 DNS 记录仍然引用旧 IP 的情况下生成新证书?据我了解,ManagedCertificates 在创建期间访问域?
  • 我想我找到了帮助你的方法。我将在我的实验室进行测试并尽快返回。

标签: google-kubernetes-engine


【解决方案1】:

在我的实验室帐户中进行了一些研究和测试之后,我将解释如何在许多 LoadBalancer 中重用/重新分配当前的 ManagedCertificate。

如上所述here

当您的域解析为多个负载均衡器(多个 Ingress)的 IP 地址时,您应该创建一个 ManagedCertificate 资源并将其附加到所有 Ingress。如果您改为创建许多 ManagedCertificate 资源并将每个资源附加到单独的 Ingress,则证书颁发机构可能无法验证您的域的所有权,并且您的某些证书​​可能无法配置

我正在区域集群(旧)上的 Kubernetes 1.17.4 中运行一个简单的应用程序,并希望使用 GKE kubernetes 1.17.5 迁移到新的区域集群。

在旧集群中,我创建了一个ManagedCertified 和一个入口。 在新集群中,我将只创建一个重用以前的 ManagedCertificate 的入口:

  1. 新的负载均衡器 IP

让我们开始为 LoadBalancer 分配一个新的 IP 地址

gcloud compute addresses create newip --global

使用以下命令获取新 IP:

gcloud compute addresses describe newip --global

结果:

address: 34.107.xxx.xxx
...
  1. 部署应用程序

对于这个例子,我使用了一个简单的echo-server 部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: echo
spec:
  selector:
    matchLabels:
      app: echo
  template:
    metadata:
      labels:
        app: echo
    spec:
      containers:
      - name: echo
        image: mendhak/http-https-echo
        ports:
        - name: http
          containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: echo-svc
spec:
  type: NodePort
  selector:
    app: echo
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  1. 创建入口

你需要从keyingress.gcp.kubernetes.io/pre-shared-cert中获取值从旧入口,并用新ip配置注解kubernetes.io/ingress.global-static-ip-name 名字的

您可以使用命令kubectl get ing old-ingress -oyaml 获取上一个集群上的密钥。

为什么?这是解释here

托管证书使用 kubernetes.io/pre-shared-cert 注释与 Ingress 通信。

here:

ingress.gcp.kubernetes.io/pre-shared-cert:使用此注解来引用证书和密钥

最终的 yaml 将如下所示:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-new-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: newip #new ip name
    ingress.gcp.kubernetes.io/pre-shared-cert: mcrt-a798051f-a50d-4b38-84b1-xxxxxxxxxxxx # from the old ingress
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: echo-svc
          servicePort: 80
        path: /

应用入口规范并等待负载均衡器配置...几分钟后使用kubectl get ing 验证是否一切正常并尝试卷曲 ip(SSL 将不匹配,因为您正在使用 ip)

curl -IL -k 34.107.xxx.xxx

HTTP/2 200
x-powered-by: Express
content-type: application/json; charset=utf-8
content-length: 647
etag: W/"287-qCxPIULxqrMga5xHN8AAKMHsUi4"
date: Wed, 20 May 2020 11:49:14 GMT
via: 1.1 google
alt-svc: clear
  1. 更改 DNS 记录

此时,我们有了一个使用从旧集群提供的 SSL 的入口功能应用程序。

要将所有流量从以前的集群移动到新集群,您只需使用新 ip 更改 DNS 记录。

根据您使用的 DNS 提供商,您可以使用新 ip 创建一个新的 dns 条目,并使用 dns 权重、循环等控制流量...

参考资料:

https://cloud.google.com/kubernetes-engine/docs/how-to/managed-certs

【讨论】:

  • 感谢您精心研究的答案!这正是我最终所做的,而且效果很好。我不可能把它写得这么好,但可以确认这确实有效。所以,我接受并投了赞成票 :) 考虑到 GKE 定价结构最近发生的变化,希望它能对其他人有所帮助。
  • 是的,谢谢你的回答。目前尚不清楚如何完成迁移,例如使用最初为域创建的托管证书删除/删除旧集群?我们是否删除旧集群中使用的 IP 地址,然后在新集群中创建新的托管证书,最后更新新的 Ingerss(通过删除 ingress.gcp.kubernetes.io/pre-shared-cert: 注释并添加新证书)?
猜你喜欢
  • 2019-12-04
  • 2021-04-13
  • 2020-04-22
  • 2021-06-12
  • 2021-02-14
  • 1970-01-01
  • 2021-04-02
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多