• 安装Rancher
    • 安装需求
    • Rancher Server 标签
    • 启动 Rancher Server - 单容器部署 (non-HA)
    • Rancher UI
    • 启动 Rancher Server - 单容器部署 - 使用外部数据库
    • 启动 Rancher Server - 单容器部署 - 挂载MySQL数据库的数据目录
    • 启动 Rancher Server - 多节点的HA部署
      • HA部署需求
      • 大规模部署建议
      • advertise-address选项
      • HA模式下的Rancher Server节点
    • 使用AWS的Elastic/Classic Load Balancer作为Rancher Server HA的负载均衡器
      • Listener 配置 - Plaintext
      • 启用 Proxy Protocol
      • 使用Terraform进行配置
    • 使用AWS的Application Load Balancer(ALB) 作为Rancher Server HA的负载均衡器
    • 使用TLS认证的AD/OPENLDAP
    • 在HTTP代理后方启动 Rancher Server
    • 通过SSL连接MySQL的Rancher Server
    • 重要提示
    • 前提条件
    • 步骤
      • 例子

    安装Rancher


    Rancher是使用一系列的Docker容器进行部署的。运行Rancher跟启动两个容器一样简单。一个容器作为管理服务器部署,另外一个作为集群节点的Agent部署

    • Rancher Server - 单容器部署 (non-HA)
    • Rancher Server - 单容器部署 (non-HA) - 使用外置数据库
    • Rancher Server - 单容器部署 (non-HA)- 挂载MySQL数据库的数据目录
    • Rancher Server - 多节点的HA部署
    • Rancher Server - 使用AWS的Elastic/Classic Load Balancer作为Rancher Server HA的负载均衡器
    • Rancher Server - 使用TLS认证的AD/OPENLDAP
    • Rancher Server - 在HTTP代理后方启动 Rancher Server
    • Rancher Server - 通过SSL连接MySQL

    注意: 您可以运行Rancher Server的容器的命令 docker run rancher/server —help 来获得所有选项以及帮助信息。

    安装需求

    • 所有安装有支持的Docker版本的现代Linux发行版。 RancherOS, Ubuntu, RHEL/CentOS 7 都是经过严格的测试。
      • 对于 RHEL/CentOS, 默认的 storage driver, 例如 devicemapper using loopback, 并不被Docker推荐。 请参考Docker的文档去修改使用其他的storage driver。
      • 对于 RHEL/CentOS, 如果您想使用 SELinux, 您需要安装额外的 SELinux 组件.
    • 1GB内存
    • MySQL服务器需要 max_connections 的设置 > 150
      • MYSQL配置需求
      • 选项1: 用默认COMPACT选项运行Antelope
      • 选项2: 运行MySQL 5.7,使用Barracuda。默认选项ROW_FORMAT需设置成Dynamic
      • 推荐设定
      • max_packet_size >= 32M
      • innodb_log_file_size >= 256M (如果您已有现存数据库,请根据实际情况更改此设定)
      • innodb_file_per_table=1
      • innodb_buffer_pool_size >= 1GB (对于更高需求的配置,请在专属MySQL服务器机器上使用4-8G的值)

    注意: 目前Rancher中并不支持Docker for Mac

    Rancher Server 标签

    Rancher Server当前版本中有2个不同的标签。对于每一个主要的release标签,我们都会提供对应版本的文档。

    • rancher/server:latest 此标签是我们的最新一次开发的构建版本。这些构建已经被我们的CI框架自动验证测试。但这些release并不代表可以在生产环境部署。
    • rancher/server:stable 此标签是我们最新一个稳定的release构建。这个标签代表我们推荐在生产环境中使用的版本。请不要使用任何带有 rc{n} 前缀的release。这些构建都是Rancher团队的测试构建。

    启动 Rancher Server - 单容器部署 (non-HA)

    在安装了Docker的Linux服务器上,使用一个简单的命令就可以启动一个单实例的Rancher。

    1. $ sudo docker run -d --restart=unless-stopped -p 8080:8080 rancher/server

    Rancher UI

    UI以及API会使用 8080 端口对外服务。下载Docker镜像完成后,需要1到2分钟的时间Rancher才能完全启动并提供服务。

    访问如下的URL: http://<SERVER_IP>:8080<SERVER_IP> 是运行Rancher Server的主机的公共IP地址。

    当UI已经启动并运行,您可以先添加主机 或者在应用商店中选择一个容器编排引擎。在默认情况下,rancher容器会将80端口上的请求重定向到443端口上。如果没有选择不同的容器编排引擎,当前环境会使用Cattle引擎。在主机被添加都Rancher中后,您可以开始添加服务或者从应用商店通过应用模版启动一个应用。

    启动 Rancher Server - 单容器部署 - 使用外部数据库

    除了使用内部的数据库,您可以启动一个Rancher Server并使用一个外部的数据库。启动命令与之前一样,但添加了一些额外的参数去说明如何连接您的外部数据库。

    注意: 在您的外部数据库中,只需要提前创建数据库名和数据库用户。Rancher会自动创建Rancher所需要的数据库表。

    以下是创建数据库和数据库用户的SQL命令例子

    1. > CREATE DATABASE IF NOT EXISTS cattle COLLATE = 'utf8_general_ci' CHARACTER SET = 'utf8';
    2. > GRANT ALL ON cattle.* TO 'cattle'@'%' IDENTIFIED BY 'cattle';
    3. > GRANT ALL ON cattle.* TO 'cattle'@'localhost' IDENTIFIED BY 'cattle';

    启动一个Rancher连接一个外部数据库,您需要在启动容器的命令中添加额外参数。

    1. $ sudo docker run -d --restart=unless-stopped -p 8080:8080 rancher/server \
    2. --db-host myhost.example.com --db-port 3306 --db-user username --db-pass password --db-name cattle

    大部分的输入参数都有默认值并且是可选的,只有MySQL server的地址是必须输入的。

    1. --db-host IP or hostname of MySQL server
    2. --db-port port of MySQL server (default: 3306)
    3. --db-user username for MySQL login (default: cattle)
    4. --db-pass password for MySQL login (default: cattle)
    5. --db-name MySQL database name to use (default: cattle)

    注意: 在之前版本的Rancher Server中,我们需要使用环境变量去连接外部数据库。在新版本中,这些环境变量会继续生效,但Rancher建议使用命令参数代替。

    启动 Rancher Server - 单容器部署 - 挂载MySQL数据库的数据目录

    在Rancher Server容器中,如果您想使用一个主机上的卷来持久化数据库,如下命令可以在启动Rancher时挂载MySQL的数据卷。

    1. $ sudo docker run -d -v <host_vol>:/var/lib/mysql --restart=unless-stopped -p 8080:8080 rancher/server

    使用这条命令,数据库就会持久化在主机上。如果您有一个现有的Rancher Server容器并且想挂在MySQL的数据卷,可以参考以下的Rancher升级介绍。

    启动 Rancher Server - 多节点的HA部署

    在高可用(HA)的模式下运行Rancher Server与使用外部数据库运行Rancher Server一样简单,需要暴露一个额外的端口,添加额外的参数到启动命令中,并且运行一个外部的负载均衡就可以了。

    HA部署需求

    • HA 节点:
      • 所有安装有支持的Docker版本的现代Linux发行版 RancherOS, Ubuntu, RHEL/CentOS 7 都是经过严格的测试。
        • 对于 RHEL/CentOS, 默认的 storage driver, 例如 devicemapper using loopback, 并不被Docker推荐。 请参考Docker的文档去修改使用其他的storage driver。
        • 对于 RHEL/CentOS, 如果您想使用 SELinux, 您需要 安装额外的 SELinux 组件.
      • 9345, 8080 端口需要在各个节点之间能够互相访问
      • 1GB内存
    • MySQL数据库
      • 至少 1 GB内存
      • 每个Rancher Server节点需要50个连接 (例如:3个节点的Rancher则需要至少150个连接)
      • MYSQL配置要求
        • 选项1: 用默认COMPACT选项运行Antelope
        • 选项2: 运行MySQL 5.7,使用Barracuda。默认选项ROW_FORMAT需设置成Dynamic
    • 外部负载均衡服务器
      • 负载均衡服务器需要能访问Rancher Server节点的 8080 端口

    注意: 目前Rancher中并不支持Docker for Mac

    大规模部署建议

    • 每一个Rancher Server节点需要有4 GB 或者8 GB的堆空间,意味着需要8 GB或者16 GB内存
    • MySQL数据库需要有高性能磁盘
    • 对于一个完整的HA,建议使用一个有副本的Mysql数据库。另一种选择则是使用Galera集群并强制写入一个MySQL节点。
    • 在每个需要加入Rancher Server HA集群的节点上,运行以下命令:
    1. # Launch on each node in your HA cluster
    2. $ docker run -d --restart=unless-stopped -p 8080:8080 -p 9345:9345 rancher/server \
    3. --db-host myhost.example.com --db-port 3306 --db-user username --db-pass password --db-name cattle \
    4. --advertise-address <IP_of_the_Node>

    在每个节点上,<IP_of_the_Node> 需要在每个节点上唯一,因为这个IP会被添加到HA的设置中。

    如果您修改了 -p 8080:8080 并在host上暴露了一个不一样的端口,您需要添加 —advertise-http-port <host_port> 参数到命令中。

    注意: 您可以使用 docker run rancher/server —help 获得命令的帮助信息

    • 配置一个外部的负载均衡器,这个负责均衡负责将例如80443端口的流量,转发到运行Rancher Server的节点的8080端口中。负载均衡器必须支持websockets 以及 forwarded-for 的Http请求头以支持Rancher的功能。参考 使用SSL 这个配置的例子。

    advertise-address选项

    选项例子描述
    IP address—advertise-address 192.168.100.100使用指定IP
    Interface—advertise-address eth0从指定网络接口获取
    awslocal—advertise-address awslocal从这里获取http://169.254.169.254/latest/meta-data/local-ipv4
    ipify—advertise-address ipify从这里获取https://api.ipify.org

    HA模式下的Rancher Server节点

    如果您的Rancher Server节点上的IP修改了,您的节点将不再存在于Rancher HA集群中。您必须停止在—advertise-address配置了不正确IP的Rancher Server容器并启动一个使用正确IP地址的Rancher Server的容器。

    使用AWS的Elastic/Classic Load Balancer作为Rancher Server HA的负载均衡器

    我们建议使用AWS的ELB作为您Rancher Server的负载均衡器。为了让ELB与Rancher的websockets正常工作,您需要开启proxy protocol模式并且保证HTTP support被停用。 默认的,ELB是在HTTP/HTTPS模式启用,在这个模式下不支持websockets。需要特别注意listener的配置。

    如果您在配置ELB中遇到问题,我们建议您参考terraform version。

    注意: 如果您正在使用自签名的证书, 请参考我们SSL部分里的如何在AWS里配置ELB.

    Listener 配置 - Plaintext

    简单的来说,使用非加密的负载均衡,需要以下的listener配置:

    Configuration TypeLoad Balancer ProtocolLoad Balancer PortInstance ProtocolInstance Port
    PlaintextTCP80TCP8080 (或者使用启动Rancher Server时 —advertise-http-port 指定的端口)

    启用 Proxy Protocol

    为了使websockets正常工作,ELB的proxy protocol policy必须被启用。

    • 启用 proxy protocol 模式
    1. $ aws elb create-load-balancer-policy --load-balancer-name <LB_NAME> --policy-name <POLICY_NAME> --policy-type-name ProxyProtocolPolicyType --policy-attributes AttributeName=ProxyProtocol,AttributeValue=true
    2. $ aws elb set-load-balancer-policies-for-backend-server --load-balancer-name <LB_NAME> --instance-port 443 --policy-names <POLICY_NAME>
    3. $ aws elb set-load-balancer-policies-for-backend-server --load-balancer-name <LB_NAME> --instance-port 8080 --policy-names <POLICY_NAME>
    • Health check可以配置使用HTTP:8080下的 /ping 路径进行健康检查

    使用Terraform进行配置

    以下是使用Terraform配置的例子:

    1. resource "aws_elb" "lb" {
    2. name = "<LB_NAME>"
    3. availability_zones = ["us-west-2a","us-west-2b","us-west-2c"]
    4. security_groups = ["<SG_ID>"]
    5. listener {
    6. instance_port = 8080
    7. instance_protocol = "tcp"
    8. lb_port = 443
    9. lb_protocol = "ssl"
    10. ssl_certificate_id = "<IAM_PATH_TO_CERT>"
    11. }
    12. }
    13. resource "aws_proxy_protocol_policy" "websockets" {
    14. load_balancer = "${aws_elb.lb.name}"
    15. instance_ports = ["8080"]
    16. }

    使用AWS的Application Load Balancer(ALB) 作为Rancher Server HA的负载均衡器

    我们不再推荐使用AWS的Application Load Balancer (ALB)替代Elastic/Classic Load Balancer (ELB)。如果您依然选择使用ALB,您需要直接指定流量到Rancher Server节点上的HTTP端口,默认是8080。

    使用TLS认证的AD/OPENLDAP

    为了在Rancher Server上启用Active Directory或OpenLDAP并使用TLS,Rancher Server容器在启动的时候需要配置LDAP证书,证书是LDAP服务提供方提供。证书保存在需要运行Rancher Server的Linux机器上。

    启动Rancher并挂载证书。证书在容器内部 必须 命名为ca.crt

    1. $ sudo docker run -d --restart=unless-stopped -p 8080:8080 \
    2. -v /some/dir/cert.crt:/var/lib/rancher/etc/ssl/ca.crt rancher/server

    您可以使用Rancher Server的日志检查传入的 ca.crt 证书是否生效

    1. $ docker logs <SERVER_CONTAINER_ID>

    在日志的开头,会显示证书已经被正确加载的信息。

    1. Adding ca.crt to Certs.
    2. Updating certificates in /etc/ssl/certs... 1 added, 0 removed; done.
    3. Running hooks in /etc/ca-certificates/update.d....done.
    4. Certificate was added to keystore

    在HTTP代理后方启动 Rancher Server

    为了设置HTTP Proxy,Docker守护进程需要修改配置并指向这个代理。在启动Rancher Server前,需要编辑配置文件 /etc/default/docker 添加您的代理信息并重启Docker服务。

    1. sudo vi /etc/default/docker

    在文件中,编辑 #export http_proxy="http://127.0.0.1:3128/&#34; 并修改它指向您的代理。保存修改并重启Docker。重启Docker的方式在每个OS上都不一样。

    注意: 如果您使用systemd运行Docker, 请参考Docker官方的文档 去配置http proxy设置。

    为了使得应用商店加载正常,HTTP代理设置必须在Rancher Server运行的环境变量中。

    1. sudo docker run -d \
    2. -e http_proxy=<proxyURL> \
    3. -e https_proxy=<proxyURL> \
    4. -e no_proxy="localhost,127.0.0.1" \
    5. -e NO_PROXY="localhost,127.0.0.1" \
    6. --restart=unless-stopped -p 8080:8080 rancher/server

    如果您不使用应用商店,则使用您平常的Rancher Server命令即可。

    当向Rancher添加主机时,在HTTP代理中不需要额外的设置和要求。

    通过SSL连接MySQL的Rancher Server

    注意: 目前在Rancher 1.6.3以上版本才支持

    重要提示

    如果您正在使用LDAP或者AD认证方式,并且这些认证方式的证书发放方CA并不是MySQL服务器SSL的证书发放方CA,这篇指南无法适用于您的情况。

    前提条件

    • MySQL服务器的证书或CA证书

    步骤

    • 拷贝MySQL服务器的证书或CA证书到Rancher Server的主机上。当启动rancher/server容器的时候您必须将证书挂载到/var/lib/rancher/etc/ssl/ca.crt
    • 更改以下的模板的对应参数,构建一个JDBC URL:
    1. jdbc:mysql://<DB_HOST>:<DB_PORT>/<DB_NAME>?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&prepStmtCacheSize=517& cachePrepStmts=true&prepStmtCacheSqlLimit=4096&socketTimeout=60000&connectTimeout=60000&sslServerCert=/var/lib/rancher/etc/ssl/ca.crt& useSSL=true
    • 使用环境变量CATTLE_DB_CATTLE_MYSQL_URLCATTLE_DB_LIQUIBASE_MYSQL_URL来导入上面的JDBC URL到容器里面。

    • 加入环境变量CATTLE_DB_CATTLE_GO_PARAMS="tls=true"到容器里面。但是如果服务器证书的标题名字不符合服务器的主机名,您需要使用的是CATTLE_DB_CATTLE_GO_PARAMS="tls=skip-verify".

    例子

    1. $ export JDBC_URL="jdbc:mysql://<DB_HOST>:<DB_PORT>/<DB_NAME>?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&prepStmtCacheSize=517&cachePrepStmts=true&prepStmtCacheSqlLimit=4096&socketTimeout=60000&connectTimeout=60000&sslServerCert=/var/lib/rancher/etc/ssl/ca.crt&useSSL=true"
    2. $ cat <<EOF > docker-compose.yml
    3. version: '2'
    4. services:
    5. rancher-server:
    6. image: rancher/server:stable
    7. restart: unless-stopped
    8. command: --db-host <DB_HOST> --db-port <DB_PORT> --db-name <DB_NAME> --db-user <DB_USER> --db-pass <DB_PASS>
    9. environment:
    10. CATTLE_DB_LIQUIBASE_MYSQL_URL: $JDBC_URL
    11. CATTLE_DB_CATTLE_MYSQL_URL: $JDBC_URL
    12. CATTLE_DB_CATTLE_GO_PARAMS: "tls=true"
    13. volumes:
    14. - /path/to/mysql/ca.crt:/var/lib/rancher/etc/ssl/ca.crt
    15. ports:
    16. - "8080:8080"
    17. EOF
    18. $ docker-compose up -d

    重要: 您必须在两个环境变量里都写入构建好的JDBC_URL,还必须加入—db-xxx参数!