从在不同集群/上下文中运行的 pod 监控 AKS 容器/pod 状态

时间:2021-02-03 05:43:09

标签: azure kubernetes monitoring

我的应用程序在不同的集群中运行,如下所示(例如)

 cluster1 - for scratch work
 cluster2 - as staging env (pods running application )
 cluster3 - as testing env (pods running application )
 cluster4 - monitor app

所有 AKS 集群都连接在网络中,监控应用程序在 cluster4 上运行,该应用程序具有自定义监控仪表板。我正在尝试将在 cluster2cluster3 上运行的应用的容器/pod 状态添加到该信息中心。

是否可以使用 java/REST API/shell 从 cluster4 中运行的应用中获取容器/pod 状态。

我遇到了 Kubernetes java 客户端 InclusterClientExample

对于这种情况,是否有更好的方法来获取运行在不同集群上的应用程序的容器/pod 状态。

2 个答案:

答案 0 :(得分:1)

另一个选项是启用 Log Analytics API。

  • 创建一个工作区并使用 REST API 来触发查询。下面是如何做到这一点的高层次。

    • 如果设置了 AAD,请获取 TENENT ID 信息。
    • 注册应用程序,创建一个服务主体。 (提供应用程序(客户端)ID)
      • 在 SP 中,添加一个密钥。 (请记下这一点,因为以后将无法查看)
      • 添加 API 权限,选择 Log Analytics
        • 授予我的委托权限 (Data.Read) 和应用程序权限 (Data.Read)。
    • 在 Log Analytics 工作区访问控制 (IAM) 中,添加服务主体并提供读者访问权限。 (要注意工作区名称、资源组名称、工作区 ID、订阅 ID)

根据 link。 首先,我们需要使用 SP 和 Tenet id 获取 access_token。此链接中的屏幕截图很少是旧的。

使用 curl 命令:

  1. 获取令牌
find_unique_name <- function(nNames, environment) {

  un <- replicate(nNames, paste0(sample(LETTERS, 10), collapse=""))

  while (any(duplicated(un)) | any(un %in% ls(envir = environment))) {

    un <- replicate(nNames, paste0(sample(LETTERS, 10), collapse=""))
  }    

  return(un)
}
  1. 获取日志信息
curl -vX POST -d 'grant_type=client_credentials&client_id=[SP application(client) id]&client_secret=[Client secret created in SP]&resource=https://management.azure.com/' https://login.microsoftonline.com/[TENENT_ID]/oauth2/token

示例查询文件

curl -vX post -H "Authorization: Bearer [TOKEN-FROM-ABOVE]" -H "Content-Type: application/json" -H "Prefer: response-v1=true"-d @samplequery.json https://api/loganalytics.io/v1/subscriptions/[subscription-id-of-workspace]/resourceGroups/[Resource-group-name-of-workspace]/providers/Microsoft.OperationalInsights/workspaces/<workspace-name>/api/query?api-version=2020-08-01

输出将是查询的结果。

答案 1 :(得分:0)

有许多其他选项,尝试了 camel-kubernetes 组件。这使用了由 fabric8 管理的 kubernetes-client。

  • 如果使用 minikube,请设置并启动应用程序。

  • 使用 minikube dashboard kubectl proxy --port=8080 以便可以从主机访问集群。

  • 在项目中添加camel-core和camel-kubernetes依赖

package com.learning.camel.examples.prog3;

import org.apache.camel.CamelContext;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.impl.DefaultCamelContext;

public class ListPodsInK8s {
    
    public static void main(String[] args) throws Exception {
        
        CamelContext context = new DefaultCamelContext();
        try {
        context.addRoutes(new RouterToAccessK8s());
        context.start();
        
        ProducerTemplate template = context.createProducerTemplate();
        template.start();
        template.sendBody("direct:input1","example");
        Thread.sleep(3000); // sleep 3 seconds
        }finally {
            context.stop();
        }       
    }
}
  • 将路由以获取数据的代码
package com.learning.camel.examples.prog3;

import java.util.List;
import org.apache.camel.builder.RouteBuilder;
import io.fabric8.kubernetes.api.model.Pod;

public class RouterToAccessK8s  extends RouteBuilder{

    public String host = "http://127.0.0.1:8080"; // use az command to get server url
    public String authToken = "";  // fetch the token using az command in case AKS
    public String certPath = "C:\\Users\\tim\\.minikube\\profiles\\minikube\\client.crt"; //minikube 
    public String certKey = "C:\\Users\\tim\\.minikube\\profiles\\minikube\\client.key"; // minikube
    @Override
    public void configure() throws Exception {
        
        from("direct:input1")
        .toF("kubernetes-pods://%s?clientCertFile=%s&clientKeyFile=%s&namespace=default&operation=listPods", host,certPath,certKey)
        .log("pod size: ${body.size()}")
        .process(exchange -> {
            List<Pod> pods = exchange.getIn().getBody(List.class);
            System.out.println("NameSpace | PodName | Status");
            pods.stream()
            .forEach(pod -> {System.out.println(pod.getMetadata().getNamespace()+ " |  "+ pod.getMetadata().getName()+" | "+pod.getStatus().getPhase());});
        })
        .end();
    }
}

输出:

NameSpace | PodName | Status
default |  ngnix | Succeeded
kube-system |  coredns-74ff55c5b-26drq | Running
kube-system |  etcd-minikube | Running
kube-system |  kube-apiserver-minikube | Running
kube-system |  kube-controller-manager-minikube | Running
kube-system |  kube-proxy-b97ss | Running
kube-system |  kube-scheduler-minikube | Running
kube-system |  storage-provisioner | Running
kubernetes-dashboard |  dashboard-metrics-scraper-c95fcf479-x4bgq | Running

对于 Azure,az aks get-crediential --file - 可用于获取主服务器 URL(主机)和访问令牌信息。

相关问题