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了。
标签:__,5000,flask,app,部署,pod,k8s,port From: https://www.cnblogs.com/wangbin2188/p/17116489.html