在不同 cluster/context 中从 pod 运行 监控 AKS container/pod 状态
Monitor AKS container/pod status from pod running in different cluster/context
我在不同的集群中有应用程序 运行,如下所示(举个例子)
cluster1 - for scratch work
cluster2 - as staging env (pods running application )
cluster3 - as testing env (pods running application )
cluster4 - monitor app
所有 AKS 集群都连接在网络中,监控应用程序是 cluster4
上的 运行,它具有自定义监控仪表板。我正在尝试将 cluster2
和 cluster3
上应用程序 运行 的 container/pod 状态添加到该仪表板。
有没有一种方法可以使用 java/REST API/shell.
从 cluster4
中的应用 运行 获取 container/pod 状态
我遇到了 Kubernetes java 客户端 InclusterClientExample。
对于这种情况,是否有更好的方法来获取不同集群上应用程序 运行 的 container/pod 状态。
还有许多其他选项,试用了 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(主机)和访问令牌信息。
另一个选项是启用 Log Analytics API。
创建工作区并使用 REST API 触发查询。以下是如何操作的高级说明。
- 如果设置了 AAD,获取 TENENT ID 信息。
- 注册应用程序,创建服务主体。 (提供应用程序(客户端)ID)
- 在 SP 中,添加密钥。 (记下来,因为以后看不到)
- 添加API权限,select日志分析
- 授予委托权限 (Data.Read) 和应用程序权限 (Data.Read),我的情况是这样。
- 在 Log Analytics 工作区的访问控制 (IAM) 中,添加服务主体并提供 Reader 访问权限。 ( workspace-name, resourceGroup-name, workspace-id, subscription-id 需注明)
根据 link。
首先,我们需要使用 SP 和 Tenet id 获取 access_token。 link 中的一些屏幕截图是旧的。
使用 curl 命令:
- 获取令牌
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
示例查询文件
{
"query": "Perf | where CounterName == 'Available MBytes' | summarize avg(CounterValue) by bin(TimeGenerated, 1h)",
"timespan": "PT12H"
}
}
输出将是查询的结果。
我在不同的集群中有应用程序 运行,如下所示(举个例子)
cluster1 - for scratch work
cluster2 - as staging env (pods running application )
cluster3 - as testing env (pods running application )
cluster4 - monitor app
所有 AKS 集群都连接在网络中,监控应用程序是 cluster4
上的 运行,它具有自定义监控仪表板。我正在尝试将 cluster2
和 cluster3
上应用程序 运行 的 container/pod 状态添加到该仪表板。
有没有一种方法可以使用 java/REST API/shell.
从cluster4
中的应用 运行 获取 container/pod 状态
我遇到了 Kubernetes java 客户端 InclusterClientExample。
对于这种情况,是否有更好的方法来获取不同集群上应用程序 运行 的 container/pod 状态。
还有许多其他选项,试用了 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(主机)和访问令牌信息。
另一个选项是启用 Log Analytics API。
创建工作区并使用 REST API 触发查询。以下是如何操作的高级说明。
- 如果设置了 AAD,获取 TENENT ID 信息。
- 注册应用程序,创建服务主体。 (提供应用程序(客户端)ID)
- 在 SP 中,添加密钥。 (记下来,因为以后看不到)
- 添加API权限,select日志分析
- 授予委托权限 (Data.Read) 和应用程序权限 (Data.Read),我的情况是这样。
- 在 Log Analytics 工作区的访问控制 (IAM) 中,添加服务主体并提供 Reader 访问权限。 ( workspace-name, resourceGroup-name, workspace-id, subscription-id 需注明)
根据 link。 首先,我们需要使用 SP 和 Tenet id 获取 access_token。 link 中的一些屏幕截图是旧的。
使用 curl 命令:
- 获取令牌
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
示例查询文件
{
"query": "Perf | where CounterName == 'Available MBytes' | summarize avg(CounterValue) by bin(TimeGenerated, 1h)",
"timespan": "PT12H"
}
}
输出将是查询的结果。