参考:https://github.com/rancher/rancher/wiki/Setting-Up-Rancher-2.0-Development-Environment#set-up-goland

    写在前面:参考链接的指引是可以的,但是由于本人对英文不够敏感,看了至少3遍以上抠完很多细节才把开发环境搭建起来,因此“执笔”记录本地环境下的搭建过程。开源项目迭代很快,此篇文件仅供2.4.8版本的源码搭建参考。

    踩坑一、在windows上搭建后端本地环境。报错:undefined: syscall.Credential,截图如下:
    image.png
    百度搜索报错内容的返回结果太少了,但结合rancher wiki大概猜测,在windows环境下搭建尚未验证,而我也没有空去做第一个吃螃蟹,所以改用linux上把环境搭建起来吧。

    正解:使用mac或linux搭建开发环境。

    注:**在linux上面没有使用goland来运行,使用了纯命令行运行,但在goland上的配置给了我很多提示。我大概整理了一下

    • 安装go
      1. #设置国内代理,不然下载依赖会报错、很慢:
      2. export GOPROXY=https://mirrors.aliyun.com/goproxy/
      3. export GOPROXY=goproxy.cn
      4. export CATTLE_DEV_MODE=30
      5. export KUBECONFIG=yourK8Sconfig ##请替换为您的kubeconfig实际路径
      6. #编译?到现在还傻傻分不清 go run 、go build这些:
      7. go build -i -gcflags="-N -l" #执行上上面这句,当前目录将生成rancher执行文件
      8. #执行rancher,按照wiki提示需要添加--add-local=true项目参数
      9. ./rancher --add-local=true

    踩坑二、后端目录结构、最少repo
    这段目录结构一开始没仔细看,后面才发现跑不起来跟目录结构关系很大。
    image.png
    例如服务看似可以访问了,但是login界面没有出来,此处应该有截图(跟光启动了前端ui项目一样):

    究其原因是缺少了api,想起rancher文档里面对每个项目的详细介绍,以及自己的思考,我没对rancher、types执行过go install,rancher是如何引用上一级项目的types项目呢?后来回到wiki文档细看了目录结构,才发现自己还没理解这部分的说明。

    正解
    正确的目录应该是:
    注意此处在GOPATH=/root/go/src(默认)

    /root/go/src/github/rancher
    /root/go/src/github/rancher/types
    /root/go/src/github/rancher/norman
    

    一共三个repo,这三个repo在github上是独立的(2.4.8及以前的版本),据wiki说2.5.0版本开始只需要克隆一个repo就可以了。

    疑问
    只启动了rancher,没启动ui repo,但还是可以通过后端服务的url正常访问ui部分?所以ui repo部分是用来做什么的呢?

    rancher前端部署在nginx中
    构建dist包

    ./scripts/update-dependencies
    ./scripts/build-static -l -c 'k8s04:9443' -s  #其中k8s04:9443是nginx托管前端的域名和端口
    

    报错,跨域问题?
    image.png
    修改nginx.conf,添加以下三个add_header

    
    http {
        include       mime.types;
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Credentials' 'true'
    
    #修改nginx.conf后,重新加载nginx
    nginx -t
    nginx -s reload
    

    前端跨域问题解决了,但是前端调用后端有问题(继续改nginx配置)
    image.png
    前端nginx配置:

            location / {
                root   html;
                index  index.html index.htm;
            }
            location /login {
                alias   html;
                index  index.html index.htm;
            }
            location /v3 {
                add_header 'Access-Control-Allow-Origin' '*';
                proxy_pass https://rancher.local.org;
                proxy_ignore_client_abort on;
                proxy_redirect off;
                proxy_set_header  Host  $host;
                proxy_set_header  X-Real-IP  $remote_addr;
                proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                allow all;
            }
    
            location  /v3-public {
                add_header 'Access-Control-Allow-Origin' '*';
                proxy_pass   https://rancher.local.org;
                #proxy_pass   https://rancher.local.org/v3-public/;
                proxy_ignore_client_abort on;
                proxy_redirect off;
                proxy_set_header  Host  $host;
                proxy_set_header  X-Real-IP  $remote_addr;
                proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                allow all;
            }
            location  /k8s {
                add_header 'Access-Control-Allow-Origin' '*';
                proxy_pass   https://rancher.local.org;
                proxy_ignore_client_abort on;
                proxy_redirect off;
                proxy_set_header  Host  $host;
                proxy_set_header  X-Real-IP  $remote_addr;
                proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                allow all;
            }
    

    【后端nginx】的server_name添加【前端nginx】所在的IP、【后端nginx】的VIP:
    注:后端使用K8S部署的rancher,因此需要更新k8s上ingress-nginx-controller的nginx.conf

    打开你rancher服务器的 /v3/settings/ui-index接口,