本文主要描述在 CentOS 8.2 下,如何使用本地工具编译 https://github.com/istio/istio 项目。另外一种方法是通过 BUILD_WITH_CONTAINER
参数控制,使用容器编译,仅依赖于 make 和 docker。
1. 安装并升级 Ruby >= 2.6
1
2
3
| ruby -v
ruby 2.5.5p157 (2019-03-15 revision 67260) [x86_64-linux]
|
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
|
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
|
1
| gem install --no-document fpm
|
3. 安装并升级 Go >= 1.16
1
2
3
| go version
go version go1.14.12 linux/amd64
|
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 版本的要求。
1
2
| yum install -y git
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
|
重新打开 Terminal 或者执行一下提示命令将 gvm
添加到 PATH 中。
1
2
3
4
| gvm listall
...
go1.16.3
|
1
| gvm use go1.16.3 --default
|
1
2
3
| go version
go version go1.16.3 linux/amd64
|
4. 安装 Docker
1
| dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
|
1
| dnf install docker-ce --nobest -y
|
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
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
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。
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. 参考