以下功能的目标是:
-
将K8s群集上的应用程序实例缩小到0。
-
等待缩放完成。
-
验证当前比例是否达到0,并且该应用程序是否不存在活动实例。
-
将应用程序放大到其原始比例。
-
等待放大完成。
-
验证当前比例是否达到其原始比例,以及该应用是否存在活动实例。
_get_desired_replicas()
->返回当前运行的应用程序实例的计数
_instances()
->返回活动实例及其ID的列表。
问题
_实例()
在缓存机制上工作,不会立即反映当前系统状态。有一个明显的3-4秒的延迟,之后将获取系统的正确状态。由于_instances()没有立即恢复当前系统状态,这会导致while循环被卡住(请参阅下面的示例),直到超时过期。
一个选择是选择
or
而不是
and
但我不想朝那个方向走。
def _restart_k8sapp_wait(app, timeout=SCALE_UPDOWN_WAIT):
_sleep_interval = 1
desired_scale = _get_desired_replicas(app)
if desired_scale == 0:
return False
_scale_app(app, 0)
barrier_completed = time.time() + timeout
while time.time() < barrier_completed:
instances = _instances(app)
current_scale = _get_desired_replicas(app)
if current_scale == 0 and not instances:
_scale_app(app, desired_scale)
refreshed_instances = _instances(app)
refreshed_scale = _get_desired_replicas(app)
if refreshed_scale == desired_scale and refreshed_instances:
return True
time.sleep(_sleep_interval)
return False
Example: while loop iterations after app scale down
- iter 1:
desired_scale = 1
instances=[item1], current_scale = 0
if current_scale == 0 and not instances: evaluated to False
iter 1 finished ..
- iter 2:
desired_scale = 1
instances=[], current_scale = 0
if current_scale == 0 and not instances: evaluated to True
instances = [], current_scale = 1
if current_scale == desired_scale and not instances: evaluated to False
iter 2 finished ..
- iter 3:
desired_scale = 1
instances=[item1], current_scale = 1
if current_scale == 0 and not instances: evaluated to False
iter 3 finished ..