部署Python3开发的REST服务到K8S
为了方便管理,我们需要把Python3开发的REST服务部署到K8S中,再通过ingress暴露对外访问。下面就一步步来完成部署:
1. 创建gunicorn.conf.py
添加如下内容:
workers = 5 # 定义同时开启的处理请求的进程数量,根据网站流量适当调整
worker_class = "gevent" # 采用gevent库,支持异步处理请求,提高吞吐量
bind = "0.0.0.0:8888" # 监听IP放宽,以便于Docker之间、Docker和宿主机之间的通信
2. 创建Dockerfile
内容如下:
FROM registry.cn-hangzhou.aliyuncs.com/johnny2002/py36-gunicron:3.6.9
WORKDIR /usr/src/app
COPY . .
CMD ["gunicorn", "app:app", "-c", "./gunicorn.conf.py"]
上面假设你的主程序名为app.py
3. 构建Docker镜像
执行如下命令
$ docker build -t 'risk-ml-module-service' .
一个名为risk-ml-module-service的镜像就构建好了。查看镜像ID
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
risk-ml-module-service latest e0f507787b6d 22 minutes ago 220MB
4. 导出镜像到K8S的NODE
本机导出镜像
$ docker save -o risk-ml-module-service.tar e0f507787b6d
把导出的镜像文件上传到所有节点机上。
$ docker save -o risk-ml-module-service.tar e0f507787b6d
然后在节点机上安装镜像,并改名为
$ docker load -i ./risk-ml-module-service.tar
$ docker tag e0f507787b6d risk-ml-module-service:1.0.0
5. 部署到Kubenates上
编写部署文件:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: risk-ml-module-service-deployment
spec:
replicas: 2 # We want two pods for this deployment
template:
metadata:
labels:
app: risk-ml-module-service-app
spec:
containers:
- name: risk-ml-module-service-1-0-0
image: risk-ml-module-service:1.0.0
ports:
- containerPort: 8888
执行命令部署到Kubenates
$ kubectl apply -f risk-ml-module-service.yaml
编写服务部署文档
apiVersion: v1
kind: Service
metadata:
name: risk-ml-module-service
namespace: default
spec:
type: NodePort
ports:
- port: 8888
nodePort: 30008
selector:
app: risk-ml-module-service-app
编写ingress服务部署文档
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: igrs-risk-ml-module-service
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: moudle1.ml.risk.ibm.cc
http:
paths:
- path:
backend:
serviceName: risk-ml-module-service
servicePort: 8888
6. 测试服务
在客户机/etc/hosts中加入机器名和ip
192.168.122.12 moudle1.ml.risk.ibm.cc
其中,192.168.122.12是ingress所在的节点的IP
现在可以测试你的服务了:
$ curl -H "Content-Type:application/json" -X POST --data '{"modelId":"1234"}' http://moudle1.ml.risk.ibm.cc/call
{"data":{"modelId":"1234"},"message":"ERROR","status":-1}