打造docker集群管理平台——Portainer添加远程docker

代码狂魔 4 个月前 •  技术积累 172 •  0

注意,此文建议在了解docker的基础之上阅读,此文主要难点在于TLS加密通讯的设置,需要创建CA与一系列密匙。

介绍

Portainer是一款管理docker的web ui,轻量级,可用docker部署,可操作本地docker deamon进程与远程主机docker deamon进程,可将docker集群进行集中式管理,这才是portainer的强大之处。下面的操作是将远程docker主机添加到本地进行管理的教程。下图为成功的界面:


假设A机器为管理docker的主机,IP为1.1.1.1,B机器为被管理的主机,IP为1.1.1.2。A与B均安装了docker

A主机上运行Portainer

直接运行Portainer官网运行命令

$ docker volume create portainer_data
$ docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

访问http://1.1.1.1:9000即可进入Portainer

B主机docker设置TLS(证书加密通讯)(已废弃,看下面新方式)

docker采用c/s架构,所以A主机的docker命令行(client)是能与B主机的docker deamon(server端)。

docker deamon默认使用unix socket通讯,不能访问外网,TLS可为docker deamon添加可信任的TCP通讯,只有持有证书的主机才能访问,当然也可以完全暴露给外网,一般不这样做,不再赘述。

此处主要为B主机docker添加带证书的tcp通讯,并将证书拷贝给A主机,这样A主机才能与B主机的docker通讯,下面为B主机创建带证书的tcp通讯。
注意下面命令要一条条执行,不能全部拷贝执行,期间如果要输入内容都输入一样的就行,比如1111
参考https://blog.csdn.net/dounine/article/details/74840080

# 创建一个文件夹
mkdir /ssl
cd /ssl
# 创建ca密钥
openssl genrsa -aes256 -out ca-key.pem 4096
# 创建ca证书
openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem
# 创建服务器私钥
openssl genrsa -out server-key.pem 4096
# 签名私钥
openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr
# 使用ca证书与私钥证书签名
openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
# 生成客户端密钥
openssl genrsa -out key.pem 4096
# 签名客户端
openssl req -subj "/CN=client" -new -key key.pem -out client.csr
# 创建配置文件
echo extendedKeyUsage=clientAuth > extfile.cnf
# 签名证书
openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
# 删除多余文件
rm -rf ca.srl client.csr extfile.cnf server.csr

# 修改docker配置
vi /lib/systemd/system/docker.service
将
ExecStart=/usr/bin/dockerd
改为
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/ssl/ca.pem --tlscert=/ssl/server-cert.pem --tlskey=/ssl/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock

# 重启docker deamon
systemctl daemon-reload
systemctl restart docker

尝试本地连接一下,在B主机运行,如果能看到docker deamon版本,说明成功

docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://localhost:2376 version

将文件拷贝到A主机

cd /ssl
scp -P 22 ca.pem cert.pem key.pem 1.1.1.1:/root/test

登陆A主机,执行(注意,这里必须添加host,用域名才能访问,否则出现x509: cannot validate certificate for x.x.x.x because it doesn't contain any IP SANs错误)

echo "1.1.1.2 abc" >> /etc/hosts
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://abc:2376 version

如果不想添加域名,肯定有方法,但是我测试没通过,测试通过的可以告知我

B主机docker设置TLS(证书加密通讯)(新方式,支持IP访问,不用设置域名)

参考1:https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl
参考2:https://blog.csdn.net/lovexiaotaozi/article/details/82797236

# 先在/usr/local目录下创建个文件夹,这里取名叫ca,然后进入ca文件夹中
mkdir -p /usr/local/ca
cd /usr/local/ca

# 依次执行下面的命令,需要输入密码,自由指定,两次输入保持一致并记住即可.
# 创建ca密钥
openssl genrsa -aes256 -out ca-key.pem 4096

# 创建ca证书 根据提示分别输入国家,省份,城市,组织,等一系列信息(可以随便输,无所谓的其实)
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

# 生成server-key.pem,输入下面命令敲回车即可
openssl genrsa -out server-key.pem 4096

# $HOST其实指定了被连接的IP或域名
# 把下面的$Host换成你自己服务器外网的IP或者域名:比如:openssl req -subj "/CN=192.168.1.0" -sha256...
# 或:openssl req -subj "/CN=www.laohan.com" -sha256...(这么做前提是你有域名,该域名DNS解析后指向你的服务器)
openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr

# 配置白名单,也就是你接下来要允许那些ip可以连接到服务器的docker,因为已经是ssl连接,所以我推荐配置0.0.0.0,也就是所有Ip都可以连接
# 但只有拥有证书的才可以连接成功,这样配置好之后公司其他人也可以使用.如果你不想这样,那你可以配置Ip,用逗号分隔开.
# 下面的$Host依旧是你服务器外网的IP或者域名,请自行替换 这里如果你使用的是服务器Ip的话
# 请将前面的DNS换成IP(换成IP两个字母,不是服务器的IP),
# 否则配下来连接还是不会成功,如果你使用的是服务器域名,那么就用DNS就可以了)
echo subjectAltName = DNS:$HOST,IP:0.0.0.0 >> extfile.cnf

# 执行下面语句
echo extendedKeyUsage = serverAuth >> extfile.cnf

# 执行下面语句,然后输入前面设置过的密码,用以生成ca-key.
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out server-cert.pem -extfile extfile.cnf

# 生成客户端所需的key.pem,依旧在该服务器下执行下面命令,到时候把生成好的几个公钥私钥拷出去即可.
openssl genrsa -out key.pem 4096

# 签名客户端
openssl req -subj '/CN=client' -new -key key.pem -out client.csr

# 生成cert.pem,需要输入前面设置的密码
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out cert.pem -extfile extfile.cnf

# 删除多余文件
rm -rf client.csr server.csr

# 修改权限
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem

# 归集服务器证书
cp server-*.pem  /etc/docker/
cp ca.pem /etc/docker/

# 修改docker配置
vi /lib/systemd/system/docker.service

将ExecStart=/usr/bin/dockerd
替换为:
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock

# 重载docker
systemctl daemon-reload
systemctl restart docker 

# 开放2376端口
/sbin/iptables -I INPUT -p tcp --dport 2376 -j ACCEPT
iptables-save

# 重启docker
systemctl restart docker 

尝试本地连接一下,在B主机运行,如果能看到docker deamon版本,说明成功

# $HOST换成上面填写的IP(openssl req -subj "/CN=$HOST"...这一步填写的IP)
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://$HOST:2376 version

将文件拷贝到A主机

scp -P 22 ca.pem cert.pem key.pem 1.1.1.1:/root/test

登陆A主机,执行

# $HOST换成上面填写的IP(openssl req -subj "/CN=$HOST"...这一步填写的IP)
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://$HOST:2376 version

将B主机的docker添加到A主机的portainer进行统一管理(旧)

进入portainer,找到左边列表里面的Endpoints,点Add endpoints,如下图设置:需要注意以下几点

  1. Endpoint URL填写IP:PORT
  2. TLS选择第二个"TLS with client verification only",意为验证了的客户端即可,不验证服务器端(此时A相当于客户端,B相当于服务端)
  3. 将B主机中生成的cert.pemkey.pem下载下来上传到Required TLS files栏中
  4. 在防火墙上开放B主机2376端口(可以是其他端口,在第二步修改docker配置那里设置)

添加成功如图所示

将B主机的docker添加到A主机的portainer进行统一管理(新)

进入portainer,找到左边列表里面的Endpoints,点Add endpoints,如下图设置即可

Tags:none
上一篇
打赏
下一篇

添加新评论