Please enable Javascript to view the contents

如何在 CentOS 8 下编译 istio 项目

 ·  ☕ 3 分钟

本文主要描述在 CentOS 8.2 下,如何使用本地工具编译 https://github.com/istio/istio 项目。另外一种方法是通过 BUILD_WITH_CONTAINER 参数控制,使用容器编译,仅依赖于 make 和 docker。

1. 安装并升级 Ruby >= 2.6

  • 安装 Ruby
1
yum install -y ruby
  • 查看 Ruby 版本
1
2
3
ruby -v

ruby 2.5.5p157 (2019-03-15 revision 67260) [x86_64-linux]
  • 安装 RVM
1
2
3
4
yum install -y tar
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
curl -sSL https://get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh
  • 安装 Ruby 2.6
1
rvm install 2.6
  • 查看 Ruby 版本
1
2
3
ruby -v

ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-linux]

2. 安装 FPM

FPM 是一个打包工具, 能将源码打包成 rpm、deb、pkg 等格式的包。istio 目前使用的就是 FPM 。

  • 安装依赖
1
yum install -y ruby-devel gcc make rpm-build rubygems
  • 安装 FPM
1
gem install --no-document fpm

3. 安装并升级 Go >= 1.16

  • 安装 Go
1
yum install -y go
  • 查看 Go 版本
1
2
3
go version

go version go1.14.12 linux/amd64
  • 低版本 Go 编译会报错
1
2
3
4
5
6
make docker

...
manifests/manifest.go:18:2: package embed is not in GOROOT (/usr/lib/golang/src/embed)
operator/pkg/helm/renderer.go:19:2: package io/fs is not in GOROOT (/usr/lib/golang/src/io/fs)
make: *** [build-linux] Error 1

可查看 go.mod 文件检查 istio 对 Go 版本的要求。

  • 安装 gvm
1
2
yum install -y git
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

重新打开 Terminal 或者执行一下提示命令将 gvm 添加到 PATH 中。

  • 查看可选的 Go 版本
1
2
3
4
gvm listall

...
go1.16.3
  • 安装 Go
1
gvm install go1.16.3
  • 设置版本
1
gvm use go1.16.3 --default
  • 查看版本
1
2
3
go version

go version go1.16.3 linux/amd64

4. 安装 Docker

  • 添加 Docker 源
1
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
  • 安装 Docker
1
dnf install docker-ce --nobest -y
  • 启动 Docker
1
2
systemctl enable docker
systemctl start docker

5. 编译 istio

  • 安装依赖
1
yum install -y make vim
  • 克隆代码

这里指定一个固定的版本,方便复现,也可以直接使用 master 分支。

1
2
git clone https://github.com/istio/istio.git -b release-1.10
cd istio
  • 修改 Makefile 文件屏蔽 BUILD_WITH_CONTAINER=1 等参数
vim Makefile

# -include Makefile.overrides.mk

如果不想修改 Makefile 文件,也可以在每条 make 命令前加上 BUILD_WITH_CONTAINER=0 不使用容器进行构建。

否则,默认会使用容器环境进行构建。

  • [可选]定制参数

这一步主要用于设置镜像的格式,默认是 docker.io/istio/xxx:tag-or-sha1

1
2
3
export USER="shaowenchen"
export HUB="docker.io/$USER"
export TAG="dev"
  • 编译全部镜像
1
make docker
  • 查看镜像
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
docker images|grep shaowenchen

Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
docker.io/shaowenchen/install-cni                    dev                                       8a9c31c0c4a7  10 seconds ago      286 MB
docker.io/shaowenchen/operator                       dev                                       b71597601723  27 seconds ago      240 MB
docker.io/shaowenchen/istioctl                       dev                                       5d65d14fd7e4  37 seconds ago      242 MB
docker.io/shaowenchen/app_sidecar_centos_7           dev                                       26f3a9648acc  47 seconds ago      559 MB
docker.io/shaowenchen/app_sidecar_centos_8           dev                                       2b0c1152137a  About a minute ago  548 MB
docker.io/shaowenchen/app_sidecar_debian_10          dev                                       fef52d04e703  2 minutes ago       353 MB
docker.io/shaowenchen/app_sidecar_debian_9           dev                                       389d00724d36  3 minutes ago       337 MB
docker.io/shaowenchen/app_sidecar_ubuntu_focal       dev                                       572f901273f1  3 minutes ago       314 MB
docker.io/shaowenchen/app_sidecar_ubuntu_bionic      dev                                       f8cce2842939  4 minutes ago       317 MB
docker.io/shaowenchen/app_sidecar_ubuntu_xenial      dev                                       7e5622aacfa1  4 minutes ago       371 MB
docker.io/shaowenchen/app                            dev                                       69c061680f8e  5 minutes ago       189 MB
docker.io/shaowenchen/proxyv2                        dev                                       a09e64c4e01f  5 minutes ago       305 MB
docker.io/shaowenchen/pilot                          dev                                       047f2d849519  5 minutes ago       241 MB
  • 编译某个组件及其镜像

tools/istio-docker.mk 中定义了各个组件镜像的编译过程。

1
2
3
4
DOCKER_TARGETS ?= docker.pilot docker.proxyv2 docker.app docker.app_sidecar_ubuntu_xenial \
docker.app_sidecar_ubuntu_bionic docker.app_sidecar_ubuntu_focal docker.app_sidecar_debian_9 \
docker.app_sidecar_debian_10 docker.app_sidecar_centos_8 docker.app_sidecar_centos_7 \
docker.istioctl docker.operator docker.install-cni

下面以 istioctl 为例:

1
make istioctl
1
make docker.istioctl
  • 查看编译结果
1
2
3
4
ls out/linux_amd64

bug-report  docker_build  envoy-centos  istio-cni         istio-cni-taint  istio-iptables  logs      pilot-agent      release
client      envoy         install-cni   istio-cni-repair  istioctl         istio_is_init   operator  pilot-discovery  server
1
2
3
4
docker images|grep istioctl

Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
docker.io/shaowenchen/istioctl                       dev                                       f55daa65098d  7 seconds ago   242 MB
  • 推送镜像到 DockerHub

推送之前需要登陆 DockerHub。

1
make push.docker.istioctl

6. 总结

建议使用 CentOS 8 进行编译,因为 CentOS 7.6 下编译 app_sidecar_centos 镜像时会卡主,下面是截取的日志。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
Step 1/14 : ARG VM_IMAGE_NAME=ubuntu
Step 2/14 : ARG VM_IMAGE_VERSION=bionic
Step 3/14 : ARG BASE_VERSION=latest
Step 4/14 : FROM gcr.io/istio-release/app_sidecar_base_${VM_IMAGE_NAME}_${VM_IMAGE_VERSION}:${BASE_VERSION}
 ---> 697dbc6cd975
Step 5/14 : COPY certs/                           /var/lib/istio/
 ---> Using cache
 ---> 725e4acd0342
Step 6/14 : COPY certs/default/*                  /var/run/secrets/istio/
 ---> Using cache
 ---> a1f2cd8f8596
Step 7/14 : COPY istio-sidecar.deb  /tmp/istio-sidecar.deb
 ---> a1a01e6e9993
Step 8/14 : RUN dpkg -i /tmp/istio-sidecar.deb && rm /tmp/istio-sidecar.deb
 ---> Running in 28c5abc9a6a0

经过上面一系列操作之后 Docker 也假死,具体原因有待排查。

CentOS 8 使用 Podman 替代了 Docker CLI ,GLIBC 也不用升级,很容易编译成功。

7. 参考


微信公众号
作者
微信公众号