从零开始搭建Envoy 1.17编译环境--基于CentOS7以及glibc 2.17环境

背景原因

envoy是istio数据面的核心组件,也是现在最热门的网络代理中间件之一。但是它的编译部署一直是个复杂的问题,网络上关于envoy编译环境搭建以及编译步骤的文档少之又少,就算找到一篇也不一定能过运用在新版本的envoy编译流程上(因为引入了v8内核作为wasm扩展的运行时)。

所以如果有用户需要对源码做定制修改时(比如加入自己的过滤器等),编译成为了挡在用户路上的第一支拦路虎。此外,就算使用官方提供的编译好的二进制文件,也需要glibc版本至少要满足2.18以上。这对于CentOS/RHEL 7版本的用户来说极不友好(CentOS/RHEL 7只支持glibc 2.17,冒然升级glibc可能导致系统几乎所有程序都段错误,无法运行)。

其实envoy社区提供了很多个可以直接使用的CI镜像,如果你的系统支持glibc 2.18及以上的话,可以直接使用官方提供的CI镜像来编译envoy。但是!使用envoy社区提供的镜像编译步骤,生成的envoy只是普通的envoy,是不能正常的支持istio的wasm插件扩展的,这也就是说如果你使用envoy作为istio的数据面代理的话,是不能够正常运行的(istio预置的wasm模块不能正常加载)。

那么,如何才能编译出及支持低版本glibc,又能使用wasm扩展的envoy呢?这是本文要和大家讨论的,请往下看...

主要工具链及版本

工具 版本
git 2.23
golang 1.15+
gcc 7
llvm + clang 10
cmake 3.17.5
make 3.82
ninja 1.10.2
bazel 3.7.2
python 3.6+
zlib 1.2.3.4

环境准备

  1. 准备一台最小化安装的CentOS7

  2. 安装一些依赖

    # 下面编译要用到
    yum install -y wget python3 openssl-devel libcurl-devel expat-devel patch libtool libatomic
    
  3. 安装gcc 7(要用gcc编译git和llvm)

    yum install centos-release-scl
    yum install devtoolset-7
    yum install devtoolset-7-libatomic-devel
    # 需要使用gcc7时可以采用如下方法切换
    # 1. 临时切换gcc
    # 1.a 新启一个bash来切换的gcc7
    scl enable devtoolset-7 bash
    # 1.b 当前的bash切换gcc7,下面两条选择一条
    source /opt/rh/devtoolset-7/enable
    source scl_source enable devtoolset-7
    # 2. 想要每次启动都默认使用gcc7,可以放到启动配置里
    echo 'source /opt/rh/devtoolset-7/enable' >> /etc/profile
    
    # 验证一下
    which gcc
    gcc --version
    
  4. 安装git

    wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.23.0.tar.xz
    tar xvf git-2.23.0.tar.xz
    cd git-2.23.0/
    make prefix=/usr/local/git all
    make prefix=/usr/local/git install
    echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/profile
    source /etc/profile
    
  5. 安装cmake

    cd ~
    wget https://cmake.org/files/v3.16/cmake-3.16.0-Linux-x86_64.sh
    chmod +x cmake-3.16.0-Linux-x86_64.sh
    ./cmake-3.16.0-Linux-x86_64.sh
    mv ~/cmake-3.16.0-Linux-x86_64 /usr/local/
    # 把cmake目录/bin加到PATH里
    # 保险起见,可以把cmake软链接到/usr/bin/中,以防后面编译找不到cmake
    ln -s /usr/local/cmake-3.16.0-Linux-x86_64/bin/cmake /usr/bin/cmake
    
  6. 安装llvm + clang

    git clone https://github.com/llvm/llvm-project.git
    cd llvm-project
    # 切换到v10版本
    git checkout origin/release/10.x -b v10
    mkdir build
    cd build
    
    # 生成Makefile
    cmake -G "Unix Makefiles"\
     -DLLVM_ENABLE_PROJECTS="clang;libcxx;libcxxabi;lld"\
     -DCMAKE_BUILD_TYPE=Release\
     ../llvm
    
    # 编译
    make
    mkdir /usr/llvm
    mv bin docs include lib libexec /usr/llvm/
    # 最后将bin路径放到PATH中
    # 还需要ldconfig配置项里加入/usr/llvm/lib
    echo /usr/llvm/lib > /etc/ld.so.conf.d/llvm.conf
    
  7. 安装ninja

    wget https://github.com/ninja-build/ninja/releases/download/v1.10.2/ninja-linux.zip
    unzip ninja-linux.zip
    # 把解压的文件放到/usr/bin里
    
  8. 安装golang及envoy所需的bazel工具(用go写的)

    wget https://golang.org/dl/go1.16.4.linux-amd64.tar.gz
    tar xvf go1.16.4.linux-amd64.tar.gz
    # 依然是添加到PATH
    
    # 然后下载所需的bazel工具
    go get -u github.com/bazelbuild/buildtools/buildifier
    # 设置环境变量BUILDIFIER_BIN为$GOPATH/bin/buildifier
    go get -u github.com/bazelbuild/buildtools/buildozer
    # 设置环境变量BUILDOZER_BIN为$GOPATH/bin/buildozer
    
  9. 安装bazel

    wget https://github.com/bazelbuild/bazel/releases/download/3.7.2/bazel-3.7.2-installer-linux-x86_64.sh
    chmod +x bazel-3.7.2-installer-linux-x86_64.sh
    ./bazel-3.7.2-installer-linux-x86_64.sh --user
    
  10. 重点)编译安装gn

编译v8引擎要用到gn来生成ninja file,默认bazel下载的gn不能支持glibc 2.18以下的版本,所以就导致了在CentOS/RHEL 7系统上无法正常编译,在其他高版本glibc的系统上编译出来的envoy也无法在CentOS/RHEL 7上使用。我们需要使用自己编译的版本替换掉bazel默认下载的gn。

另外多说一句,在编译v8(wee8)的时候,其编译脚本里是会判断系统版本以及是否安装了gn的,所以只要把编译好的gn放到PATH可以找得到的地方就可以了。

```bash
git clone https://gn.googlesource.com/gn
cd gn
python build/gen.py
ninja -C out
# To run tests:
out/gn_unittests
```

编译envoy

虽然安装了llvm/clang编译器,但是envoy的编译过程可能需要用到libatomic库,所以最好gcc也切换到7

scl enable devtoolset-7 bash

到此,就是全部的编译准备工作了。接下来就可以编译envoy了,按需求不同,大体上envoy是如下两种编译方式:

a.单独的envoy

# 直接拉取envoy仓库的代码
git clone https://github.com/envoyproxy/envoy.git
cd envoy
# 执行编译
bazel build //source/exe:envoy-static

b.istio envoy

# 如果需要支持istio的wasm扩展,需要拉去istio/proxy仓库的代码来编译
git clone https://github.com/istio/proxy.git
cd proxy
make build_envoy

可以根据自己的需求来编译,编译好的二进制文件在工程目录下的bazel-bin目录中。整体编译时间较长,建议使用配置较高的机器,CPU核数与内存呈1比2配置(例如8CPU+16GB RAM)。

如有问题或不清楚的地方,望指正。转载请注明出处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容