环境说明
- 系统版本: Kylin Linux Advanced Server V10 (Sword)
- CPU 架构: aarch64
- CPU 型号: Kunpeng-920
- ingress-nginx 版本: helm-chart-4.2.4
构建 controller
本地编译安装 ginkgo
下载源码
1
2
3export GOPATH="/root/go"
mkdir ${GOPATH}/src/github.com/onsi/
git clone https://gitee.com/lonely0422/ginkgo.git ${GOPATH}/src/github.com/onsi/ginkgo安装 ginkgo,以下命令会在 ${GOPATH}/bin 目录 下生成一个
ginkgo
二进制文件1
2cd ${GOPATH}/src/github.com/onsi/ginkgo/ginkgo
go install .拷贝生成的
ginkgo
文件到/usr/local/bin
目录,1
cp ${GOPATH}/bin/ginkgo /usr/local/bin/
测试执行 ginkgo 命令
1
ginkgo version
编译 controller 镜像相关的二进制文件
下载 ingress-nginx 源码
1
git clone -b helm-chart-4.2.4 https://github.com/kubernetes/ingress-nginx.git
修改
build/run-in-docker.sh
脚本1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32# build/run-in-docker.sh,如下所示: 注释 `go install -mod=mod github.com/onsi/ginkgo/ginkgo@v1.16.4` 这一行代码
if [[ "$DOCKER_IN_DOCKER_ENABLED" == "true" ]]; then
echo "..reached DIND check TRUE block, inside run-in-docker.sh"
echo "FLAGS=$FLAGS"
go env
set -x
# go install -mod=mod github.com/onsi/ginkgo/ginkgo@v1.16.4
find / -type f -name ginkgo 2>/dev/null
which ginkgo
/bin/bash -c "${FLAGS}"
set +x
else
echo "Reached DIND check ELSE block, inside run-in-docker.sh"
docker run \
${PLATFORM_FLAG} ${PLATFORM} \
--tty \
--rm \
${DOCKER_OPTS} \
-e DEBUG=${DEBUG} \
-e GOCACHE="/go/src/${PKG}/.cache" \
-e GOMODCACHE="/go/src/${PKG}/.modcache" \
-e DOCKER_IN_DOCKER_ENABLED="true" \
-v "${HOME}/.kube:${HOME}/.kube" \
-v "${KUBE_ROOT}:/go/src/${PKG}" \
-v "${KUBE_ROOT}/bin/${ARCH}:/go/bin/linux_${ARCH}" \
-v "/var/run/docker.sock:/var/run/docker.sock" \
-v "${INGRESS_VOLUME}:/etc/ingress-controller/" \
-w "/go/src/${PKG}" \
${MAC_DOCKER_FLAGS} \
${E2E_IMAGE} /bin/bash -c "${FLAGS}"
fi执行以下命令编译二进制文件
1
2
3
4
5
6
7
8
9
10
11# 设置环境变量 DOCKER_IN_DOCKER_ENABLED=true
export DOCKER_IN_DOCKER_ENABLED=true
# 设置 GOPROXY
go env -w GOPROXY="https://goproxy.cn,direct"
# 更新 go.mod 文件
go mod tidy
# 编译
make build生成的二进制文件会在
/rootfs/bin/arm64/
目录下
构建 controller 镜像
修改 Makefile 文件,主要修改以下地方
1
2# 镜像仓库地址,改成以下配置
REGISTRY ?= registry-changsha.vonebaas.com/kubernetes/ingress-nginx # 初始配置为: gcr.io/k8s-staging-ingress-nginx修改 NGINX_BASE 文件,将里面的内容替换:
1
registry-changsha.vonebaas.com/kubernetes/ingress-nginx/nginx:1.19.10
在 rootfs/etc/nginx 目录下新建 geoip 目录,并提前准备好相关数据库文件( geoip 文件可以从其他平台的 ingress-nginx controller pod 中拷贝出来),如下
1
2
3
4
5
6
7tree geoip/
geoip/
├── GeoIPASNum.dat
├── GeoIP.dat
└── GeoLiteCity.dat
0 directories, 3 files修改 rootfs/Dockerfile 文件,主要给镜像 apk 软件管理工具换源,如下所示:
1
2
3
4
5
6RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \
&& apk update \
&& apk upgrade \
&& apk add --no-cache \
diffutils \
&& rm -rf /var/cache/apk/*执行以下命令构建镜像
1
make image
编译 kube-webhook-certgen 镜像
进入 ingress-nginx 源码中的 images/kube-webhook-certgen 目录,修改 Makefile 文件
1
2# 修改镜像仓库地址
REGISTRY ?= registry-changsha.vonebaas.com/kubernetes/ingress-nginx执行以下命令构建镜像
1
docker build -t registry-changsha.vonebaas.com/kubernetes/ingress-nginx/kube-webhook-certgen:1.3.0 rootfs