当前位置: 首页 > news >正文

Python脚本服务器迁移至K8S集群部署

文章背景:本地有个centos服务器用于各类python脚本的定期任务执行,考虑这些脚本含有敏感信息,放在这个服务器不太安全,而且这台服务器还承载其他业务的功能,混用资源不合适,所以想把这些定期任务迁移出来,放到K8S集群运行。
任务信息
在这里插入图片描述
设计思路:将每个Python脚本及其运行环境打包为标准化容器镜像,这些脚本中的模块都需要按照现有的版本进行固化,防止有意外问题,保留原服务器的PATH和LANG设置,避免环境差异导致的问题,然后把这个镜像上传到私有仓库以供拉取,编写一些Kubernetes原生CronJob与现有K8s集群无缝集成,存储方面使用K8S集群的nfs存储类,用于日志的持久化,另外因为脚本会生成一些其他临时信息需要被留存读取,在yaml中挂载节点的本地目录,这方面是因为想整点花活,不然就也使用存储类了。

迁移项目目录结构

python/
├── Dockerfile                  # Docker镜像构建文件
├── requirements.txt            # Python依赖列表
├── packages/                   # 本地Python包目录
├── scripts/                    # 所有Python脚本
│   ├── check.py                # 各类脚本名,仅举例部分
│   ├── autonetxj.py
└── kubernetes/├── cronjob.yaml└── pvc.yaml                # 持久化存储配置

准备工作
1.按照上方的目录结构,手动创建对应的目录及各空文件先。
2.把所有需要迁移的脚本任务脚本源文件拷贝到scripts/目录。
3.切换到这个python/目录,获取当前Python环境的所有已安装包输出到requirements.txt,也可以自行录入。

pip freeze > requirements.txt

4.切换到这个python/目录,使用命令下载各类模块安装包到packages/目录

#批量下载
pip download -r requirements.txt -d ./packages
#单个下载示例pip download numpy==1.19.5  -d ./packages

开始实施
1.切换到这个python/目录,编写镜像构建文件

vi Dockerfile 

Dockerfile代码信息

# 使用官方Python 3.6.8镜像(Debian Buster基础)
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/python:3.6# 安装语言包并配置UTF-8
RUN apt-get update && apt-get install -y locales && \sed -i 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \locale-gen en_US.UTF-8# 创建zabbix用户,我有的脚本是与zabbix系统联动所有此处需要
RUN groupadd -g 10787 zabbix && \useradd -u 10787 -g zabbix -s /bin/bash zabbix# 安装系统依赖:gcc(编译Python包)、ODBC驱动、MSSQL工具
RUN apt-get update && apt-get install -y \gcc \unixodbc-dev \gnupg2 \curl# 强制更新ODBC驱动配置(支持TLS 1.2)此处是因为我有的脚本需要连数据库
RUN curl -sSL https://packages.microsoft.com/keys/microsoft.asc | apt-key add - && \echo "deb [arch=amd64] https://packages.microsoft.com/debian/10/prod buster main" > /etc/apt/sources.list.d/mssql.list && \apt-get update && ACCEPT_EULA=Y apt-get install -y msodbcsql17 mssql-tools openssl && \echo "[openssl]" > /etc/ssl/openssl.cnf && \echo "default_bits = 4096" >> /etc/ssl/openssl.cnf && \echo "MinProtocol = TLSv1.2" >> /etc/ssl/openssl.cnf && \echo "CipherString = DEFAULT:@SECLEVEL=1" >> /etc/ssl/openssl.cnf# 设置中国时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \echo "Asia/Shanghai" > /etc/timezone# 复制文件到镜像
WORKDIR /app
COPY requirements.txt .
COPY packages/ ./packages/
COPY scripts/ ./scripts/# 安装Python依赖
RUN pip install --no-index --find-links=./packages -r requirements.txt# 创建日志目录并设置权限(root用户运行)
RUN mkdir -p /var/log/app && chmod 777 /var/log/app# 配置环境变量(包含MSSQL工具路径)
ENV PATH="/opt/mssql-tools/bin:${PATH}" \LANG=en_US.UTF-8 \LC_ALL=en_US.UTF-8# 保持root用户运行
USER root

2.构建及上传Docker镜像到私有仓库

# 切换到python/目录构建镜像
docker build -t python-scripts:3.6.8-v1 .
# 测试镜像是否可以正常运行,我镜像中有的脚本需要使用home目录,所以-v
docker run -it --rm -v /home:/home myregistry/python-scripts:3.6.8-v1  bash
# 给这个基础镜像打标签
docker tag c105d8d46380 registry.cn-hangzhou.aliyuncs.com/lik8s/other:python-scripts-3.6.8-v1
# 上传镜像到私有仓库
docker push registry.cn-hangzhou.aliyuncs.com/lik8s/other:python-scripts-3.6.8-v1

在这里插入图片描述

3.把这些文件全部拷贝到K8S集群的任意节点,K8S相关的yaml在后续编写,目前是空文件

4.编写持久化存储配置 (pvc.yaml)和CronJob配置(cronjob.yaml)
pvc.yaml配置内容(使用bg-k8s-nfsdata的存储类,限额10G):

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: scripts-datanamespace: python-cronjob
spec:accessModes:- ReadWriteManystorageClassName: bg-k8s-nfsdataresources:requests:storage: 10Gi

cronjob.yaml配置内容(私有仓库地址,挂载home目录,设置定期执行,日志分类):

---
apiVersion: batch/v1
kind: CronJob
metadata:name: check-scriptnamespace: python-cronjob
spec:schedule: "*/3 * * * *"concurrencyPolicy: ForbidjobTemplate:spec:template:spec:containers:- name: checkimage: registry.cn-hangzhou.aliyuncs.com/lik8s/other:python-scripts-3.6.8-v1 imagePullPolicy: IfNotPresentcommand:- sh- -c - "mkdir -p /var/log/app/check && python3 /app/scripts/check >> /var/log/app/check/check.log 2>&1"volumeMounts:- name: host-homemountPath: /home- name: scripts-datamountPath: /var/log/app/checksubPath: checkvolumes:- name: host-homehostPath:path: /hometype: Directory- name: scripts-datapersistentVolumeClaim:claimName: scripts-datarestartPolicy: OnFailure
---
apiVersion: batch/v1
kind: CronJob
metadata:name: autonetxj-scriptnamespace: python-cronjob
spec:schedule: "5 8 * * *"jobTemplate:spec:template:spec:containers:- name: autonetxjimage: registry.cn-hangzhou.aliyuncs.com/lik8s/other:python-scripts-3.6.8-v1imagePullPolicy: IfNotPresentcommand:- sh- -c - "mkdir -p /var/log/app/autonetxj && python3 /app/scripts/autonetxj >> /var/log/app/autonetxj/autonetxj.log 2>&1"volumeMounts:- name: host-homemountPath: /home- name: scripts-datamountPath: /var/log/app/autonetxjsubPath: autonetxjvolumes: - name: host-homehostPath:path: /hometype: Directory- name: scripts-datapersistentVolumeClaim:claimName: scripts-datarestartPolicy: OnFailure
---

5.部署服务

# 切换到yaml文件所在的目录,执行部署命令
kubectl apply -f pvc-scripts.yaml
kubectl apply -f cronjobs.yaml# 如果运行不正常可以删除改一下脚本再执行部署
kubectl delete -f cronjobs.yaml# 可以查看是否正常的命令
kubectl get pod -A
kubectl describe pod 名称

日志目录:
在这里插入图片描述

最终效果图
在这里插入图片描述

http://www.dtcms.com/a/294924.html

相关文章:

  • k8s中的configmap存储
  • JavaWeb-Servlet
  • 内外网互传文件 安全、可控、便捷的跨网数据交换
  • 服务器版本信息泄露-iis返回包暴露服务器版本信息
  • Node.js 倒计时图片服务部署与 Nginx 反向代理实战总结
  • RCE随笔-奇技淫巧(2)
  • Android热修复实现方案深度分析
  • AI面试如何提升物流行业招聘效率?实战案例解析
  • ESP32-S3学习笔记<5>:SPI的应用
  • JDK 介绍与使用指南
  • CMake进阶:检查头文件存在性(check_include_file 和 check_include_fileCXX)
  • uniapp拦截返回事件
  • 应该切换到 NVMe 吗?
  • 学习 Pandas 库:Series 与 DataFrame 核心操作指南
  • c语言:预处理详解
  • CRMEB 单商户PRO多商户通用去版权教程
  • 二叉树解析
  • 51c大模型~合集158
  • RockyLinux 9.6 解决删除home后无法开机问题
  • 视觉BPE统一多模态理解-北大
  • Python+大模型 day03
  • 面试实战,问题四,介绍一下dubbo框架,如何回答
  • 河南萌新联赛2025第二场-河南农业大学
  • 解决uniapp 使用uview生成小程序包太大无法上传的问题
  • 亚马逊广告优化技巧:如何减少预算浪费
  • Tang Prime 20K板I2S输入输出例程
  • lumerical——光纤布拉格光栅(Fiber Bragg gratings)
  • AI驱动攻防升级,API安全走到关键档口
  • MyBatis整合SpringBoot终极指南
  • 设备维修记录可追溯:管理系统选型指南