拥抱容器:From swarm to k8s 实战

滴滴滴!拥抱容器活动已经成功举办三期啦!每一期的人气都超级旺,相信很多小伙伴都在老师的带领下成功的入了门,错过的小伙伴们可以戳以往的文章回顾学习哦~

【活动回顾】容器实战:Docker 基础入门

讲座实录 | 拥抱容器:Docker 集群入门与实战(上)

讲座实录 | 拥抱容器:Docker 集群入门与实战(下)

【活动回顾】拥抱容器:Python web开发及其与docker的结合

8 月 31 日我们第三期课程如期举办,因为撞期世界人工智能大会,很多小伙伴不得不择其一,很开心看到 GDG 真的有好多死忠粉呀! 我们将在本篇文章中对第三期的活动进行回顾总结,没有来得及参加的小伙伴们赶紧打开文章康康老师又给我们带来了什么新内容趴~

本篇教程会介绍如何使用docker swarm进行容器的编排与分发friendlyhello:v4,这一服务可以通过浏览器访问,获取当前节点的Hostname,最终效果如下:

STEP 1: 创建虚拟机  讲座实录 | 拥抱容器:Docker 集群入门与实战(上)

STEP 2: 初始化集群  讲座实录 | 拥抱容器:Docker 集群入门与实战(下)

以上两个步骤在前期的文章当中有介绍,此处就不再赘述了~详情请戳链接~

STEP 3: 创建friendlyhello:v4服务

我们先在当前目录下直接创建两个文件,app.py Dockerfile,并加入如下代码:

•app.py


from flask import Flask
from redis import Redis, RedisError
import os
import socket


# Connect to Redis
redis = Redis(host=“redis”, db=0, socket_connect_timeout=2, socket_timeout=2)


app = Flask(__name__)


@app.route(“/”)
def hello():
try:
visits = redis.incr(“counter”)
except RedisError:
visits = cannot connect to Redis, counter disabled


html = HostName: {host_name}
\

Hostname: {hostname}
\

Visits: {visits}”
return html.format(host_name=os.getenv(“HOSTNAME”, “UNKNOWN”),
hostname=socket.gethostname(), visits=visits)


if __name__ == “__main__”:
app.run(host=‘0.0.0.0’, port=5000)

Dockerfile


FROM python:3.7-slim


WORKDIR /app


COPY . /app


RUN pip install flask redis -i https://mirrors.aliyun.com/pypi/simple –trusted-host mirrors.aliyun.com
EXPOSE 5000


CMD [“python”, “app.py”]

接着构建image:

$ docker build -t friendlyhello:v4 .

然后通过docker service create来创建服务,–replicas 3参数表示创建3个副本:

$ docker service create --replicas 3 -p 5000:5000 --name friendly friendlyhello:v4

成功以后,我们就可以看到这一服务的task们了:

$ docker service ps friendly

但是,我们发现只有manager节点的task启动了,2个worker节点都表示没有镜像,所以接下来我们就需要去做分发。

STEP 4: 快速分发镜像到所有节点

我们先缩个容:

$ docker service scale friendly=1

为了高效分发,我们不用docker hub,而是自己部署一个registry服务:

$ docker service create --name registry --publish 5555:5000 registry:2

看看成功了没:

$ docker service ps registry

OK,接下来我们来把friendlyhello:v4镜像给推送到registry,在此之前,我们先创建一个配置文件,加入配置,否则可能会出现https相关问题:

$ vi /etc/docker/daemon.json

写入:


{“insecure-registries”: [“:5555”]}


// 我的配置:
{“insecure-registries”: [“192.168.99.112:555”]}

接着重启一下docker:

$ sudo /etc/init.d/docker restart

重启后,我们就可以重新打tag然后push到registry了:


$ docker tag friendlyhello:v4 :5555/friendlyhello:v4
$ docker push :5555/friendlyhello:v4


# 我的命令:
$ docker tag friendlyhello:v4 192.168.99.112:5555/friendlyhello:v4
$ docker push 192.168.99.112:5555/friendlyhello:v4

如果这里出现了奇奇怪怪的问题,试试等个几秒重新执行一下

接着,分别到worker-1和worker-2里,加入一个一样的daemon.json:

$ vi /etc/docker/daemon.json

别忘了添加完配置后重启一下

重启后,就可以pull下我们需要的那个镜像了:


$ docker pull 192.168.99.112:5555/friendlyhello:v4
$ docker tag 192.168.99.112:5555/friendlyhello:v4 friendlyhello:v4

如果又出现了奇奇怪怪的问题,可以试试在manager节点再重新push一下

接着在manager节点扩容:

$ docker service scale friendly=3

这下3个节点的task就都成功跑起来了:

$ docker service ps friendly

可以通过浏览器访问看看:

部署是没什么问题了,不过我们还需要让它显示所使用的node的名字,这需要加入环境变量。

我们先关了现在的服务:

$ docker service rm friendly

再重新创建,同时加入新的参数:

$ docker service create --replicas 3 -p 5000:5000 --name friendly3 -e HOSTNAME="{{.Node.Hostname}}" --hostname="{{.Node.Hostname}}-{{.Node.ID}}-{{.Service.Name}}" friendlyhello:v4

再来访问看看:

STEP 5: 用Portainer可视化管理Swarm集群

回到manager节点,现在来通过docker stack部署Portainer:


$ curl -L https://downloads.portainer.io/portainer-agent-stack.yml -o portainer-agent-stack.yml

$ docker stack deploy –compose-file=portainer-agent-stack.yml portainer

完成后,我们可以通过:9000端口来访问Portainer:

这里有丰富的功能,可以方便我们可视化地操作swarm集群

科科

拥抱容器的第四次活动正在紧张筹备中

写作业的奖励也持续有效

(不知道啥作业的就不用问了)

届时我们将第一时间会发文通知大家

各位盆友千万要关注我们的推送哦~

关于GDG

Google Developer Groups 谷歌开发者社区,是谷歌开发者部门发起的全球项目,面向对 Google 和开源技术感兴趣的人群而存在的公益性开发者社区。GDG Shanghai 创立于 2009 年,是全球 GDG 社区中最活跃和知名的技术社区之一,每年举办 30 – 50 场大大小小的科技活动,每年影响十几万以上海为中心辐射长三角地带的开发者及科技从业人员。
 
社区中的各位组织者均是来自各个行业有着本职工作的互联网从业者,我们需要更多新鲜血液的加入!如果你对谷歌技术感兴趣,业余时间可调配,认同社区的价值观,愿意为社区做出贡献,欢迎加入我们成为社区志愿者!