WEBKT

手把手教你:在Kubernetes上部署并自动扩容Flask应用

103 0 0 0

在Kubernetes上部署并自动扩容Flask应用

本文将指导你如何在Kubernetes集群中部署一个简单的Flask Web应用,并实现服务的自动扩容和负载均衡。我们将一步步地完成Dockerfile的编写,Kubernetes Deployment和Service的配置,以及Horizontal Pod Autoscaler (HPA)的设置。

1. 准备Flask应用

首先,我们需要一个简单的Flask应用。创建一个名为 app.py 的文件,内容如下:

from flask import Flask
import os
import time

app = Flask(__name__)

@app.route('/')
def hello():
    # 模拟一些耗时操作,以便观察负载均衡效果
    time.sleep(0.1)
    return 'Hello, Kubernetes! This is pod: ' + os.environ.get('HOSTNAME', 'unknown') + '\n'

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)

这个Flask应用很简单,只有一个根路由 /,返回一个包含Pod名称的欢迎信息。time.sleep(0.1) 用于模拟一些耗时操作,方便我们观察负载均衡的效果。

接下来,创建一个 requirements.txt 文件,用于指定Flask依赖:

Flask

2. 编写Dockerfile

Dockerfile用于构建Docker镜像。创建一个名为 Dockerfile 的文件,内容如下:

FROM python:3.8-slim-buster

WORKDIR /app

COPY requirements.txt .  # 先复制依赖文件,利用Docker缓存
RUN pip install --no-cache-dir -r requirements.txt

COPY app.py .

ENV FLASK_APP=app.py

EXPOSE 5000

CMD ["flask", "run", "--host=0.0.0.0"]

Dockerfile解释:

  • FROM python:3.8-slim-buster: 基于Python 3.8 slim镜像。使用slim镜像可以减小镜像体积。
  • WORKDIR /app: 设置工作目录为 /app
  • COPY requirements.txt .: 复制 requirements.txt 文件到工作目录。先复制依赖文件可以利用Docker缓存,加快构建速度。
  • RUN pip install --no-cache-dir -r requirements.txt: 安装Python依赖。--no-cache-dir 可以减小镜像体积。
  • COPY app.py .: 复制 app.py 文件到工作目录。
  • ENV FLASK_APP=app.py: 设置环境变量 FLASK_APP,告诉Flask应用入口。
  • EXPOSE 5000: 声明容器暴露5000端口。
  • CMD ["flask", "run", "--host=0.0.0.0"]: 运行Flask应用。--host=0.0.0.0 允许从任何IP地址访问应用。

3. 构建Docker镜像

在包含 Dockerfileapp.py 的目录下,执行以下命令构建Docker镜像:

docker build -t my-flask-app:v1 .

my-flask-app:v1 替换为你自己的镜像名称和标签。构建完成后,可以使用 docker images 命令查看镜像。

4. 推送Docker镜像到镜像仓库

你需要将构建好的Docker镜像推送到一个镜像仓库,例如Docker Hub、阿里云镜像仓库等。这里以Docker Hub为例,首先登录Docker Hub:

docker login

然后,为镜像打上标签,指定你的Docker Hub用户名:

docker tag my-flask-app:v1 your-dockerhub-username/my-flask-app:v1

最后,推送镜像:

docker push your-dockerhub-username/my-flask-app:v1

5. 配置Kubernetes Deployment

Deployment用于管理Pod的部署和更新。创建一个名为 deployment.yaml 的文件,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: flask-app-deployment
spec:
  replicas: 3  # 初始副本数量
  selector:
    matchLabels:
      app: flask-app
  template:
    metadata:
      labels:
        app: flask-app
    spec:
      containers:
      - name: flask-app
        image: your-dockerhub-username/my-flask-app:v1  # 替换为你的镜像
        ports:
        - containerPort: 5000
        resources:
          requests:
            cpu: 100m  # 请求的CPU资源
            memory: 128Mi # 请求的内存资源
          limits:
            cpu: 200m  # 限制的CPU资源
            memory: 256Mi # 限制的内存资源

Deployment解释:

  • apiVersion: apps/v1: 指定API版本。
  • kind: Deployment: 指定资源类型为Deployment。
  • metadata.name: Deployment的名称。
  • spec.replicas: 初始副本数量为3。
  • spec.selector.matchLabels: 用于匹配Pod的标签。
  • spec.template.metadata.labels: Pod的标签。
  • spec.template.spec.containers: 容器的配置。
    • name: 容器的名称。
    • image: 使用的镜像,替换为你的镜像。
    • ports: 容器暴露的端口。
    • resources: 资源限制,包括CPU和内存的请求和限制。合理的资源限制可以防止Pod占用过多资源,影响其他Pod的运行。

6. 配置Kubernetes Service

Service用于暴露Deployment,提供统一的访问入口。创建一个名为 service.yaml 的文件,内容如下:

apiVersion: v1
kind: Service
metadata:
  name: flask-app-service
spec:
  type: LoadBalancer  # 使用LoadBalancer类型,Kubernetes会自动创建一个负载均衡器
  selector:
    app: flask-app
  ports:
  - port: 80
    targetPort: 5000

Service解释:

  • apiVersion: v1: 指定API版本。
  • kind: Service: 指定资源类型为Service。
  • metadata.name: Service的名称。
  • spec.type: Service的类型。LoadBalancer 类型会在云平台上创建一个负载均衡器,将流量转发到Pod。如果你的Kubernetes集群没有LoadBalancer支持,可以使用 NodePort 类型,并通过Node的IP地址和端口访问应用。
  • spec.selector: 用于匹配Pod的标签。
  • spec.ports: 端口配置。port 是Service暴露的端口,targetPort 是Pod暴露的端口。

7. 配置Horizontal Pod Autoscaler (HPA)

HPA用于根据CPU利用率自动调整Pod的副本数量。创建一个名为 hpa.yaml 的文件,内容如下:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: flask-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: flask-app-deployment  # Deployment的名称
  minReplicas: 3  # 最小副本数量
  maxReplicas: 10 # 最大副本数量
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50  # 目标CPU利用率为50%

HPA解释:

  • apiVersion: autoscaling/v2beta2: 指定API版本。
  • kind: HorizontalPodAutoscaler: 指定资源类型为HorizontalPodAutoscaler。
  • metadata.name: HPA的名称。
  • spec.scaleTargetRef: 指定HPA控制的Deployment。
  • spec.minReplicas: 最小副本数量为3。
  • spec.maxReplicas: 最大副本数量为10。
  • spec.metrics: 扩缩容的指标。这里使用CPU利用率,目标CPU利用率为50%。

8. 部署应用

执行以下命令部署应用:

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f hpa.yaml

9. 验证部署

使用以下命令查看Deployment、Service和HPA的状态:

kubectl get deployments
kubectl get services
kubectl get hpa

等待Service的外部IP地址分配完成后,可以通过该IP地址访问Flask应用。你可以使用 kubectl describe service flask-app-service 命令查看Service的详细信息,包括外部IP地址。

10. 测试自动扩容

使用压力测试工具,例如 hey,向Flask应用发送大量请求,观察HPA是否会自动增加Pod的副本数量:

hey -n 2000 -c 200 http://<your-service-external-ip>

执行 kubectl get hpa 命令,可以看到HPA的当前副本数量和CPU利用率。当CPU利用率超过50%时,HPA会自动增加Pod的副本数量,直到达到最大副本数量。

总结

本文介绍了如何在Kubernetes集群中部署一个简单的Flask Web应用,并实现服务的自动扩容和负载均衡。通过编写Dockerfile,配置Kubernetes Deployment、Service和HPA,我们可以轻松地管理和扩展我们的应用。希望本文能够帮助你更好地理解和使用Kubernetes。

K8s探索者 KubernetesFlask自动扩容

评论点评