为了方便管理,我们需要把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}
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐