跳转至

如何使用 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) * 1
  • Rancher Server ECS 实例 * 1
  • Rancher Agent ECS 实例 * 2
  • NAS 网络存储(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
回到页面顶部