You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IaaC测试场景下,如何用Java监控AKS集群创建状态

解决AKS集群创建后等待资源就绪与部署成功的Java实现方案

问题场景

我正在为IaaC项目编写测试用例,测试流程如下:

Given I do not have a AKS cluster
And I call an api to create a cluster
Then I have a cluster up and running

在第三步验证环节,需要完成两个核心等待逻辑:

  1. 等待AKS资源本身创建完成(Provisioning状态变为成功)
  2. 资源创建完成后,等待集群内部部署状态完全就绪(节点就绪、核心组件运行正常)

查阅Azure官方文档后,未找到azure-sdk-for-java提供的现成Watcher工具,求可行的实现方案。


方案一:手动轮询实现(最稳定可控)

Azure SDK for Java虽然没有现成的Watcher工具,但可以通过调用集群状态查询API,结合轮询机制实现等待逻辑。以下是具体代码示例:

1. 等待AKS资源创建完成

核心是轮询集群的provisioningState,直到状态变为Succeeded:

import com.azure.resourcemanager.containerservice.models.KubernetesCluster;
import com.azure.resourcemanager.containerservice.models.ProvisioningState;

public void waitForClusterProvisioned(KubernetesCluster cluster, long timeoutMinutes, long pollIntervalSeconds) throws InterruptedException {
    long endTime = System.currentTimeMillis() + timeoutMinutes * 60 * 1000;
    while (System.currentTimeMillis() < endTime) {
        // 刷新集群状态
        cluster = cluster.refresh();
        ProvisioningState state = cluster.provisioningState();
        
        if (ProvisioningState.SUCCEEDED.equals(state)) {
            System.out.println("AKS cluster provisioning completed successfully");
            return;
        } else if (ProvisioningState.FAILED.equals(state)) {
            throw new RuntimeException("AKS cluster provisioning failed");
        }
        
        // 间隔轮询
        Thread.sleep(pollIntervalSeconds * 1000);
    }
    throw new RuntimeException("Timeout waiting for AKS cluster provisioning");
}

2. 等待集群部署状态就绪

资源创建完成后,还需要验证节点池状态、核心组件就绪情况。可以通过查询节点池的powerState和集群的agentPoolProfiles状态,或者进一步检查K8s API的节点就绪状态:

import com.azure.resourcemanager.containerservice.models.AgentPool;
import com.azure.resourcemanager.containerservice.models.PowerState;

public void waitForClusterDeploymentReady(KubernetesCluster cluster, long timeoutMinutes, long pollIntervalSeconds) throws InterruptedException {
    long endTime = System.currentTimeMillis() + timeoutMinutes * 60 * 1000;
    while (System.currentTimeMillis() < endTime) {
        cluster = cluster.refresh();
        boolean allPoolsReady = true;
        
        // 检查所有节点池的运行状态
        for (AgentPool pool : cluster.agentPools().values()) {
            pool = pool.refresh();
            if (!PowerState.RUNNING.equals(pool.powerState().code())) {
                allPoolsReady = false;
                break;
            }
            // 可选:检查节点池的节点数量是否符合预期
            if (pool.count() != pool.provisionedCount()) {
                allPoolsReady = false;
                break;
            }
        }
        
        if (allPoolsReady) {
            // 可选:进一步通过K8s API验证核心组件(如kube-system的Pod)就绪
            // 这里可以集成kubernetes-client-java来查询Pod状态
            System.out.println("AKS cluster deployment is fully ready");
            return;
        }
        
        Thread.sleep(pollIntervalSeconds * 1000);
    }
    throw new RuntimeException("Timeout waiting for AKS cluster deployment to be ready");
}

方案二:结合RxJava实现异步轮询(更优雅的异步方式)

如果项目中使用RxJava,可以将轮询逻辑封装为Observable,避免阻塞线程:

import io.reactivex.rxjava3.core.Observable;
import java.util.concurrent.TimeUnit;

public Observable<KubernetesCluster> waitForClusterProvisionedAsync(KubernetesCluster cluster, long timeoutMinutes) {
    return Observable.interval(30, TimeUnit.SECONDS)
            .map(tick -> cluster.refresh())
            .filter(c -> ProvisioningState.SUCCEEDED.equals(c.provisioningState()))
            .firstOrError()
            .timeout(timeoutMinutes, TimeUnit.MINUTES)
            .toObservable();
}

关键注意事项

  • 合理设置轮询间隔和超时时间:AKS集群创建通常需要10-20分钟,建议超时设置为30分钟,轮询间隔30-60秒
  • 处理API调用异常:轮询过程中可能遇到API限流或临时故障,建议添加重试逻辑(比如用Azure SDK的重试策略,或者手动捕获异常后重试)
  • 可选的深度验证:如果需要更严格的就绪检查,可以通过K8s Java客户端连接到集群,验证Node的Ready状态、kube-system命名空间下的Pod是否全部Running

内容的提问来源于stack exchange,提问作者Anish Nagaraj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 14:10:16