是否可以在不停机的情况下重新配置 Kubernetes 中的 运行 Ingress?
Is a reconfiguration of running Ingress in Kubernetes possible without downtime?
我们目前面临以下情况:
Ingress1_legacy: service.domain.com
/ >> service_legacy
Ingress2_new: service_one.domain.com, service_two.domain.com
/one >> service_new_one
/two >> service_new_two
我们的计划是将 service.domain.com 无缝重定向到 service_new_one。现在的想法是像这样编辑 Ingress1 以指向 service_new_one:
Ingress1_legacy (updated): service.domain.com
/ >> service_new_one
我们的经验是,一旦我们更改 Ingress1_legacy 的配置,对 service.domain.com 的调用就会导致 502。这种情况持续了足够长的时间,以便我们更好地回滚到原来的状态配置。
那么这是一个可行的策略吗?我们的假设是否正确,Ingress 中服务路由的更改配置应该允许无缝、立即 迁移到其他服务?或者 Ingress 配置的更改通常会导致负载平衡停机?
简短回答:当您更新入口资源时,由于 Google 云平台和 Kubernetes 平台都需要这个过程,因此会有一小段停机时间。
我不排除有办法减少或取消停机时间,但如果你只是更新入口,你就会体验到它。
小实验
我们有以下入口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /index.html
backend:
serviceName: httpd
servicePort: 80
- path: /apache
backend:
serviceName: nginx
servicePort: 80
和 4 个服务 nginx
、nxing2
、httpd
和 httpd2
指向 4 个不同的部署,每个部署在不同的节点上。
运行:
kubectl run nginx2 --image=nginx
kubectl run nginx2 --image=nginx
kubectl run httpd --image=httpd:2.4
kubectl run httpd2 --image=httpd:2.4
并创建:
kind: Service
apiVersion: v1
metadata:
name: httpd
spec:
selector:
run: httpd2
type: LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 80
---
kind: Service
[...]
我们连接到 http://ingress-ip/index.html 并想象经典的“有效!”
一旦您将入口更改为指向 nginx2
和 httpd2
:
- ~ 1分钟继续服务老服务
- ~ 1 分钟
/nginx
带你到“Error: Server Error
”和 /index.html
“default backend - 404
”
- 3分钟后我们终于恢复稳定
我们目前面临以下情况:
Ingress1_legacy: service.domain.com
/ >> service_legacy
Ingress2_new: service_one.domain.com, service_two.domain.com
/one >> service_new_one
/two >> service_new_two
我们的计划是将 service.domain.com 无缝重定向到 service_new_one。现在的想法是像这样编辑 Ingress1 以指向 service_new_one:
Ingress1_legacy (updated): service.domain.com
/ >> service_new_one
我们的经验是,一旦我们更改 Ingress1_legacy 的配置,对 service.domain.com 的调用就会导致 502。这种情况持续了足够长的时间,以便我们更好地回滚到原来的状态配置。
那么这是一个可行的策略吗?我们的假设是否正确,Ingress 中服务路由的更改配置应该允许无缝、立即 迁移到其他服务?或者 Ingress 配置的更改通常会导致负载平衡停机?
简短回答:当您更新入口资源时,由于 Google 云平台和 Kubernetes 平台都需要这个过程,因此会有一小段停机时间。
我不排除有办法减少或取消停机时间,但如果你只是更新入口,你就会体验到它。
小实验 我们有以下入口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /index.html
backend:
serviceName: httpd
servicePort: 80
- path: /apache
backend:
serviceName: nginx
servicePort: 80
和 4 个服务 nginx
、nxing2
、httpd
和 httpd2
指向 4 个不同的部署,每个部署在不同的节点上。
运行:
kubectl run nginx2 --image=nginx
kubectl run nginx2 --image=nginx
kubectl run httpd --image=httpd:2.4
kubectl run httpd2 --image=httpd:2.4
并创建:
kind: Service
apiVersion: v1
metadata:
name: httpd
spec:
selector:
run: httpd2
type: LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 80
---
kind: Service
[...]
我们连接到 http://ingress-ip/index.html 并想象经典的“有效!”
一旦您将入口更改为指向 nginx2
和 httpd2
:
- ~ 1分钟继续服务老服务
- ~ 1 分钟
/nginx
带你到“Error: Server Error
”和/index.html
“default backend - 404
” - 3分钟后我们终于恢复稳定