如何使用 Rancher 打造私有 CaaS平台?
注意,此文章已经过时 rancher 1.x
自行研发的Cattle
容器编排引擎已经弃用 ,rancher
不再维护1.x
版本。
并于 2019
年推出 rancher 2.x
使用 Kubernetes
代替 Cattle
容器编排功能。
2018-10-10 by dongnan
目标
基于阿里云
& Rancher
,打造私有 CaaS
平台。
如果你使用的是其它的 IaaS
云 或者自建IDC
等,需要作出相应的调整。
环境描述
基础架构
这个迷你的CaaS
平台 由 5 个阿里云实例组成,包括:
SLB
负载均衡实例(4/7) * 1Rancher Server
ECS 实例 * 1Rancher Agent
ECS 实例 * 2NAS
网络存储(NFS) 实例 * 1
可以根据自己的实际情况进行调整。
网络安全
这里特别说明下网络,因为早期阿里家的金融云为经典网络模式,金融行业有强制等级保护要求以此来保护网络安全;
屏蔽 ECS公网 IP全部端口,对外提供服务必须使用 SLB
负载均衡代理,SSH/RDP
远程,必须登录 VPN
获取 Tunnel
通道后方可登录 后端服务器;
示例中的 Rancher Server
与 Rancher Agent
使用私有IP 进行网络通信,Rancher UI
控制台 也是通过 VPN
进行访问的。拓扑图如下:
如果你使用的阿里公共云,或者 VPC
网路模式,那么上面的限制不存在,但是还是提个建议注意网络安全,Rancher Server/Agent
之间尽量使用私有网络通信。
此外对于经典网络,需要提前创建一个安全组,开放 UDP 500/4500
端口,并将 rancher Server/Agent
全部加入到此安全组,否则会遇到 ipsec / healthcheck
容器异常。
软件版本
Linux: Ubuntu 16.04 Server
Docker: 17.12.0-ce
Rancher: stable-1.6
安装部署
部署 Docker
这里推荐使用 Ansible
批量部署 Docker
服务,详细可以参考这里。
部署 Rancher
Rancher
是使用一系列的 Docker
容器进行部署的,分为两部分,其中 Rancher Server
容器作为管理服务器部署,另外的 Rancher Agent
容器作为集群节点的 Agent
部署 。
创建 Rancher Server 容器
docker run --name rancher-1.6 -tid \
-v rancher-db:/var/lib/mysql \
-v /etc/localtime:/etc/localtime \
-e JAVA_OPTS="-Xmx5120m" \
-e TZ="Asia/Shanghai" \
-e LANG="en_US.UTF-8" \
--restart=unless-stopped -p 8080:8080 rancher/server:stable
启动 Rancher Server
需要几分钟时间,当日志中显示 "... Startup Succeeded ...
" 的时候,Rancher UI
就能正常访问了,
UI 控制台地址http://<server_ip>:8080
。
配置访问控制策略
初始安装 Rancher的访问控制并未配置,任何能够访问你的IP地址的人,都可以访问你的UI和API,建议优先设置 “本地身份认证”,后续根据需求调整访问控制策略。 启用访问控制 -> 本地身份认证 -> 设置用户信息,详细步骤参考这里。
添加主机
接下来,添加 Rancher Agent
依次在登录各台 Docker
主机上执行提示的注册命令,如:
基础架构 -> 添加主机 -> 主机注册地址(根据实际情况修改,这里选择默认) -> Custom -> 将下列脚本拷贝到每一台主机上运行以注册 Rancher。
例如:
docker run --rm --privileged \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var/lib/rancher:/var/lib/rancher rancher/agent:v1.2.6 \
http://Your-Rancher-Server-URL:8080/v1/scripts/9BF41EEC80CFF41E46D4:1483142400000:OFUHMoFcngbzwyLQY9Yx9BKjVQ
对接阿里云产品
主要有两个方面:
- 对接 “阿里云NAS存储”,为后续的容器应用提供共享存储服务,通过对接NAS服务 我们无需对现有应用做任何修改,即可具备无限容量及性能扩展、单一命名空间、多共享、高可靠和高可用等特性。
- 通过 绑定阿里云SLB服务,为后面的容器应用提供负载均衡服务,SLB服务会检查云服务器池中ECS实例的健康状态,自动隔离异常状态的ECS实例,从而解决了单台ECS实例的单点问题,提高了应用的整体服务能力。
下面的文件写的非常详细,这里不再重复步骤,请参考下列文章。
创建一个应用
项目基础架构
典型的 WEB应用架构,组件包括:
- 1个负载均衡器/反向代理(LB),例如
haproxy
; - 2个应用服务器(APP),例如
nginx
; - 1个数据库服务器(DB),例如
mysql
;
说明
因为业务特殊性,这里没有使用 Aliyun-slb
方案,而是使用 Rancher
自带的 LB容器
,所以需要手动指定 阿里云SLB端口, Aliyun-slb
方案。
Aliyun -> SLB (前端:80 后端:8001 健康检查:8001) -> ECS 端口:8001 (Haproxy 容器:8001) -> Nginx 容器:80
部署应用
首先准备好配置文件,包括:
docker-compose 配置文件
cat docker-compose.yml
version: '2'
services:
my-web:
image: nginx:alpine
volumes:
- my-data:/var/www/html
environment:
- ITE=test
labels:
aliyun.logs.nginx: stdout
lb:
image: rancher/lb-service-haproxy:v0.7.15
ports:
- 8001:8001
depends_on:
- my-web
labels:
io.rancher.container.agent.role: environmentAdmin
io.rancher.container.create_agent: 'true'
volumes:
my-data:
driver: rancher-nfs
rancher-compose 配置文件
cat rancher-compose.yml
version: '2'
services:
lb:
scale: 1
start_on_create: true
lb_config:
certs: []
port_rules:
- priority: 1
protocol: http
service: my-web
source_port: 8001
target_port: 80
stickiness_policy:
cookie: rh-lb-myApp
domain: ''
indirect: true
mode: insert
nocache: true
postonly: false
health_check:
healthy_threshold: 2
response_timeout: 2000
port: 42
unhealthy_threshold: 3
initializing_timeout: 60000
interval: 2000
strategy: recreate
reinitializing_timeout: 60000
my-web:
scale: 2
start_on_create: true
其次通过 rancher UI
控制台,添加"应用",如图
依次上传上述的两个 yml
配置文件。
验证应用
访问 WEB
服务器,可以是SLB
的IP 或者 绑定SLB IP
的域名。
注意,返回的 Cookie
是不同的,对应了后端不同的容器。
第1次访问
curl -IL https://my-app.zongming.net
HTTP/1.1 200 OK
Date: Wed, 21 Mar 2018 11:14:53 GMT
Content-Type: text/html
Content-Length: 612
Connection: keep-alive
Last-Modified: Wed, 21 Feb 2018 18:52:51 GMT
ETag: "5a8dc003-264"
Accept-Ranges: bytes
Set-Cookie: rh-lb-myweb=b805d6375f8bb0447473a03dd2763755354ef4a9; path=/
Cache-control: private
第2次访问
curl -IL https://my-app.zongming.net
HTTP/1.1 200 OK
Date: Wed, 21 Mar 2018 11:14:55 GMT
Content-Type: text/html
Content-Length: 612
Connection: keep-alive
Last-Modified: Wed, 21 Feb 2018 18:52:51 GMT
ETag: "5a8dc003-264"
Accept-Ranges: bytes
Set-Cookie: rh-lb-myweb=3e8743a037dd8ba0d8b3af4309bb0673418b7cd0; path=/
Cache-control: private