运维锅总详解Kubernetes之Kubelet

本文尝试从Kubelet的发展历史、实现原理、交互逻辑、伪代码实现及最佳实践5个方面对Kubelet进行详细阐述。希望对您有所帮助!

一、kubelet发展历史

Kubelet 是 Kubernetes 中的核心组件之一,负责管理单个节点上的容器运行。它的发展历史和功能演进是 Kubernetes 项目整体发展的一个缩影。以下是 Kubelet 的发展历程和关键特性演进:

Kubernetes 及 Kubelet 的起源

2014 年:Kubernetes 项目启动
  • 背景: Kubernetes 项目由 Google 于 2014 年启动,基于 Google 内部的容器管理系统 Borg 和 Omega 的经验。

  • 初版 Kubelet: 作为 Kubernetes 的核心组件之一,Kubelet 从一开始就是为了在每个节点上管理容器而设计的。它负责与 API Server 交互,获取 Pod 规范,并根据规范启动和管理容器。

早期发展(2014-2016)

2014 年:Kubernetes v0.1 发布
  • 初始功能: 最早的 Kubelet 实现了基本的容器管理功能,包括启动、停止和监控容器。

2015 年:Kubernetes v1.0 发布
  • 正式发布: Kubernetes v1.0 标志着项目的稳定版本发布,Kubelet 作为核心组件,功能逐渐完善。

  • 功能增强:

    • Pod 生命周期管理: 实现了 Pod 的创建、更新和删除流程。

    • cAdvisor 集成: 集成 cAdvisor,用于监控容器的资源使用情况(CPU、内存、网络等)。

关键功能发展(2016-2018)

2016 年:Kubernetes v1.2
  • 集成 CRI(Container Runtime Interface):

    • 背景: 在此之前,Kubelet 直接与 Docker 进行交互。

    • 变更: 引入了 CRI,使 Kubelet 可以与多种容器运行时(如 Docker、rkt、CRI-O、containerd)进行交互,增加了灵活性。

2017 年:Kubernetes v1.6
  • Dynamic Kubelet Configuration: 引入动态 Kubelet 配置,允许在运行时更改 Kubelet 配置而无需重启节点。

  • 增强的调度功能: Kubelet 开始支持高级调度功能,如污点和容忍度(Taints and Tolerations)。

2018 年:Kubernetes v1.10
  • CRI 标准化: CRI 接口进一步标准化,确保与不同容器运行时的兼容性。

  • Pod 安全性: 增加对 Pod 安全策略(Pod Security Policies)的支持,增强 Pod 的安全性控制。

近期发展(2019-至今)

2019 年:Kubernetes v1.15
  • CSI(Container Storage Interface): Kubelet 开始支持 CSI,简化存储插件的集成和管理。

  • Device Plugins: 引入设备插件机制,允许第三方供应商扩展和管理特殊硬件资源(如 GPU、FPGA)。

2020 年:Kubernetes v1.18
  • Topology Manager: 引入拓扑管理器,优化节点上的资源分配,特别是对于 NUMA 架构和高性能计算的场景。

  • 延迟节点功能: 增加对延迟节点功能的支持,提高节点的可靠性和可用性。

2021 年:Kubernetes v1.21
  • IPv6/IPv4 双栈支持: Kubelet 开始支持 IPv6 和 IPv4 双栈网络配置,增强网络灵活性。

  • Graceful Node Shutdown: 支持节点优雅关闭,确保在节点关闭时,容器和工作负载能安全地停止和迁移。

2022 年至今
  • 持续优化和安全增强: Kubelet 不断进行性能优化、安全性增强和新功能的添加,以适应日益复杂的容器化环境和应用场景。

  • 扩展与插件支持: 增强对各种插件的支持,包括网络插件(CNI)、存储插件(CSI)和设备插件,提升 Kubelet 的扩展能力。

未来展望

  • 进一步增强安全性: 持续改进 Pod 安全策略和节点安全性。

  • 边缘计算支持: 适应边缘计算场景,增强 Kubelet 的轻量级和低延迟特性。

  • 多容器运行时支持: 深化 CRI 的支持,增强与新兴容器运行时(如 Kata Containers)的兼容性。

总结

Kubelet 作为 Kubernetes 集群中每个节点上的核心代理,一直在不断发展和完善。从最初的简单容器管理到现在的复杂资源调度、安全策略和插件机制,Kubelet 在 Kubernetes 生态系统中扮演着至关重要的角色。它的演进不仅反映了 Kubernetes 项目的发展轨迹,也展示了现代容器编排技术的进步和趋势。

二、Kubelet实现原理

Kubelet 是 Kubernetes 中负责管理每个节点上的 Pod 和容器的核心组件。它的实现原理涉及多个关键方面,包括与 Kubernetes API 服务器的交互、Pod 的生命周期管理、容器运行时接口(CRI)、节点健康检查和资源管理等。以下是 Kubelet 实现原理的详细解析:

1. Kubelet 启动和初始化

启动过程
  • 配置加载: Kubelet 启动时,首先加载配置文件和命令行参数,包括节点名称、API 服务器地址、认证信息等。

  • 组件初始化: 初始化各个子组件,如 API 客户端、Pod 管理器、容器运行时、网络插件等。

  • 注册节点: Kubelet 启动后,会将自己注册到 Kubernetes 集群中,向 API 服务器报告节点的状态和能力。

2. 与 API 服务器的交互

Pod 同步循环
  • 监听资源: Kubelet 通过 Watch API 监听 API 服务器上的 Pod 资源变更,包括创建、更新和删除事件。

  • 状态报告: 定期向 API 服务器报告节点和 Pod 的状态,包括运行状态、资源使用情况、健康检查结果等。

3. Pod 的生命周期管理

Pod 的创建和删除
  • Pod 配置处理: 收到新的 Pod 规范后,Kubelet 解析 Pod 规范,处理配置和依赖,如卷挂载、环境变量等。

  • 容器创建: 使用容器运行时(如 Docker 或 containerd)拉取镜像、创建并启动容器。

  • Pod 清理: 删除 Pod 时,Kubelet 停止并删除 Pod 内的所有容器,清理相关资源。

容器运行时接口(CRI)
  • CRI 插件: Kubelet 通过 CRI 与不同的容器运行时(如 Docker、containerd、CRI-O)交互,实现容器的创建、删除和监控。

  • 接口调用: 主要使用 gRPC 接口进行通信,Kubelet 通过调用 CRI 插件的接口来管理容器。

4. 节点健康检查

定期检查
  • 健康检查探针: Kubelet 配置健康检查探针(如 Liveness、Readiness 和 Startup),定期检查节点和容器的健康状态。

  • 状态报告: 将检查结果报告给 API 服务器,API 服务器根据报告结果进行调度决策。

5. 资源管理

资源监控
  • cAdvisor 集成: Kubelet 集成 cAdvisor,用于实时监控节点和容器的资源使用情况(CPU、内存、磁盘等)。

  • 资源限制: 根据 Pod 规范中的资源限制(Requests 和 Limits),Kubelet 配置容器的资源使用,确保公平分配和隔离。

6. 网络和存储管理

网络插件(CNI)
  • CNI 插件: Kubelet 通过 CNI 插件配置和管理 Pod 的网络,确保每个 Pod 都有一个独立的网络环境。

  • 网络隔离: 实现网络隔离和多租户支持,确保 Pod 之间的网络流量受控。

存储管理(CSI)
  • CSI 插件: Kubelet 使用 CSI 插件管理持久化存储卷,处理卷的挂载、卸载和动态配置。

  • 卷管理: 根据 Pod 规范中的卷配置,Kubelet 负责卷的创建、挂载和生命周期管理。

7. 日志和监控

日志收集
  • 容器日志: Kubelet 负责收集和管理容器的日志,支持日志的轮转和清理。

  • 系统日志: Kubelet 记录自身的操作日志和状态变化,方便调试和监控。

监控集成
  • Prometheus: Kubelet 暴露监控指标,支持 Prometheus 等监控系统的集成,实现节点和 Pod 的性能监控。

8. 安全和认证

安全配置
  • 认证和授权: Kubelet 配置认证和授权机制,确保只有合法的请求可以访问节点上的资源。

  • Pod 安全策略: Kubelet 支持 Pod 安全策略(PSP),限制 Pod 的操作权限和行为。

关键组件和模块

1. PodManager
  • 作用: 管理节点上所有 Pod 的生命周期,处理 Pod 的创建、更新和删除。

  • 功能: 负责 Pod 的调度、容器的启动和停止、资源配置等。

2. RuntimeManager
  • 作用: 通过 CRI 接口与容器运行时交互,管理容器的生命周期。

  • 功能: 拉取镜像、启动容器、停止容器、获取容器状态等。

3. VolumeManager
  • 作用: 管理 Pod 的存储卷,处理卷的挂载和卸载。

  • 功能: 支持各种存储后端(如本地存储、网络存储)、实现持久化存储。

4. NetworkPlugin
  • 作用: 通过 CNI 插件配置和管理 Pod 的网络。

  • 功能: 设置网络接口、分配 IP 地址、配置网络策略等。

5. Prober
  • 作用: 执行健康检查探针,监控容器和节点的健康状态。

  • 功能: 定期检查 Liveness、Readiness 和 Startup 探针,报告检查结果。

Kubelet 的工作流程

  1. 初始化: Kubelet 启动并初始化各个组件。

  2. 节点注册: Kubelet 向 API 服务器注册节点信息。

  3. 监听 Pod 资源: 通过 Watch API 监听 Pod 资源的变化。

  4. Pod 同步: 根据 Pod 规范,创建或更新 Pod,启动或停止容器。

  5. 健康检查: 定期执行健康检查,确保 Pod 和容器的健康状态。

  6. 资源监控: 通过 cAdvisor 监控资源使用情况,报告给 API 服务器。

  7. 网络和存储管理: 使用 CNI 和 CSI 插件管理网络和存储卷。

  8. 日志和监控: 收集和管理日志,暴露监控指标。、

Kubelet 作为 Kubernetes 的核心组件,扮演着节点上 Pod 和容器管理的关键角色。其实现原理涉及多个方面,包括与 API 服务器的交互、容器运行时接口、节点健康检查、资源管理、网络和存储管理、日志和监控等。通过这些机制,Kubelet 确保了 Kubernetes 集群中每个节点上的容器能够高效、稳定地运行。

三、Kubelet 与其他组件交互示意图

Kubelet 在 Kubernetes 集群中作为核心组件,主要负责管理每个节点上的 Pod 和容器。为了更好地理解 Kubelet 与其他组件的交互逻辑,下面将通过一个示意图和详细的解释来展示这种交互关系。

+-------------------------------------+| Kubernetes API Server               |+-------------------------------------+/|\|| Watch/Sync Pod/Node Status|\|/
+----------------+------------------+   +----------------+
|    Controller Manager             |   | Scheduler       |
+-----------------------------------+   +----------------+/|\                      /|\|                        ||                        ||                        |\|/                      \|/+-------------------+       +----------------+|       Kubelet     |       |       Kubelet  |+-------------------+       +----------------+| - PodManager      |       | - PodManager   || - RuntimeManager  |       | - RuntimeMgr   || - VolumeManager   |       | - VolumeMgr    || - NetworkPlugin   |       | - NetworkPlug  || - Prober          |       | - Prober       |+-------------------+       +----------------+/|\                      /|\|                        |Container Runtime Interface (CRI)      ||                        |\|/                      \|/+-------------------+       +----------------+|   Containerd      |       |     Docker     |+-------------------+       +----------------+/|\                      /|\|                        |Container Network Interface (CNI)      ||                        |\|/                      \|/+-------------------+       +----------------+| Network Plugins   |       | Network Plugins|+-------------------+       +----------------+

详细解释

  1. Kubelet 与 Kubernetes API Server 的交互

  • Pod 同步: Kubelet 通过 API 服务器的 Watch 机制监听 Pod 的变更事件。当有新的 Pod 被分配到该节点,或者 Pod 状态需要更新时,Kubelet 会获取最新的 Pod 规范。

  • 状态报告: Kubelet 定期向 API 服务器报告节点和 Pod 的状态,包括运行状态、资源使用情况和健康状况。

Kubelet 与 Controller Manager 的交互

  • 节点状态监控: Controller Manager 通过 API 服务器获取节点状态信息,并根据这些信息做出调度决策或触发其他控制逻辑(如自动扩展)。

Kubelet 与 Scheduler 的交互

  • 调度决策: Scheduler 通过 API 服务器将调度决策告知 Kubelet,即将某个 Pod 分配到具体的节点。Kubelet 接收到调度指令后,负责在本节点上启动和管理该 Pod。

Kubelet 内部组件的交互

  • PodManager: 管理节点上的 Pod 生命周期,包括创建、更新和删除 Pod。

  • RuntimeManager: 通过 CRI 与容器运行时(如 containerd 或 Docker)交互,负责容器的启动、停止和管理。

  • VolumeManager: 处理存储卷的挂载和卸载,确保 Pod 访问持久化存储。

  • NetworkPlugin: 使用 CNI 插件配置 Pod 的网络,确保网络隔离和通信。

  • Prober: 执行健康检查探针,监控 Pod 和容器的健康状态。

Kubelet 与容器运行时的交互

  • CRI: Kubelet 通过 CRI 接口与具体的容器运行时(如 containerd 或 Docker)进行通信,执行容器的创建、运行和销毁等操作。

Kubelet 与网络插件的交互

  • CNI: Kubelet 通过 CNI 接口与网络插件交互,负责为 Pod 分配 IP 地址,配置网络接口,实现网络策略和隔离。

交互逻辑说明

  • Pod 同步与管理:

    • Kubelet 通过监听 API 服务器的 Pod 变更事件,获取最新的 Pod 规范。

    • PodManager 处理 Pod 规范,协调其他子组件(如 RuntimeManager、VolumeManager、NetworkPlugin)完成 Pod 的部署和管理。

  • 状态监控与报告:

    • Prober 定期检查容器和节点的健康状态,将结果报告给 PodManager。

    • PodManager 汇总节点和 Pod 的状态,定期通过 API 服务器向 Controller Manager 和 Scheduler 报告。

  • 容器与网络配置:

    • RuntimeManager 通过 CRI 接口与容器运行时交互,启动和管理容器。

    • NetworkPlugin 通过 CNI 接口与网络插件交互,配置 Pod 的网络环境,确保网络连接和隔离。

结论

Kubelet 是 Kubernetes 集群中每个节点上的关键组件,通过与 API 服务器、Controller Manager 和 Scheduler 等组件的交互,实现了对 Pod 和容器的管理。同时,Kubelet 内部的各个子组件协同工作,处理容器运行时、存储卷和网络配置等任务,确保 Kubernetes 集群的高效运行和资源管理。

四、kubelet 伪代码实现

下面是一个使用 Go 语言实现 Kubelet 核心功能的简化伪代码。这个伪代码示例展示了 Kubelet 的启动过程、与 Kubernetes API 服务器的交互、Pod 的生命周期管理、容器运行时接口(CRI)、健康检查和资源管理等关键功能。

package mainimport ("fmt""time"
)// 配置结构体
type Config struct {ApiServerURL    stringRuntimeEndpoint stringNodeName        string
}// API 服务器客户端
type ApiServerClient struct {serverURL string
}func NewApiServerClient(url string) *ApiServerClient {return &ApiServerClient{serverURL: url}
}func (c *ApiServerClient) WatchPods() {// 模拟监听 Pod 资源变更fmt.Println("Watching pods from API server...")
}func (c *ApiServerClient) ReportNodeStatus() {// 模拟向 API 服务器报告节点状态fmt.Println("Reporting node status to API server...")
}// 容器运行时接口(CRI)
type ContainerRuntime struct {endpoint string
}func NewContainerRuntime(endpoint string) *ContainerRuntime {return &ContainerRuntime{endpoint: endpoint}
}func (r *ContainerRuntime) CreateContainer(pod string) {// 模拟创建容器fmt.Printf("Creating container for pod %s...\n", pod)
}func (r *ContainerRuntime) RemoveContainer(pod string) {// 模拟删除容器fmt.Printf("Removing container for pod %s...\n", pod)
}// Kubelet 主结构体
type Kubelet struct {config           ConfigapiServerClient  *ApiServerClientcontainerRuntime *ContainerRuntime
}func NewKubelet(config Config) *Kubelet {return &Kubelet{config:           config,apiServerClient:  NewApiServerClient(config.ApiServerURL),containerRuntime: NewContainerRuntime(config.RuntimeEndpoint),}
}func (k *Kubelet) Run() {// 启动 Kubeletfmt.Println("Starting Kubelet...")// 注册节点k.RegisterNode()// 启动 Pod 同步循环go k.syncLoop()// 启动状态报告循环go k.statusLoop()// 模拟运行一段时间time.Sleep(10 * time.Second)
}func (k *Kubelet) RegisterNode() {// 模拟节点注册fmt.Println("Registering node with API server...")
}func (k *Kubelet) syncLoop() {for {// 模拟监听和处理 Pod 资源变更k.apiServerClient.WatchPods()time.Sleep(5 * time.Second)// 示例:根据监听结果,创建或删除容器k.containerRuntime.CreateContainer("example-pod")}
}func (k *Kubelet) statusLoop() {for {// 定期向 API 服务器报告节点和 Pod 状态k.apiServerClient.ReportNodeStatus()time.Sleep(10 * time.Second)}
}func main() {// 创建并运行 Kubeletconfig := Config{ApiServerURL:    "http://api-server:8080",RuntimeEndpoint: "unix:///var/run/container-runtime.sock",NodeName:        "example-node",}kubelet := NewKubelet(config)kubelet.Run()
}

代码说明

  1. Config 结构体:存储 Kubelet 的配置参数,包括 API 服务器 URL、容器运行时接口端点和节点名称。

  2. ApiServerClient 结构体:用于与 Kubernetes API 服务器交互,包括监听 Pod 资源变更和报告节点状态。

  3. ContainerRuntime 结构体:表示容器运行时接口,用于创建和删除容器。

  4. Kubelet 结构体:Kubelet 的主结构体,包含配置、API 服务器客户端和容器运行时接口。

  5. NewKubelet 函数:创建并初始化一个新的 Kubelet 实例。

  6. Run 方法:启动 Kubelet,注册节点,并启动两个循环:

  • syncLoop:模拟监听和处理 Pod 资源变更,根据监听结果创建或删除容器。

  • statusLoop:定期向 API 服务器报告节点和 Pod 的状态。

注意

  • 这个伪代码示例是一个简化版本,主要展示了 Kubelet 的基本功能和工作流程。实际的 Kubelet 实现复杂得多,包括详细的错误处理、更多的资源管理(如存储卷、网络配置等)、更高级的健康检查机制、安全策略等。

  • 本示例省略了实际的网络通信、并发处理和更复杂的业务逻辑,仅用于展示 Kubelet 的基本工作原理。

五、kubelet最佳实践及参数优化

优化和配置 Kubelet 可以提高 Kubernetes 集群的性能、可靠性和安全性。以下是一些 Kubelet 的最佳实践和参数优化建议:

Kubelet 最佳实践

1. 定期更新和安全补丁
  • 保持更新:定期更新 Kubelet 和相关组件,确保集群使用最新的功能和安全修复。

  • 安全补丁:及时应用安全补丁,防止已知漏洞被利用。

2. 资源限制和请求
  • 合理设置资源请求和限制:确保 Pod 的资源请求(requests)和限制(limits)合理配置,防止资源争用和节点过载。

  • 使用 Cgroups:利用 Cgroups 控制和隔离容器的资源使用,保证资源公平分配。

3. 健康检查和故障恢复
  • 配置健康检查:使用 Liveness、Readiness 和 Startup 探针,确保应用程序的健康状态,支持自动故障恢复。

  • 启用自愈功能:配置节点自动重启和恢复策略,增强系统的可用性和稳定性。

4. 日志和监控
  • 集成日志管理:将容器日志集中管理和分析,如使用 Fluentd、Elasticsearch 和 Kibana(EFK)等工具。

  • 监控指标:使用 Prometheus 和 Grafana 监控集群和应用的性能指标,及时发现和解决问题。

5. 网络和存储优化
  • 网络插件配置:选择适合的网络插件(如 Calico、Flannel),配置网络策略,确保网络性能和安全性。

  • 存储优化:使用合适的存储插件(如 CSI),配置持久化存储卷,提高存储性能和可靠性。

Kubelet 参数优化

Kubelet 提供了许多配置参数,可以通过修改配置文件或启动命令行参数进行调整。以下是一些常用参数及其优化建议:

1. 基本配置
  • --node-ip

    • 说明:指定节点的 IP 地址。

    • 优化建议:确保配置正确的节点 IP,避免多网卡或多 IP 产生的网络问题。

  • --hostname-override

    • 说明:覆盖节点的主机名。

    • 优化建议:在主机名不一致的情况下使用,确保 Kubernetes 内部和外部的主机名一致。

2. 性能优化
  • --max-pods

    • 说明:每个节点允许的最大 Pod 数量。

    • 优化建议:根据节点的资源能力合理设置,防止过载。常见默认值是 110。

  • --kube-reserved

    • 说明:预留给 Kubernetes 系统组件的资源。

    • 优化建议:预留一定的 CPU、内存和存储资源,防止系统组件资源不足影响节点稳定性。

  • --system-reserved

    • 说明:预留给系统守护进程的资源。

    • 优化建议:预留一定的系统资源,确保系统守护进程的正常运行。

3. 网络优化
  • --network-plugin

    • 说明:指定网络插件(如 cni)。

    • 优化建议:选择适合的网络插件,并根据插件文档优化网络配置。

  • --cni-bin-dir

    • 说明:CNI 插件二进制文件目录。

    • 优化建议:确保路径正确,并包含所需的 CNI 插件。

  • --cni-conf-dir

    • 说明:CNI 配置文件目录。

    • 优化建议:确保路径正确,并包含正确的 CNI 配置文件。

4. 存储优化
  • --volume-plugin-dir

    • 说明:存储插件目录。

    • 优化建议:确保路径正确,并包含所需的存储插件。

  • --fail-swap-on

    • 说明:是否在检测到 swap 时失败。

    • 优化建议:设为 true,确保在启用 swap 时失败,因为 Kubernetes 不支持启用 swap。

5. 健康检查和故障恢复
  • --read-only-port

    • 说明:设置 Kubelet 只读端口(通常用于监控)。

    • 优化建议:可以关闭此端口以增强安全性(设为 0)。

  • --healthz-port

    • 说明:健康检查端口。

    • 优化建议:确保此端口启用,并配置健康检查探针。

  • --pod-manifest-path

    • 说明:Pod 清单文件路径。

    • 优化建议:使用静态 Pod 文件时设置此参数,并确保文件路径和格式正确。

示例:优化后的 Kubelet 启动参数

kubelet \--node-ip=192.168.1.10 \--hostname-override=my-node \--max-pods=100 \--kube-reserved=cpu=500m,memory=1Gi,ephemeral-storage=1Gi \--system-reserved=cpu=200m,memory=500Mi,ephemeral-storage=1Gi \--eviction-hard=memory.available<200Mi,nodefs.available<10% \--network-plugin=cni \--cni-bin-dir=/opt/cni/bin \--cni-conf-dir=/etc/cni/net.d \--volume-plugin-dir=/usr/libexec/kubernetes/kubelet-plugins/volume/exec \--fail-swap-on=true \--read-only-port=0 \--healthz-port=10248 \--pod-manifest-path=/etc/kubernetes/manifests

结论

通过合理配置和优化 Kubelet,可以显著提高 Kubernetes 集群的性能和稳定性。遵循最佳实践,定期监控和调整参数,根据具体的集群环境和业务需求进行优化,确保集群高效、安全、可靠地运行。

完。3464bb2d71f8c3bac9092f046cff0825.png希望对您有所帮助!关注锅总,及时获得更多花里胡哨的运维实用操作!

3c0d871000f8c0c89266336d01a6bf6d.png

锅总个人博客

https://gentlewok.blog.csdn.net/

锅总微信公众号

b891126593899c843ab5b505d43b2ce5.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/48533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】222. 完全二叉树的个数

什么是计算机基础&#xff1f;如果本题能够用二分二进制二叉树的方式解出本题&#xff0c;那么我可以认为你的计算机基础就很好了。很久以来&#xff0c;我一直认为自己的计算机基础好&#xff0c;但是自刷题以来&#xff0c;跟网上这么多优秀的同学相比&#xff0c;我发现我实…

五分钟学会 Docker Registry 搭建私有镜像仓库

在上一篇文章《前端不懂 Docker &#xff1f;先用它换掉常规的 Vue 项目部署方式》中&#xff0c;我们学习了如何使用 aliyun 私有镜像仓库&#xff0c;也了解到可以使用 Docker Registry 搭建私有镜像仓库。这篇文章就分享下实操过程。 registry 是官方提供的 registry 镜像&…

WEB前端09-前端服务器搭建(Node.js/nvm/npm)

前端服务器的搭建 在本文中&#xff0c;我们将介绍如何安装和配置 nvm&#xff08;Node Version Manager&#xff09;以方便切换不同版本的 Node.js&#xff0c;以及如何设置 npm&#xff08;Node Package Manager&#xff09;使用国内镜像&#xff0c;并搭建一个简单的前端服…

类和对象(三)

默认成员函数 接下来继续看剩下的两个默认成员函数。 const成员函数 将const修饰的成员函数称之为const成员函数&#xff0c;const修饰成员函数放到成员函数参数列表的后 ⾯。const实际修饰该成员函数隐含的this指针&#xff0c;表明在该成员函数中不能对类的任何成员进⾏修…

秋招突击——7/17——复习{二分查找——搜索插入位置、搜索二维矩阵,}——新作{链表——反转链表和回文链表,子串——和为K的子数组}

文章目录 引言新作二分模板二分查找——搜索插入位置复习实现 搜索二维矩阵复习实现 新作反转链表个人实现参考实现 回文链表个人实现参考实现 和为K的子数组个人实现参考实现 总结 引言 今天算法得是速通的&#xff0c;严格把控好时间&#xff0c;后面要准备去面试提前批了&a…

C语言实例-约瑟夫生者死者小游戏

问题&#xff1a; 30个人在一条船上&#xff0c;超载&#xff0c;需要15人下船。于是人们排成一队&#xff0c;排队的位置即为他们的编号。报数&#xff0c;从1开始&#xff0c;数到9的人下船&#xff0c;如此循环&#xff0c;直到船上仅剩15人为止&#xff0c;问都有哪些编号…

C语言 | Leetcode C语言题解之第260题只出现一次的数字III

题目&#xff1a; 题解&#xff1a; int* singleNumber(int* nums, int numsSize, int* returnSize) {int xorsum 0;for (int i 0; i < numsSize; i) {xorsum ^ nums[i];}// 防止溢出int lsb (xorsum INT_MIN ? xorsum : xorsum & (-xorsum));int type1 0, type2…

【Mysql】Docker下Mysql8数据备份与恢复

[TOC] 【Mysql】Docker下Mysql8数据备份与恢复 1 创建Mysql容器 格式 docker run -d --name容器名称 -p 宿主端口号:3306 -e MYSQL_ROOT_PASSWORDmysql密码 -e MYSQL_PASSWORDmysql密码 -e TZAsia/Shanghai -v 宿主目录-数据:/var/lib/mysql -v 宿主目录-备份数据:/back…

多态性概念 OOPS

大家好&#xff01;今天&#xff0c;我们将探讨面向对象编程 (OOP) 中的一个基本概念 - 多态性。具体来说&#xff0c;我们将重点介绍其三种主要形式&#xff1a;方法重载、方法覆盖和方法隐藏。对于任何使用 OOP 语言&#xff08;例如 C#&#xff09;的程序员来说&#xff0c;…

NET 语言识别,语音控制操作、语音播报

System.Speech. 》》System.Speech.Synthesis; 语音播报 》》System.Speech.Recognition 语音识别 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Speech.Recog…

mac二进制安装operator-sdk

0. 前置条件 1. 安装go 安装步骤略。 1. 下载operator-sdk源码包 https://github.com/operator-framework/operator-sdk 1.1 选择适合当前go版本的operator版本&#xff0c;在operator-sdk/go.mod文件中可以查看Operator-sdk使用的go版本。 2. 编译 源码包下载后&#x…

C语言航空售票系统

以下是系统部分页面 以下是部分源码&#xff0c;需要源码的私信 #include<stdio.h> #include<stdlib.h> #include<string.h> #define max_user 100 typedef struct ft {char name[50];//名字char start_place[50];//出发地char end_place[50];//目的地char …

JAVA 异步编程(线程安全)二

1、线程安全 线程安全是指你的代码所在的进程中有多个线程同时运行&#xff0c;而这些线程可能会同时运行这段代码&#xff0c;如果每次运行的代码结果和单线程运行的结果是一样的&#xff0c;且其他变量的值和预期的也是一样的&#xff0c;那么就是线程安全的。 一个类或者程序…

多线程初阶(二)- 线程安全问题

目录 1.观察count 原因总结 2.解决方案-synchronized关键字 &#xff08;1&#xff09;synchronized的特性 &#xff08;2&#xff09;如何正确使用 语法格式 3.死锁 &#xff08;1&#xff09;造成死锁的情况 &#xff08;2&#xff09;死锁的四个必要条件 4.Java标准…

若依二次开发

口味改造 原&#xff1a; 改造&#xff1a; 1./** 定义口味名称和口味列表的静态数据 */ 2.改变页面样式 3.定义储存当前选中的口味列表数组&#xff0c;定义改变口味名称时更新当前的口味列表 4.改变页面样式 6.格式转换 7.定义口味列表获取焦点时更新当前选中的口味列表

【DGL系列】简单理解graph.update_all和spmm的区别

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 背景介绍 源码分析 小结一下 背景介绍 我们在看GNN相关的论文时候&#xff0c;都会说到邻接矩阵与特征矩阵之间是用到了spmm&#xff0c;在很久…

深入理解Linux网络(二):UDP接收内核探究

深入理解Linux网络&#xff08;二&#xff09;&#xff1a;UDP接收内核探究 一、UDP 协议处理二、recvfrom 系统调⽤实现 一、UDP 协议处理 udp 协议的处理函数是 udp_rcv。 //file: net/ipv4/udp.c int udp_rcv(struct sk_buff *skb) {return __udp4_lib_rcv(skb, &udp_…

【web】-反序列化-to_string

<?php highlight_file(__FILE__); class A{public $s;public function __destruct(){echo "hello".$this->s;}} class B{public $cmd;public function __toString(){system($this->cmd);return 1;} } unserialize($_GET[code]); __toString()当对象被当着…

《梦醒蝶飞:释放Excel函数与公式的力量》17.1使用命名范围和工作表函数

第17章&#xff1a;使用命名范围和工作表函数 17.1 命名范围的优势 在Excel中&#xff0c;使用命名范围是一个强大且灵活的功能&#xff0c;它可以极大地提高工作效率和公式的可读性。命名范围不仅使公式更容易理解&#xff0c;还减少了错误的可能性。以下将详细介绍命名范围的…

自然语言大模型介绍

1 简介 最近一直被大语言模型刷屏。本文是周末技术分享会的提纲&#xff0c;总结了一些自然语言模型相关的重要技术&#xff0c;以及各个主流公司的研究方向和进展&#xff0c;和大家共同学习。 2 Transformer 目前的大模型基本都是Transformer及其变种。本部分将介绍Transf…