k8s部署flask

k8s部署java服务是比较简单的,因为jar包已经包含了应用的所有内容,再加上JVM就可以开心的跑起来了。

但是python服务比较特别,不仅需要python执行环境和应用代码,一般还需要依赖一系列第三方的包。

下面使用python比较流行的flask框架,来实现一个mini的web服务。

一、构建镜像

首先拉取基础镜像

#拉取基础镜像
docker pull python:3.8-slim

下面是应用的代码,简单起见,只有一个文件app.py

from flask import Flask, make_response, request

app = Flask(__name__)


@app.route('/')
def index():
    return "Hello, World!"


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

依赖的第三方包requirements.txt

Flask==2.0.3

将上面两个文件跟dockerfile放在一个目录

FROM python:3.8-slim
WORKDIR /usr/src/app
COPY requirements.txt /usr/src/app
COPY app.py /usr/src/app
RUN pip install -r requirements.txt
EXPOSE 5000
CMD [ "python", "app.py"]

重新构建镜像

docker build -t  wangbin2188/flask:2.0.3 .
##docker启动容器
docker run -d -p 5000:5000 --name flask-app wangbin2188/flask:2.0.3
#访问5000端口,返回hello,world
curl 0.0.0.0:5000

这就证明我的镜像打包成功了,我们的目标是在k8s部署flask,所以还要继续

二、k8s部署

使用如下命令生成pod模板

kubectl run flask-app --image=wangbin2188/flask:2.0.3 --dry-run=client -o yaml

最终的pod配置文件flask-app.yaml如下

apiVersion: v1
kind: Pod
metadata:
  name: flask-app
  labels:
    app: flask-app
spec:
  containers:
  - image: wangbin2188/flask:2.0.3
    name: flask-app
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 5000
  dnsPolicy: ClusterFirst
  restartPolicy: Always

通过kubectl apply -f flask-app.yaml创建pod,通过kubectl  get po查看pod的状态

但这时应用虽然起来了,却只能在pod内部访问,我们可以通过port-forward将pod的端口映射出来

#把本机的端口映射到在pod的端口号
kubectl port-forward flask-app 5000:5000 &
#在本机curl,返回hello,world
curl 0.0.0.0:5000
hello,world

总是用port-forward并不优雅,我们可以给pod生成一个service

#给上面的deploy生成一个service
kubectl expose pod flask-app --port=5000 --target-port=5000 --dry-run=client -o yaml

最终的service配置

apiVersion: v1
kind: Service
metadata:
  labels:
    app: flask-app
  name: flask-app
spec:
  ports:
  - port: 5000
    protocol: TCP
    targetPort: 5000
  selector:
    app: flask-app
  type: NodePort

这样就可以在集群外访问flask-app了。

posted @ 2023-02-13 15:10  Mars.wang  阅读(1196)  评论(0)    收藏  举报