zoukankan      html  css  js  c++  java
  • Consul 从源码编译

    一、安装GO环境

    1、使用 YUM 进行安装

    (1)可以在 linux 服务器上输入 go,会有如下红色框中的提示,可以选择 Y

     (2)检查是否安装过

      Installed packages 表示 go 是通过 yum 安装的。

     

    若是未安装,可以直接执行  yum install go 进行安装,然后可以直接执行 go 命令是否安装好

    2、使用 GO 源码进行安装(这里使用1.13版本,且安装在 Linux ARM 服务器上)

       通过线下安装有个好处,可以选择 GO 的版本,而 yum 安装不可以自由选择版本。

       线下编译的服务器若已经安装了GO环境,查看是否是1.13的版本,若不是建议卸载(yum 安装的话,使用 yum remove golang 进行卸载),这里推荐使用1.13的版本,是因为consul在编译的过程中需要下载依赖的go库,1.13版本中可以配置代理加快下载速度。

    (1) 下载1.13版本的GO安装包

    • 将下载的包解压到/usr/local下;

     (2) 配置环境变量

    在 /etc/profile 中添加

    export GOROOT=/usr/local/go

    export PATH=$PATH:$NODEJS_HOME/bin:/usr/local/go/bin

    (3) 使用 go version 进行验证

        表示安装好了

    (4) 修改 GO 环境变量中的代理

     其中 GOPROXY初始值是https://proxy.golang.org,direct, 需要通过 go env -w GOPROXY=https://goproxy.cn,direct修改值。

    二、Consul 源码编译(本示例使用 v1.6.5)

    1、下载

    源码下载地址:https://github.com/hashicorp/consul/tree/v1.6.5

    两种方式:

    方式一:可以通过git clone -b v1.6.5 https://github.com/hashicorp/consul.git 命令直接将 tag 1.6.5 版本下的代码下载到本地;

    该种方式要求编译服务器上安装了git。

    方式二:直接在github上下载1.6.5的源码zip包。

     将下载的 consul-1.6.5.zip 源码包上传到编译服务器并进行解压,这里示例解压后的目录为:/home/wf/consul/consul-1.6.5-git/consul

    2、编译

    • cd 解压后的consul目录下
    • 执行 make tools    

            该命令会下载 consul 依赖的go库,但目测也仅是下载了一部分。

    可能会遇到的问题如下:

     

     

     问题 1

         当consul源码包不是通过git 下载下来的时候,会有该错误提示,可忽略;

     问题 2、3、4、5

         均是网络不通造成的,请检查代理配置的是否正确,网络是否正常,本文出现这些错误,是因为使用 Proxy代理的时候配置错误造成。

    问题 6

         产生该问题的原因为 通过 go env 查看到 GO111MODULE = off ,通过 编译输出的控制台日志可看到,此时并没有从网上下载具体版本(consul 安装目录下)的GO库包 到 GOPATH 下的pkg目录下,而是 直接下载 get 指定的 GO库包到 GOPATH 下的 src 目录下且下载最新版本的,根据 问题6 下载的链接在 github.com 上查看 发现 下载的 是master 中的代码,其下的确是没有 mockery 目录,又查看 consul 安装目录下的 go.mod 中声明的 mockery 版本并不是最新版本的,而申明的版本中是有 mockery 目录的,因此 尝试将 GO111MODULE设置空置,打开module 功能,再次执行 make tools ,发现直接下载 go.mod 指定包了。

    • 执行make dev

         该命令适配本地服务器操作系统进行编译,主要是用于测试。

     显然在编译的时候,还是会下载依赖的GO库,最终会在consul/bin,consul/pkg/ /bin/linux_arm64,root/go/bin 下都会生成 consul 二进制文件。

    注意:

       consul 二进制文件中打包进去的GO依赖库是 GOPATH 中指定的路径下的pkg/mod中的库,而不是consul解压路径下的 vendor。

    •  执行 make linux 

               a) 删除consul/bin,consul/pkg/ /bin/linux_arm64,root/go/bin的consul二进制文件

               b) 执行make linux生成最终使用的 consul 二进制文件

    PS:之所以不使用 make dev 生成的consul二进制文件,是因为该文件是用来本地测试使用的,不能作为最终使用文件。

    3、删除引用的某些软件

          由于一些政策,软件商业化的时候,可能就是禁止使用某些软件,此时 consul 编译的时候,可能就要求删除使用某些禁止使用的软件相关的库,这里以 go-jose、vic 软件为例,说明编译 consul 的时候怎么删除这些软件相关的引用。

    •  cd 解压后的consul目录下
    •  执行 grep -rnw vic *

        a) 修改解压后的consul目录/go.mod文件

               删除文件中的vic库引用

         b) 修改consul/go.sum文件

                删除文件中的vic库描述

         c)  修改/root/go/pkg/mod/github.com/hashicorp/go-discover/go.mod

                删除文件中的vic库引用

         d)  修改/root/go/pkg/mod/github.com/hashicorp/go-discover/go.sum

                删除文件中的vic库描述

         e)  删除/root/go/pkg/mod/github.com/hashicorp/go-discover/provider/vsphere

         f)  修改/root/go/pkg/mod/github.com/hashicorp/go-discover/discover.go(因为删除vsphere模块,所以修改使用该模块的go文件)

                 i) 删除 import 中的 "github.com/hashicorp/go-discover/provider/vsphere"

                 ii) 删除 56 行的 vsphere 使用

         g) 删除/root/go/pkg/mod/github.com/hashicorp/vic

    •  执行 grep -rnw go-jose *

            a)  修改解压后的consul目录/go.mod文件

                    删除文件中的go-jose库引用

            b)  修改consul/go.sum文件

                    删除文件中的go-jose库描述

            c)  修改/root/go/pkg/mod/github.com/hashicorp/vault/api/go.mod

                     删除文件中的go-jose库引用

           d)  修改/root/go/pkg/mod/github.com/hashicorp/vault/api/go.sum

                      删除文件中的go-jose库描述

           e)  删除/root/go/pkg/mod/gopkg.in/square

            f)  删除/root/go/pkg/mod /github.com/hashicorp/vault/api/plugin_helpers.go

           g)  修改consul目录/agent/consul/authmethod/kubeauth/k8s.go

                 i)  删除go-jose库引用

                 ii) 删除go-jose 中的 jwt 使用,两处

    可能遇到的问题:

         在经过上面删除修改操作之后(假定忘了修改/root/go/pkg/mod/github.com/hashicorp/go-discover/discover.go),再次执行make dev命令,会发现所有的依赖库全部重新下载了,而且均是现在最新版的,最后出现了以上错误。

         提示k8s/io/api最新版本为0.18.8,但是其中不包含需要的k8s.io/api/admissionregistration/v1alpha1,打开/root/go/pkg/mod/k8s.io/api/admissionregistration的确是没有v1alpha1。打开consul压缩包中的go.mod 可以发现原始的k8s.io/api 版本是v0.0.0-20190325185214-7544f9db76f6,但是现在变成了0.18.8,显然版本有误。

         经过排除法,发现是dscover.go中忘了删除对go-discover的vsphere模块引用,由此可见在编译过程中,发现缺失go依赖模块都会自动触发重新下载,而且还会下载最新版本的。

    • 检查consul二进制文件是否还有go-josevic字样

                  文本文件打开consul二进制文件,搜索go-josevic,发现没有了。

  • 相关阅读:
    10_14 drf接口框架。
    10_11 vue路由跳转
    10_10,vue项目环境搭建
    10_9vue循环指令与组件
    10_8 vue的导入
    9_25中间键与登录认证
    块级元素居中问题
    2019牛客多校第五场 F maximum clique 1 状压dp+最大独立集
    2019牛客多校第五场C generator 2 hash,bsgs模板
    2019牛客多校第五场B generator 十进制快速幂
  • 原文地址:https://www.cnblogs.com/sandyflower/p/13545450.html
Copyright © 2011-2022 走看看