kubernetes学习总结(32)——kubernetes的架构原理简单总结

科技D人生 科技D人生     2022-11-30     696

关键词:

一、Master 节点与 Node 节点通讯原理

Master 节点启动时,会运行一个 kube-apiserver 进程,它提供了集群管理的 API 接口,是集群内各个功能模块之间数据交互和通信的中心枢纽,并且它页提供了完备的集群安全机制。在 Node 节点上,使用 K8S 中的 kubelet 组件,在每个 Node 节点上都会运行一个 kubelet 进程,它负责向 Master 汇报自身节点的运行情况,如 Node 节点的注册、终止、定时上报健康状况等,以及接收 Master 发出的命令,创建相应 Pod。在 K8S 中,Pod 是最基本的操作单元,它与 docker 的容器有略微的不同,因为 Pod 可能包含一个或多个容器(可以是 docker 容器),这些内部的容器是共享网络资源的,即可以通过 localhost 进行相互访问。关于 Pod 内是如何做到网络共享的,每个 Pod 启动,内部都会启动一个 pause 容器(google的一个镜像),它使用默认的网络模式,而其他容器的网络都设置给它,以此来完成网络的共享问题。如下图所示:

二、Master 节点将 Pod 调度到指定的 Node 节点的原理

该工作由 kube-scheduler 来完成,整个调度过程通过执行一些列复杂的算法最终为每个 Pod 计算出一个最佳的目标 Node,该过程由 kube-scheduler 进程自动完成。常见的有轮询调度(RR)。当然也有可能,我们需要将 Pod 调度到一个指定的 Node 上,我们可以通过节点的标签(Label)和 Pod 的 nodeSelector 属性的相互匹配,来达到指定的效果。如下图所示:

三:各节点、Pod 的信息都在哪里维护,怎样维护?

从上面的 Pod 调度的角度看,我们得有一个存储中心,用来存储各节点资源使用情况、健康状态、以及各 Pod 的基本信息等,这样 Pod 的调度来能正常进行。在 K8S 中,采用 etcd 组件 作为一个高可用强一致性的存储仓库,该组件可以内置在 K8S 中,也可以外部搭建供 K8S 使用。集群上的所有配置信息都存储在了 etcd,为了考虑各个组件的相对独立,以及整体的维护性,对于这些存储数据的增、删、改、查,统一由 kube-apiserver 来进行调用,apiserver 也提供了 REST 的支持,不仅对各个内部组件提供服务外,还对集群外部用户暴露服务。外部用户可以通过 REST 接口,或者 kubectl 命令行工具进行集群管理,其内在都是与 apiserver 进行通信。如下图所示:

四:外部用户如何访问集群内运行的 Pod ?

内部运行的 Pod 如何对外访问。使用过 Docker 的同学应该知道,如果使用 bridge 模式,在容器创建时,都会分配一个虚拟 IP,该 IP 外部是没法访问到的,我们需要做一层端口映射,将容器内端口与宿主机端口进行映射绑定,这样外部通过访问宿主机的指定端口,就可以访问到内部容器端口了。那么,K8S 的外部访问是否也是这样实现的?答案是否定的,K8S 中情况要复杂一些。因为上面讲的 Docker 是单机模式下的,而且一个容器对外就暴露一个服务。在分布式集群下,一个服务往往由多个 Application 提供,用来分担访问压力,而且这些 Application 可能会分布在多个节点上,这样又涉及到了跨主机的通信。这里,K8S 引入了 Service 的概念,将多个相同的 Pod 包装成一个完整的 service 对外提供服务,至于获取到这些相同的 Pod,每个 Pod 启动时都会设置 labels 属性,在 Service 中我们通过选择器 Selector,选择具有相同 Name 标签属性的 Pod,作为整体服务,并将服务信息通过 Apiserver 存入 etcd 中,该工作由 Service Controller 来完成。同时,每个节点上会启动一个 kube-proxy 进程,由它来负责服务地址到 Pod 地址的代理以及负载均衡等工作。如下图所示:

五:Pod 如何动态扩容和缩放?

服务是由 Pod 组成的,那么服务的扩容也就意味着 Pod 的扩容。通俗点讲,就是在需要时将 Pod 复制多份,在不需要后,将 Pod 缩减至指定份数。K8S 中通过 Replication Controller 来进行管理,为每个 Pod 设置一个期望的副本数,当实际副本数与期望不符时,就动态的进行数量调整,以达到期望值。期望数值可以由我们手动更新,或自动扩容代理来完成。如下图所示:

六:各个组件之间是如何相互协作的?

ectd 是作为集群数据的存储中心, apiserver 是管理数据中心,作为其他进程与数据中心通信的桥梁。而 Service Controller、Replication Controller 这些统一交由 kube-controller-manager 来管理,kube-controller-manager 作为一个守护进程,每个 Controller 都是一个控制循环,通过 apiserver 监视集群的共享状态,并尝试将实际状态与期望不符的进行改变。关于 Controller,manager 中还包含了 Node 节点控制器(Node Controller)、资源配额管控制器(ResourceQuota Controller)、命名空间控制器(Namespace Controller)等。如下图所示:

kubernetes学习总结-基本概念

...件  -doctor:负责本机的容器创建和管理工作3.Pod:  Kubernetes最基本概念  -Pause容器作为根容器,代表整个容器的ip和volume存储4.Label(标签):  -实现分组管理功能5.LabelSelector:  使用场景:  -监控Pod的副本数量,kube-Con... 查看详情

kubernetes学习总结synopsis

同类产品dockercompose、dockerswarm、dockermachine、mesos、marathonKubernetes项目地址https://github.com/kubernetes/kubernetes/releasesSchema?核心组件:1)APIserver:接收、分析用户请求,并处理用户请求2)Scheduler:调度资源(通过初选、优选、选定三个阶... 查看详情

kubernetes学习总结(28)——kubernetes常见问题总结(代码片段)

如何删除不一致状态下的rc、deployment、service在某些情况下经常发现kubectl进程挂起现象,然后在get时候发现删了一半而另外的删除不了[root@k8s-master ~]# kubectl get -f fluentd-elasticsearch/NAME DESIRED CURRENT READY AGErc/elasticsearch-logging-... 查看详情

kubernetes学习总结(18)——kubernetes容器网络

前言在Kubernetes 中要保证容器之间网络互通网络至关重要。Kubernetes 本身并没有实现容器网络而是通过插件化的方式自由接入,容器网络接入需要满足如下基本原则:pod无论运行在任何节点都可以互相直接通信,而不... 查看详情

kubernetes学习总结(29)——使用kubeadm部署kubernetes1.24详细步骤总结(代码片段)

前言kubeadm是Kubernetes官方提供的用于快速安部署Kubernetes集群的工具,伴随Kubernetes每个版本的发布都会同步更新,kubeadm会对集群配置方面的一些实践做调整,通过实验kubeadm可以学习到Kubernetes官方在集群配置上一些新... 查看详情

kubernetes学习总结(31)——kubernetes为何需要istio?

一、ServiceMesh是什么?“Aservicemeshisadedicatedinfrastructurelayerforhandlingservice-to-servicecommunication.“——WilliamMorgan。erviceMesh是一个专注于处理服务间通信的基础设施层。云原生应用有着复杂的服务拓扑,而ServiceMesh保证请求可以... 查看详情

kubernetes学习总结(31)——kubernetes为何需要istio?

一、ServiceMesh是什么?“Aservicemeshisadedicatedinfrastructurelayerforhandlingservice-to-servicecommunication.“——WilliamMorgan。erviceMesh是一个专注于处理服务间通信的基础设施层。云原生应用有着复杂的服务拓扑,而ServiceMesh保证请求可以... 查看详情

kubernetes学习总结(14)——kubernetes实用命令总结(代码片段)

一、Pods1、Getallpodsinthecurrentnamespacekubectlgetpods2、Getpodsinallnamespaceskubectlgetpods--all-namespaces3、Getpodswithmoredetailskubectlgetpods-owide4、Gettheyamlforapodkubectlgetpod<pod>-oyaml5、Inspectapodkubectldescribepods<pod>6、Getpodssortedbyametrickubectlgetpods--s... 查看详情

kubernetes学习总结(14)——kubernetes实用命令总结(代码片段)

一、Pods1、Getallpodsinthecurrentnamespacekubectlgetpods2、Getpodsinallnamespaceskubectlgetpods--all-namespaces3、Getpodswithmoredetailskubectlgetpods-owide4、Gettheyamlforapodkubectlgetpod<pod>-oyaml5、Inspectapodkubectldescribepods<pod>6、Getpodssortedbyametrickubectlgetpods--s... 查看详情

kubernetes学习总结(18)——kubernetes容器网络(代码片段)

前言在Kubernetes 中要保证容器之间网络互通网络至关重要。Kubernetes 本身并没有实现容器网络而是通过插件化的方式自由接入,容器网络接入需要满足如下基本原则:pod无论运行在任何节点都可以互相直接通信,而不... 查看详情

kubernetes学习总结——kubernetes常见面试题汇总

简述etcd及其特点etcd是CoreOS团队发起的开源项目,是一个管理配置信息和服务发现(servicediscovery)的项目,它的目标是构建一个高可用的分布式键值(key-value)数据库,基于Go语言实现。特点:简单... 查看详情

kubernetes学习总结(26)——kubernetes网络模型基础指南(代码片段)

前言Kubernetes是为运行分布式集群而建立的,分布式系统的本质使得网络成为Kubernetes的核心和必要组成部分,了解Kubernetes网络模型可以使你能够正确运行、监控和排查应用程序故障。网络是非常复杂的,拥有许多概念... 查看详情

kubernetes学习总结(17)——kubernetes快速入门需要掌握的知识点总结(代码片段)

一、DockerDocker是基于操作系统的沙盒技术,使得用户更简单和完整的去打包自己的应用。docker底层是基于Linux的操作系统级别的虚拟化技术LXC实现;LXC是通过CGroup实现了虚拟化资源管理,用来保证应用资源的隔离和应... 查看详情

kubernetes学习总结(36)——kubernetes本地运行的四种方法(代码片段)

前言Kubernetes是一个开源的容器编排平台。它由Google开发,为自动化部署、扩展和管理容器化应用提供了一个开源系统。虽然大多数人在云环境中运行Kubernetes,但在本地运行Kubernetes集群不仅是可能的,它还至少有两个... 查看详情

kubernetes学习总结(36)——kubernetes本地运行的四种方法(代码片段)

前言Kubernetes是一个开源的容器编排平台。它由Google开发,为自动化部署、扩展和管理容器化应用提供了一个开源系统。虽然大多数人在云环境中运行Kubernetes,但在本地运行Kubernetes集群不仅是可能的,它还至少有两个... 查看详情

kubernetes学习总结(36)——kubernetes本地运行的四种方法(代码片段)

前言Kubernetes是一个开源的容器编排平台。它由Google开发,为自动化部署、扩展和管理容器化应用提供了一个开源系统。虽然大多数人在云环境中运行Kubernetes,但在本地运行Kubernetes集群不仅是可能的,它还至少有两个... 查看详情

kubernetes学习总结(27)——kubernetes安装redis集群的两个方案(代码片段)

一、自定义yaml文件安装背景在Kubernetes中部署Redis集群面临挑战,因为每个Redis实例都依赖于一个配置文件,该文件可以跟踪其他集群实例及其角色。为此,需要结合使用KubernetesStatefulSets和PersistentVolumes实现。Redis集群... 查看详情

kubernetes学习总结(22)——应用程序迁移到kubernetes应该注意些什么?

...实现更自动化基础设施的关键,而将应用程序迁移到Kubernetes是一个重大步骤。根据Canonical的数据,只有大约15%的企业完全使用Kubernetes来运行应用程序。大约同样比例的人仍在使用纯粹以虚拟机为中心的基础设施,而... 查看详情