如何在不停机的情况下将 ManagedCertificates 从区域迁移到区域 GKE 集群

jan*_*ogt 4 google-kubernetes-engine

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

我的移民计划是:

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

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

Mr.*_*ler 5

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

正如这里提到的:

当您的域解析为多个负载均衡器(多个 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
Run Code Online (Sandbox Code Playgroud)

使用以下命令获取新 IP:

gcloud compute addresses describe newip --global
Run Code Online (Sandbox Code Playgroud)

结果:

address: 34.107.xxx.xxx
...
Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)
  1. 创建入口

您需要ingress.gcp.kubernetes.io/pre-shared-cert 从旧 ingress的 key 中获取值,并kubernetes.io/ingress.global-static-ip-name使用新的 ip 名称配置注释

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

为什么?在这里解释:

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

这里

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: /

Run Code Online (Sandbox Code Playgroud)

应用入口规范并等待负载均衡器配置......几分钟后验证一切是否正常使用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
Run Code Online (Sandbox Code Playgroud)
  1. 更改 DNS 记录

在这一点上,我们有一个使用旧集群提供的 SSL 的入口功能应用程序。

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

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

参考:

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