当前位置: 首页 > news >正文

最新 client-java 调用 k8s ApiServer

创建权限绑定

sa-role.yaml

apiVersion: v1
kind: ServiceAccount
metadata:name: my-admin #账号名namespace: kube-system---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:annotations:rbac.authorization.kubernetes.io/autoupdate: "true"labels:kubernetes.io/bootstrapping: rbac-defaultsname: my-cluster-admin
rules:
- apiGroups: ["*"]resources: ["*"]verbs: ["*"]
- nonResourceURLs: ["*"]verbs: ["*"]---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: clusterrolebinding-admin
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: my-cluster-admin
subjects:
- kind: ServiceAccountname: my-adminnamespace: kube-system---
apiVersion: v1
kind: Secret
metadata:name: my-admin-tokennamespace: kube-systemannotations:kubernetes.io/service-account.name: "my-admin"   
type: kubernetes.io/service-account-token
 kubectl apply -f .

获取永久token

kubectl get secret my-admin-token -n kube-system -o jsonpath={".data.token"} | base64 -d

k8s apiserver的api查看

生成k8s token

请求k8s-swagger文件

curl -H “Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImQ4Slh0Mk9lMzd0TXNlZW9sbGRRMUVfRWtYSHVnNnFwMG11TmhYR3dWM2cifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi10b2tlbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJobC1hZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6Ijc4MDk1MDgwLWE2MWYtNGQ0Ni05YTUyLTYxYzMxOTAyYzIyMCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTpobC1hZG1pbiJ9.Gy8xiiLngFopG6EJVAUIsP7n9jQqsP6rWEg8q6LcqpaQ42FXYVX01o1wsqi6u5l3H5D4_dI-GjOU1ajc8Y_g4lZu-ClCxn360tsoJ6ZaCg7fuW4LIA2Mr1gT-rv7yLKhYplF6LDwEwsqlAh3nZopoWvMPtAKWfUQ0rI6q3CoNbpben7DAoJljmZRTa63QSjpnYH8hyZGfkgtXYhe6NC1wF0Q3FQJ5yWO1-oaDpkus3sjFa34OJmWx_VR8g-bAUlkrC5GFVMSEFytXGb1MlYSP3W0muel6-C7d-dWZBT7GV_kQrkgP8PYQC1i3weoA19t8JqT2CX1G1WmKo_F2DFktw” -k https://localhost:6443/openapi/v2 > k8s-swagger.json

获取 swagger-ui 镜像

docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/swaggerapi/swagger-ui:v4.15.5

创建serviceaccount

启动 swagger-ui 镜像

docker run -d -p 8080:8080 -e SWAGGER_JSON=/k8s-swagger.json -v /root/crd/k8s-swagger.json:/k8s-swagger.json swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/swaggerapi/swagger-ui:v4.15.5

访问 swagger-ui

http://127.0.0.1:8080

生成k8s对应的CRD资源

参考资源https://kkgithub.com/kubernetes-client/java/blob/master/docs/generate-model-from-third-party-resources.md

docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/kubernetes-client/java/crd-model-gen:v1.0.6
export LOCAL_MANIFEST_FILE=/root/prometheus/kube-prometheus-0.14.0/manifests/setup/0prometheusruleCustomResourceDefinition.yaml
docker run \--rm \-v "$LOCAL_MANIFEST_FILE":"$LOCAL_MANIFEST_FILE" \-v /var/run/docker.sock:/var/run/docker.sock \-v "$(pwd)":"$(pwd)" \-ti \--network host \swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/kubernetes-client/java/crd-model-gen:v1.0.6 \/generate.sh \-u $LOCAL_MANIFEST_FILE \-n com.example.stable \-p com.example.stable \-o "$(pwd)"

在线生成方式参考https://blog.csdn.net/weixin_42340037/article/details/132496248

  • fork kubernetes-client/java 仓库到自己的github
https://github.com/kubernetes-client/java
  • 点击Actions,在点击CRD Java Model Generate

  • 执行run workflow;输入必要的数据

Comma-separated paths to CRD yaml sources, can be either HTTP url or local file path.。k8s 自定义资源的 yaml文件,kube-prometheus的自定义资源prometheusrule

https://github.com/prometheus-operator/kube-prometheus
https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/refs/heads/main/manifests/setup/0prometheusruleCustomResourceDefinition.yaml
  • 执行 Actions 后,下载生成为 CRD Java Model 的 zip 包

The package name of the generated java project. 可以随便输入报名

#调用k8s的api

引入依赖

<dependency><groupId>io.kubernetes</groupId><artifactId>client-java</artifactId><version>21.0.2</version>
</dependency>

编码调用 k8s api的代码

package k8s_demo;import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.yaml.snakeyaml.Yaml;import com.alibaba.fastjson2.JSON;
import com.crd.models.V1PrometheusRule;
import com.crd.models.V1PrometheusRuleSpec;
import com.crd.models.V1PrometheusRuleSpecGroups;
import com.crd.models.V1PrometheusRuleSpecRules;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;import io.kubernetes.client.openapi.ApiClient;
import io.kubernetes.client.openapi.ApiException;
import io.kubernetes.client.openapi.Configuration;
import io.kubernetes.client.openapi.apis.CustomObjectsApi;
import io.kubernetes.client.openapi.apis.CustomObjectsApi.APIcreateClusterCustomObjectRequest;
import io.kubernetes.client.openapi.apis.CustomObjectsApi.APIcreateNamespacedCustomObjectRequest;
import io.kubernetes.client.openapi.apis.CustomObjectsApi.APIdeleteNamespacedCustomObjectRequest;
import io.kubernetes.client.openapi.apis.CustomObjectsApi.APIlistClusterCustomObjectRequest;
import io.kubernetes.client.openapi.apis.CustomObjectsApi.APIlistNamespacedCustomObjectRequest;
import io.kubernetes.client.openapi.models.V1ObjectMeta;
import io.kubernetes.client.util.ClientBuilder;
import io.kubernetes.client.util.credentials.AccessTokenAuthentication;public class CRDdemo {public static void main(String[] args) {ApiClient client = new ClientBuilder().setBasePath("https://10.0.2.11:6443").setVerifyingSsl(false).setAuthentication(new AccessTokenAuthentication("eyJhbGciOiJSUzI1NiIsImtpZCI6ImQ4Slh0Mk9lMzd0TXNlZW9sbGRRMUVfRWtYSHVnNnFwMG11TmhYR3dWM2cifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJteS1hZG1pbi10b2tlbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJteS1hZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImMxYjgyNmU0LTM4YzctNGI1Yy05MzliLTU3MmExNzQ4ZjhjNiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTpteS1hZG1pbiJ9.giP37iGgtXoBCPRj4YBu0ooovb8SbOXuMyAfQx5erzbh-s1AJZTsMVho-Hu2VlyeRcQ7AkLy44EUMdf__yy0XR44qXYRlN6-gG0yAMHTSt_mBbfbpt35uJ39jAnmFlS9SGgTfzAJdjoDzA6Vhq7_njab6Dkc9wmYuIAR4Q1fUEjIdkVb-558xlqegouUd4TNC855p6gwUoTLMZaNo1wGMHEa94HV37ECpGsQ2gSr4nEw29LQOHei96HfRuBdJa7lLhnuaqqKqE8tR9DuGVN5adtmC-AnSabRlkCgjM7KmB3b7BBndlRuG4ZcuARCCNvrbUM0N_Z43hL6PgEtSXFmxg"))// .setAuthentication(new AccessTokenAuthentication("eyJhbGciOiJSUzI1NiIsImtpZCI6ImQ4Slh0Mk9lMzd0TXNlZW9sbGRRMUVfRWtYSHVnNnFwMG11TmhYR3dWM2cifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi10b2tlbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJobC1hZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6Ijc4MDk1MDgwLWE2MWYtNGQ0Ni05YTUyLTYxYzMxOTAyYzIyMCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTpobC1hZG1pbiJ9.Gy8xiiLngFopG6EJVAUIsP7n9jQqsP6rWEg8q6LcqpaQ42FXYVX01o1wsqi6u5l3H5D4_dI-GjOU1ajc8Y_g4lZu-ClCxn360tsoJ6ZaCg7fuW4LIA2Mr1gT-rv7yLKhYplF6LDwEwsqlAh3nZopoWvMPtAKWfUQ0rI6q3CoNbpben7DAoJljmZRTa63QSjpnYH8hyZGfkgtXYhe6NC1wF0Q3FQJ5yWO1-oaDpkus3sjFa34OJmWx_VR8g-bAUlkrC5GFVMSEFytXGb1MlYSP3W0muel6-C7d-dWZBT7GV_kQrkgP8PYQC1i3weoA19t8JqT2CX1G1WmKo_F2DFktw")).build();Configuration.setDefaultApiClient(client);System.out.println(client);CustomObjectsApi apiInstance = new CustomObjectsApi(client);try {String group = "monitoring.coreos.com"; // String | The custom resource's group nameString version = "v1"; // String | The custom resource's versionString plural = "prometheusrules"; // String | The custom resource's plural name. For TPRs this would be lowercase plural kind.Object body = null; // Object | The JSON schema of the Resource to create.String pretty = "true"; // String | If 'true', then the output is pretty printed.APIlistClusterCustomObjectRequest aPIlistClusterCustomObjectRequest = apiInstance.listClusterCustomObject(group, version, plural);Object result = aPIlistClusterCustomObjectRequest.execute();System.out.println(JSON.toJSON(result));System.out.println("-----------------------------");APIlistNamespacedCustomObjectRequest aPIlistNamespacedCustomObjectRequest = apiInstance.listNamespacedCustomObject(group, version, pretty, plural);result = aPIlistNamespacedCustomObjectRequest.execute();System.out.println(result);System.out.println("-----------------------------");} catch (ApiException e) {System.err.println("Exception when calling CustomObjectsApi#listNamespacedCustomObject");System.err.println("Status code: " + e.getCode());System.err.println("Reason: " + e.getResponseBody());System.err.println("Response headers: " + e.getResponseHeaders());e.printStackTrace();}catch (Exception e) {e.printStackTrace();}try {String group = "monitoring.coreos.com"; // String | The custom resource's group nameString version = "v1"; // String | The custom resource's versionString plural = "prometheusrules"; // String | The custom resource's plural name. For TPRs this would be lowercase plural kind.String pretty = "true"; // String | If 'true', then the output is pretty printed.String namespace = "monitoring";V1PrometheusRule v1PrometheusRule = new V1PrometheusRule();v1PrometheusRule.setKind("PrometheusRule");v1PrometheusRule.setApiVersion("monitoring.coreos.com/v1");V1ObjectMeta v1ObjectMeta = new V1ObjectMeta();Map<String, String> labelsMap = new HashMap<String, String>();labelsMap.put("prometheus", "k8s");labelsMap.put("ole", "alert-rules");v1ObjectMeta.setLabels(labelsMap);v1ObjectMeta.setName("custom-rule2");v1ObjectMeta.setNamespace("monitoring");v1PrometheusRule.setMetadata(v1ObjectMeta);V1PrometheusRuleSpec v1PrometheusRuleSpec = new V1PrometheusRuleSpec();List<V1PrometheusRuleSpecGroups> groups = new ArrayList<V1PrometheusRuleSpecGroups>();V1PrometheusRuleSpecGroups v1PrometheusRuleSpecGroups = new V1PrometheusRuleSpecGroups();v1PrometheusRuleSpecGroups.setName("disk");groups.add(v1PrometheusRuleSpecGroups);v1PrometheusRuleSpec.setGroups(groups);List<V1PrometheusRuleSpecRules> rules = new ArrayList<V1PrometheusRuleSpecRules>();V1PrometheusRuleSpecRules v1PrometheusRuleSpecRules = new V1PrometheusRuleSpecRules();v1PrometheusRuleSpecRules.setAlert("diskFree");Map<String, String> annotationsMap = new HashMap<String, String>();annotationsMap.put("value", "{{$value}}");annotationsMap.put("summary", "{{ $labels.job }}  项目实例 {{ $labels.instance }} 磁盘使用率大于 80%");annotationsMap.put("description", "{{ $labels.instance }}  {{ $labels.mountpoint }}  磁盘使用率大于80%  (当前的值: {{ $value }}%),请及时处理");v1PrometheusRuleSpecRules.setAnnotations(annotationsMap);v1PrometheusRuleSpecRules.setExpr("(1-(node_filesystem_free_bytes{fstype=~\"ext4|xfs\",mountpoint!=\"/boot\"} / node_filesystem_size_bytes{fstype=~\"ext4|xfs\",mountpoint!=\"/boot\"}) )*100 > 80");v1PrometheusRuleSpecRules.setFor("1m");Map<String, String> labelsMap2 = new HashMap<String, String>();labelsMap2.put("level", "disaster");labelsMap2.put("severity", "warning");v1PrometheusRuleSpecRules.setLabels(labelsMap2);rules.add(v1PrometheusRuleSpecRules);v1PrometheusRuleSpecGroups.setRules(rules);v1PrometheusRule.setSpec(v1PrometheusRuleSpec);APIcreateNamespacedCustomObjectRequest aPIcreateNamespacedCustomObjectRequest = apiInstance.createNamespacedCustomObject(group, version, namespace, plural, v1PrometheusRule);aPIcreateNamespacedCustomObjectRequest.pretty(pretty);Object result = aPIcreateNamespacedCustomObjectRequest.execute();System.out.println(JSON.toJSON(result));} catch (ApiException e) {System.err.println("Exception when calling CustomObjectsApi#createNamespacedCustomObject");System.err.println("Status code: " + e.getCode());System.err.println("Reason: " + e.getResponseBody());System.err.println("Response headers: " + e.getResponseHeaders());e.printStackTrace();}catch (Exception e) {e.printStackTrace();}try {String group = "monitoring.coreos.com"; // String | The custom resource's group nameString version = "v1"; // String | The custom resource's versionString plural = "prometheusrules"; // String | The custom resource's plural name. For TPRs this would be lowercase plural kind.String pretty = "true"; // String | If 'true', then the output is pretty printed.String namespace = "monitoring";String name = "";APIdeleteNamespacedCustomObjectRequest aPIdeleteNamespacedCustomObjectRequest = apiInstance.deleteNamespacedCustomObject(group, version, namespace, plural, name);Object result = aPIdeleteNamespacedCustomObjectRequest.execute();System.out.println(JSON.toJSON(result));} catch (ApiException e) {System.err.println("Exception when calling CustomObjectsApi#aPIdeleteNamespacedCustomObjectRequest");System.err.println("Status code: " + e.getCode());System.err.println("Reason: " + e.getResponseBody());System.err.println("Response headers: " + e.getResponseHeaders());e.printStackTrace();}catch (Exception e) {e.printStackTrace();}}/*** @param filename yaml文件名称* @return 返回yaml文件中对应的json数据*/public static String yamlToJson(String filename) {String jsonData;try {// 创建Yaml对象Yaml yaml = new Yaml();// 打开文件输入流FileInputStream input = new FileInputStream(filename);// 读取整个文件为一个Map对象,如果yaml文件为列表,则数据类型为listMap<String, Object> data = yaml.load(input);// 创建ObjectMapper对象用于将数据转换为JSONObjectMapper mapper = new ObjectMapper();// 启用格式化输出mapper.enable(SerializationFeature.INDENT_OUTPUT);// 将数据转换为JSON字符串jsonData = mapper.writeValueAsString(data);// 返回读取的数据return jsonData;} catch (Exception e) {e.printStackTrace();}return null;}
}

https://kkgithub.com/kubernetes-client/java/blob/master/kubernetes/docs/CustomObjectsApi.md#createClusterCustomObject

代码中需要用到的变量值查看

查看k8s的自定义资源

kubectl get customresourcedefinitions.apiextensions.k8s.io

查看自定义资源的group和version信息

kubectl explain prometheusrules.monitoring.coreos.com

查看自定义资源的plural信息

kubectl describe customresourcedefinitions.apiextensions.k8s.io  prometheusrules.monitoring.coreos.com

删除自定义资源的实例

kubectl delete prometheusrules.monitoring.coreos.com custom-rule -n monitoring

相关文章:

最新 client-java 调用 k8s ApiServer

创建权限绑定 sa-role.yaml apiVersion: v1 kind: ServiceAccount metadata:name: my-admin #账号名namespace: kube-system--- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata:annotations:rbac.authorization.kubernetes.io/autoupdate: "true…...

TCP单包数据大于1460字节会被拆包的问题

关于TCP单包数据大于1460字节会被拆包的问题 1、问题背景&#xff1a; 最近在用STM32W5500做项目&#xff0c;需要STM32通过TCP协议发送数据到上位机并显示。当数据量小的时候上位机显示正常&#xff0c;一旦数据量大过大上位机就会出现数据丢失的情况&#xff0c;甚至数据直接…...

苏宁关键字搜索接口技术解析与实战

在当今的电商领域&#xff0c;搜索功能无疑是用户寻找心仪商品的最重要途径之一。苏宁作为国内知名的电商平台&#xff0c;其提供的API接口服务为开发者提供了丰富的商品数据。本文将详细介绍如何使用苏宁的关键字搜索接口&#xff0c;通过编写代码实现商品搜索功能。 接口概述…...

Java学习教程,从入门到精通,Java 基本数据类型详解(5)

Java 基本数据类型详解 Java是一种强类型语言&#xff0c;这意味着在Java程序中&#xff0c;每个变量都必须明确声明其数据类型。Java提供了八种基本数据类型&#xff08;Primitive Data Types&#xff09;&#xff0c;这些类型都是预先定义好的&#xff0c;并且每种类型都占用…...

使用Flask实现本机的模型部署

前言 模型部署是指将大模型运行在专属的计算资源上&#xff0c;使模型在独立的运行环境中高效、可靠地运行&#xff0c;并为业务应用提供推理服务。其目标是将机器学习模型应用于实际业务中&#xff0c;使最终用户或系统能够利用模型的输出&#xff0c;从而发挥其作用。 一、设…...

基于SSM的校园跑腿网站的设计与实现

文未可获取一份本项目的java源码和数据库参考。 课题来源及研究的目的和意义 随着网络技术的不断完善与发展&#xff0c;各种互联网公司不断如雨后春笋般不断涌现&#xff0c;丰富了人们生活的各个方面。近年来由于 Online To 0ffline即线上到线下(020)模式的发展和兴起&…...

【Java】正则表达式详解

目录 引言 一、基本概念 1.1 元字符 1.2 预定义字符类 1.3 边界匹配符 1.4 数量标识符 1.5 捕获与非捕获分组 二、Java中的正则表达式支持 三、正则表达式的使用示例 3.1 匹配字符串 3.2 替换字符串 3.3 分割字符串 3.4 使用Pattern和Matcher 3.5 捕获组和后向…...

Java知识巩固(七)

目录 面向对象 面向对象三大特征 封装 继承 多态 多态 深拷贝和浅拷贝区别了解吗?什么是引用拷贝? 浅拷贝 深拷贝 面向对象 万物皆为对象&#xff0c;也就是描述某个事物解决问题的过程中所发生的事情。 面向对象三大特征 封装 封装是指把一个对象的状态信息&…...

Ubuntu22.04 更换源

Ubuntu22.04 更换网易163源 1、编辑/etc/apt/sources.list文件 1 sudo nano /etc/apt/sources.list 2、清空文件内容&#xff0c;拷贝下列163源到文本。 1 2 3 4 5 6 7 8 deb http://mirrors.163.com/ubuntu/ jammy main restricted universe multiverse deb http://mirro…...

江恩理论和波浪理论的结合

结合波浪理论和江恩理论需要综合考虑市场波动的形态以及时间和价格的关系。这两者都是技术分析中的重要工具&#xff0c;能够帮助投资者更好地理解市场的趋势和未来的走势。 波浪理论&#xff08;Elliott Wave Theory&#xff09; 波浪理论是由Ralph Nelson Elliott提出的&…...

AJAX——AJAX 取消请求

利用 abort&#xff08;&#xff09;方法取消请求 本文分享到此结束&#xff0c;欢迎大家评论区相互讨论学习&#xff0c;下一篇继续分享AJAX中请求重复发送问题的学习。...

ruoyi域名跳转缓存冲突问题(解决办法修改:session名修改session的JSESSIONID名称)

【版权所有&#xff0c;文章允许转载&#xff0c;但须以链接方式注明源地址&#xff0c;否则追究法律责任】【创作不易&#xff0c;点个赞就是对我最大的支持】 前言 仅作为学习笔记&#xff0c;供大家参考 总结的不错的话&#xff0c;记得点赞收藏关注哦&#xff01; 目录 前…...

嵌入式QT中基本工程模板分析

大家好,今天主要来分享一下,如何分析一下QT的工程代码文件。 第一:QT工程分析...

Linux网络:UDP socket - 简单聊天室

Linux网络&#xff1a;UDP socket - 简单聊天室 聊天通信架构ServerInetAddrUdpServerMessageRoutermain Client测试 聊天通信架构 本博客基于Linux实现一个简单的聊天通信服务&#xff0c;以熟悉Linux的网络接口。 总代码地址&#xff1a;[UDPsocket-简单聊天通信] 文件结构…...

Codeforces Round 646 (Div. 2) E. Tree Shuffling(树,贪心)

题目链接 Codeforces Round 646 (Div. 2) E. Tree Shuffling 思路 考虑一个节点 u u u&#xff0c;显然它子树中的操作可以由它本身和祖先来进行。如果它的祖先有比它花费更小的&#xff0c;直接跳过节点 u u u。 我们分别记录每一个子树中位置不对的 0 0 0和 1 1 1的个数&…...

HCIE-Datacom题库_11_IPsecVPN【17道题】

一、单选题 1.IPsecSA(SecurityAssociation&#xff0c;安全联盟)有两种生成方式&#xff0c;分别是手工方式和IKE自动协商方式&#xff0c;以下关于这两种方式的描述中&#xff0c;错误的是哪一项? 手工方式和IKE方式建立的SA都支持动态刷新 IKE方式建立的SA,其生存周期由…...

Dongle Sentinal在Jenkins下访问不了的问题

背景&#xff1a; 工作站部署的jenkins的脚本无法正常打包&#xff0c;定位后发现是本地获取不了license&#xff0c;但是使用usb over network的远程license都能获取并正常打包 分析&#xff1a; 获取不了license的原因是本地无法识别dongle。根据提供信息&#xff0c;之前…...

X射线衍射(X-ray Diffraction,XRD)小白版

文章目录 实验过程原理晶体构成X射线波长diffraction 干涉效应 Braggs Law晶体间距d散射角度θ半波长λ/2公式 公式名称由来应用设备 实验过程 In the X-ray experiment , a sample is placed into the center of an instrument and illuminated with a beam of X-rays. 在X射…...

Nordic 定时器系统app timer[获取时间戳]

获取时间戳 想要在Nordic 定时器系统中获取时间戳,也就是是在调用app_timer的时候时间戳要有效,我们可以看看定时器系统初始化: ret_code_t app_timer_init(void) {ret_code_t err_code;drv_rtc_config_t config {.prescaler APP_TIMER_CONFIG_RTC_FREQUENCY,.int…...

【Linux】实验:mkdir 命令 、 tee 命令

#1024程序员节&#xff5c;征文# 1.命令说明 本文主要实验 linux 的两个命令&#xff1a;mkdir -p 路径、 tee 创建文件。 命令&#xff1a;mkdir -p 路径 说明&#xff1a;该命令将自动创建路径下的目录及子目录&#xff0c;结尾可以/ 也可以不带/&#xff0c;默认都是建文…...

MATLAB仿真GPS调制和捕获

一,中频数据捕获: 当捕获通道状态空闲时,启动中频数据存储,此时根据当前要捕获的卫星的来选择射频通道,并将相应的载波频率和码频率写入寄存器中,使能存储操作;当一次捕获运算完成之后,需要重新存储中频数据。 卫星选择:初始化时,将所有卫星设置为待捕获状态,用一…...

K-Means聚类选K避坑指南:当肘部法则“失灵”,轮廓系数如何救场?

K-Means聚类选K避坑指南&#xff1a;当肘部法则"失灵"&#xff0c;轮廓系数如何救场&#xff1f; 在数据科学实践中&#xff0c;K-Means算法因其简洁高效而广受欢迎&#xff0c;但确定最佳聚类数K却常让从业者陷入困境。当面对高维、噪声多或分布不平衡的真实业务数据…...

NotebookLM概念关联分析终极对照表,覆盖12类典型文档结构,99.2%的关联断裂问题可秒级定位

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM概念关联分析 NotebookLM 是 Google 推出的基于用户自有文档构建可信 AI 助手的实验性工具&#xff0c;其核心能力在于对上传 PDF、TXT 等文本进行语义理解与跨文档概念链接。它并非通用大模…...

证件照换装API实战指南:一键换装,告别服装不合格!

还在为证件照服装不符合要求而烦恼&#xff1f;可立图ClipImg证件照换装API&#xff0c;自动识别身形与姿态&#xff0c;一键替换为正装&#xff0c;让你的照片瞬间专业起来&#xff01;一、痛点场景&#xff1a;你的证件照是否也遇到过这些尴尬吗&#xff1f;求职简历&#xf…...

CFS调度器:从公平算法到内核实现全景解析

1. CFS调度器的设计哲学与公平性实现 Linux内核的CFS&#xff08;Completely Fair Scheduler&#xff09;调度器诞生于2007年&#xff0c;取代了之前的O(1)调度器。它的核心设计理念可以用一个简单的比喻理解&#xff1a;想象CPU时间是一块披萨&#xff0c;CFS要确保每个进程都…...

3分钟终极解决方案:一键将XAPK文件高效转换为通用APK

3分钟终极解决方案&#xff1a;一键将XAPK文件高效转换为通用APK 【免费下载链接】xapk-to-apk A simple standalone python script that converts .xapk file into a normal universal .apk file 项目地址: https://gitcode.com/gh_mirrors/xa/xapk-to-apk 还在为安卓设…...

射频功放设计避坑指南:聊聊ADS仿真中那些容易被忽略的细节(以460MHz AB类为例)

射频功放设计避坑指南&#xff1a;ADS仿真中的关键细节解析&#xff08;460MHz AB类实战&#xff09; 在射频功率放大器设计中&#xff0c;仿真环节的准确性直接决定了最终产品的性能表现。许多工程师虽然掌握了ADS软件的基本操作流程&#xff0c;却在关键参数设置和结果解读环…...

‌古星图导航测试:波利尼西亚航海术的AI复现‌

跨越千年的航海智慧与现代测试的碰撞在科技高度发达的今天&#xff0c;GPS、北斗等卫星导航系统已成为我们出行、航海、航空等领域不可或缺的工具。然而&#xff0c;在数千年前&#xff0c;太平洋上的波利尼西亚人却凭借着对星空的深刻理解和独特的航海技术&#xff0c;在广袤无…...

‌失落大陆建模:亚特兰蒂斯数字重建的结构验证‌

一、项目背景与目标设定在数字孪生与虚拟考古技术飞速发展的当下&#xff0c;亚特兰蒂斯这一传说中失落大陆的数字重建&#xff0c;不仅是对古老神话的技术致敬&#xff0c;更是对复杂场景建模与结构验证能力的极致考验。本项目旨在依托Blender等3D建模工具&#xff0c;结合最新…...

基于NirDiamant/agents-towards-production项目:使用RunPod Serverless部署AI智能体实战指南

基于NirDiamant/agents-towards-production项目&#xff1a;使用RunPod Serverless部署AI智能体实战指南 【免费下载链接】agents-towards-production End-to-end, code-first tutorials for building production-grade GenAI agents. From prototype to enterprise deployment…...