前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pod中将代码与运行环境分离

pod中将代码与运行环境分离

作者头像
编程黑洞
发布2023-03-06 19:44:09
8430
发布2023-03-06 19:44:09
举报
文章被收录于专栏:编程黑洞编程黑洞

# 0. 前言

我们在创建一个 python 的 web 服务的镜像时,一般的做法是,将 python 环境与代码打包成一个镜像,然后将这个镜像进行发布。

现在有个需求就是将 python 环境和代码分别构造成两个镜像,让他们进行解耦,并且将他们编排在一个 pod 中。

本文介绍如何将 pod 中的代码与运行的环境进行拆分。

# 1. 思路

首先我们将代码打包成镜像 A,再将 python 运行环境打包成镜像 B,通过编排在 Pod 中的 InitContainer 设置为镜像 A,并将其内的代码拷贝到挂载的 emptyDir 存储卷中,然后在镜像 B 中挂载相同的存储卷,在使用运行环境中的 python 去执行存储卷中拷贝过来的代码即可。

# 2. 案例

# 2.1 创建代码镜像

先创建一个简单的 python web 程序 main.py

代码语言:javascript
复制
from flask import Flask

app = Flask(__name__)


@app.route("/")
def hello_world():
    return "Hello, World!"

app.run(host="0.0.0.0")

我们再创建包含代码镜像的 Dockerfile,做的事情是将 main.py 文件拷贝到镜像的根目录下,文件命名为Dockerfile_code

代码语言:javascript
复制
FROM busybox:latest
COPY main.py /

我们通过 docker build 开始创建镜像,镜像名称为 demo_code,默认 tag为 latest

代码语言:javascript
复制
docker build . -t "demo_code" -f Dockerfile_code

这个时候我们的代码镜像创建好了。

# 2.2 创建 python 运行环境

我们开始创建 python 运行环境镜像的 Dockerfile,以 python3 的镜像为基础,并安装 flask 库,文件名为 Dockerfile_runtime

代码语言:javascript
复制
FROM python:3
RUN pip install flask

再构建一下这个镜像,镜像名为 demo_runtime,默认 tag 是 latest

代码语言:javascript
复制
docker build . -t "demo_runtime" -f Dockerfile_runtime

这个时候,两个镜像都已准备好

# 2.3 容器编排

创建 deployments.yaml 文件,在 Pod 中的 initContainers 中配置代码镜像, 然后挂载临时存储卷,将代码复制到存储卷中。

然后再配置应用容器 python 运行环境,挂载上面相同的临时存储卷,然后再使用 python 将代码运行。

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
  labels:
    app: demo
spec:
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      initContainers:
        - image: demo_code:latest
          name: code
          imagePullPolicy: IfNotPresent
          volumeMounts:
          - mountPath: /opt/demo
            name: app-volume
          command: ["cp", "/main.py", "/opt/demo/"]
      containers:
        - name: runtime
          image: demo_runtime:latest
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 5000
              hostPort: 5000
              protocol: TCP
              name: http
          volumeMounts:
            - mountPath: /opt/demo
              name: app-volume
          command: ["python", "/opt/demo/main.py"]
      volumes:
      - name: app-volume
        emptyDir: { }

我们通过 kubectl apply 创建 deployments

代码语言:javascript
复制
kubectl apply -f deployments.yaml

我们通过 kubectl get pods 可以看到 pod 已经创建成功,然后找到 pod 所在的节点。通过节点 ip+端口即可访问到容器的中接口。

代码语言:javascript
复制
[root@k8s-master-07rf9 test]# kubectl get pods -o wide
NAME                    READY   STATUS    RESTARTS   AGE     IP               NODE               NOMINATED NODE   READINESS GATES
demo-6f49db5d6c-25vss   1/1     Running   0          4m58s   10.244.132.130   k8s-master-07rf9   <none>           <none>


[root@k8s-master-07rf9 test]# curl 10.65.132.187:5000
Hello, World!

# 3. 总结

本文的编排方式只是 pod 的设计模式的一种。有兴趣的可以了解更多。

通过这种方式可以让代码与运行环境解耦,当我们更新代码时,并不会影响到运行环境。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-11-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • # 0. 前言
  • # 1. 思路
  • # 2. 案例
    • # 2.1 创建代码镜像
      • # 2.2 创建 python 运行环境
        • # 2.3 容器编排
        • # 3. 总结
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档