Kubernetes之Controller详解
本文尝试从Kubernetes Controller的种类、交互逻辑、最佳实践、伪代码示例及历史演进5个方面对其进行详细阐述,希望对您有所帮助!
一、Kubernetes Controller种类
Kubernetes Controller Manager 是 Kubernetes 集群的核心组件之一,负责管理和协调集群内各种控制器。控制器是实现 Kubernetes 集群自动化管理的核心部分,通过持续协调集群的实际状态和期望状态,确保资源的正确配置和运行。
Kubernetes Controller Manager 包含多个控制器,每个控制器负责特定的资源和任务。以下是一些主要控制器及其功能:
-
Node Controller
- 作用:监控节点的状态,负责在节点不可用时执行相应的操作,例如将 Pod 标记为不可调度、在节点无法通信时驱逐 Pod。
-
Replication Controller
- 作用:确保指定数量的 Pod 副本在任何时候都在运行。如果 Pod 被删除或崩溃,Replication Controller 会创建新的 Pod 来满足副本数要求。
-
Endpoint Controller
- 作用:填充 Endpoints 对象,使服务能够正确地找到相应的 Pod,确保服务与后端 Pod 之间的通信。
-
Service Account & Token Controllers
- 作用:创建默认的 Service Account 并管理 API 访问令牌,确保每个命名空间都有一个默认的 Service Account。
-
Namespace Controller
- 作用:处理命名空间的创建和删除,确保在删除命名空间时清理相关资源。
-
Job Controller
- 作用:管理 Job 对象,确保 Job 中定义的任务(Pod)按预期运行和完成,适用于一次性任务或批处理任务。
-
CronJob Controller
- 作用:管理 CronJob 对象,按照预定义的时间表周期性地运行 Job。
-
DaemonSet Controller
- 作用:确保每个节点上都运行一个 DaemonSet 定义的 Pod,通常用于节点级别的任务,例如日志收集和监控。
-
StatefulSet Controller
- 作用:管理有状态应用,确保有状态 Pod 的创建、删除和更新按序执行,维护 Pod 的稳定网络标识和持久存储。
-
Deployment Controller
- 作用:管理 Deployment 对象,确保应用按期望的版本和副本数运行,支持滚动更新和回滚。
-
ReplicaSet Controller
- 作用:类似于 Replication Controller,但功能更强大,通常与 Deployment 一起使用,确保指定数量的 Pod 副本在任何时候都在运行。
-
Horizontal Pod Autoscaler (HPA) Controller
- 作用:根据资源使用情况(例如 CPU 或内存)自动扩展或缩减 Pod 数量,以满足应用的需求。
-
Vertical Pod Autoscaler (VPA) Controller
- 作用:根据实际资源使用情况调整 Pod 的资源请求和限制(CPU 和内存),提高资源利用率。
-
Garbage Collector Controller
- 作用:负责清理被删除资源的相关依赖资源,例如删除被删除 Pod 关联的 PersistentVolumeClaim(PVC)。
-
Certificate Signing Request (CSR) Controller
- 作用:管理和批准/拒绝证书签名请求,通常用于自动化证书管理。
这些控制器通过不断检查集群的实际状态和期望状态,执行必要的操作来确保 Kubernetes 集群的稳定和可靠运行。
Kubernetes Controller Manager 包含的控制器非常多,以下是一些更高级的或特定于某些功能的控制器:
-
Ingress Controller
- 作用:管理 Ingress 资源,提供外部访问到集群内部服务的方式,通过 HTTP/HTTPS 路由流量。
-
ResourceQuota Controller
- 作用:管理和执行 ResourceQuota 资源,确保命名空间内的资源使用不超过设定的配额。
-
LimitRange Controller
- 作用:管理和执行 LimitRange 资源,设置命名空间内 Pod 和容器的默认资源请求和限制。
-
PersistentVolume Controller
- 作用:管理 PersistentVolume 资源,确保持久存储卷的生命周期,包括创建、绑定和回收。
-
PersistentVolumeClaim Controller
- 作用:管理 PersistentVolumeClaim 资源,确保持久存储卷正确地绑定到请求的 Pod。
-
StorageClass Controller
- 作用:管理 StorageClass 资源,定义不同存储提供者的存储类型和配置,支持动态存储卷的创建。
-
Certificate Controller
- 作用:管理 Kubernetes 内部证书的创建和分发,通常与 Cert-Manager 等工具集成。
-
PodDisruptionBudget (PDB) Controller
- 作用:管理 PodDisruptionBudget 资源,限制计划内的 Pod 中断(例如滚动更新或节点维护)以确保应用的高可用性。
-
NetworkPolicy Controller
- 作用:管理 NetworkPolicy 资源,控制 Pod 间的网络流量,增强集群的安全性。
-
Service Controller
- 作用:管理 Service 资源,确保服务的负载均衡和 IP 地址分配。
-
TTL Controller for Finished Resources
- 作用:管理和清理已完成的 Job 和 Pod,根据定义的 TTL(生存时间)自动删除这些资源。
-
EndpointSlice Controller
- 作用:管理 EndpointSlice 资源,提供比传统 Endpoints 更高效和可扩展的服务发现机制。
-
CSIDriver and CSINode Controllers
- 作用:管理和协调 CSI(容器存储接口)驱动程序,确保 CSI 驱动程序的注册和节点能力的报告。
-
VolumeAttachment Controller
- 作用:管理 VolumeAttachment 资源,处理动态存储卷的挂载和卸载请求。
-
ServiceAccountToken Controller
- 作用:管理 ServiceAccount 令牌的创建和分发,为 Pod 提供安全的 API 访问凭证。
这些控制器涵盖了 Kubernetes 集群中广泛的资源和功能,通过不断协调和管理这些资源,确保集群的自动化操作、资源管理和高可用性。
以下是一些更为细分和特定功能的控制器:
-
CSIDriver Controller
- 作用:管理 CSI 驱动程序的生命周期,确保 CSI 驱动程序正确注册和使用。
-
CSINode Controller
- 作用:协调 CSI 驱动程序和 Kubernetes 节点,确保节点报告正确的存储能力。
-
VolumeSnapshot Controller
- 作用:管理 VolumeSnapshot 和 VolumeSnapshotContent 资源,支持持久卷的快照和恢复功能。
-
CronJob Controller
- 作用:管理 CronJob 资源,按照预定义的时间表定期运行 Job。
-
ResourceClaim and ResourceClaimTemplate Controllers
- 作用:管理资源声明(ResourceClaim)和资源声明模板(ResourceClaimTemplate),用于动态分配和管理共享资源。
-
CustomResourceDefinition (CRD) Controller
- 作用:管理 CRD 资源,允许用户定义和使用自定义资源类型。
-
Event Controller
- 作用:管理集群中的事件对象,用于记录和追踪集群中的重要操作和状态变化。
-
Garbage Collector
- 作用:自动清理被删除资源的相关依赖资源,例如删除被删除 Pod 关联的 PersistentVolumeClaim(PVC)。
-
Priority and Fairness (P&F) Controller
- 作用:管理 API 请求的优先级和公平性,确保高优先级请求得到及时处理,同时防止资源耗尽。
-
TokenCleaner Controller
- 作用:清理过期的服务账户令牌,确保集群安全性。
-
PodSecurityPolicy (PSP) Controller
- 作用:管理 Pod 安全策略,控制 Pod 的安全设置和权限。
-
CertificateSigningRequest (CSR) Controller
- 作用:管理和批准/拒绝证书签名请求,通常用于自动化证书管理。
-
RuntimeClass Controller
- 作用:管理 RuntimeClass 资源,支持不同的容器运行时配置。
-
EndpointSlice Controller
- 作用:管理 EndpointSlice 资源,提供比传统 Endpoints 更高效和可扩展的服务发现机制。
-
MutatingAdmissionWebhook and ValidatingAdmissionWebhook Controllers
- 作用:管理和执行动态准入控制策略,通过 Webhook 实现对资源创建、更新的动态验证和修改。
-
ClusterRole and ClusterRoleBinding Controllers
- 作用:管理集群级别的角色和角色绑定,控制集群内用户和服务账户的权限。
-
Role and RoleBinding Controllers
- 作用:管理命名空间级别的角色和角色绑定,控制命名空间内用户和服务账户的权限。
-
Lease Controller
- 作用:管理租约资源(Lease),用于协调集群中的主选举等分布式协调任务。
-
APIService Controller
- 作用:管理 APIService 资源,协调 Kubernetes API 聚合层的注册和可用性。
这些控制器共同工作,确保 Kubernetes 集群的自动化管理、资源调度、安全性和高可用性。通过这些控制器,Kubernetes 实现了对集群资源的全面管理和高效运行。
二、Kubernetes 主要控制器与其他组件交互示意图
示意图
交互说明
-
kubectl / CLI 与 API Server 的交互:
- 用户通过 kubectl 或其他客户端工具向 API Server 发出 CRUD 操作请求(创建、读取、更新、删除)。
-
API Server 与 etcd 的交互:
- API Server 将集群状态存储到 etcd,并从 etcd 读取状态数据。
-
API Server 与 Scheduler 的交互:
- Scheduler 从 API Server 获取未调度的 Pod,确定它们的调度位置后将结果返回给 API Server。
-
API Server 与 Controller Manager 的交互:
- Controller Manager 从 API Server 获取资源状态,根据控制逻辑进行必要的调整,然后将更新后的状态提交回 API Server。
-
Controller Manager 内部控制器的交互:
- 各控制器(如 Node Controller、Replication Controller 等)负责特定资源的管理,通过 API Server 获取和更新状态。
-
API Server 与 Kubelet 的交互:
- Kubelet 从 API Server 获取调度到该节点的 Pod 信息,管理 Pod 和容器的生命周期,并将节点和 Pod 的状态报告给 API Server。
-
Kubelet 与 Container Runtime 的交互:
- Kubelet 通过 CRI 接口与容器运行时(如 Docker 或 containerd)通信,管理容器的创建、启动、停止等操作。
-
Kubelet 与 Pod Network 的交互:
- Kubelet 配置 Pod 的网络,通过 CNI 插件设置网络连接。
-
Kubelet 与 kube-proxy 的交互:
- Kube-proxy 维护网络规则和服务发现,通过 API Server 获取服务信息并在节点上配置网络规则。
-
Controller Manager 与 Persistent Storage 的交互:
- Controller Manager 通过 CSI 插件管理持久存储卷的生命周期,包括卷的创建、绑定和删除。
通过这样的示意图和详细说明,可以更直观地理解 Kubernetes 各主要组件和控制器之间的交互关系。
三、Kubernetes Controller最佳实践
在 Kubernetes 中,控制器(Controller)是保持系统实际状态与期望状态一致的关键组件。为了确保控制器的高效、可靠和安全运行,以下是一些最佳实践:
设计和实现控制器的最佳实践
-
Idempotency(幂等性)
- 确保控制器的操作是幂等的,这意味着无论操作执行多少次,结果应该是相同的。这可以避免因重复执行而产生的副作用。
-
Reconciliation Loop(协调循环)
- 实现一个可靠的协调循环来监控资源状态变化,并采取相应行动使其达到期望状态。这个循环应该能够处理突发的事件和定期的状态检查。
-
Event Handling(事件处理)
- 使用 Kubernetes 提供的 Informer 和 Watch 机制来监听资源变化事件,减少不必要的 API 调用,提高响应速度。
-
Error Handling(错误处理)
- 设计可靠的错误处理机制,记录错误日志,避免控制器因未处理的异常而崩溃。重试机制应考虑指数退避策略(exponential backoff)以避免过载。
-
Rate Limiting(限流)
- 实施限流机制来控制控制器的执行频率,防止由于频繁的重试和协调操作导致的资源消耗过大。
部署和管理控制器的最佳实践
-
Scalability(可扩展性)
- 确保控制器能够水平扩展(Horizontal Scaling),通过增加副本数来处理更多的负载。
-
Resource Management(资源管理)
- 为控制器设置合理的资源请求和限制(CPU 和内存),避免因资源耗尽导致控制器性能下降或崩溃。
-
Observability(可观察性)
- 实施日志记录、监控和告警机制。使用 Prometheus 监控控制器的指标,确保系统运行健康。
-
Security(安全性)
- 使用 Kubernetes RBAC(角色访问控制)来限制控制器的权限,仅授予其所需的最低权限(Principle of Least Privilege)。
- 定期更新控制器的镜像,确保使用最新的安全补丁。
开发控制器的最佳实践
-
Controller Libraries and Frameworks(控制器库和框架)
- 利用现有的 Kubernetes 控制器库和框架(如 Kubebuilder 和 Operator SDK)来简化控制器的开发和管理。
-
Testing(测试)
- 实施单元测试、集成测试和端到端测试,确保控制器在各种条件下的正确性和稳定性。
- 使用 Kind 或 Minikube 等本地 Kubernetes 环境进行测试,模拟真实场景。
-
Documentation(文档)
- 提供详细的控制器文档,包括架构设计、配置选项、使用指南和故障排除步骤,帮助用户理解和使用控制器。
高可用性和容错的最佳实践
-
Redundancy(冗余)
- 部署多个副本的控制器来提高高可用性,确保在单个副本失败时仍有其他副本继续工作。
-
Health Checks(健康检查)
- 配置 Liveness 和 Readiness 探针,以便 Kubernetes 能够自动检测和恢复故障的控制器实例。
-
Graceful Shutdown(优雅停机)
- 实现优雅停机机制,确保控制器在接收到终止信号时能够完成当前的协调任务,避免中间状态不一致。
通过遵循这些最佳实践,可以确保 Kubernetes 控制器的高效、可靠和安全运行,有助于维护集群的稳定性和高可用性。
四、Controller伪代码实现
为了实现一个遵循最佳实践的 Kubernetes 控制器,以下是一个使用 Go 语言编写的伪代码示例。该控制器监控自定义资源 Foo
,并确保每个 Foo
对象对应一个名为 bar-{foo_name}
的 ConfigMap 存在。
完整的 Go 语言实现 Kubernetes 控制器伪代码
package mainimport ("context""fmt""log""time"metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"corev1 "k8s.io/api/core/v1""k8s.io/client-go/informers""k8s.io/client-go/kubernetes""k8s.io/client-go/rest""k8s.io/client-go/tools/cache""k8s.io/client-go/util/retry""k8s.io/client-go/util/workqueue""k8s.io/apimachinery/pkg/util/wait"
)// FooController 定义控制器结构体
type FooController struct {clientset *kubernetes.Clientsetinformer cache.SharedIndexInformerworkqueue workqueue.RateLimitingInterface
}// NewFooController 创建新的控制器实例
func NewFooController(clientset *kubernetes.Clientset, informer cache.SharedIndexInformer) *FooController {workqueue := workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "Foo")informer.AddEventHandler(cache.ResourceEventHandlerFuncs{AddFunc: func(obj interface{}) {key, err := cache.MetaNamespaceKeyFunc(obj)if err == nil {workqueue.Add(key)}},UpdateFunc: func(oldObj, newObj interface{}) {key, err := cache.MetaNamespaceKeyFunc(newObj)if err == nil {workqueue.Add(key)}},DeleteFunc: func(obj interface{}) {key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj)if err == nil {workqueue.Add(key)}},})return &FooController{clientset: clientset,informer: informer,workqueue: workqueue,}
}// Run 启动控制器
func (c *FooController) Run(stopCh <-chan struct{}) {defer c.workqueue.ShutDown()go c.informer.Run(stopCh)if !cache.WaitForCacheSync(stopCh, c.informer.HasSynced) {log.Fatalf("Error syncing cache")return}wait.Until(c.runWorker, time.Second, stopCh)
}// runWorker 处理队列中的项目
func (c *FooController) runWorker() {for c.processNextItem() {}
}// processNextItem 处理队列中的下一个项目
func (c *FooController) processNextItem() bool {key, quit := c.workqueue.Get()if quit {return false}defer c.workqueue.Done(key)err := c.syncHandler(key.(string))if err != nil {c.workqueue.AddRateLimited(key)} else {c.workqueue.Forget(key)}return true
}// syncHandler 同步资源状态
func (c *FooController) syncHandler(key string) error {namespace, name, err := cache.SplitMetaNamespaceKey(key)if err != nil {return fmt.Errorf("invalid resource key: %s", key)}// 获取 Foo 对象foo, err := c.informer.GetIndexer().ByNamespace(namespace).Get(name)if err != nil {if cache.IsNotFound(err) {// Foo 对象已被删除return nil}return err}// 确保对应的 ConfigMap 存在configMapName := fmt.Sprintf("bar-%s", name)configMap, err := c.clientset.CoreV1().ConfigMaps(namespace).Get(context.TODO(), configMapName, metav1.GetOptions{})if err != nil {if cache.IsNotFound(err) {// 创建 ConfigMapconfigMap = &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Name: configMapName,Namespace: namespace,},Data: map[string]string{"foo": name,},}_, err = c.clientset.CoreV1().ConfigMaps(namespace).Create(context.TODO(), configMap, metav1.CreateOptions{})if err != nil {return err}} else {return err}}return nil
}func main() {config, err := rest.InClusterConfig()if err != nil {log.Fatalf("Error building kubeconfig: %s", err.Error())}clientset, err := kubernetes.NewForConfig(config)if err != nil {log.Fatalf("Error building kubernetes clientset: %s", err.Error())}informerFactory := informers.NewSharedInformerFactory(clientset, time.Minute)fooInformer := informerFactory.Core().V1().ConfigMaps().Informer()controller := NewFooController(clientset, fooInformer)stopCh := make(chan struct{})defer close(stopCh)go controller.Run(stopCh)<-stopCh
}
代码说明
-
初始化控制器
NewFooController
函数初始化控制器,设置事件处理程序,将资源事件添加到工作队列。
-
运行控制器
Run
方法启动控制器,运行 Informer 并同步缓存,然后启动工作线程处理队列中的项目。
-
处理队列中的项目
runWorker
方法从队列中提取项目并调用processNextItem
处理它们。processNextItem
方法调用syncHandler
同步资源状态,并根据处理结果决定是否重新调度该项目。
-
同步资源状态
syncHandler
方法获取Foo
对象,并确保对应的 ConfigMap 存在。如果不存在,则创建它。
最佳实践
- Idempotency(幂等性):确保每次处理同一个资源时,结果是一致的,不会产生副作用。
- Reconciliation Loop(协调循环):通过
syncHandler
实现协调循环,保持实际状态与期望状态一致。 - Event Handling(事件处理):使用 Informer 监听资源变化,减少 API 调用。
- Error Handling(错误处理):通过重试机制处理错误,并使用速率限制器防止过载。
- Rate Limiting(限流):使用
RateLimitingInterface
控制工作队列的处理速率。 - Scalability(可扩展性):使用工作队列和多工作线程,提高处理能力。
- Resource Management(资源管理):在实际部署时,应设置合理的资源请求和限制。
- Observability(可观察性):记录日志(在实际实现中应添加日志记录)和监控指标。
- Security(安全性):使用适当的 RBAC 配置,确保控制器仅有必要的权限。
五、Kubernetes Controller历史演进
Kubernetes Controller Manager 作为 Kubernetes 集群的核心组件之一,其功能和架构在不同版本的 Kubernetes 中不断演进。以下是 Kubernetes Controller Manager 的历史演进概述:
初期阶段 (v1.0 之前)
在 Kubernetes 的早期版本中,Controller Manager 的概念并不明确。早期的控制器逻辑直接内置在 API Server 中,负责管理 Pod 和其他资源的生命周期。随着 Kubernetes 的发展,控制器逻辑逐渐被抽象和独立出来,形成了一个单独的组件。
v1.0 (2015)
- 单一二进制:最初,所有控制器都是作为一个单一的二进制文件
kube-controller-manager
运行。这种设计简化了部署和管理,但缺乏灵活性。 - 基本控制器:包括 Node Controller、Replication Controller、Endpoint Controller 和 Service Account Controller 等基本控制器。
v1.2 (2016)
- Horizontal Pod Autoscaler (HPA):引入了 HPA 控制器,用于基于 CPU 使用率自动扩展 Pod 数量。
v1.5 (2016)
- CustomResourceDefinition (CRD):替换了 ThirdPartyResource (TPR),允许用户定义自定义资源。CRD 控制器负责管理这些自定义资源。
- StatefulSet Controller:引入 StatefulSet 控制器,用于管理有状态应用,确保有序和稳定的 Pod 部署。
v1.6 (2017)
- Multiple Schedulers:引入了对多调度器的支持,允许用户使用自定义调度器。
- PodDisruptionBudget (PDB):引入 PDB 控制器,限制计划内的 Pod 中断以确保应用的高可用性。
v1.8 (2017)
- Taints and Tolerations:增强了调度功能,引入了污点和容忍,允许节点标记不适合运行某些 Pod 的原因。
v1.9 (2017)
- Workloads API 组:引入了新的工作负载 API 组,包括 Deployment、DaemonSet 和 StatefulSet 等,简化了工作负载管理。
v1.10 (2018)
- Volume Snapshots:引入 VolumeSnapshot 和 VolumeSnapshotContent 控制器,支持持久卷的快照和恢复功能。
v1.12 (2018)
- Topology Aware Volume Scheduling:改进了持久卷调度,考虑到存储卷的拓扑要求,以优化性能。
v1.14 (2019)
- Cluster API:引入 Cluster API 控制器,用于管理 Kubernetes 集群的生命周期(创建、升级、删除)。
v1.16 (2019)
- Custom Metrics:扩展 HPA 控制器,支持基于自定义指标的自动扩展。
v1.18 (2020)
- EndpointSlice:引入 EndpointSlice 控制器,提供比传统 Endpoints 更高效和可扩展的服务发现机制。
v1.19 (2020)
- CSI Volume Health Monitoring:改进了 CSI 控制器,添加了卷健康监控功能。
v1.20 (2020)
- Storage Capacity Tracking:增强了存储调度,支持跟踪和报告存储容量。
v1.21 (2021)
- Immutable Secrets and ConfigMaps:引入不可变的 Secrets 和 ConfigMaps,提高集群的安全性和性能。
v1.22 (2021)
- PodSecurityPolicy (PSP) Deprecated:宣布弃用 PodSecurityPolicy,逐步引入新的安全策略机制。
v1.23 (2021)
- CronJob Controller:CronJob 控制器正式成为稳定版,用于管理定时任务。
v1.24 (2022)
- PodSecurity Admission:引入 Pod 安全准入控制器,取代 PSP,提供灵活的 Pod 安全策略。
v1.25 (2022)
- Dynamic Resource Allocation:引入动态资源分配控制器,支持共享资源的动态分配和管理。
总结
Kubernetes Controller Manager 的演进体现了 Kubernetes 不断扩展和增强其功能以满足各种需求的过程。随着 Kubernetes 的发展,Controller Manager 添加了许多新功能和控制器,以更好地管理和调度集群资源,提升系统的自动化和智能化水平。这些演进帮助 Kubernetes 成为一个强大且灵活的容器编排平台。
完。
希望对您有用!关注锅总,及时获得更多花里胡哨的运维实用操作!
锅总微信公众号
锅总个人博客
https://gentlewok.blog.csdn.net/
相关文章:

Kubernetes之Controller详解
本文尝试从Kubernetes Controller的种类、交互逻辑、最佳实践、伪代码示例及历史演进5个方面对其进行详细阐述,希望对您有所帮助! 一、Kubernetes Controller种类 Kubernetes Controller Manager 是 Kubernetes 集群的核心组件之一,负责管理…...

openlayers性能优化——开启图层预加载、减少空白等待时间
使用切片图层时、地图拖拽会有空白图片,为了减少空白等待时间,我们可以开始图层预加载。 const map_top new Map({layers: [new TileLayer({preload:Infinity, //预加载source: new StadiaMaps({layer: "outdoors",}),}),],target: "ma…...

BlockingQueue详解(含动画演示)
目录 BlockingQueue详解0、BlockingQueue简介BlockingQueue接口中方法注释BlockingQueue的实现,总结计划 1、ArrayBlockingQueue简介2、ArrayBlockingQueue的继承体系3、ArrayBlockingQueue的构造方法①、 ArrayBlockingQueue(int capacity)②、ArrayBlockingQueue(…...

wordpress商用付费主题与免费主题的区别
WordPress免费主题与WordPress付费主题,都可以用,但存在非常大的差别。从直观的感受,简单地说就是,WordPress免费主题能用,WordPress付费主题好用。如果涉及到其它的方面,WordPress商用付费主题与免费主题之…...

【ARM Trace32(劳特巴赫) 使用介绍 2.7 -- bat 脚本传参数给 trace32 cmm 脚本】
请阅读【Trace32 ARM 专栏导读】 文章目录 bat 脚本传参数给 trace32脚本可变参数传入CMM 脚本接收参数运行BAT脚本bat 脚本传参数给 trace32脚本 在使用 Trace32 的过程中,如果每次都是通过GUI 界面来操作,是习惯使用命令行工作的人所不能忍受的!!!,那么能不同通过脚本…...

NavicatforMySQL11.0软件下载-NavicatMySQL11最新版下载附件详细安装步骤
我们必须承认Navicat for MySQL 支援 Unicode,以及本地或远程 MySQL 服务器多连线,使用者可浏览数据库、建立和删除数据库、编辑数据、建立或执行 SQL queries、管理使用者权限(安全设定)、将数据库备份/复原、汇入/汇出数据&…...

弱监督学习
弱监督学习(Weak Supervision)是一种利用不完全、不精确或噪声数据进行模型训练的方法。以下是一些常用的弱监督方法及其原理: 1. 数据增强(Data Augmentation) 原理: 数据增强是一种通过增加训练数据的多…...

代码随想录算法训练营第五十天|LeetCode1143 最长公共子序列、LeetCode1035 不相交的线、LeetCode53 最大子数组和
题1: 指路:1143. 最长公共子序列 - 力扣(LeetCode) 思路与代码: 类似于最长重复子数组,我们依旧定义一个二维数组dp[i][j],其含义为从0到以i-1结尾的nums1数组和从0到j-1结尾的nums2数组的最…...

百日筑基第三天-SOA初步了解
百日筑基第三天-SOA初步了解 SOA(Service-Oriented Architecture,面向服务的架构)是一种软件设计原则,它倡导将应用程序分解为独立的服务单元,这些服务通过定义良好的接口相互通信,以实现业务功能。而RPC&…...

「2024中国数据要素产业图谱1.0版」重磅发布,景联文科技凭借高质量数据采集服务入选!
近日,景联文科技入选数据猿和上海大数据联盟发布的《2024中国数据要素产业图谱1.0版》数据采集服务板块。 景联文科技是专业数据服务公司,提供从数据采集、清洗、标注的全流程数据解决方案,协助人工智能企业解决整个AI链条中数据采集和数据标…...

条码二维码读取设备在医疗设备自助服务的重要性
医疗数字信息化建设的深入推进,医疗设备自助服务系统已成为医疗服务领域的一大趋势,条码二维码读取设备作为自助设备的重要组成部分,通过快速、准确地读取条形码二维码信息,不公提升了医疗服务效率,还为患者提供了更加…...

centos 7.8 安装sql server 2019
1.系统环境 centos 7.8 2.数据库安装文件准备 下载 SQL Server 2019 (15.x) Red Hat 存储库配置文件 sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/7/mssql-server-2019.repo 采用yum源进行不安装下载,这时yum 会自动检测…...

Android焦点机制结合WMS
文章前提: 了解WMS基本作用了解window的概念,phoneWindow,rootViewImpl了解view的事件分发 开始: 讲三件事情: window的创建,更新焦点的更新事件的分发 Window的创建,更新: wi…...

Hive分区和分桶
分区: 根据某一列进行进行划分存储,常用的有时间分区; 查询数据时只需要扫描特定的分区数据,不需要全盘扫描,节省时间, 方便数据归档和清理 创建分区表 create table table_name( col1 int, col2 string ) partition …...

GPT-5的到来~
IT之家6月22日消息,在美国达特茅斯工程学院周四公布的采访中,OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布,给出了肯定答案并表示将在一年半后发布。此外,穆拉蒂在采访中还把GPT-4到GPT-5的飞跃描述为高中生到博士生的成长。“像 GPT-4 这样的系统则更像是聪明的…...

责任链模式(设计模式)
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象有机会处理请求,从而避免请求的发送者和接收者之间的耦合。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理…...

计算机图形学入门20:加速光线追踪
1.前言 前文说了Whitted-style光线追踪技术的原理以及光线与平面的交点计算方式,对于现在应用最广的Polygon Mesh显式曲面来说,一个复杂场景中的多边形面总数可能达到千万甚至亿万以上,如果每个像素发射光线都和场景中每个平面进行求交点计算…...

sys.stdin对象——实现标准输入
自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 sys.stdin是一个标准化输入对象,可以连续输入或读入文件所有内容,不结束,不能直接使用。输入完成后&am…...

嵌入式项目分享| 终极智能手表,全过程+全开源分享
这是一个非常完整的智能手表开源项目,功能齐全,且资料开源,如果你是:自己平时喜欢diy的工程师,想要提升开发技能的学生,马上要做毕设的大四学生,这个手表很值得一做,别错过了~~ 所有开源的资料以及原文链接见文末。 先来看下这个手表的功能: 首先,是一个可以佩戴的手…...

【Linux详解】进程的状态 | 运行 阻塞 挂起 | 僵尸和孤儿状态
目录 操作系统中 运行状态 阻塞状态 进程状态转换 Linux系统中 查看进程状态 深度睡眠状态 T 暂停状态 Z 僵尸状态 孤儿状态 文章手稿 xmind: 引言 介绍系统中的进程状态及其管理方式。将通过结合操作系统原理和实际代码示例,详细说明进程的各种状态、转换…...

MySQL添加外键约束经典案例
1DDL建表语句 需要一个emp员工表和一个dept部门表 CREATE TABLE emp (id int NOT NULL AUTO_INCREMENT,name varchar(50) COLLATE utf8mb4_0900_as_ci NOT NULL COMMENT 姓名,age int DEFAULT NULL COMMENT 年龄,job varchar(20) COLLATE utf8mb4_0900_as_ci DEFAULT NULL CO…...

vue3监听器watch以及watchEffect的使用
一,watch()简介: 侦听一个或多个响应式数据源,并在数据源变化时调用所给的回调函数 watch()默认是懒侦听的,即仅在侦听源发生变化时才执行回调函数。 watch()一共有三个参数 第一个参数:侦听器的源,可以为以…...

modelsim做后仿真的一点思路
这是以TD_5.6.3_Release_88061生成的网表文件(其他工具生成的网表文件类似),与modelsim联合进行门级仿真的样例,时序仿真与门级仿真的方法类似,只是增加了标准延时文件。 1、建立门级仿真工程 将门级网表和testbench添…...

如何获取特定 HIVE 库的元数据信息如其所有分区表和所有分区
如何获取特定 HIVE 库的元数据信息如其所有分区表和所有分区 1. 问题背景 有时我们需要获取特定 HIVE 库下所有分区表,或者所有分区表的所有分区,以便执行进一步的操作,比如通过 使用 HIVE 命令 MSCK REPAIR TABLE table_name sync partiti…...

如何在 qmake(QtCreator)中指定 Mac 平台
在 Qt 项目文件(.pro 文件)中设置针对 Mac OS 的配置项。通常情况下,我们可以使用如下方式为 Windows 和 Unix 系统分别添加源文件: win32 {SOURCES += hellowin.cpp } unix {SOURCES += hellounix.cpp }虽然 Mac OS 是类 Unix 系统,但有时我们仍然需要区分它和 Linux 系…...

day39动态规划part02| 62.不同路径 63. 不同路径 II 343. 整数拆分 (可跳过)96..不同的二叉搜索树 (可跳过)
**62.不同路径 ** 本题大家掌握动态规划的方法就可以。 数论方法 有点非主流,很难想到。 题目讲解 | 视频讲解 class Solution { public:int uniquePaths(int m, int n) {// 确定数组及其下标的含义int dp[101][101] {0}; //到达i,j的点有多少条路径// 确定递推…...

声场合成新方法:基于声波传播的框架
声场合成是指在房间内的麦克风阵列上,根据来自房间内其他位置的声源信号,合成每个麦克风的音频信号。它是评估语音/音频通信设备性能指标的关键任务,因为它是一种成本效益高的方法,用于数据生成以替代真实的数据收集,后…...

鸿蒙文件操作事前准备
13900001,沙箱13900002 首选授权 module授权配置 "requestPermissions": [{ "name": "ohos.permission.CAMERA",}, { "name": "ohos.permission.READ_MEDIA",}, { "name": "ohos.permission.WR…...

AI智能时代:ChatGPT如何在金融市场发挥策略分析与预测能力?
文章目录 一、ChatGPT在金融策略制定中的深度应用客户需求分析与定制化策略市场动态跟踪与策略调整策略分析与优化 二、ChatGPT在算法交易中的深度应用自动交易策略制定交易执行与监控风险管理 三、未来展望《智能量化:ChatGPT在金融策略与算法交易中的实践》亮点内…...

C#面:C#属性能在接口中声明吗?
在C#中,接口是一种定义了一组方法、属性和事件的类型。在接口中,只能声明方法、属性和事件的签名,而不能包含字段、构造函数或实现代码。因此,C#属性不能直接在接口中声明。 然而,你可以在接口中定义属性的签名&#…...