rancher 是一个为DevOps团队提供的完整的Kubernetes与容器管理解决方案。rancher最大的优点就是安装部署方便,极大地简化了K8S的安装配置。在官网上,推荐的是使用docker方式安装rancher,这种方式隐藏了大量的细节。在网上搜了下现有的资料,几乎都是照抄官方文档,更没有在windows上安装rancher的先例。

rancher是用golang写的,跨平台问题不大,但也需要一些修改。正好最近要对rancher做二次开发,于是记录下了在windows上编译安装rancher的步骤。

1.修改源码

rancher要在windows上编译通过并运行,需要修改以下源码

main.go

func run(cfg app.Config) error {
   logrus.Infof("Rancher version %s is starting", VERSION)
   logrus.Infof("Rancher arguments %+v", cfg)
   dump.GoroutineDumpOn(syscall.SIGUSR1, syscall.SIGILL)
   ctx := signals.SetupSignalHandler(context.Background())

改为如下,此处修改基本不会有副作用

func run(cfg app.Config) error {
   logrus.Infof("Rancher version %s is starting", VERSION)
   logrus.Infof("Rancher arguments %+v", cfg)
   dump.GoroutineDumpOn(syscall.SIGILL, syscall.SIGILL)
   ctx := signals.SetupSignalHandler(context.Background())

然后屏蔽以下几个文件中相关syscall的处理:(这几处修改可能会导致K8S相关的功能带来影响,但影响未知.建议使用条件编译方式)

pkg/controllers/user/helm/common/common.go

func JailCommand(cmd *exec.Cmd, jailPath string) (*exec.Cmd, error) {
   if os.Getenv("CATTLE_DEV_MODE") != "" {
      return cmd, nil
   } else {
      //cred, err := jailer.GetUserCred()
      //if err != nil {
      // return nil, errors.WithMessage(err, "get user cred error")
      //}
      //
      //cmd.SysProcAttr = &syscall.SysProcAttr{}
      //cmd.SysProcAttr.Credential = cred
      //cmd.SysProcAttr.Chroot = jailPath
      //cmd.Env = jailer.WhitelistEnvvars(cmd.Env)
      return cmd, nil
   }
}

pkg/controllers/management/node/utils.go 修改同理

func buildCommand(nodeDir string, node *v3.Node, cmdArgs []string) (*exec.Cmd, error) {
   // In dev_mode, don't need jail or reference to jail in command
   if os.Getenv("CATTLE_DEV_MODE") != "" {
      env := initEnviron(nodeDir)
      command := exec.Command(nodeCmd, cmdArgs...)
      command.Env = env
      return command, nil
   }

   //cred, err := jailer.GetUserCred()
   //if err != nil {
   // return nil, errors.WithMessage(err, "get user cred error")
   //}

   command := exec.Command(nodeCmd, cmdArgs...)
   //command.SysProcAttr = &syscall.SysProcAttr{}
   //command.SysProcAttr.Credential = cred
   //command.SysProcAttr.Chroot = path.Join(jailer.BaseJailPath, node.Namespace)
   envvars := []string{
      nodeDirEnvKey + nodeDir,
      "PATH=/usr/bin:/var/lib/rancher/management-state/bin",
   }
   command.Env = jailer.WhitelistEnvvars(envvars)
   return command, nil
}

屏蔽jailer的处理

pkg/jailer/jailer.go 注释掉这个方法

// GetUserCred looks up the user and provides it in syscall.Credential
//func GetUserCred() (*syscall.Credential, error) {
//
//}

修改一个依赖库里的文件 (比较正规的方式是在go mod中使用replace语法,而不是直接修改第三方package)

vendor/github.com/rancher/kontainer-engine/service/service.go

#446行开始注释这段代码
//if os.Getenv("CATTLE_DEV_MODE") == "" {
// cred, err := getUserCred()
// if err != nil {
//    return "", errors.WithMessage(err, "get user cred error")
// }
//
// cmd.SysProcAttr = &syscall.SysProcAttr{}
// cmd.SysProcAttr.Credential = cred
// cmd.SysProcAttr.Chroot = "/opt/jail/driver-jail"
// cmd.Env = whitelistEnvvars([]string{"PATH=/usr/bin"})
//}

628行注释掉这个方法

// getUserCred looks up the user and provides it in syscall.Credential
//func getUserCred() (*syscall.Credential, error) {

然后编译即可生成exe文件。

2.运行

如果笔记本内存在8G以上,可以安装windows版本k8s或者minikube

由于我本机配置太低,所以使用了linux服务器上的配置。

#每次运行一定要执行这个命令,或者在环境变量里配置加下也可一劳永逸
set CATTLE_DEV_MODE=true
go build -mod=vendor
#生成可执行文件 rancher.exe 运行文件需要k8s 在服务器上安装k8s 然后将配置文件k3s.yaml下载到本地windows上,修改配置文件的ip为k8s所在服务器上的ip 
#修改完成后执行下面指令 其中:g:\data\k3s.yaml为配置文件所在本地路径
rancher.exe  --k8s-mode=external  --kubeconfig g:\data\k3s.yaml --no-cacerts=true

k3s.yaml是Linux服务器上的K8S配置文件。不要使用服务器上已经被rancher使用过的k8s,而是用一个崭新的K8S环境。

服务器上安装k8s可以参考这里:https://k3s.io/

#这一步可能需要翻墙
curl -sfL https://get.k3s.io | sh -
#Check for Ready node, takes maybe 30 seconds
k3s kubectl get node

新增一个用户试一下,可以新增成功

3.条件编译

条件编译不需要在原有文件内容上做修改,编译出的文件可以保证在linux上是完整的。

以修改pkg/controllers/user/helm/common/common.go 为例,将原文件重命名未common_linux.go,然后新建一个common_windows_amd64.go,里面是windows版本的源码。

然后编译即可。

看起来条件编译对源文件做了重命名操作,但是保证了linux上代码的完整,不会让windows上的修改导致linux上产生隐患。

golang条件编译的源里可以参考此处:https://www.jianshu.com/p/4bb03e67e7ae

4.问题

1.未测试更多高级功能,还未知。