使用 Kubernetes 轻松实现应用程序的自动伸缩

随着互联网的发展,越来越多的企业和机构开始将自己的服务和产品迁移到云平台上,为了能够更好地适应流量高峰和用户需求的变化,自动伸缩成为了一项重要的技术。

而在现代化的开发中,容器化已经成为了不可或缺的一部分,因为它能够极大地提高开发和部署的效率。而 Kubernetes 作为一个容器编排工具,可以自动化地管理容器的生命周期,因此它也成为了实现自动伸缩的常用工具。

Kubernetes 自动伸缩的基本原理

Kubernetes 的自动伸缩是基于 Pod 来实现的,Pod 是 Kubernetes 最小的可部署单元,它包含一个或多个容器。Kubernetes 通过对 Pod 的数量进行调整来实现自动伸缩。

Kubernetes 的自动伸缩包括两个模式:水平自动伸缩和垂直自动伸缩,其中水平自动伸缩是最常用的模式。

水平自动伸缩(Horizontal Pod Autoscaling,HPA)指的是根据实际应用负载的变化,自动增减 Pod 的数量,以保证应用程序的性能和可用性。

垂直自动伸缩(Vertical Pod Autoscaling,VPA)则是根据应用程序的负载变化,自动调整容器的资源配额,以保证应用程序的性能和可用性。

如何配置 Kubernetes 的自动伸缩

安装 Metrics Server

配置 Kubernetes 的自动伸缩前,需要先安装 Metrics Server,它是 Kubernetes 的一个组件,用于收集及管理集群中容器和节点的相关指标数据。要安装 Metrics Server,可以使用以下命令:

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml

配置 HPA

下面我们来配置一下水平自动伸缩(HPA)。首先在应用程序的 Deployment 文件中,需要设置 Pod 的最小和最大副本数,以及目标 CPU 利用率,例如:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      name: my-app
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-image
        resources:
          requests:
            cpu: 200m
            memory: 256Mi
          limits:
            cpu: 500m
            memory: 512Mi
---
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      targetAverageUtilization: 50

其中,minReplicas 指定了 Pod 的最小副本数,maxReplicas 指定了 Pod 的最大副本数,targetAverageUtilization 指定了目标 CPU 利用率,这里是 50%。

这样就配置好了水平自动伸缩。

配置 VPA

下面我们再来配置一下垂直自动伸缩(VPA)。首先需要安装 VPA 插件,可以使用以下命令:

kubectl apply -f https://github.com/kubernetes/autoscaler/releases/download/vertical-pod-autoscaler-0.9.0/vertical-autoscaler.yaml

安装完成后,可以在 Deployment 文件中设置资源配额,例如:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      name: my-app
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-image
        resources:
          limits:
            cpu: 100m
            memory: 256Mi
        volumeMounts:
        - name: data
          mountPath: /data
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: my-app-data

这里我们设置了 Pod 的 CPU 配额为 100m,表示每个容器最多使用 100m 的 CPU 资源。VPA 会根据容器使用的资源自动调整 CPU 配额。

可以使用以下命令创建一个 VPA 对象:

kubectl apply -f - <<EOF
apiVersion: autoscaling.k8s.io/v1beta1
kind: VerticalPodAutoscaler
metadata:
  name: my-app-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       "Deployment"
    name:       "my-app"
  updatePolicy:
    updateMode: "Auto"
EOF

这样就配置好了垂直自动伸缩。

示例代码

总结

Kubernetes 的自动伸缩能够极大地提高应用程序的性能和可用性,可以根据实际的负载变化来自动调整应用程序的 Pod 数量和容器资源配额。配置 Kubernetes 的自动伸缩需要注意一些细节,通过使用示例代码,可以更好地理解和掌握这项技术。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65920a9aeb4cecbf2d6f3b48


纠错反馈