我当前正在运行一个区域性GKE集群,并且想要迁移到一个新的区域集群。旧的群集具有一个带有公共IP的Ingress对象,该对象使用Google托管证书进行HTTPS终止。
我的迁移计划是:
kubectl apply -f clusterConfig.yaml
。最大的问题是,ManagedCertificates将至少需要15分钟。将IP移到准备就绪后。这将导致在此时间段内所有服务不可用。在新的ManagedCertificates准备好之前,有什么方法可以在新集群中使用旧的ManagedCertificates的密钥?
答案 0 :(得分:3)
在对我的实验室帐户进行一些研究和测试之后,我将说明如何在许多LoadBalancers中重用/重新分配当前的ManagedCertificate。
如here所述:
当您的域解析为多个负载均衡器(多个Ingress)的IP地址时,您应该创建一个ManagedCertificate资源并将其附加到所有Ingress。如果您改为创建许多ManagedCertificate资源并将它们分别附加到单独的Ingress,则证书颁发机构可能无法验证您的域的所有权,并且某些证书可能无法设置
我正在区域集群(旧)上的Kubernetes 1.17.4中运行一个简单的应用程序,并希望使用GKE kubernetes 1.17.5迁移到新的Zonal集群。
在旧群集中,我创建了一个ManagedCertified
和一个入口。
在新集群中,我将仅使用前一个ManagedCertificate
来创建一个入口:
让我们开始为LoadBalancer分配新的IP地址
gcloud compute addresses create newip --global
使用以下命令获取新IP:
gcloud compute addresses describe newip --global
结果:
address: 34.107.xxx.xxx
...
在此示例中,我使用一个简单的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
您需要从键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
这时,我们有了一个功能性的应用程序,该应用程序使用了从旧群集提供的SSL进行入口。
要将所有流量从以前的群集移动到新群集,只需使用新IP更改DNS记录。
根据您使用的DNS提供商,您可以使用新的IP创建一个新的dns条目,并使用dns权重,轮询等方式控制流量。
参考:
https://cloud.google.com/kubernetes-engine/docs/how-to/managed-certs