扩展你的Kubernetes集群:理解水平扩展与垂直扩展

news/2024/7/5 2:46:58

这扩展你的Kubernetes集群:理解水平扩展与垂直扩展

  • 一、前言
    • 1.1 什么是 Kubernetes
    • 1.2 扩展集群规模的必要性
  • 二、集群规模扩展概述
    • 2.1 水平扩展 vs 垂直扩展
    • 2.2 Kubernetes 中的水平扩展
    • 2.3 节点的添加和删除
  • 三、水平扩展实现方法
    • 3.1 使用 Deployment 扩展集群规模
      • 3.1.1 创建 Deployment
      • 3.1.2 手动缩放 Deployment
      • 3.1.3 自动缩放 Deployment
    • 3.2 扩展 StatefulSet
      • 3.2.1 创建 StatefulSet
      • 3.2.2 手动缩放 StatefulSet
      • 3.2.3 自动缩放 StatefulSet
  • 四、节点的添加和删除
    • 4.1 添加节点
      • 4.1.1 创建节点
      • 4.1.2 加入集群
    • 4.2 删除节点
      • 4.2.1 从集群中移除节点
      • 4.2.2 删除节点
  • 五、使用 Horizontal Pod Autoscaler 自动调整副本数
    • 5.1 什么是 Horizontal Pod Autoscaler
    • 5.2 如何创建 Horizontal Pod Autoscaler
  • 六、小结回顾

一、前言

1.1 什么是 Kubernetes

Kubernetes是一个用于管理容器化应用程序的开源平台。它提供了自动化部署、扩展和操作应用程序所需的资源,并对容器的运行状态进行监控和修复。Kubernetes 能够节省大量时间和精力,让开发人员能够专注于应用程序的开发和部署。

1.2 扩展集群规模的必要性

随着业务需求的增加,集群规模也需要不断扩展。集群规模的扩展可以提高应用程序的可靠性,同时也能够保障应用程序的性能和弹性。对于 Kubernetes 集群而言,应用程序的扩展通常是在节点层面进行的,通过添加更多的节点能够提高 Kubernetes 集群的处理能力。下面我们将会讨论 Kubernetes 中的集群规模扩展的方法。

二、集群规模扩展概述

2.1 水平扩展 vs 垂直扩展

集群规模的扩展可以通过水平扩展和垂直扩展两种方法来实现。水平扩展指的是在集群中添加更多的节点,以提高整个集群的处理能力。垂直扩展则是增加每个节点的处理能力,例如增加内存、CPU 等资源,以提高单个节点的处理能力。

在 Kubernetes 中,集群规模的扩展通常采用水平扩展的方法进行。因为 Kubernetes 的设计理念是将应用程序分布在多个节点上,通过水平扩展能够提高整个集群的处理能力,保证应用程序的高可用性和稳定性。

2.2 Kubernetes 中的水平扩展

# 声明Deployment对象,同时定义了ReplicaSet的副本数,默认为1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  # 定义了Pod模板,每个Pod中运行一个nginx容器
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          # 定义容器的资源限制
          resources:
            limits:
              cpu: "1"
              memory: "64Mi"
            requests:
              cpu: "0.5"
              memory: "32Mi"

在Kubernetes中,水平扩展的方法通常是通过添加或删除节点来实现的。启动新的Pod时,Kubernetes会自动将应用程序负载均衡到新Pod上,以提高群集的处理能力,从而实现水平扩展。

Kubernetes支持多种水平扩展方法,包括自动扩展。自动扩展能够通过Kubernetes的自动伸缩机制实现,根据所需资源量进行自适应调整,以实现自动化扩展和收缩。

# 声明HorizontalPodAutoscaler对象,用于自动调整Pod数量
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deployment
  # 定义水平扩展规则和阈值
  minReplicas: 1
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: 50
    - type: Resource
      resource:
        name: memory
        targetAverageValue: 40Mi

2.3 节点的添加和删除

要向 Kubernetes 集群中添加节点,必须首先创建一个新的节点,并为其分配一个唯一的标识符,例如 IP 地址或主机名。然后,需要使用 Kubernetes API 将新节点添加到集群中,同时还需要为其定义一个节点配置文件,以确定节点的资源和其他属性。

同样地,当需要删除节点时,只需将其从 Kubernetes 集群中删除即可。在 Kubernetes 中,要删除节点,则需要执行相反的步骤,即首先需要删除节点的配置文件,然后再将其从集群中删除。

三、水平扩展实现方法

3.1 使用 Deployment 扩展集群规模

3.1.1 创建 Deployment

在 Kubernetes 中,使用 Deployment 对象可以很容易地扩展集群规模,并实现应用程序的高可用性。以下是创建 Deployment 的 YAML 文件示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-deployment
spec:
  replicas: 3  # Pod 的副本数,可以根据需要进行修改
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: app
          image: my-app:latest
          ports:
            - containerPort: 8080

上述 YAML 内容定义了一个 Deployment 对象 my-app-deployment。这个 Deployment 对象的 spec 字段中定义了 Pod 的副本数,使用了 selector 标签选择器来指定要管理的 Pod,以及 Pod 的模板。

3.1.2 手动缩放 Deployment

可以手动更改 Deployment 的副本数,来扩展或缩小集群规模。以下是通过kubectl命令缩放 Deployment 的示例:

kubectl scale deployment my-app-deployment --replicas=5

在这个例子中,我们将 my-app-deployment Deployment 对象的副本数从 3 扩展到了 5。

3.1.3 自动缩放 Deployment

自动缩放可以根据 CPU、内存等指标的使用率自动扩展或缩小集群规模。Kubernetes 中的 自动水平扩展(HPA) 可以方便地实现自动缩放。以下是一个自动扩展 Deployment 的 YAML 文件示例:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app-deployment
  minReplicas: 3
  maxReplicas: 10
  targetCPUUtilizationPercentage: 50

上述 YAML 内容定义了一个自动扩展 Deployment 的 HorizontalPodAutoscaler 对象 my-app-hpa。它指定了要管理的 Deployment 对象的名称 my-app-deployment,以及自动扩展的最小和最大副本数。

3.2 扩展 StatefulSet

3.2.1 创建 StatefulSet

StatefulSet 和 Deployment 一样,也是 Kubernetes 提供的扩展集群规模的一种 object ,但是 StatefulSet 可以为 Pod 指定一个唯一的、持久的标识符。这就意味着,可以方便地管理有状态的应用程序,例如数据库或消息队列。

以下是创建 StatefulSet 的 YAML 文件示例:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-app-statefulset
spec:
  replicas: 3
  serviceName: my-app-service
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: app
          image: my-app:latest
          ports:
            - containerPort: 8080

在上面的示例中,我们使用 StatefulSet 对象来创建一个具有唯一标识符的 Pod 集。与 Deployment 对象不同的是,StatefulSet 对象的 spec 字段中指定了 serviceName,这样就可以为 Pod 指定一个唯一的 DNS 主机名。

3.2.2 手动缩放 StatefulSet

和 Deployment 一样,StatefulSet 也可以手动扩展或缩小集群规模。以下是通过 kubectl 命令缩放 StatefulSet 的示例:

kubectl scale statefulset my-app-statefulset --replicas=5

在这个例子中,我们将 my-app-statefulset StatefulSet 对象的副本数从 3 扩展到了 5。

3.2.3 自动缩放 StatefulSet

与 Deployment 一样,StatefulSet 也可以通过自动扩展来实现弹性伸缩。可以使用 状态化应用程序的自动伸缩 (SAAS) 来自动扩展 StatefulSet。以下是一个自动扩展 StatefulSet 的 YAML 文件示例:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-statefulset-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: StatefulSet
    name: my-app-statefulset
  minReplicas: 3
  maxReplicas: 10
  targetCPUUtilizationPercentage: 50

在这个示例中,我们使用了自动扩展 HorizontalPodAutoscaler 对象 my-app-statefulset-hpa,指定了要管理的 StatefulSet 对象的名称 my-app-statefulset,以及自动缩放的最小和最大副本数和 CPU 使用率的目标百分比。

四、节点的添加和删除

4.1 添加节点

在 Kubernetes 集群中添加节点可提高集群的容错性和可用性,同时也可以提高集群的扩展能力。

4.1.1 创建节点

在 Kubernetes 中,我们可以通过在物理机或者虚拟机上配置 Kubernetes 软件环境,并将其加入到集群中。节点上需要运行 kubelet、kube-proxy 等组件。以下是一个在节点上安装 Kubernetes 的示例脚本:

# 拉取 Kubernetes 的二进制文件并解压
wget https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl -O /usr/local/bin/kubectl
chmod +x /usr/local/bin/kubectl
curl -L -o kubeadm https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubeadm
chmod +x kubeadm
mv kubeadm /usr/local/bin/

# 初始化 Kubernetes 节点
kubeadm init --pod-network-cidr=10.244.0.0/16

4.1.2 加入集群

在创建节点之后,需要将其加入到现有的 Kubernetes 集群中。可以使用 kubeadm 工具加入节点,将节点的加入操作分为两步。

在主节点上执行以下命令,获取加入节点的命令:

kubeadm token create --print-join-command

将输出的命令在节点上执行,将节点加入到集群中:

kubeadm join <master-ip>:<master-port> --token <token> --discovery-token-ca-cert-hash <hash>

4.2 删除节点

当节点出现故障或需要进行升级时,可能需要将其从集群中移除。

4.2.1 从集群中移除节点

从集群中移除节点可以使用以下 kubectl 命令:

kubectl drain <node-name> --ignore-daemonsets

这个命令会将节点上的 Pod 驱逐到其他节点,等待 Pod 迁移完成之后再将节点从集群中移除。

4.2.2 删除节点

当节点完全从集群中移除之后,即可执行以下 kubeadm 命令将节点删除:

kubeadm reset

五、使用 Horizontal Pod Autoscaler 自动调整副本数

Kubernetes 提供了 Horizontal Pod Autoscaler(HPA)来自动调整副本数,使得应用程序可以根据负载自动进行水平扩展。

5.1 什么是 Horizontal Pod Autoscaler

Horizontal Pod Autoscaler 是 Kubernetes 中的扩展对象,它可以自动扩展或缩减 Pod 的副本数,以保持 Pod 的 CPU 使用率、内存使用率等指标在一定范围内。

5.2 如何创建 Horizontal Pod Autoscaler

以下是使用 kubectl 命令创建 Horizontal Pod Autoscaler 的示例:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: my-app
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 10
  targetCPUUtilizationPercentage: 50

在这个示例中,我们创建了一个名为 my-app 的 HorizontalPodAutoscaler 对象。这个对象指定了要自动扩展的 Deployment 对象的名称,以及自动扩展的最小和最大副本数和 CPU 使用率的目标百分比。可以使用以下命令将 Horizontal Pod Autoscaler 对象部署到 Kubernetes 集群中:

kubectl apply -f hpa.yaml

这样,我们就创建了一个可以根据负载自动调整副本数的 Horizontal Pod Autoscaler 对象。

六、小结回顾

Kubernetes是一个用于管理容器化应用程序的开源平台。当需求量增加时,扩展集群规模变得必要。本文将讨论集群规模扩展的概述,水平扩展和垂直扩展的区别,以及在Kubernetes中如何实现水平扩展和节点的添加和删除。

水平扩展和垂直扩展
水平扩展是通过增加与应用程序相关的数量来扩展系统规模。例如,在Kubernetes中,可以通过创建更多的Pod并将它们分配到现有节点上来实现水平扩展。通过水平扩展,可以提高集群的冗余程度和可用性。另一方面,垂直扩展是通过增加单个组件的大小或容量来增加系统的资源。例如,增加节点的处理器速度或内存大小。

水平扩展Kubernetes集群
在Kubernetes中,可以使用Deployment和StatefulSet来进行水平扩展。 Deployment是一种创建和管理Pod的抽象方式,StatefulSet用于管理有状态应用程序。使用Deployment进行水平扩展的步骤包括创建Deployment、手动缩放或自动缩放。

使用StatefulSet进行水平扩展的步骤包括创建StatefulSet以及手动或自动缩放。 添加和删除节点 可以通过两种方式添加节点:手动和自动。

手动添加节点包括创建节点并将其添加到集群中。自动添加节点可以设置为根据需求自动添加节点和配置自动扩展选项。

删除节点包括将其从集群中移除并删除节点。 可以使用Horizontal Pod Autoscaler进行自动缩放。它是一种控制器,根据CPU使用率或其他指标自动增加或减少Pod的数量。

综上,我们了解了在Kubernetes中如何进行集群规模的水平扩展、节点的添加和删除以及如何使用Horizontal Pod Autoscaler自动调整副本数。水平扩展能够提高集群的可用性和冗余程度,并能够自动调节副本数量以优化性能。节点的添加和删除可以扩展集群规模,并根据需求自动扩展选项。


http://lihuaxi.xjx100.cn/news/1126345.html

相关文章

《Vue.js 设计与实现》—— 03 Vue.js 3 的设计思路

1. 声明式地描述 UI Vue.js 3 是一个声明式的 UI 框架&#xff0c;即用户在使用 Vue.js 3 开发页面时是声明式地描述 UI 的。 编写前端页面涉及的内容如下&#xff1a; DOM 元素&#xff1a;例如是 div 标签还是 a 标签属性&#xff1a;如 a 标签的 href 属性&#xff0c;再…

JQuery 详细教程

文章目录 一、JQuery 对象1.1 安装和使用1.2 JQuery包装集对象 二、JQuery 选择器2.1 基础选择器2.2 层次选择器2.3 表单选择器 三、JQuery Dom 操作3.1 操作元素3.1.1 操作属性3.1.2 操作样式3.1.3 操作内容 3.2 添加元素3.3 删除元素3.4 遍历元素 四、JQuery 事件4.1 ready 加…

MySQL笔记(四) 函数、变量、存储过程、游标、索引、存储引擎、数据库维护、指定字符集、锁机制

MySQL笔记&#xff08;四&#xff09; 文章目录 MySQL笔记&#xff08;四&#xff09;函数文本处理函数日期和时间处理函数数值处理函数类型转换函数流程控制函数自定义函数基本语法 局部变量全局变量聚集函数 aggregate functionDISTINCT 存储过程为什么要使用使用创建 删除建…

顺序表和链表的各种代码实现

一、线性表 在日常生活中&#xff0c;线性表的例子比比皆是。例如&#xff0c;26个英文字母的字母表&#xff08;A,B,C,……&#xff0c;Z&#xff09;是一个线性表&#xff0c;表中的数据元素式单个字母。在稍复杂的线性表中&#xff0c;一个数据元素可以包含若干个数据项。例…

进程与线程——嵌入式(驱动)软开基础(四)

1 异步IO和同步IO区别? 答案:如果是同步IO,当一个IO操作执行时,应用程序必须等待,直到此IO执行完。相反,异步IO操作在后台运行,IO操作和应用程序可以同时运行,提高系统性能,提高IO流量。 解读:在同步文件IO中,线程启动一个IO操作然后就立即进入等待状态,直到IO操…

如何在IVD行业运用IPD?

IVD&#xff08;体外诊断&#xff0c;In Vitro Diagnostic&#xff09;是指对人体样本&#xff08;血液、体液、组织&#xff09;进行定性或定量的检测&#xff0c;进而判断疾病或机体功能的诊断方法。IVD目前已经成为疾病预防、诊断治疗必不可少的医学手段&#xff0c;约80%左…

Java --- redis7之缓存预热+雪崩+穿透+击穿

目录 一、缓存预热 二、缓存雪崩 三、缓存穿透 3.1、解决方案 3.1.1、空对象缓存或者缺省值 3.1.2、Goolge布隆过滤器Guava解决缓存穿透 四、缓存击穿 4.1、危害 4.2、解决方案 4.3、模拟百亿补贴活动案例 一、缓存预热 场景&#xff1a;MySQL有N条新记录&#xff…

大数据Doris(十八):Properties配置项和关于ENGINE

文章目录 Properties配置项和关于ENGINE 一、Properties配置项 二、关于ENGINE Properties配置项和关于ENGINE 一、Properties配置项 在创建表时,可以指定properties设置表属性,目前支持以下属性: replica