> 技术文档 > Python脚本服务器迁移至K8S集群部署

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

文章背景:本地有个centos服务器用于各类python脚本的定期任务执行,考虑这些脚本含有敏感信息,放在这个服务器不太安全,而且这台服务器还承载其他业务的功能,混用资源不合适,所以想把这些定期任务迁移出来,放到K8S集群运行。
任务信息
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-8RUN 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 /appCOPY 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目录,所以-vdocker 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

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

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

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

apiVersion: v1kind: PersistentVolumeClaimmetadata: name: scripts-data namespace: python-cronjobspec: accessModes: - ReadWriteMany storageClassName: bg-k8s-nfsdata resources: requests: storage: 10Gi

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

---apiVersion: batch/v1kind: CronJobmetadata: name: check-script namespace: python-cronjobspec: schedule: \"*/3 * * * *\" concurrencyPolicy: Forbid jobTemplate: spec: template: spec: containers: - name: check image: registry.cn-hangzhou.aliyuncs.com/lik8s/other:python-scripts-3.6.8-v1 imagePullPolicy: IfNotPresent command:  - sh  - -c  - \"mkdir -p /var/log/app/check && python3 /app/scripts/check >> /var/log/app/check/check.log 2>&1\" volumeMounts:  - name: host-home mountPath: /home  - name: scripts-data mountPath: /var/log/app/check subPath: check volumes: - name: host-home  hostPath: path: /home type: Directory - name: scripts-data  persistentVolumeClaim: claimName: scripts-data restartPolicy: OnFailure---apiVersion: batch/v1kind: CronJobmetadata: name: autonetxj-script namespace: python-cronjobspec: schedule: \"5 8 * * *\" jobTemplate: spec: template: spec: containers: - name: autonetxj image: registry.cn-hangzhou.aliyuncs.com/lik8s/other:python-scripts-3.6.8-v1 imagePullPolicy: IfNotPresent command:  - sh  - -c  - \"mkdir -p /var/log/app/autonetxj && python3 /app/scripts/autonetxj >> /var/log/app/autonetxj/autonetxj.log 2>&1\" volumeMounts:  - name: host-home mountPath: /home  - name: scripts-data mountPath: /var/log/app/autonetxj subPath: autonetxj volumes: - name: host-home  hostPath: path: /home type: Directory - name: scripts-data  persistentVolumeClaim: claimName: scripts-data restartPolicy: OnFailure---

5.部署服务

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

日志目录:
Python脚本服务器迁移至K8S集群部署

最终效果图
Python脚本服务器迁移至K8S集群部署