k8s组件、工作原理详解
1.k8s组件
Master 组件:
kube-apiserver(API Server):
角色: 提供集群的唯一入口,处理所有 API 请求。
原理: 接收来自客户端(kubectl、UI 界面)和其他组件的请求,验证和授权请求,然后将其转发到其他组件或更新 etcd 中的数据。
etcd:
角色: 分布式键值存储,保存整个集群的状态和配置信息。
原理: 存储集群的整体状态、配置信息和元数据,被 kube-apiserver 用于存储配置信息、Pod 状态、Service 数据等。
kube-scheduler:
角色: 负责将新创建的 Pod 调度到合适的节点上。
原理: 监听未调度的 Pod,考虑资源约束、硬件要求,选择合适的节点,将 Pod 信息更新到 API Server。
kube-controller-manager:
角色: 包含多个控制器,负责维护集群中各种资源的状态。
原理: 监听 API Server 中的资源变化,如 Replication Controller、Node Controller 等,通过 API Server 更新集群状态以达到期望的状态。
Node 组件:
kubelet:
角色: 在每个 Node 上运行,负责维护 Pod 的生命周期。
原理: 从 API Server 获取 Pod 的期望状态,与容器运行时(如 Docker)交互,管理 Pod 的创建、启动、停止,并将节点状态报告给 API Server。
kube-proxy:
角色: 提供网络代理和负载均衡服务,确保 Pod 之间和外部的流量正确路由。
原理: 监听 API Server 中 Service 和 Endpoint 的变化,维护节点上的网络规则,确保流量正确地到达后端的 Pod。
Container Runtime:
角色: 负责运行容器,将容器镜像转换为正在运行的容器实例。
原理: 根据 Pod 的规格与 kubelet 交互,下载镜像并运行容器,同时处理容器的生命周期。
Controller:
Replication Controller(ReplicaSet):
角色: 确保指定数量的 Pod 副本在集群中运行。
原理: 监听 Pod 的运行状态,当 Pod 数量不符合预期时,通过 API Server 更新 Pod 的数量。
Deployment:
角色: 提供声明性语法,用于部署和更新应用。
原理: 定义期望的应用状态,Deployment Controller 负责在集群中创建、更新、删除 Pod 以满足定义的状态。
StatefulSet:
角色: 用于有状态应用的管理,确保每个 Pod 有唯一标识和稳定的网络标识。
原理: 与 Deployment 类似,但为有状态的应用提供了更好的唯一性和稳定性支持。
其他组件:
Pod:
角色: 最小的可部署和可扩展的单元,可以包含一个或多个容器。
原理: 共享网络和存储卷,通过 Pod 定义文件中的规格启动和管理容器。
Service:
角色: 提供抽象层,定义一组 Pod 的访问方式。
原理: 通过虚拟 IP 和 DNS 名称,将流量引导到后端的 Pod,不同类型的 Service 提供不同的访问方式。
Volume:
角色: 用于在容器之间共享和持久化数据的目录。
原理: 提供了不同类型的 Volume,如 EmptyDir、HostPath、PersistentVolume,确保数据的可靠性和共享。
Namespace:
角色: 用于将集群内的资源隔离开,以便不同团队或项目可以共享同一集群而不相互影响。
原理: 提供资源隔离和命名空间隔离,确保不同的资源不会冲突。
ConfigMap 和 Secret:
角色: 用于将配置信息和敏感信息从 Pod 的规格中解耦。
原理: 通过 ConfigMap 和 Secret 对象,将配置信息和敏感信息注入到 Pod 中,方便管理和更新。
2.工作流程说明
- 用户通过kubectl向api-server发起创建pod请求。
- apiserver通过对应的kubeconfig进行认证,认证通过后将yaml中的po信息存到etcd。
- Controller-Manager通过apiserver的watch接口发现了pod信息的更新,执行该资源所依赖的拓扑结构整合,整合后将对应的信息交给apiserver,apiserver写到etcd,此时pod已经可以被调度。
- Scheduler同样通过apiserver的watch接口更新到pod可以被调度,通过算法给pod分配合适的node,并将pod和对应节点绑定的信息交给apiserver,apiserver写到etcd,然后将pod交给kubelet。
- kubelet收到pod后,k8s调用标准接口与docker交互(调用CNI接口给pod创建pod网络,调用CRI接口去启动容器,调用CSI进行存储卷的挂载),Docker 提供了容器的运行时环境,负责启动、停止、管理容器的生命周期。kubelet 通过与 Docker 通信,使用 Docker 的 API 来创建和管理容器。
- 网络,容器,存储创建完成后pod创建完成,等业务进程启动后,pod运行成功。
3.网络的选择
- Calico 是一个开源的容器网络解决方案,为容器、虚拟机和裸机主机提供高性能、规模可扩展、安全性强的网络连接。以下是 Calico 的一些重要特点:
- BGP路由: Calico 使用 BGP(边界网关协议)实现网络路由,允许在集群中的节点之间建立直接路由连接。这种设计有助于提高网络性能,减少了数据包的传输和处理时间。
- 网络策略: Calico 支持 Kubernetes 的网络策略(Network Policies),允许你定义和实施对 Pod 之间通信的访问控制规则。这提供了细粒度的网络安全性,允许管理员定义哪些 Pod 可以与其他 Pod 进行通信以及如何通信。
- IP池管理: Calico 提供了对 IP 地址池的管理,使得在 Kubernetes 集群中更灵活地管理 Pod 的 IP 地址分配。这有助于避免 IP 地址的冲突和更好地控制 IP 地址的使用。
- 跨主机容器直连: Calico 支持容器直连,即容器可以直接使用主机上的 IP 地址,而无需进行 NAT 转换。这提高了网络性能并减少了复杂性。
- 容器网络可视化: Calico 提供了网络拓扑的可视化工具,允许管理员查看整个集群的网络结构,了解节点之间的连接和流量流向。
- IPv6 支持: Calico 支持 IPv6,使得集群可以使用 IPv6 地址,同时也支持 IPv4。这使得 Calico 更好地适应未来网络的发展趋势。
- 多云平台支持: Calico 不仅可以在本地部署的 Kubernetes 环境中使用,还支持在各种云平台上运行,包括 AWS、Azure、GCP 等。
- 开源和社区支持: Calico 是一个开源项目,具有强大的社区支持。这意味着用户可以从社区中获取支持、解决问题,并参与到项目的改进和发展中。
4.k8s的优缺点
自我修复:
- 概念解释: 自我修复是指容器运行时或编排系统能够检测到某个容器实例的崩溃或异常状态,并在短时间内(例如1秒左右)自动重新启动一个新的容器实例,以维持服务的可用性。
- 实现方式: 通过容器编排系统(如 Kubernetes)的健康检查机制,监测容器的运行状态,一旦检测到故障,编排系统会自动触发重启操作,确保容器服务的稳定性。
弹性伸缩:
- 概念解释: 弹性伸缩是指根据实际负载情况,自动调整集群中运行的容器实例数量,以应对流量波动或负载增加,确保资源的高效利用。
- 实现方式: 使用水平自动扩展机制,容器编排系统监测资源利用率或自定义指标,根据预定义的规则自动增减容器实例数量,以满足应用的性能需求。
服务发现:
- 概念解释: 服务发现是指容器之间或应用程序组件之间能够自动发现彼此的存在和网络位置,使得它们能够相互通信。
- 实现方式: 使用服务注册与发现机制,例如在 Kubernetes 中,服务通过 Service 对象进行注册,并通过 DNS 或环境变量的方式对外提供服务发现,使得其他容器或服务能够轻松地找到和连接到依赖的服务。
负载均衡:
- 概念解释: 负载均衡是指将请求分配到多个容器实例,以平衡负载、提高性能和确保容器集群的可靠性。
- 实现方式: 通过服务代理或者内置的负载均衡器,容器编排系统可以将请求分发给运行中的多个容器实例,确保它们共同处理请求,实现负载均衡。
版本回退:
- 概念解释: 版本回退是指在应用程序发布新版本后,如果发现问题或兼容性等方面的难题,能够快速、自动地将应用程序回退到之前的稳定版本。
- 实现方式: 通过使用滚动更新策略,容器编排系统能够在发布新版本时保留旧版本的部分容器实例,以便在需要时可以快速回退到先前的版本,确保系统的可靠性。
存储编排:
- 概念解释: 存储编排是指容器运行时或编排系统能够根据容器的需求,自动创建、管理存储卷,以满足应用程序对持久化存储的需求。
- 实现方式: 使用存储编排机制,如 Kubernetes 中的 CSI(Container Storage Interface),容器编排系统可以动态创建、挂载、卸载和删除存储卷,以支持应用程序对数据的持久性要求。
5.node节点宕机
- Pod 迁移: 当一个节点宕机时,节点上运行的所有 Pod 都将被终止。Kubernetes 控制平面(如 kube-scheduler)会监测到节点的失效,并尝试将这些 Pod 调度到其他正常的节点上,以保持应用的高可用性。这个过程称为 Pod 迁移。
- 自动缩容: 如果你启用了 Kubernetes 的自动伸缩机制(Horizontal Pod Autoscaling),失效的节点上的 Pod 被迁移到其他节点上后,系统可能会自动缩减不再需要的节点数量。
- 节点状态变更: Kubernetes 控制平面会将宕机的节点标记为不可用,并将该节点从集群的活动节点列表中移除。管理员可以选择手动修复或替换故障节点。
- 事件记录: 在 Kubernetes 集群的事件中,你会看到与节点宕机和 Pod 迁移相关的事件记录。这些事件可以通过 kubectl get events 或 Kubernetes 仪表板查看。
- 持久卷的重新挂载: 如果在宕机的节点上运行了有状态的应用,该节点上的持久卷(Persistent Volumes)可能需要在其他节点上重新挂载以确保数据的可用性。
- 节点替代: 如果你的 Kubernetes 集群配置了节点替代(Node Replacement)机制,宕机的节点可能会被替代为新的节点。这可能涉及到云服务提供商的自动节点替代机制,或者手动添加新节点来替代故障节点。
6.pod出现问题
- 重启策略: 在 Pod 的定义中,可以指定重启策略,包括 Always、OnFailure 和 Never。当 Pod 发生问题时,根据重启策略,Kubernetes 控制平面会自动重启该 Pod,使其尽快恢复。
- 自愈(Self-Healing): 如果 Pod 所在的节点发生故障或 Pod 本身无法正常运行,Kubernetes 控制平面会尝试将该 Pod 调度到其他正常的节点上,以实现自愈和高可用性。
- Liveness 和 Readiness 探针: 在 Pod 的定义中,可以配置 Liveness 探针和 Readiness 探针。Liveness 探针用于检测应用程序是否仍在运行,如果探针失败多次,控制平面将认为该应用程序不再健康,并采取相应措施,例如重启 Pod。Readiness 探针用于确定 Pod 是否准备好接收流量,如果不准备好,Pod 将被从服务负载均衡中剔除。
- 事件记录: 当 Pod 出现问题时,相关的事件将被记录在 Kubernetes 集群中。可以使用 kubectl describe pod <pod-name> 或 kubectl get events 来查看这些事件,以帮助诊断和调试问题。
- 容器日志: 容器的标准输出和标准错误日志会被收集,管理员可以通过 kubectl logs <pod-name> <container-name> 命令查看这些日志,以便定位问题。
- 事件通知: Kubernetes 支持集成多种事件通知系统,如 Prometheus、Grafana 等。可以配置这些系统,以便在 Pod 发生问题时及时收到通知。
- 自动缩放: 如果你启用了 Kubernetes 的自动伸缩机制(Horizontal Pod Autoscaling),系统会根据定义的指标,自动调整 Pod 的副本数量,以应对负载波动。
7.k8s周边服务
- Helm: Helm 是 Kubernetes 的包管理工具,用于简化和加速应用程序的部署、升级和管理。它使用称为 Charts 的打包格式。
- kubectl: kubectl 是 Kubernetes 的命令行工具,用于与 Kubernetes 集群进行交互。通过 kubectl,你可以执行各种管理操作,如创建、删除、更新资源。
- kubeadm: kubeadm 是用于快速部署 Kubernetes 集群的工具。它简化了集群的初始化、节点加入等过程。
- minikube: minikube 是用于在本地开发环境中运行单节点 Kubernetes 集群的工具,用于进行开发和测试。
- kops: kops 是一个用于在云环境中部署和管理 Kubernetes 集群的工具。它支持 AWS、GCP、Azure 等云平台。
- Kubeconfig: Kubeconfig 是一个用于配置和管理 kubectl 的文件。它包含了与 Kubernetes 集群的连接信息、认证信息等。
- kube-state-metrics: kube-state-metrics 是一个用于将 Kubernetes 集群状态导出为 Prometheus 指标的服务。它提供了关于 Pod、Node、Deployment 等资源的详细信息。
- Prometheus: Prometheus 是一种开源监控和告警工具,用于收集和存储时间序列数据。它与 Kubernetes 集成良好,并支持通过 Grafana 进行可视化。
- Grafana: Grafana 是一种开源的监控和度量分析平台,与 Prometheus 集成,用于创建丰富的仪表板。
- Fluentd: Fluentd 是一种开源的日志收集器,用于收集、处理和转发容器日志。它与 Kubernetes 集成,支持多种日志存储后端。
- Elasticsearch: Elasticsearch 是一个分布式搜索和分析引擎,与 Fluentd 和 Kibana 一起用于构建 ELK 堆栈,用于集中化处理和分析日志。
- KubeVirt: KubeVirt 允许在 Kubernetes 上运行和管理虚拟机,使得容器和虚拟机可以共存。
8.k8s自动化相关工具
- Helm: Helm 是 Kubernetes 的包管理器,用于自动化应用程序的部署、升级和管理。它通过使用称为 Charts 的打包格式,提供了一种简化和标准化的部署流程。
- Kubernetes Operators: Operators 是一种用于扩展 Kubernetes 功能的自定义控制器。它们使用自定义资源定义(CRD)来描述应用程序的状态,并根据定义的规则自动执行操作,实现自动化的管理和运维。
- kops: kops 是一个用于在云环境中自动化部署和管理 Kubernetes 集群的工具。它支持 AWS、GCP、Azure 等云平台,并提供了自动化的集群创建、扩展和升级功能。
- kubeadm: kubeadm 是一个用于快速初始化和配置 Kubernetes 集群的工具。它提供了自动化的集群初始化、节点加入等操作,使得集群的部署变得更加简单。
- KubeOne: KubeOne 是一个开源工具,用于在多个云提供商和基础设施上自动化 Kubernetes 集群的部署和管理。它支持高可用性配置,并提供了自动化的操作。
- Kubeform: Kubeform 是一个用于在多云环境中自动化 Kubernetes 集群的工具。它基于 Terraform,支持多个云平台,并提供了集群的创建、扩展和升级功能。
- KubeSpray: KubeSpray 是一个使用 Ansible 进行自动化的 Kubernetes 部署工具。它支持多云环境和自定义的部署配置。
- ArgoCD: ArgoCD 是一个用于自动化 GitOps 部署的工具。它将 Kubernetes 配置存储在 Git 存储库中,并自动同步到集群,实现了应用程序的声明性和自动化的更新。
- Tekton: Tekton 是一个用于构建、测试和部署 CI/CD 流水线的 Kubernetes 原生框架。它通过自定义资源定义(CRD)来定义和管理流水线任务,实现了自动化的持续集成和交付。
9.我们遇到的问题
1.没有固定且足够的机器测试,
2.pod是比较灵活的,license不能固定在一个pod或者一个node上
3.目前我们的流程是:设备——相机——算法,有状态且都是一一对应的,需要做到无状态,无设备的概念,需要ai-server和da这边做改动
4.算法升级、终端服务的升级也需要改动