Kubernetes架构组件和设计原则

在此页面中,您将了解有关 Kubernetes 架构所需的所有信息:包括Kubernetes的概念、组件和架构、Kubernetes的设计原则和安装示例。

什么是Kubernetes?
Kubernetes是Google开发的开源编排工具,用于管理分布式节点集群中的微服务或容器化应用程序。Kubernetes提供高弹性基础设施,具有零停机部署能力、容器自动回滚、扩展和自我修复(包括自动放置、自动重启、自动复制和根据 CPU 使用情况扩展容器)。

Kubernetes的主要目标是通过提供所需功能的 REST API 来隐藏管理容器队列的复杂性。Kubernetes本质上是可移植的,这意味着它可以在各种公共或私有云平台上运行,例如 AWS、Azure、OpenStack 或 Apache Mesos。它也可以在裸机上运行。

Kubernetes组件和架构
Kubernetes遵循客户端-服务器架构。可以进行多主服务器设置(以实现高可用性),但默认情况下有一个主服务器充当控制节点和联系点。主服务器由各种组件组成,包括 kube-apiserver、etcd 存储、kube-controller-manager、cloud-controller-manager、kube-scheduler 和用于 Kubernetes 服务的 DNS 服务器。节点组件包括Docker之上的 kubelet 和 kube-proxy 。

Kubernetes架构组件和设计原则

主要部件
以下是主节点上的主要组件:

  • etcd集群– 一个简单的分布式键值存储,用于存储 Kubernetes 集群数据(例如 Pod 数量、状态、命名空间等)、API 对象和服务发现详细信息。出于安全原因,只能从 API 服务器访问它。etcd 在观察者的帮助下向集群发送有关配置更改的通知。通知是每个 etcd 集群节点上的 API 请求,用于触发节点存储中的信息更新。
  • kube-apiserver – Kubernetes API 服务器是中央管理实体,用于接收所有 REST 修改请求(针对 Pod、服务、复制集/控制器等),充当集群的前端。此外,这是与 etcd 集群通信的唯一组件,确保数据存储在 etcd 中并与已部署 Pod 的服务详细信息一致。
  • kube-controller-manager – 在后台运行许多不同的控制器进程(例如,复制控制器控制 pod 中的副本数量,端点控制器填充服务和 pod 等端点对象)以调节 pod 的共享状态集群并执行日常任务。当服务配置发生更改时(例如,替换运行 pod 的映像,或更改配置 yaml 文件中的参数),控制器会发现更改并开始朝着新的所需状态努力。
  • cloud-controller-manager – 负责管理依赖于底层云提供商(如果适用)的控制器进程。例如,当控制器需要检查节点是否终止或在云基础设施中设置路由、负载均衡器或卷时,所有这些都由云控制器管理器处理。
  • kube-scheduler – 帮助根据资源利用率在各个节点上调度 Pod(一组位于同一位置的容器,我们的应用程序进程在其中运行)。它读取服务的操作要求并将其安排在最适合的节点上。例如,如果应用程序需要 1GB 内存和 2 个 CPU 核心,则该应用程序的 pod 将被调度到至少具有这些资源的节点上。每次需要调度 Pod 时,调度程序都会运行。调度程序必须知道可用的总资源以及分配给每个节点上现有工作负载的资源。

节点(工作者)组件

以下是(工作)节点上的主要组件:

  • kubelet – 节点上的主要服务,定期接收新的或修改的 pod 规范(主要通过 kube-apiserver)并确保 pod 及其容器健康并以所需状态运行。该组件还向主服务器报告其运行所在主机的运行状况。
  • kube-proxy – 在每个工作节点上运行的代理服务,用于处理各个主机子网划分并向外部世界公开服务。它跨集群中的各个隔离网络将请求转发到正确的 Pod/容器。

kubectl
kubectl命令是一个与 kube-apiserver 交互并向主节点发送命令的线路工具。每个命令都会转换为 API 调用。

Kubernetes概念
使用 Kubernetes 需要了解它用来表示系统状态的不同抽象,例如服务、pod、卷、命名空间和部署。

  • Pod – 通常指一个或多个应作为单个应用程序进行控制的容器。Pod 封装了应用程序容器、存储资源、唯一的网络 ID 以及有关如何运行容器的其他配置。
  • 服务– Pod 是易失性的,也就是说 Kubernetes 不保证给定的物理 Pod 将保持活动状态(例如,复制控制器可能会杀死并启动一组新的 Pod)。相反,服务代表一组逻辑 Pod 并充当网关,允许(客户端)Pod 向服务发送请求,而无需跟踪实际构成服务的物理 Pod。
  • Volume——类似于 Docker 中的容器卷,但 Kubernetes 卷适用于整个 Pod,并挂载在 Pod 中的所有容器上。Kubernetes确保数据在容器重新启动时得以保留。仅当 pod 被破坏时,该卷才会被删除。此外,一个 Pod 可以关联多个卷(可能是不同类型的)。
  • 命名空间– 虚拟集群(单个物理集群可以运行多个虚拟集群),适用于许多用户分布在多个团队或项目的环境,以隔离关注点。命名空间内的资源必须是唯一的,并且不能访问不同命名空间中的资源。此外,还可以为命名空间分配资源配额,以避免消耗超过其在物理集群整体资源中的份额。
  • 部署– 在 yaml 文件中描述 Pod 或副本集的所需状态。然后,部署控制器逐渐更新环境(例如,创建或删除副本),直到当前状态与部署文件中指定的所需状态匹配。例如,如果 yaml 文件为 pod 定义了 2 个副本,但当前只有一个正在运行,则将创建一个额外的副本。请注意,不应直接操作通过部署管理的副本,而只能通过新部署进行操作。

Kubernetes设计原则

Kubernetes旨在支持高可用分布式系统所需的功能,例如(自动)扩展、高可用性、安全性和可移植性。

  • 可扩展性——Kubernetes根据 CPU 利用率提供 Pod 的水平扩展。CPU使用率的阈值是可配置的,如果达到阈值,Kubernetes将自动启动新的 pod。例如,如果CPU的阈值是 70%,但应用程序实际上增长到 220%,那么最终将部署另外3个Pod,以便平均 CPU 利用率回到 70% 以下。当特定应用程序有多个 Pod 时,Kubernetes提供跨它们的负载均衡能力。Kubernetes 还支持有状态Pod的水平扩展,包括通过有状态集的 NoSQL 和 RDBMS 数据库。有状态集与部署的概念类似,但即使在删除Pod时也能确保存储持久且稳定。
  • 高可用性——Kubernetes解决了应用程序和基础设施级别的高可用性问题。副本集确保给定应用程序的无状态Pod所需(最小)数量的副本正在运行。有状态集对有状态 pod 执行相同的作用。在基础设施层面,Kubernetes 支持各种分布式存储后端,如 AWS EBS、Azure Disk、Google Persistent Disk、NFS 等。向Kubernetes添加可靠、可用的存储层可确保有状态工作负载的高可用性。此外,每个主组件都可以配置为多节点复制(多主),以确保更高的可用性。
  • 安全性——Kubernetes解决了多个层面的安全问题:集群、应用程序和网络。API 端点通过传输层安全 (TLS) 进行保护。只有经过身份验证的用户(服务帐户或普通用户)才能在集群上执行操作(通过 API 请求)。在应用程序级别,Kubernetes 机密可以存储每个集群(如果使用命名空间则为虚拟集群,否则为物理集群)的敏感信息(例如密码或令牌)。请注意,可以从同一集群中的任何 Pod 访问机密。可以在部署中定义访问 Pod 的网络策略。网络策略指定 Pod 如何相互通信以及如何与其他网络端点通信。
  • 可移植性——Kubernetes 可移植性体现在操作系统选择(集群可以在任何主流 Linux 发行版上运行)、处理器架构(虚拟机或裸机)、云提供商(AWS、Azure 或 Google Cloud Platform)以及新的容器运行时方面,除了Docker之外,还可以添加。通过联合概念,它还可以支持跨混合(私有云和公共云)或多云环境的工作负载。这还支持单个云提供商内的可用性区域容错。

Kubernetes的安装和设置示例

注意:在此示例中,所有组件都安装在单个docker容器内,充当主节点和工作节点。这仅用于演示目的。

安装 Kubernetes

  1. 将 K8S_VERSION 环境变量设置为最新的稳定 Kubernetes 版本,以便以后检索:
export K8S_VERSION=$(curl -sS https://storage.googleapis.com/kubernetes-release/release/stable.txt)
  1. 假设主机的架构是 amd64,设置 ARCH 环境变量:
export ARCH=amd64
  1. 运行hypercubeDocker 容器,该容器本身负责安装所有 Kubernetes 组件。它需要特殊权限,如下所述。
docker run -d --volume=/:/rootfs:ro \
--volume=/sys:/sys:rw --volume=/var/lib/docker/:/var/lib/docker:rw \
--volume=/var/lib/kubelet/:/var/lib/kubelet:rw --volume=/var/run:/var/run:rw \
--net=host --pid=host --name=hyperkube-installer \
--privileged gcr.io/google_containers/hyperkube-${ARCH}:${K8S_VERSION}\
/hyperkube kubelet --containerized \
--hostname-override=127.0.0.1 --api-servers=http://localhost:8080 \
--config=/etc/kubernetes/manifests --allow-privileged --v=2
  1. 运行该命令docker ps可查看 hypercube 启动的所有正在运行的容器,例如使用命令创建的容器"/hyperkube apiserver"

需要使用 卷参数来挂载并提供对容器实例内主机的 /root 、 /sys 和 文件系统的访问。该 选项授予对主机所有设备的访问权限,即启动新容器。参数  并  允许访问主机的网络和 PID 命名空间。/var/run /var/lib/docker --privileged --net=host--pid=host

hypercube'sDocker 镜像可从 Google 的容器注册表 (GCR) 获取,我们使用 ARCH 和 K8S_VERSION 环境变量来构建适合我们环境的镜像的完整路径:

gcr.io/google_containers/hyperkube-${ARCH}:${K8S_VERSION}

部署Pod

  1. 在超立方体容器内启动 bash shell:
docker exec -it hyperkube-installer /bin/bash
  1. 导出容器内的 Kubernetes 版本和处理器架构:
export K8S_VERSION=$(curl -sS https://storage.googleapis.com/kubernetes-release/release/stable.txt)
export ARCH=amd64
  1. 下载 kubectl 命令行工具/usr/bin/kubectl并使其可执行:
curl -sSL "http://storage.googleapis.com/kubernetes-release/release/$K8S_VERSION/bin/linux/$ARCH/kubectl" > /usr/bin/kubectl
chmod +x /usr/bin/kubectl
  1. 现在您可以运行kubectl命令来检索有关 Kubernetes 状态的信息:
kubectl get nodes
kubectl get pods
kubectl get namespaces
  1. 开始部署示例 nginx pod 并退出容器:
kubectl run nginx --image=nginx --port=80 ; exit
  1. 运行命令以查看主机上运行的新 nginx 容器。 docker ps
  2. 将 nginx pod 部署声明为服务,并将 nginx 服务的 80 端口映射到主机上的 8080 端口:
docker exec -it hyperkube-installer /bin/bash
kubectl expose deployment nginx --port=8080 --target-port=80
  1. 检查 nginx 服务是否已准备好并已分配 IP,并将其存储在变量中:
kubectl get service nginx
ip=$(kubectl get svc nginx --template={{.spec.clusterIP}}
  1. 通过浏览器检查 nginx 欢迎页面是否存在或使用curl 下载它:
curl "http://$ip:8080"

概括
Kubernetes是一种编排工具,用于管理跨分布式节点集群的分布式服务或容器化应用程序。它旨在原生支持(自动)扩展、高可用性、安全性和可移植性。Kubernetes本身遵循客户端-服务器架构,主节点由etcd集群、kube-apiserver、kube-controller-manager、cloud-controller-manager、scheduler组成。客户端(worker)节点由 kube-proxy 和 kubelet 组件组成。Kubernetes 中的核心概念包括 Pod(一组部署在一起的容器)、服务(一组具有稳定 IP 地址的逻辑 Pod)和部署(Pod 或副本集的所需状态的定义,由控制器执行,如果当前状态与期望状态不同)等等。

转载请注明出处:https://www.cloudnative-tech.com/introduction/5862.html

(0)
上一篇 2023年7月25日 下午7:23
下一篇 2023年7月27日 下午1:07

相关推荐

  • 什么是云原生架构?

    随着云计算和容器技术的发展,云原生架构成为了一个热门话题。那么,什么是云原生架构呢?为什么它如此重要?在本文中,我们将探讨云原生架构的概念、原则以及其优势。

    2023年4月25日
    0
  • 云原生一体机哪个公司的好?

    云原生一体机是集成了云计算、容器化、存储和网络等关键技术的硬件设备,旨在提供一站式的云原生解决方案。市场上有多家公司提供云原生一体机产品,以下是一些知名的供应商:

    2023年6月15日
    0
  • 容器架构技术有哪些规范?

    容器架构技术在云原生领域中扮演着重要的角色,为应用程序的开发、部署和管理提供了便利和灵活性。为了确保容器的互操作性和标准化,许多规范和标准被提出和采用。下面将介绍一些常见的容器架构技术规范。

    2023年6月1日
    0
  • K8s和SpringCloud的区别对比

    Kubernetes(k8s)和Spring Cloud是两个独立的技术栈,分别用于容器编排和微服务开发。本文将介绍Kubernetes和Spring Cloud的区别和对比。

    2023年6月6日
    0
  • devops和jenkins区别是什么?

    DevOps和Jenkins是软件开发和交付中两个常用的术语和工具。虽然它们的目标是相似的,即实现快速交付和高质量的软件,但它们的角色和功能有所不同。本文将介绍DevOps和Jenkins之间的区别。

    2023年5月31日
    0