Python服务Dokcer化并k8s部署实例

时间:2022-09-06 19:08:44

这篇文章记录了我试验将一个基于python的服务docker化并k8s部署的过程。

服务介绍
Docker化
设计
业务代码改造
创建docker镜像
K8S部署
设计
yaml文件
运行
服务介绍
这是一个用 python 实现的程序,tornado 作为 web 服务器,mongodb 作为存储,redis 作为缓存。

Docker化
设计
为了方便,使用docker hub作为镜像仓库,而不是自己搭建私有库。
业务代码直接打包进docker image,如果修改业务代码,需要重新生成docker image。
业务代码改造
将配置文件中之前涉及到的 mongo 和 redis 的配置改为服务名称。

改造前:

{
"mongodb": {
"host":"127.0.0.1",
"port":"27017"
},
"redis": {
"host":"127.0.0.1",
"port":"6379"
}
}
1
2
3
4
5
6
7
8
9
10
改造后:

{
"mongodb": {
"host":"nebulae-redis-mongo", # 服务名称
"port":"27017"
},
"redis": {
"host":"nebulae-redis-mongo",
"port":"6379"
}
}
1
2
3
4
5
6
7
8
9
10
nebulae-redis-mongo 为一个服务的名称,下面讲 k8s 设计时会说到。
创建docker镜像
一、目录结构
nebulae
|
--- Dockerfile
|
--- code # 业务逻辑代码
|
--- nebulae
1
2
3
4
5
6
7
二、Dockerfile
FROM python:3.6 # 基础镜像

COPY ./code/nebulae /code/nebulae # 将代码copy进容器

WORKDIR /code/nebulae/services

RUN pip install -r requirements.txt # 安装程序依赖

EXPOSE 10001 # 容器对外暴露的端口

CMD ["python","nebulae_server.py"] # 容器执行的命令,起动python程序
1
2
3
4
5
6
7
8
9
10
11
创建镜像命令
在 nebulae 目录下运行下面命令,创建镜像
docker build -t test/nebulae:tag
1
将镜像推至 docker hub
docker push test/nebulae:tag
1
K8S部署
设计
本例中,mongo 和 redis 放入一个 pod 里,并在创建服务时命名为nebulae-redis-mongo,也是上面代码改造中替换的名字。
nebulae-redis-mongo 只有一个Pod
python 应用程序启动三个Pod,将服务命名为 nebulae-python
使用volume的hostPath 将 python 应用程序的日志挂截到 Node 上
k8s yaml 文件
nebulae-redis-mongo的Pod的定义:

piVersion: v1
kind: ReplicationController # 声名资源类型,为k8s的类型
metadata:
name: nebulae-redis-mongo
labels:
name: nebulae-redis-mongo
spec:
replicas: 1 # 维持的Pod个数
selector:
app: nebulae-redis-mongo # 对应下方template里的labels
template: # 具体的 Pod 定义
metadata:
labels:
app: nebulae-redis-mongo
spec:
containers: # 这个Pod里包含了mongo和redis里
- name: nebulae-redis
image: redis # redis官方镜像
ports:
- containerPort: 6379
- name: nebulae-mongo
image: mongo # mongo官方镜像
ports:
- containerPort: 27017
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
nebulae-redis-mongo服务的定义

apiVersion: v1
kind: Service # k8s 服务资源
metadata:
name: nebulae-redis-mongo
labels:
name: nebulae-redis-mongo
spec:
type: NodePort
ports:
- port: 6379
name: nebulae-redis
nodePort: 30011 # 在Node上监听此端口
- port: 27017
name: nebulae-mongo
nodePort: 30012 # 在Node上监听此端口
selector:
app: nebulae-redis-mongo # 对应 Pod 的标签
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
nebulae-pyton 的Pod定义

apiVersion: v1
kind: ReplicationController
metadata:
name: nebulae-python
spec:
replicas: 3 # Pod副本数
selector:
app: nebulae-python
template:
metadata:
labels:
app: nebulae-python
spec:
containers:
- name: nebulae-python
image: test/nebulae:0.0.3 # 在docker hub中的镜像地址
volumeMounts:
- mountPath: /code/nebulae/services/log # 容器中的日志目录
name: nebulae-python-log # 卷名
ports:
- containerPort: 10001
volumes:
- name: nebulae-python-log # 卷名
hostPath:
path: "/tmp/logs/nebulae" # node上的目录地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
nebulae-pyton 的服务定义

apiVersion: v1
kind: Service
metadata:
name: nebulae-python
spec:
type: NodePort
ports:
- port: 10001
nodePort: 30013
selector:
app: nebulae-python
1
2
3
4
5
6
7
8
9
10
11
运行:
最终的 nebulae 的创建文件,名为 nebulae.yaml

apiVersion: v1
kind: ReplicationController
metadata:
name: nebulae-redis-mongo
labels:
name: nebulae-redis-mongo
spec:
replicas: 1
selector:
app: nebulae-redis-mongo
template:
metadata:
labels:
app: nebulae-redis-mongo
spec:
containers:
- name: nebulae-redis
image: redis
ports:
- containerPort: 6379
- name: nebulae-mongo
image: mongo
ports:
- containerPort: 27017
---
apiVersion: v1
kind: Service
metadata:
name: nebulae-redis-mongo
labels:
name: nebulae-redis-mongo
spec:
type: NodePort
ports:
- port: 6379
name: nebulae-redis
nodePort: 30011
- port: 27017
name: nebulae-mongo
nodePort: 30012
selector:
app: nebulae-redis-mongo
---
apiVersion: v1
kind: ReplicationController
metadata:
name: nebulae-python
spec:
replicas: 3
selector:
app: nebulae-python
template:
metadata:
labels:
app: nebulae-python
spec:
containers:
- name: nebulae-python
image: yf8155674/nebulae:0.0.3
volumeMounts:
- mountPath: /code/nebulae/services/log
name: nebulae-python-log
ports:
- containerPort: 10001
volumes:
- name: nebulae-python-log
hostPath:
path: "/tmp/logs/nebulae"
---
apiVersion: v1
kind: Service
metadata:
name: nebulae-python
spec:
type: NodePort
ports:
- port: 10001
nodePort: 30013
selector:
app: nebulae-python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
最后布署到k8s,一行命令解决:

$kubectl create -f nebulae.yaml
.....
replicationcontroller "nebulae-redis-mongo" created
service "nebulae-redis-mongo" created
replicationcontroller "nebulae-python" created
service "nebulae-python" created
1
2
3
4
5
6
查看服务

$kubectl get svc # 查看当前的服务
.....
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nebulae-python NodePort 10.8.255.117 <none> 10001:30013/TCP 1m
nebulae-redis-mongo NodePort 10.8.255.202 <none> 6379:30011/TCP,27017:30012/TCP 1m
1
2
3
4
5
查看Pod状态

$kubectl get pods
....
NAME READY STATUS RESTARTS AGE
nebulae-python-9phxq 1/1 Running 0 3m
nebulae-python-nqkq4 1/1 Running 0 3m
nebulae-python-p9zvs 1/1 Running 0 3m
nebulae-redis-mongo-p7625 2/2 Running 0 3m

Python服务Dokcer化并k8s部署实例的更多相关文章

  1. docker容器化python服务部署(supervisor-gunicorn-flask)

    docker容器化python服务部署(supervisor-gunicorn-flask) 本文系作者原创,转载请注明出处: https://www.cnblogs.com/further-furt ...

  2. Docker&plus;Kubernetes&lpar;k8s&rpar;微服务容器化实践

    第1章 初识微服务微服务的入门,我们从传统的单体架构入手,看看在什么样的环境和需求下一步步走到微服务的,然后再具体了解一下什么才是微服务,让大家对微服务的概念有深入的理解.然后我们一起画一个微服务的架 ...

  3. &period;Net Core 商城微服务项目系列(十二):使用k8s部署商城服务

    一.简介 本篇我们将会把商城的服务部署到k8s中,同时变化的还有以下两个地方: 1.不再使用Consul做服务的注册和发现,转而使用k8s-dns来实现. 2.不再使用Ocelot作为业务网关,使用T ...

  4. spinnaker自动发布k8s部署应用&lt&semi;一&gt&semi;

    一.准备环境 !docker-ce---17.06.2-ce !k8s集群----1.11.1 !helm部署工具---helm-v2.10.0 !spinnaker-charts---spinnak ...

  5. 最小化安装k8s

    最小化安装k8s Nick_4438 关注 2018.07.11 10:40* 字数 670 阅读 0评论 0喜欢 0 1.前言 之前写过一篇二进制手工安装k8s的文章,过程复杂,搞了多日才安装成功. ...

  6. Jenkins&plus;Git&plus;Docker&plus;K8s部署

    准备工作 Jenkins已安装 Docker和K8s部署运行成功 代码管理工具使用Git 最近公司项目使用Jenkins+Git+Docker+K8s进行持续化构建部署,这里笔者整理了一下构建部署的相 ...

  7. &period;net core——Docker化开发和部署

    原文:.net core--Docker化开发和部署 本篇文章是使用Vs2017生成的Dockerfile进行部署的. 目录 VS2017生成Docker部署项目 Dockerfile内容 在开发服务 ...

  8. spring-cloud-kubernetes服务发现之在k8s环境下开发spring cloud应用

    通常情况下,我们的线上的服务在迁移到k8s环境下的时候,都是采用平滑迁移的方案.服务治理与注册中心等都是采用原先的组件.比如spring cloud应用,在k8s环境下还是用原来的一套注册中心(如eu ...

  9. 拥抱云原生,如何将开源项目用k8s部署?

    微信搜索[阿丸笔记],关注Java/MySQL/中间件各系列原创实战笔记,干货满满. k8s以及云原生相关概念近年来一直比较火热,阿丸最近搞了个相关项目,小结一下. 本文将重点分享阿里开源项目otte ...

随机推荐

  1. 配置自己的OpenGL库,glew、freeglut库编译,库冲突解决(附OpenGL Demo程序)

    平台:Windows7,Visual C++ 2010 1. 引言 实验室的一个项目,用到OpenGL进行实时绘制,还用到一些其他的库,一个困扰我很久的问题就是编译时遇到的各种符号未定义,符号重定义之 ...

  2. OOCSS入门学习

    对于面向对象大家肯定都有多多少少的了解,这里所说的OOCSS就是说面向对象的CSS,得说明的是OOCSS并不是一门新语言也不是什么库,而是一种概念和javascript面向对象一样. 可能你这样写过C ...

  3. sdut 2610&colon;Boring Counting(第四届山东省省赛原题,划分树 &plus; 二分)

    Boring Counting Time Limit: 3000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述     In this problem you a ...

  4. VS2012下基本类型大小

  5. iOS如何上传代码到Github

    iOS如何上传代码到Github 很多iOS开发者想开源自己的代码或者demo,开源到Github是个不错的选择,那么如何上传我们的代码到Github,令所有人可以下载使用呢?这里我们的目的很明确,就 ...

  6. 【JQGRID DOCUMENTATION】&period;学习笔记&period;1&period;安装jqGrid

    前面介绍了怎么使用其MVC方式,很好用.不过,觉得还是只使用前段比较好. 1.1 如何安装 到http://www.trirand.com/blog/?page_id=6 下载. </html& ...

  7. 我的第一个Struts程序

    1.程序结构 2.各种文件 LoginAction.java package com.tfj.action; public class LoginAction { private String use ...

  8. VMware Workstation不能启用虚拟设备floppy0由于灭有相应的有效设备在主机上&period; 你要尝试在每次打开虚拟机电源时连接此虚拟设备?

    编辑虚拟机的硬件,把软盘取消掉,floppy的提示就没有了

  9. WPF弹性模拟动画

    原文:WPF弹性模拟动画 我们此次将要制作模拟物理中的弹性现象的交互动画,我们让一个小球向鼠标点击位置移动,这个移动的轨迹不是简单的位移,而是根据胡克定律计算得出的. 胡克定律:F=-kd F代表弹性 ...

  10. jupyter依赖tornado版本

    使用jupyter莫名奇妙出现500错误,发现是更新tornado出了问题,我的jupyter版本是5.7.4不支持6.x版本的tornado,回退到5.x版本的tornado就好了. pip ins ...