设计自己的paas平台nap 2—-分解客户端和服务器端

写在前面

前面一片文章我们主要介绍了我们的paas平台nap所基于的技术基础,这篇文章,我们首先介绍一下nap的整体思路,然后通过从客户端和服务器端的一些设计,一步一步地来了解如何设计一个完整的paas平台。

客户端

不着急,我们一步一步来。我们先来大体理一下思路,客户端git push,然后,服务器端接受到代码,然后部署,然后返回部署是否成功,ip地址和端口号是多少等,在运行的阶段,可能还会有健康检查,重新部署之类的东西。好了,大体思路有了,我们一点一点来实现。

首先来个简单的。git push的时候,服务器端调用服务器上的一个脚本。这里用到的知识就是我们之前说过的ssh forced command,可以看看之前写的blog,dokku源码解读1. git我们之前也介绍过了,git就是一个版本控制工具,而具备远程存储能力的git,也只不过是把本地的git repository移到远程服务器而已。而且我们知道,每次git push的时候,都会执行ssh git@git.com git-receive-pack 'mygit.git',实际上也是执行了ssh命令。好了,第一步,我们就实现在客户端git push的时候,远程服务器通过本地的脚本,执行echo hello就可以了。

客户端不需要任何修改,在服务器端,修改对应客户端的rsa key。

1
2
3
4
5
6
7
8
ssh core@ip //我们之前已经装好了coreos集群,用户名就是core。
vim ~/.ssh/authorized_keys //寻找自己的rsa key的位置。
command="/home/core/script $SSH_ORIGINAL_COMMAND" ssh-rsa xxxxxx //在前面添加自己的ssh forced command,需要注意的是后面的那个参数,那个参数是系统自动填写的参数,假如客户端执行git push的时候,应该就是git-receive-pack 'mygit.git'。保存退出。
cd /home/core
touch script //我们在rsa key里加的command说使用了script脚本,当然要有这个脚本。
vim script //编辑这个脚本,在这里面写下下面这两行命令。
set -x   //第一行的意思是debug模式,这样我们才可以看到这个脚本执行到哪里了,有没有成功。
echo hello

好了,可以了,我们尝试一下。在客户端

1
2
3
4
5
6
7
mkdir hello //建立一个git文件夹,并初始化
cd hello
git init
git remote add mypaas core@ip //添加远程仓库
touch hello
git commit -am "hello" //当仓库为空的时候,是不能push的时候。
git push mypaas master //push

这个时候,应该可以看到输出了hello。

attention: 需要注意的是,如果我们修改了rsa key前面的command,那么我们ssh进去服务器的时候,会执行command,而不会进去了,一定要注意这种情况,有可能导致你永远进不去系统。解决办法是你在coreos系统中重新建立一个用户,修改这个用户的rsa key前的command,而保存一个始终可以ssh进去的用户。但是我不知道coreos怎么给新用户赋予可以sudo权限,没有找到visudo,或者sudoers,等我知道了就在这里补充一下。所以我现在就保持有一个ssh到coreos的终端,或者每次下班了之后,就把rsa key中的command去除,下次尝试的时候再加进去。

coreos添加新用户,并赋予sudo权限。 添加user的时候,不要用常规的linux方法,采用修改cloud-config文件的方式。cloud-config文件在/var/lib/coreos-install/user_data里面。

1
2
3
4
5
6
- name: test
    ssh-authorized-keys:
      - ssh-rsa xxx
    groups:
      - sudo
      - docker

在users里面添加这样一个新的用户,group里面的sudo,就是赋予sudo权限。具体可以看官方说明。然后使得新配置生效。 sudo coreos-cloudinit --from-file /var/lib/coreos-install/user_data

服务器

还是一步一步来,我们把困难的任务分解来看。我们这里就做一个脚本,这个脚本是干什么的呢,就是读取一个文件夹里的Dockerfile,然后生成systemd可以解释的文件,然后执行他。至于这个Dockerfile怎么来的,先不考虑,我们就直接写一个Dockerfile,后来的时候应该是git push上来的。脚本代码应该是这样。

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
\#!/bin/bash
set -x

WORKDIR=/etc/systemd/system
APP="hello"
sudo touch $WORKDIR/$APP.service
SERVICE="$WORKDIR/$APP.service"
sudo chmod o+w $SERVICE
cat > $SERVICE <<EOF
[Unit]
Description=$APP
Requires=docker.service
After=docker.service

[Service]
ExecStartPre=/usr/bin/docker build -t $APP /home/core/$APP
ExecStartPre=/usr/bin/docker stop $APP
ExecStartPre=/usr/bin/docker rm $APP
ExecStart=/usr/bin/docker run -d -P --name $APP $APP

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable /etc/systemd/system/$APP.service
sudo systemctl daemon-reload
sudo systemctl start $APP.service

简单吧,读取/home/core/$APP路径下的Dockerfile,然后打包成一个image,然后删除可能存在的,然后运行。

后面我们将会讲解怎么把这两个简单的步骤组合起来,组合起来之后,就是一个简单的,具备paas平台过程的paas平台了,虽然还有很多需要修改,补充,完善的地方。

May 18th, 2015