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

时间:2020-05-14 10:14:50

标签: google-kubernetes-engine

我当前正在运行一个区域性GKE集群,并且想要迁移到一个新的区域集群。旧的群集具有一个带有公共IP的Ingress对象,该对象使用Google托管证书进行HTTPS终止。

我的迁移计划是:

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

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

1 个答案:

答案 0 :(得分:3)

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

here所述:

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

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

在旧群集中,我创建了一个ManagedCertified和一个入口。 在新集群中,我将仅使用前一个ManagedCertificate来创建一个入口:

  1. 新的LoadBalancer 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. 创建入口

您需要从键ingress.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(由于您使用的是ip,SSL尚不匹配) )

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