安装Rancher并启用SSL


为了在Rancher Server启用 https 访问,您需要在Rancher Server前使用一个代理服务器代理https请求,并能设置http的头参数。我们会在以下的内容中提供一个使用NGINX、HAProxy或者Apache作为代理的例子。当然了,其他工具也是可以的。

需求

除了一般的Rancher Server需求外,您还需要:

  • 有效的SSL证书:如果您的证书并不是标准的Ubuntu CA bundle,请参考以下内容使用自签名证书
  • 相关域名的DNS配置

Rancher Server 标签

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

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

启动 Rancher Server

在我们的例子配置中,所有的流量都会通过一个Docker link从代理传入Rancher Server容器。有其他替代的方法,但在我们的例子中会尽量的简单易懂

启动Rancher Server。我们需要添加 —name=rancher-server 参数到命令中,使得代理的容器可以与Rancher Server容器建立Docker link

  1. $ sudo docker run -d --restart=unless-stopped --name=rancher-server rancher/server

注意: 在我们的例子中,我们假设代理会运行在其他容器中。如果您打算在其他的服务器上运行代理,则您需要在Rancher Server上暴露8080端口,本地的话,通过在 docker run 中添加 -p 127.0.0.1:8080:8080 参数。

如果您需要复用现有的Rancher Server实例,升级的步骤会根据您如何运行原有的Rancher实例而不同。

Nginx 配置模版

以下是最小的NGINX配置。您应该根据您的需要定制化您自己的配置。本配置需要nginx版本大于 1.9.5。

设置注意项

  • rancher-server 是您的Rancher Server容器的名称。 当您启动Rancher Server容器时,命令中必须包括 —name=rancher-server 参数。当您启动nginx容器时,您的命令则必须包括 —link=rancher-server ,这样以下的配置才能生效。
  • <server> 可以是任何的名字,但是必须与http/https server配置的名称一致。
  1. upstream rancher {
  2. server rancher-server:8080;
  3. }
  4. map $http_upgrade $connection_upgrade {
  5. default Upgrade;
  6. '' close;
  7. }
  8. server {
  9. listen 443 ssl spdy;
  10. server_name <server>;
  11. ssl_certificate <cert_file>;
  12. ssl_certificate_key <key_file>;
  13. location / {
  14. proxy_set_header Host $host;
  15. proxy_set_header X-Forwarded-Proto $scheme;
  16. proxy_set_header X-Forwarded-Port $server_port;
  17. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  18. proxy_pass http://rancher;
  19. proxy_http_version 1.1;
  20. proxy_set_header Upgrade $http_upgrade;
  21. proxy_set_header Connection $connection_upgrade;
  22. # This allows the ability for the execute shell window to remain open for up to 15 minutes. Without this parameter, the default is 1 minute and will automatically close.
  23. proxy_read_timeout 900s;
  24. }
  25. }
  26. server {
  27. listen 80;
  28. server_name <server>;
  29. return 301 https://$server_name$request_uri;
  30. }

Apache 配置例子

以下是使用Apache作为负载均衡的配置例子。

设置注意项

  • <server_name> 是Rancher Server容器的名称。当您启动Apache容器,命令中必须包含 —link=<server_name>,这样以下的配置才能生效。
  • 在代理的设置中,您需要在配置中替换 rancher 这个参数。
  • 确保 proxy_wstunnel 这个参数是启用的(websocket支持)。
  1. <VirtualHost *:80>
  2. ServerName <server_name>
  3. Redirect / https://<server_name>/
  4. </VirtualHost>
  5.  
  6. <VirtualHost *:443>
  7. ServerName <server_name>
  8.  
  9. SSLEngine on
  10. SSLCertificateFile </path/to/ssl/cert_file>
  11. SSLCertificateKeyFile </path/to/ssl/key_file>
  12.  
  13. ProxyRequests Off
  14. ProxyPreserveHost On
  15.  
  16. RewriteEngine On
  17. RewriteCond %{HTTP:Connection} Upgrade [NC]
  18. RewriteCond %{HTTP:Upgrade} websocket [NC]
  19. RewriteRule /(.*) ws://rancher:8080/$1 [P,L]
  20.  
  21. RequestHeader set X-Forwarded-Proto "https"
  22. RequestHeader set X-Forwarded-Port "443"
  23.  
  24. <Location />
  25. ProxyPass "http://rancher:8080/"
  26. ProxyPassReverse "http://rancher:8080/"
  27. </Location>
  28.  
  29. </VirtualHost>

HAProxy 配置例子

以下是HAProxy的最小配置。您应该根据您的需要去修改。

设置注意项

  • <rancher_server_X_IP>是Rancher Servers的IP地址。
  1. global
  2. maxconn 4096
  3. ssl-server-verify none
  4.  
  5. defaults
  6. mode http
  7. balance roundrobin
  8. option redispatch
  9. option forwardfor
  10.  
  11. timeout connect 5s
  12. timeout queue 5s
  13. timeout client 36000s
  14. timeout server 36000s
  15.  
  16. frontend http-in
  17. mode http
  18. bind *:443 ssl crt /etc/haproxy/certificate.pem
  19. default_backend rancher_servers
  20.  
  21. # Add headers for SSL offloading
  22. http-request set-header X-Forwarded-Proto https if { ssl_fc }
  23. http-request set-header X-Forwarded-Ssl on if { ssl_fc }
  24.  
  25. acl is_websocket hdr(Upgrade) -i WebSocket
  26. acl is_websocket hdr_beg(Host) -i ws
  27. use_backend rancher_servers if is_websocket
  28.  
  29. backend rancher_servers
  30. server websrv1 <rancher_server_1_IP>:8080 weight 1 maxconn 1024
  31. server websrv2 <rancher_server_2_IP>:8080 weight 1 maxconn 1024
  32. server websrv3 <rancher_server_3_IP>:8080 weight 1 maxconn 1024

F5 BIG-IP配置示例

下面的iRule配置可以使在F5 BIG-IP后的Rancher Server被访问到

  1. when HTTP_REQUEST {
  2. HTTP::header insert "X-Forwarded-Proto" "https";
  3. HTTP::header insert "X-Forwarded-Port" "443";
  4. HTTP::header insert "X-Forwarded-For" [IP::client_addr];
  5. }

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

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

Listener 配置 - SSL

在ELB的SSL控制台,listener配置与以下配置类似:

Configuration TypeLoad Balancer ProtocolLoad Balancer PortInstance ProtocolInstance Port
SSL-TerminatedSSL (Secure TCP)443TCP8080 (或者使用启动Rancher时配置 —advertise-http-port 的端口)
  • 需要添加相应的安全组设置以及SSL证书

启用 Proxy Protocol

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

  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 路径进行健康检查

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

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

注意: 如果您使用ALB配合Kubernetes,kubectl —kubeconfig=kube_configxxx.yml exec 并不能使用那个功能,您需要使用ELB。

使用自签名证书 (Beta)

免责声明

以下的配置只会在Rancher的核心服务并且是单节点部署模式下生效。当前并没有官方的Rancher模版Rancher catalog支持。

Rancher Compose CLI 将需要CA证书,这个CA证书需要被添加到操作系统默认证书当中。请参考Golang root_*

前置条件

  • PEM格式的CA 证书
  • 为Rancher Server签名的CA证书
  • Nginx或者Apache实例,反向代理Rancher Server,并配置SSL

Rancher Server

  • 通过以下的Docker命令启动Rancher Server容器。证书必须放在容器内部/var/lib/rancher/etc/ssl/ca.crt的位置。
  1. $ sudo docker run -d --restart=unless-stopped -p 8080:8080 -v /some/dir/cert.crt:/var/lib/rancher/etc/ssl/ca.crt rancher/server
  1. <br>
  2.  
  3. > **注意:** 如果您在容器内部运行NGINX或者Apache,您可以直接链接这个实例并且不需要暴露Rancher UI的8080端口。
  4.  
  5. 这个命令将会配置服务器的ca-certificate,从而使Rancher的主机创建服务,应用商店服务和Compose执行服务可以与Rancher Server通信。
  • 如果您使用Nginx或者Apache代理SSL,在容器启动命令中添加—link=<rancher_server_container_name>参数。

  • 使用 https 地址访问Rancher,例如 https://rancher.server.domain

  • 为SSL更新主机注册地址配置

注意: 除非您的浏览器信任了该用于给Rancher Server签名的CA证书,否则在您访问UI的时候,浏览器会显示一个未信任的网站警告。

添加 Hosts

  • 在您准备添加到Rancher集群的主机上,使用PEM格式保存CA证书,并放入 /var/lib/rancher/etc/ssl 文件夹下并改名为 ca.crt

  • 添加 自定义主机, 使用UI上提示的命令复制到主机上. 命令会自动挂载目录 -v /var/lib/rancher:/var/lib/rancher, 所以文件会自动的复制到您的主机上。