Python 项目容器化实战

来自AI助手的总结
通过构建镜像并部署到K8s,结合Service和Ingress发布Python Flask应用
Python 项目容器化实战
  • 一、思路分析

  • 安装组件包:使用Python基础镜像;

一、打包镜像并上传


#上传项目包

[root@master01 5]# cd python-demoapp/

[root@master01 python-demoapp]# ls

build  CONTRIBUTING.md  deploy  deployment.yaml  Dockerfile  ingress.yaml  LICENSE  makefile  README.md  service.yaml  src  tests

#原始包需要修改requirements.txt,主要添加werkzeug==2.2.2

[root@master01 5]# vim python-demoapp/src/requirements.txt

Flask==2.1.0

py-cpuinfo==7.0.0

psutil==5.8.0

gunicorn==20.1.0

black==20.8b1

flake8==3.9.0

pytest==6.2.5

werkzeug==2.2.2

#如果不进行上面修改直接build,会发生如下报错

[root@master01 python-demoapp]# docker logs -f 2eb27c745cd1

...

...

ImportError: cannot import name 'url_quote' from 'werkzeug.urls' (/usr/local/lib/python3.9/site-packages/werkzeug/urls.py)

#查看Dockerfile文件

[root@master01 python-demoapp]# cat Dockerfile

FROM registry.cn-hangzhou.aliyuncs.com/abroad_images/python:3.9-slim-buster

LABEL Name="Python Flask Demo App" Version=1.4.2

ARG srcDir=src

WORKDIR /app

COPY $srcDir/requirements.txt .

#RUN pip install --no-cache-dir -r requirements.txt

RUN pip install --no-cache-dir --default-timeout=1000 --retries=10 -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

COPY $srcDir/run.py .

COPY $srcDir/app ./app

EXPOSE 5000

CMD ["gunicorn", "-b", "0.0.0.0:5000", "run:app"]

#编译镜像

[root@master01 python-demoapp]# docker build -t python:v1 .

#后台起容器

[root@master01 python-demoapp]# docker run -it --rm -p 5000:5000 python:v1

#验证

[root@master01 python-demoapp]# curl localhost:5000 -i

HTTP/1.1 200 OK

Server: gunicorn

Date: Thu, 06 Apr 2023 08:53:54 GMT

...

...

#重新定义标签

[root@master01 python-demoapp]# docker tag python:v1 harbor.zhang-qing.com/demo/python:v1

#推送镜像

[root@master01 python-demoapp]# docker push harbor.zhang-qing.com/demo/python:v1

二、创建deployment.yaml资源

[root@master01 python-demoapp]# cat deployment.yaml
# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pythondemo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: pythondemo
  template:
    metadata:
      labels:
        app: pythondemo
    spec:
      containers:
      - name: pythondemo
        image: harbor.zhang-qing.com/demo/python:v1
        resources:
          limits:
            memory: "2Gi"
            cpu: "1"
          requests:
            memory: "1Gi"
            cpu: "500m"
        ports:
          - containerPort: 5000
            name: web
        livenessProbe:
          httpGet:
            port: web
            path: /
          timeoutSeconds: 2       # 表示容器必须在2s内做出相应反馈给probe,否则视为探测失败
          periodSeconds: 30       # 探测周期,每30s探测一次
        readinessProbe:
          tcpSocket:
            port: web
          initialDelaySeconds: 10 # 容器启动后10s开始探测
#应用
[root@master01 python-demoapp]# kaf deployment.yaml

三、创建service资源

控制器资源创建无误后,接下来我们部署service资源,然后就可以通过clusterIP+端口方式访问服务

[root@master01 python-demoapp]# cat service.yaml
apiVersion: v1
kind: Service
metadata:
  name: pythondemo
spec:
  type: ClusterIP
  selector:
    app: pythondemo
  ports:
  - name: http
    port: 5000
    protocol: TCP
    targetPort: 5000
#应用
[root@master01 python-demoapp]#  kaf service.yaml

四、创建ingress资源

[root@master01 python-demoapp]# cat ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    konghq.com/https-redirect-status-code: "301"
    konghq.com/protocols: http
    konghq.com/regex-priority: "1000"
  name: python-ing
spec:
  ingressClassName: nginx
  rules:
  - host: python-test.zhang-qing.com
    http:
      paths:
      - backend:
          service:
            name: pythondemo
            port:
              number: 5000
        path: /
        pathType: ImplementationSpecific
#应用
[root@master01 python-demoapp]#  kaf ingress.yaml
##配置hosts
在阿里云域名做A记录
10.0.0.11 python-test.zhang-qing.com

五、测试验证

打开浏览器输入http://python-test.zhang-qing.com/monitor进行访问

image-20250330173214295

六、环境复原


[root@master01 python-demoapp]# k delete -f deployment.yaml -f service.yaml  -f ingress.yaml

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容