构建 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修改 go.mod 文件,在文件最下面添加如下配置
1
replace golang.org/x/sys => golang.org/x/sys v0.1.0
更新 go.mod
1
go mod tidy
安装 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.0 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修改 go.mod 文件,在文件最下面添加以下内容,替换 x/sys 模块
1
replace golang.org/x/sys => golang.org/x/sys v0.1.0
执行以下命令编译二进制文件
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/loong64/
目录下
构建 controller 镜像
修改 Makefile 文件,主要修改以下地方
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22# 仓库地址,改成以下配置
REGISTRY ?= registry-changsha.vonebaas.com/kubernetes/ingress-nginx # 初始配置为: gcr.io/k8s-staging-ingress-nginx
# 新增以下变量配置
IMAGE_NAME ?= controller-loong64
# 修改 make image 相关操作的命令,改成如下
.PHONY: image
image: clean-image ## Build image for a particular arch.
echo "Building docker image ($(ARCH))..."
docker build \
${PLATFORM_FLAG} ${PLATFORM} \
--no-cache \
$(MAC_DOCKER_FLAGS) \
--pull \
--network=host \ # 添加 --network=host 配置,否则构建镜像时会报错误 temporary error (try again later)
--build-arg BASE_IMAGE="$(BASE_IMAGE)" \
--build-arg VERSION="$(TAG)" \
--build-arg TARGETARCH="$(ARCH)" \
--build-arg COMMIT_SHA="$(COMMIT_SHA)" \
--build-arg BUILD_ID="$(BUILD_ID)" \
-t $(REGISTRY)/$(IMAGE_NAME):$(TAG) rootfs # 主要修改镜像名称,换成使用上面的 IMAGE_NAME 变量名修改 NGINX_BASE 文件,将里面的内容替换:
1
cr.loongnix.cn/library/nginx:1.23.1-alpine@sha256:f64600eda8dfdea9e61499c8e06bf3d6da76ab01703f1cc102cdd08da988d4b1
在 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 文件,主要修改以下部分
1
2
3
4
5
6
7
8
9
10# 修改所有拷贝文件的属组以及属主为 nginx
:%s/www-data:www-data/nginx:nginx/g
# 修改 nginx 二进制文件路径
:%s@/usr/local/nginx/sbin/nginx@/usr/sbin/nginx@g
# 修改容器内启动进程用户为 nginx
USER nginx
# 修改第一个 RUN 指令,添加安装软件 dumb-init 以及 bash执行以下命令构建镜像
1
make image