暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Kubernetes 架构详细解释

55

点击上方蓝字关注我们





Kubernetes 是一个开源的容器编排平台,旨在自动化应用程序的部署、扩展和管理。通过 Kubernetes,开发者可以轻松管理容器化应用的生命周期,保证应用的高可用性和扩展性。

1. 集群架构




Kubernetes 集群由多个节点组成,分为 Master 节点和 Worker 节点(Node)。Master 节点负责集群的管理和控制,而 Worker 节点则运行实际的容器化应用。

  • Master 组件:API Server、ETCD、Scheduler、Controller Manager
  • Node 组件:kubelet、kube-proxy、Container Runtime


Master 节点


Master 节点是 Kubernetes 集群的控制中心,负责管理集群的各项功能和协调工作负载的调度。Master 节点上的关键组件包括:

1.1 API Server


API Server 是 Kubernetes 的前端接口,所有的操作请求都通过 API Server 进行处理。它是集群管理的核心,提供了 RESTful API 供用户和其他组件进行交互。

当用户通过 kubectl 命令行工具部署一个应用时,kubectl 会向 API Server 发送请求,例如:


    kubectl create -f deployment.yaml


    API Server 接收到请求后,会验证和处理请求,并将信息存储到 ETCD 中,然后通知其他相关组件执行相应的操作。


    1.2 ETCD


    ETCD 是一个分布式键值存储,用于存储 Kubernetes 集群的所有状态数据。它保存了整个集群的配置、状态信息和元数据,是集群的“数据库”。

    当一个新的节点加入集群时,API Server 会将节点的信息写入 ETCD,确保所有组件都能够访问到最新的集群状态。例如,新的节点信息可能如下:

      {
      "kind": "Node",
      "apiVersion": "v1",
      "metadata": {
      "name": "node-1",
      "labels": {
      "role": "worker"
      }
      },
      "status": {
      "capacity": {
      "cpu": "4",
      "memory": "16Gi"
      }
      }


      }


      1.3 Scheduler


      Scheduler 负责将新创建的 Pod 分配到合适的 Node 上。它根据资源需求、策略、约束条件和节点的当前负载等因素做出调度决策。

      假设用户提交了一个需要运行 2 个副本的 Pod,Scheduler 会根据集群的资源情况选择合适的节点,例如:


        apiVersion: apps/v1
        kind: Deployment
        metadata:
        name: my-app
        spec:
        replicas: 2
        template:
        metadata:
        labels:
        app: my-app
        spec:
        containers:
        - name: my-container


        image: my-app-image


        Scheduler 会将两个 Pod 分配到资源充足的节点上。

        1.4 Controller Manager


        Controller Manager 负责管理 Kubernetes 控制器,这些控制器监控集群状态并确保集群始终处于期望状态。常见的控制器包括节点控制器、复制控制器、部署控制器等。

        当一个节点故障时,节点控制器会检测到节点不可达,并启动相应的修复措施,如在其他健康的节点上重新调度运行在故障节点上的 Pod。

        Node 节点


        Node 节点是 Kubernetes 集群中实际运行应用工作负载的地方,每个 Node 都包含以下关键组件:

        1.5 kubelet


        kubelet 是运行在每个 Node 上的代理,负责与 Master 节点通信并执行分配给该节点的任务。kubelet 确保容器在 Node 上正常运行,并定期向 Master 报告节点状态。

        当 API Server 分配一个 Pod 给某个 Node 时,kubelet 会接收该 Pod 的定义,并启动对应的容器。例如:


          apiVersion: v1
          kind: Pod
          metadata:
          name: my-pod
          spec:
          containers:
          - name: my-container


          image: my-app-image


          kubelet 会根据 Pod 的定义,使用容器运行时(如 Docker)在节点上启动容器。

          1.6 kube-proxy


          kube-proxy 是负责处理 Kubernetes 服务的网络代理,它维护节点上的网络规则,确保网络流量能够正确路由到相应的容器。

          假设用户创建了一个服务(Service)来暴露应用程序,kube-proxy 会在节点上配置相应的网络规则。例如:


            apiVersion: v1
            kind: Service
            metadata:
            name: my-service
            spec:
            selector:
            app: my-app
            ports:
            - protocol: TCP
            port: 80


            targetPort: 8080


            kube-proxy 会确保所有访问 my-service 的流量被正确路由到运行 my-app 的 Pod。


            1.7 Container Runtime


            Container Runtime 是运行容器的底层软件,常见的容器运行时包括 Docker、containerd 等。它负责下载镜像、创建和管理容器。

            当 kubelet 需要启动一个新的 Pod 时,容器运行时会根据镜像名称下载镜像,并启动容器。例如,使用 Docker 运行一个容器:


              docker run -d --name my-container my-app-image


              Docker 会下载 my-app-image 并启动一个名为 my-container 的容器。

              举例




              • 编写应用代码并创建 Docker 镜像:


                • 编写 web 应用代码,并使用 Dockerfile 构建镜像。

                • 将镜像上传到镜像仓库。

              • 创建 Kubernetes 部署和服务:


                • 编写部署(Deployment)和服务(Service)的 YAML 文件。

                • 使用 kubectl
                  命令将部署和服务应用到 Kubernetes 集群。

                apiVersion: apps/v1
                kind: Deployment
                metadata:
                name: web-app
                spec:
                replicas: 3
                template:
                metadata:
                labels:
                app: web-app
                spec:
                containers:
                - name: web-container
                image: web-app-image
                ---
                apiVersion: v1
                kind: Service
                metadata:
                name: web-service
                spec:
                selector:
                app: web-app
                ports:
                - protocol: TCP
                port: 80
                targetPort: 8080
                • Kubernetes 调度和运行:


                  • API Server 接收部署和服务的请求,将信息存储到 ETCD。

                  • Scheduler 分配 3 个副本的 Pod 到合适的节点。

                  • kubelet 在各自的节点上启动容器,并定期报告状态。

                  • kube-proxy 配置网络规则,确保流量路由到 web-service


                Kubernetes 的高可用性、扩展性和自动化能力使其成为现代应用程序部署和管理的理想选择。通过合理配置和使用 Kubernetes,可以大大提高应用程序的部署效率和可靠性,满足企业的各种需求。

                  非常感谢您读到这里!如果您觉得这篇文章对您有帮助,请不要忘记关注公众号。关注后,您将第一时间获得最新的AI、云计算、运维(Linux、数据库)技术,以及更多实用的技能干货。

                  点击页面右上角的“关注”按钮,不错过任何精彩内容!

                  扫码获取联系方式


                  文章转载自周同学带您玩AI,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论