齐全的文章在基于Spring Boot + HttpClient框架的多平台多接口数据一致性校验diff测试2
6. 边缘端资源管理 > 主机资源 > 容器主机 node
登录跳板机,登录gsc服务器194结尾
统计个数
[root@allinone ~]# kubectl get node -A|awk '{print $1"|||"$2"|||node,"}'|grep -v 'NAME'|wc -l
过滤需要的字段
名称 状态 类型
[root@allinone ~]# kubectl get node -A|awk '{print $1"|||"$2"|||node,"}'|grep -v 'NAME'
allinone|||Ready|||node,
kubesphere-a3c6e800|||Ready|||node,
rancher-1d58f7a4|||Ready|||node,
[root@allinone ~]# kubectl get node -A|head -n1
NAME STATUS ROLES AGE VERSION
最终解析结果格式,拷贝入代码namespace.txt
5. 边缘端资源管理 > 容器资源 > 存储管理 > 命名空间 namespace
登录跳板机,登录gsc服务器194结尾
统计个数
[root@allinone ~]# kubectl get namespace -A|grep -v 'NAME'|awk '{print $1"|||"$2"|||namespace,"}'|wc -l
过滤需要的字段
命名空间 状态 类型
[root@allinone ~]# kubectl get namespace -A|grep -v 'NAME'|awk '{print $1"|||"$2"|||namespace,"}'
[root@node1 ~]# kubectl get namespace -A |head -n2
NAME STATUS AGE
最终解析结果格式如NAME,拷贝入代码namespace.txt
rancher-operator-system|||Active|||namespace,
user-c8m7x|||Active|||namespace,
4. 边缘端资源管理 > 容器资源 > 工作负载 > 服务 service
登录跳板机,登录gsc服务器194结尾
统计个数
[root@allinone ~]# kubectl get service -A |grep -v 'NAME'|awk '{print $2"|||"$1"|||"$4"|||"$3","}'|grep -v 'NAME'|wc -l
84
过滤需要的字段
名称 命名空间 集群IP 类型
[root@allinone ~]# kubectl get service -A |grep -v 'NAME'|awk '{print $2"|||"$1"|||"$4"|||"$3","}'|grep -v 'NAME'
最终解析结果格式如NAME|||NAMESPACE|||CLUSTER-IP |||TYPE,拷贝入代码deployment.txt
mec-cmo-relationship|||lecp-resources|||None|||ClusterIP,
register-server|||lecp-resources|||10.xx.xx.xx|||NodePort,
3. 边缘端资源管理 > 容器资源 > 工作负载 > 容器组 pod
登录跳板机,登录gsc服务器194结尾
统计个数
[root@allinone ~]# kubectl get pod -A -o wide |grep -v 'NAME'|awk '{print $2"|||"$4"|||"$1"|||"$7"|||"$8"|||"$5"|||pod,"}'|grep -v 'NAME'|wc -l
110
过滤需要的字段
Pods名称 状态 命名空间 ip地址 所在节点 类型
[root@allinone ~]# kubectl get pod -A -o wide |grep -v 'NAME'|awk '{print $2"|||"$4"|||"$1"|||"$7"|||"$8"|||"$5"|||pod,"}'|grep -v 'NAME'
2个接口对应的最终结果为
[root@allinone ~]# kubectl get pod -A -o wide |grep -v 'NAME'|awk '{print $2"|||"$4"|||"$8"|||"$1","}'|grep -v 'NAME'
最终解析结果NAME|||STATUS|||NAMESPACE|||NODE|||NOMINATED|||RESTARTS,拷贝入代码pod.txt
[root@allinone ~]# kubectl get pod -A -o wide |grep -v 'NAME'|awk '{print $2"|||"$4"|||"$1"|||"$7"|||"$8"|||"$5"|||pod,"}'|grep -v 'NAME'|grep logging-init-wpwpk
需要把服务器pod容器状态为Completed的转化为和接口状态一致的Succeeded
String status = values[1];
if(status.equals("Completed")){
status="Succeeded";
}
查看容器的状态
[root@allinone ~]# kubectl get pod -A -o wide |grep -v 'NAME'|awk '{print $4}'|grep -v 'NAME'|sort |uniq -c
10 Completed 对应页面的成功 对应接口的Succeeded
2 EdgeStatusCodeFailed 对应页面的异常 对应接口的Failed
1 ErrImagePull
1 ImagePullBackOff 对应页面的挂起 对应接口的Pending
1 Pending 对应页面的挂起 对应接口的Pending
96 Running 对应页面的运行中 对应接口的Running
if (status.equals("Completed")) {
status = "Succeeded";
} else if (status.equals("EdgeStatusCodeFailed")) {
status = "Failed";
} else if (status.equals("ImagePullBackOff")) {
status = "Pending";
}
jo.put("status", status);
遇到的问题以及解决
发现有的容器服务器状态和接口不一致
[root@allinone ~]# kubectl get pod -n lecp-id lecp-id-otter-7895b6d694-td9kj -o custom-columns=Name:metadata.name,Status:status.phase
Name Status
lecp-id-otter-7895b6d694-td9kj Pending
[root@allinone ~]# kubectl get pod -n lecp-id lecp-id-otter-7895b6d694-td9kj
NAME READY STATUS RESTARTS AGE
lecp-id-otter-7895b6d694-td9kj 0/1 ImagePullBackOff 0 2d3h
[root@allinone ~]# kubectl get pod -n lecp-id lecp-id-otter-7895b6d694-td9kj
Status: Pending
原因:命令行工具做了可读性处理
类似的还有CrashLoopBackoff、ErrImagePull 应该是为了输出的结果更友好 做了优化
用如下命令行可以看
kubectl get po -A -o custom-columns=Name:metadata.name,Namespace:metadata.namespace,Status:status.phase
2. 边缘端资源管理 > 容器资源 > 工作负载 > 无状态服务 deployment
登录跳板机,登录gsc服务器194结尾
统计个数
[root@allinone ~]# kubectl get deployment -A |grep -v 'NAME'|awk '{print $2"|||"$1"|||"$3"|||deployment,"}'|grep -v 'NAME'|wc -l
80
过滤需要的字段
名称 命名空间 实例个数 类型
[root@allinone ~]# kubectl get deployment -A |grep -v 'NAME'|awk '{print $2"|||"$1"|||"$3"|||deployment,"}'|grep -v 'NAME'
[root@node1 ~]# kubectl get deployment -A |head -n2
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
最终解析结果格式如NAME|||NAMESPACE|||READY,拷贝入代码deployment.txt
tiller-deploy|||kube-system|||1/1|||deployment,
接口返回的状态字段为
"pods": {
"current": 0,
"desired": 1,
"running": 0,
"pending": 0,
"failed": 1,
"succeeded": 0,
"warnings": []
},
实例个数为running/desired
String status = running + "/" + desired;
测试结果
1. 边缘端资源管理 > 容器资源 > 持久卷声明 pvc
登录跳板机,登录mec服务器k3sserver-1
统计个数
[root@k3sserver-1 ~]# kubectl get pvc -A|grep -v 'NAME'|awk '{print $2"|||"$1"|||"$3"|||"$5"|||"$6"|||"$4"|||"$7","}'|grep -v 'NAME'|wc -l
174
过滤需要的字段
名称 命名空间 状态 容量 访问方式 声明 存储类
[root@k3sserver-1 ~]# kubectl get pvc -A|grep -v 'NAME'|awk '{print $2"|||"$1"|||"$3"|||"$5"|||"$6"|||"$4"|||"$7","}'|grep -v 'NAME'
存入格式如下
win2016|||vmimages|||Bound|||50Gi|||RWO|||pvc-fc06edfa-523c-4c34-a27a-f52f40004aeb|||csi-rbd-sc,
接口取数据格式发生了变化,namespace、name在claim字段 需要用split拆分解析
for (int n = 0; n < items.size(); n++) {
if (items.getJSONObject(n).size() != 0) {
// 名称 命名空间 状态 容量 访问方式 声明 存储类
String name = items.getJSONObject(n).getString("claim").split("\\/")[1];
String namespace = items.getJSONObject(n).getString("claim").split("\\/")[0];
// System.out.println("==name==" + name);
// System.out.println("==namespace=="+namespace);
String status = items.getJSONObject(n).getString("status");
String storage = items.getJSONObject(n).getJSONObject("capacity").getString("storage");
String accessModes = items.getJSONObject(n).getJSONArray("accessModes").getString(0);
String volume = items.getJSONObject(n).getJSONObject("objectMeta").getString("name");
String storageClass = items.getJSONObject(n).getString("storageClass");
// System.err.println("debug-name==" + name);
JSONObject jo = new JSONObject(true);
// 不传true则排列无序 未按照存放的顺序打印
jo.put("name", name);
jo.put("namespace", namespace);
jo.put("status", status);
jo.put("storage", storage);
jo.put("accessModes", accessModes);
jo.put("volume", volume);
jo.put("storageClass", storageClass);
ja.add(jo);
// System.out.println("debug-case3CMO平台管理容器资源存储管理存储卷声明的jo JSONObject第" + m + "个数组==" + jo);
log.info("debug-jo JSONObject第{}个数组=={}", n, jo);
log.info("debug-ja的JSONArray格式=={}", ja);
}
RWO对应ReadWriteOnce
RWX对应ReadWriteMany
if (accessModes.equals("RWO")) {
// 一个存储卷只能挂载在到1个pod 如挂载到pod1,不能同时挂到pod2,需要在pod1卸载pvc后再挂载到pod2
accessModes = "ReadWriteOnce";
} else if (accessModes.equals("RWX")) {
// 一个存储卷可以挂载在到多个pod 如可以同时挂载到pod1 pod2
accessModes = "ReadWriteMany";
}
jo.put("accessModes", accessModes);