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-jose\vic字樣

              文本文件打開consul二進制文件,搜索go-jose\vic,發現沒有了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM