这篇文章记录了我试验将一个基于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. 微服务从代码到k8s部署应有尽有系列(一)

    从本篇文章开始,我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 实战项目地址:https://github.com/Mikaelemmmm/go-zer ...

  2. 微服务从代码到k8s部署应有尽有系列(二、网关)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  3. 微服务从代码到k8s部署应有尽有系列(三、鉴权)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  4. 微服务从代码到k8s部署应有尽有系列(四、用户中心)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  5. 微服务从代码到k8s部署应有尽有系列(五、民宿服务)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  6. 微服务从代码到k8s部署应有尽有系列(六、订单服务)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  7. 微服务从代码到k8s部署应有尽有系列(十四、部署环境搭建)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  8. 微服务从代码到k8s部署应有尽有系列(七、支付服务)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  9. 微服务从代码到k8s部署应有尽有系列(八、各种队列)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

随机推荐

  1. 常见的Git命令

    最近想着需要把工作中做一个备份,除了本地保存之外,上传到码云是个不错的选择,除了Git的一些特点外,也可以让别人看到你的代码,共同修改之类的 首先在上传到码云之前,需要学习Git的一些基础教程,包括国 ...

  2. [python](windows)分布式进程问题:pickle模块不能序列化lambda函数

    运行错误:_pickle.PicklingError: Can't pickle <function <lambda> at 0x000002BAAEF12F28>: attr ...

  3. mysql数据库通过二进制 -【恢复数据记录】

    1.修改配置文件 vi /etc/my.cnf log-bin = binlog systemctl restart mysqld mysql -uroot -p123456 mysql> sh ...

  4. (15)线程---Condition条件

      功能:也是通过阻塞控制线程数量.类似信号量\进程池\线程池的作用 语法:wait from threading import Condition con= Condition() conn.acq ...

  5. GeoServer服务器环境的搭建

    .java 的安装  下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 我下载的java 1.8版本 1. ...

  6. MongoDB基本增删改查

    一. 在Node中如何操作 MongoDB数据  1.使用官方的 mongodb 来操作:https://github.com/mongodb/node-mongodb-native  2.使用第三方 ...

  7. Python 小节回顾

    1.python程序是大小写敏感. 2.python中字符串是用单引号 ' 或双引号 " 括起来的任意文本. python中用 r '  ' 表示 ' ' 内部的字符串不转义. 3.在pyt ...

  8. 『流畅的Python』第5章笔记_一等函数

  9. RobotFramework--环境安装1

    1.RobotFramework RobotFramework 的架构是一个通用型的验收测试和验收测试驱动开发的自动化测试框架(ATDD).它 具有易于使用的表格来组织测试过程和测试数据. 3.1版本 ...

  10. Failed to process import candidates for configuration class [com.simple.....]

    主要原因: 是因为自己定制的starter在打包时(package)用了spring-boot-maven-plugin,即在你的定制starter工程的pom.xml中有如下配置: <buil ...