1 - 单节点安装+外部七层负载平衡


对于开发环境,我们推荐直接在主机上通过docker run的形式运行Rancher server容器。如果主机可以通过公网IP直接访问,可以参考单节点安装

一、Linux主机要求

二、配置SSL证书并安装Rancher

出于安全考虑,使用Rancher时需要SSL进行加密。SSL可以保护所有Rancher网络通信,例如登录或与集群交互。

注意:1、离线安装?2、API审计日志? 3、代理上网?4、自定义CA根证书?

方案A-使用您自己生成的自签名证书

采用外部七层负载均衡器来做代理,那么只需要把证书放在外部七层负载均衡器上,如果是自签名证书,则需要把CA文件映射到rancher server容器中,如果没有自签名证书,可一键生成自签名ssl证书

先决条件:1、创建一个自签名证书。2、证书文件必须是PEM格式。3、这里的证书不需要进行base64加密。

运行Rancher server容器时候,需要把自签名CA证书映射到Rancher容器中:

  1. docker run -d --restart=unless-stopped \
  2. -p 80:80 -p 443:443 \
  3. -v <主机路径>:/var/lib/rancher/ \
  4. -v /root/var/log/auditlog:/var/log/auditlog \
  5. -e AUDIT_LEVEL=3 \
  6. -v /etc/your_certificate_directory/cacerts.pem:/etc/rancher/ssl/cacerts.pem \
  7. rancher/rancher:stable (或者rancher/rancher:latest)

方案B-使用权威CA机构颁发的证书

如果您公开发布您的应用,理想情况下应该使用由权威CA机构颁发的证书。

先决条件:1、证书必须是PEM格式,PEM只是一种证书类型,并不是说文件必须是PEM为后缀,具体可以查看证书类型;2、这里的证书不需要进行base64加密;3、给容器添加—no-cacerts参数禁止Rancher生成默认CA证书;

如果您使用由权威CA机构颁发的证书,则无需在Rancher容器中安装您的CA证书,只需运行下面的基本安装命令即可:

  1. docker run -d --restart=unless-stopped \
  2. -p 80:80 -p 443:443 \
  3. -v <主机路径>:/var/lib/rancher/ \
  4. -v /root/var/log/auditlog:/var/log/auditlog \
  5. -e AUDIT_LEVEL=3 \
  6. rancher/rancher:stable (或者rancher/rancher:latest) --no-cacerts

三、配置七层负载均衡器

默认情况下,rancher容器会将80端口上的请求重定向到443端口上。如果rancher server通过负载均衡器来代理,这个时候请求是通过负载均衡器发送给rancher server,而并非客户端直接访问rancher server。在非全局https的环境中,如果以外部负载均衡器作为ssl终止,这个时候通过负载均衡器的https请求将需要被反向代理到rancher server http(80)上。在负载均衡器上配置X-Forwarded-Proto: https参数,rancher server http(80)上收到负载均衡器的请求后,就不会再重定向到https(443)上。

负载均衡器或代理必须配置为支持以下内容:

  • WebSocket连接
  • SPDY/HTTP/2协议
  • 传递/设置以下headers:

HeaderValue描述Host传递给Rancher的主机名识别客户端请求的主机名。X-Forwarded-Protohttps识别客户端用于连接负载均衡器的协议。注意:如果存在此标头,rancher/rancher不会将HTTP重定向到HTTPS。X-Forwarded-PortPort used to reach Rancher.识别客户端用于连接负载均衡器的端口。X-Forwarded-ForIP of the client connection.识别客户端的原始IP地址。

  • Nginx 配置文件示例

此Nginx配置文件在Nginx version 1.13 (mainline)和1.14(stable)通过测试

  1. worker_processes 4;
  2. worker_rlimit_nofile 40000;
  3. events {
  4. worker_connections 8192;
  5. }
  6. http {
  7. upstream rancher {
  8. server rancher-server:80;
  9. }
  10. map $http_upgrade $connection_upgrade {
  11. default Upgrade;
  12. '' close;
  13. }
  14. server {
  15. listen 443 ssl http2; # 如果是升级或者全新安装v2.2.2,需要禁止http2
  16. server_name FQDN;
  17. ssl_certificate <您自己的自签名证书>;
  18. ssl_certificate_key <您自己的自签名证书私钥>;
  19. location / {
  20. proxy_set_header Host $host;
  21. proxy_set_header X-Forwarded-Proto $scheme;
  22. proxy_set_header X-Forwarded-Port $server_port;
  23. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  24. proxy_pass http://rancher;
  25. proxy_http_version 1.1;
  26. proxy_set_header Upgrade $http_upgrade;
  27. proxy_set_header Connection $connection_upgrade;
  28. # This allows the ability for the execute shell window to remain open for up to 15 minutes.
  29. ## Without this parameter, the default is 1 minute and will automatically close.
  30. proxy_read_timeout 900s;
  31. proxy_buffering off;
  32. }
  33. }
  34. server {
  35. listen 80;
  36. server_name FQDN;
  37. return 301 https://$server_name$request_uri;
  38. }
  39. }

为了减少网络传输的数据量,可以在七层代理的http定义中添加GZIP功能。

  1. # Gzip Settings
  2. gzip on;
  3. gzip_disable "msie6";
  4. gzip_disable "MSIE [1-6]\.(?!.*SV1)";
  5. gzip_vary on;
  6. gzip_static on;
  7. gzip_proxied any;
  8. gzip_min_length 0;
  9. gzip_comp_level 8;
  10. gzip_buffers 16 8k;
  11. gzip_http_version 1.1;
  12. gzip_types
  13. text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml application/font-woff
  14. text/javascript application/javascript application/x-javascript
  15. text/x-json application/json application/x-web-app-manifest+json
  16. text/css text/plain text/x-component
  17. font/opentype application/x-font-ttf application/vnd.ms-fontobject font/woff2
  18. image/x-icon image/png image/jpeg;

四、(可选)为Agent Pod添加主机别名(/etc/hosts)

如果您没有内部DNS服务器而是通过添加/etc/hosts主机别名的方式指定的Rancher server域名,那么不管通过哪种方式(自定义、导入、Host驱动等)创建K8S集群,K8S集群运行起来之后,因为cattle-cluster-agent Podcattle-node-agent无法通过DNS记录找到Rancher server,最终导致无法通信。

解决方法

可以通过给cattle-cluster-agent Podcattle-node-agent添加主机别名(/etc/hosts),让其可以正常通信(前提是IP地址可以互通)

  • cattle-cluster-agent pod
  1. export kubeconfig=xxx/xxx/xx.kubeconfig.yaml
  2. kubectl --kubeconfig=$kubeconfig -n cattle-system \
  3. patch deployments cattle-cluster-agent --patch '{
  4. "spec": {
  5. "template": {
  6. "spec": {
  7. "hostAliases": [
  8. {
  9. "hostnames":
  10. [
  11. "xxx.cnrancher.com"
  12. ],
  13. "ip": "192.168.1.100"
  14. }
  15. ]
  16. }
  17. }
  18. }
  19. }'
  • cattle-node-agent pod
  1. export kubeconfig=xxx/xxx/xx.kubeconfig.yaml
  2. kubectl --kubeconfig=$kubeconfig -n cattle-system \
  3. patch daemonsets cattle-node-agent --patch '{
  4. "spec": {
  5. "template": {
  6. "spec": {
  7. "hostAliases": [
  8. {
  9. "hostnames":
  10. [
  11. "xxx.rancher.com"
  12. ],
  13. "ip": "192.168.1.100"
  14. }
  15. ]
  16. }
  17. }
  18. }
  19. }'

注意1、替换其中的域名和IP 2、别忘记json中的引号。

五、FAQ和故障排除

FAQ中整理了常见的问题与解决方法。