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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: Kubernetes是一个用于管理容器化应用程序的开源平台。它提供了自动化部署、扩展和操作应用程序所需的资源,并对容器的运行状态进行监控和修复。Kubernetes 能够节省大量时间和精力,让开发人员能够专注于应用程序的开发和部署。

一、前言

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自动调整副本数。水平扩展能够提高集群的可用性和冗余程度,并能够自动调节副本数量以优化性能。节点的添加和删除可以扩展集群规模,并根据需求自动扩展选项。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
16天前
|
弹性计算 人工智能 Serverless
阿里云ACK One:注册集群云上节点池(CPU/GPU)自动弹性伸缩,助力企业业务高效扩展
在当今数字化时代,企业业务的快速增长对IT基础设施提出了更高要求。然而,传统IDC数据中心却在业务存在扩容慢、缩容难等问题。为此,阿里云推出ACK One注册集群架构,通过云上节点池(CPU/GPU)自动弹性伸缩等特性,为企业带来全新突破。
|
23天前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
24天前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。
|
1月前
|
Kubernetes 应用服务中间件 nginx
搭建Kubernetes v1.31.1服务器集群,采用Calico网络技术
在阿里云服务器上部署k8s集群,一、3台k8s服务器,1个Master节点,2个工作节点,采用Calico网络技术。二、部署nginx服务到k8s集群,并验证nginx服务运行状态。
472 1
|
1月前
|
Kubernetes Cloud Native 微服务
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
105 1
|
1月前
|
负载均衡 应用服务中间件 nginx
基于Ubuntu-22.04安装K8s-v1.28.2实验(二)使用kube-vip实现集群VIP访问
基于Ubuntu-22.04安装K8s-v1.28.2实验(二)使用kube-vip实现集群VIP访问
51 1
|
1月前
|
Kubernetes Ubuntu Linux
Centos7 搭建 kubernetes集群
本文介绍了如何搭建一个三节点的Kubernetes集群,包括一个主节点和两个工作节点。各节点运行CentOS 7系统,最低配置为2核CPU、2GB内存和15GB硬盘。详细步骤包括环境配置、安装Docker、关闭防火墙和SELinux、禁用交换分区、安装kubeadm、kubelet、kubectl,以及初始化Kubernetes集群和安装网络插件Calico或Flannel。
141 0
|
1月前
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
73 0
|
1月前
|
弹性计算 Kubernetes Linux
如何使用minikube搭建k8s集群
如何使用minikube搭建k8s集群
|
1月前
|
Kubernetes 应用服务中间件 nginx
k8s学习--k8s集群使用容器镜像仓库Harbor
本文介绍了在CentOS 7.9环境下部署Harbor容器镜像仓库,并将其集成到Kubernetes集群的过程。环境中包含一台Master节点和两台Node节点,均已部署好K8s集群。首先详细讲述了在Harbor节点上安装Docker和docker-compose,接着通过下载Harbor离线安装包并配置相关参数完成Harbor的部署。随后介绍了如何通过secret和serviceaccount两种方式让Kubernetes集群使用Harbor作为镜像仓库,包括创建secret、配置节点、上传镜像以及创建Pod等步骤。最后验证了Pod能否成功从Harbor拉取镜像运行。
109 0