Press "Enter" to skip to content

Docker Swarm + CEPH 搭建过程

准备工作

硬件准备

我准备了3台虚拟化机器, 安装的是centos7系统(CentOS-7-x86_64-Everything-1708.iso)的最精简安装。

网络规划

服务器的 IP地址规划为:
swarm1:10.255.255.61
swarm2:10.255.255.62
swarm3:10.255.255.63

主机名和IP地址的映射我在路由器上配置好的,如果你没有配置dns,最好在本地hosts文件上配置好,以免发生意想不到的状况。

搭建目标

我的搭建目标是搭建一套docker swarm平台, 网络用 swarm的 overlay网络,存储使用ceph。

一些说明

由于之前没用接触过ceph存储,在百度 google一番之后,搜到很多 使用docker搭建ceph的教程(可能我搜索关键词有毛病。。汗)。
然后我就顺着教程进行搭建,然后其过程痛苦不堪,搞了2天,反正最终是没搞起来。
将要放弃之际,看了看ceph的官方文档(http://docs.ceph.org.cn/start/) ,发现居然有ceph-deploy这么神奇的东西。
然后就顺着教程搭建了一下,第一把搭建是比较坑的。后来查了下网络,有人说需要配置网络代理,有些包不用代理下不下来的,
然后我配置了下代理,顺利多了,根据教程就能很容易的搭建起来。代理配置

vim /etc/environment

在里面输入
http_proxy="http://username:password@proxy_server:port"

然后在命令行上
export http_proxy="http://username:password@proxy_server:port"

每个节点都需要配置

CEPH搭建

主要参考CEPH官方教程

预检

http://docs.ceph.org.cn/start/quick-start-preflight/

安装 CEPH 部署工具

由于我们用的centos7系统,使用RPM包的形式安装。

sudo yum install -y yum-utils && sudo yum-config-manager --add-repo https://dl.fedoraproject.org/pub/epel/7/x86_64/ && sudo yum install --nogpgcheck -y epel-release && sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 && sudo rm /etc/yum.repos.d/dl.fedoraproject.org*

把软件包源加入软件仓库。用文本编辑器创建一个 YUM (Yellowdog Updater, Modified) 库文件,其路径为 /etc/yum.repos.d/ceph.repo

vim /etc/yum.repos.d/ceph.repo

[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://download.ceph.com/rpm-jewel/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1

更新软件库并安装 ceph-deploy

sudo yum update && sudo yum install ceph-deploy

NPT&用户

官方教程建议安装NTP(http://docs.ceph.org.cn/start/quick-start-preflight/#ntp) ,防止主机时间问题导致毛病。我检查下我的主机时间,发现没毛病,偷懒就没配置。
官方教程建议使用非root用户来安装,需建用户(http://docs.ceph.org.cn/start/quick-start-preflight/#ntp) 我偷懒直接用了root用户,就没进行配置。

允许无密码 SSH 登录

正因为 ceph-deploy 不支持输入密码,你必须在管理节点上生成 SSH 密钥并把其公钥分发到各 Ceph 节点。 ceph-deploy 会尝试给初始 monitors 生成 SSH 密钥对。
生成 SSH 密钥对,但不要用 sudo 或 root 用户。提示 “Enter passphrase” 时,直接回车,口令即为空:

ssh-keygen

Generating public/private key pair.
Enter file in which to save the key (/ceph-admin/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /ceph-admin/.ssh/id_rsa.
Your public key has been saved in /ceph-admin/.ssh/id_rsa.pub.

把公钥拷贝到各 Ceph 节点,把下列命令中的 {username} 替换成前面创建部署 Ceph 的用户里的用户名。

ssh-copy-id root@swarm1
ssh-copy-id root@swarm2
ssh-copy-id root@swarm3

开放所需端口

Ceph Monitors 之间默认使用 6789 端口通信, OSD 之间默认用 6800:7300 这个范围内的端口通信。详情见网络配置参考。 Ceph OSD 能利用多个网络连接进行与客户端、monitors、其他 OSD 间的复制和心跳的通信。
某些发行版(如 RHEL )的默认防火墙配置非常严格,你可能需要调整防火墙,允许相应的入站请求,这样客户端才能与 Ceph 节点上的守护进程通信。
对于 RHEL 7 上的 firewalld ,要对公共域开放 Ceph Monitors 使用的 6789 端口和 OSD 使用的 6800:7300 端口范围,并且要配置为永久规则,这样重启后规则仍有效。例如:
三台机器都必须要配置。

sudo firewall-cmd --zone=public --add-port=6789/tcp --permanent
sudo firewall-cmd --zone=public --add-port=6800-7300/tcp --permanent
sudo firewall-cmd --reload

SELINUX

在 CentOS 和 RHEL 上, SELinux 默认为 Enforcing 开启状态。为简化安装,我们建议把 SELinux 设置为 Permissive 或者完全禁用,也就是在加固系统配置前先确保集群的安装、配置没问题。用下列命令把 SELinux 设置为 Permissive :

sudo setenforce 0

永久关闭 vim /etc/selinux/config

SELINUX=disabled

这是我的准备工作配置,如果你在配置过程中遇到问题,最好还是看看官方的文档

存储集群快速安装

参考的文档

创建配置目录

我们创建一个 Ceph 存储集群,它有一个 Monitor 和两个 OSD 守护进程。一旦集群达到 active + clean 状态,再扩展它:增加第三个 OSD 、增加元数据服务器和两个 Ceph Monitors。为获得最佳体验,先在管理节点上创建一个目录,用于保存 ceph-deploy 生成的配置文件和密钥对。

mkdir /opt/my-cluster
cd /opt/my-cluster

ceph-deploy 会把文件输出到当前目录,所以请确保在此目录下执行 ceph-deploy

创建集群

如果在某些地方碰到麻烦,想从头再来,可以用下列命令清除配置:

ceph-deploy purge {ceph-node} [{ceph-node}]
ceph-deploy forgetkeys

在管理节点上,进入刚创建的放置配置文件的目录,用 ceph-deploy 执行如下步骤。

ceph-deploy new swarm1

把 Ceph 配置文件里的默认副本数从 3 改成 2 ,这样只有两个 OSD 也可以达到 active + clean 状态。把下面这行加入 [global] 段:

osd pool default size = 2

安装 Ceph

ceph-deploy install swarm1 swarm2 swarm3

配置初始 monitor(s)、并收集所有密钥:

ceph-deploy mon create-initial

完成上述操作后,当前目录里应该会出现这些密钥环:
{cluster-name}.client.admin.keyring
{cluster-name}.bootstrap-osd.keyring
{cluster-name}.bootstrap-mds.keyring
{cluster-name}.bootstrap-rgw.keyring

添加两个 OSD 。为了快速地安装,这篇快速入门把目录而非整个硬盘用于 OSD 守护进程。如何为 OSD 及其日志使用独立硬盘或分区,请参考 ceph-deploy osd 。登录到 Ceph 节点、并给 OSD 守护进程创建一个目录。

ssh swarm2
sudo mkdir /var/local/osd2
exit

ssh swarm3
sudo mkdir /var/local/osd3
exit

然后,从管理节点执行 ceph-deploy 来准备 OSD 。

ceph-deploy osd prepare swarm2:/var/local/osd2 swarm3:/var/local/osd3

最后,激活 OSD 。

ceph-deploy osd activate swam2:/var/local/osd2 swarm3:/var/local/osd3

用 ceph-deploy 把配置文件和 admin 密钥拷贝到管理节点和 Ceph 节点,这样你每次执行 Ceph 命令行时就无需指定 monitor 地址和 ceph.client.admin.keyring 了。

ceph-deploy admin swarm1 swarm2 swarm3

确保你对 ceph.client.admin.keyring 有正确的操作权限。

chmod +r /etc/ceph/ceph.client.admin.keyring

检查集群的健康状况。

ceph health

至此,CEPH集群搭建完毕,如果一切OK的话,最好给系统打个快照。

Docker Swarm集群搭建

docker安装

在3台机器上执行安装操作(参考地址

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine

sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

sudo yum install docker-ce

sudo systemctl start docker
sudo systemctl enable docker

docker就安装好了。

docker swarm初始化

参考教程 参考教程2
先把网络配置好
You need the following ports open to traffic to and from each Docker host participating on an overlay network:
* TCP port for cluster management communications
* TCP and UDP port 7946 for communication among nodes
* UDP port 4789 for overlay network traffic

firewall-cmd --add-port=2377/tcp --zone=public --permanent
firewall-cmd --add-port=7946/tcp --zone=public --permanent
firewall-cmd --add-port=7946/udp --zone=public --permanent
firewall-cmd --add-port=4789/udp --zone=public --permanent
firewall-cmd --reload

在swarm1节点上执行

docker swarm init --advertise-addr 10.255.255.61

docker swarm join --token SWMTKN-1-3i2e61fn9hgue070k2qnmsd7mcaapc9jwa2r1wyuao6rlyytr9-7wim3etfq5imqsywklutstacx 10.255.255.61:2377

他会给你一个其他节点加入集群的命令, 然后在其他节点上执行这条命令就可以把 swarm2 swarm3 加入到集群了。
这里有个超级巨坑要注意下, swarm初始化完了会创建一个ingress网络,我当时配置好,启动服务之后外部怎么都访问不了,郁闷死我了。后来查了半天,原来是ingress的网段和我服务器的网段冲突了。
我主机的默认网络是 10.255.255.0/24的, 这个ingress的默认网络是10.255.0.0/16的,是冲突的,真是晕死。
如果你在实践的时候,最好检查下网络,如果发现冲突,或者想重新规划,只需要删除这个网络,再重新创建就行了。参考这里

docker network ls

找到冲突的网络id

docker network rm network-id

docker network create \
  --driver overlay \
  --ingress \
  --subnet=10.200.0.0/24 \
  --gateway=10.200.0.2 \
  ingress

初始化一个你自己的服务

docker service create --name=nginx --publish 80:80  nginx

我在初始化集群的时候还遇到个服务不能转发的问题,搞了半天,也很郁闷, 然后我创建一个简单docker应用,暴露端口,然后docker提示我 网络转发没有开,服务可能不能正常访问。
如果你也遇到这个问题,尝试这样操作:参考这里

vim /etc/sysctl.conf
net.ipv4.ip_forward=1

systemctl restart network
sysctl -p

至此你的docker swarm集群应该初始化完毕了。

Portainer安装

portainer是一个用来管理docker swarm集群的可视化工具,非常好用。
先创建个网络

docker network create --driver overlay portainer_agent_network

配置portainer代理,这是全局的,所有节点上都会运行这个代理

docker service create \
    --name portainer_agent \
    --network portainer_agent_network \
    -e AGENT_CLUSTER_ADDR=tasks.portainer_agent \
    --mode global \
    --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock \
    portainer/agent

创建一个portainer持久化目录

mkdir /opt/portainer_data

创建portainer服务

docker service create \
    --name portainer \
    --network portainer_agent_network \
    --publish 9000:9000 \
    --replicas=1 \
    --constraint 'node.role == manager' \
    --mount type=bind,source=/opt/portainer_data,destination=/data \
    portainer/portainer:latest -H "tcp://tasks.portainer_agent:9001" --tlsskipverify

你可以通过访问任意节点的 9000端口来访问portainer,初始化个密码就可以进行管理了。

rexray/rbd安装

ceph装好了,docker swarm也装好了,如何来使用呢。
你需要装个docker插件 具体参考

docker plugin install rexray/rbd RBD_DEFAULTPOOL=rbd

装好之后,你就可以创建你的存储卷了

docker volume create --driver rexray/rbd:latest cephvol1

你也可以在portainer界面上进行创建。
Requirements

The RBD plug-in requires that the host has a fully working environment for mapping Ceph RBDs, including having the RBD kernel module already loaded. The cluster configuration and authentication files must be present in /etc/ceph.

至此,全部完成了。后面的我还没实践,等实践了再来更新。

——————–分割线—————-

我又来了, 上面其实还没搞完。

在上面的基础上,我发现可以创建 基于rexray/rbd的存储卷, 然后在我尝试把存储挂到我容器上面的时候,容器怎么都启动不了。
搞了半天,看系统日志有报错,看到 docker 有尝试 和 “unix:///var/run/rexray/998287049.sock” 联系,但是联系不上。
查了些资料,思考了下,感觉 应该是这样玩的。
我前面装了个 rexray/rbd 只是个 rexray给rbd存储写的插件, 我们还需要装个rexray才可以,看了rexray官网文档,也确实是这样。

那么开干吧。参考文档 (IBM) (REXRAY

安装 rexray

curl -sSL https://rexray.io/install | sh

在每个节点上面都要安装。

然后启动rexray

rexray start

也可以debug模式启动
REXRAY_DEBUG=true rexray start

然后再尝试 创建卷,挂载卷, 好像可以玩了。 噢耶。

配置rexray为服务

Install as a service with

rexray install

This will register itself with SystemD or SystemV for proper initialization.

Once configured the REX-Ray service can be started with the command ‘sudo systemctl start rexray’.

增加rexray的配置

配置生成器

Rexray 官方文档

再次更新,关于 权限问题。
在我尝试给NGINX挂载一个卷之后,访问发现nginx返回的是403,看了下日志,报的是 permission deny,没有读文件权限。
查看了文件权限之后 是 700, root的权限,nginx没权限读取文件的。
然后研究了很多文章,查了很多文档。然后目前可以通过这样配置来修改权限。

docker plugin install rexray/rbd RBD_DEFAULTPOOL=rbd LINUX_VOLUME_FILEMODE=0777

然后我把插件卸载了,重新安装了下,目前看来权限是OK的,可以控制。 参考文档
参考文档

One Comment

  1. Brian Lin
    Brian Lin 2020年10月10日

    感謝分享,解決之前困擾我的問題

您的电子邮箱地址不会被公开。 必填项已用 * 标注