k8s-ingress 编译启动链路

1、编译可执行类

make 根据 Makefile 的描述找到build脚本

# Copyright 2017 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Add the following 'help' target to your Makefile
# And add help text after each target name starting with '##'

.DEFAULT_GOAL:=help

.EXPORT_ALL_VARIABLES:

ifndef VERBOSE
.SILENT:
endif

# set default shell
SHELL=/bin/bash -o pipefail -o errexit

# Use the 0.0 tag for testing, it shouldn't clobber any release builds
TAG ?= $(shell cat TAG)

# e2e settings
# Allow limiting the scope of the e2e tests. By default run everything
FOCUS ?= .*
# number of parallel test
E2E_NODES ?= 7
# run e2e test suite with tests that check for memory leaks? (default is false)
E2E_CHECK_LEAKS ?=

REPO_INFO ?= $(shell git config --get remote.origin.url)
COMMIT_SHA ?= git-$(shell git rev-parse --short HEAD)
BUILD_ID ?= "UNSET"

PKG = k8s.io/ingress-nginx

HOST_ARCH = $(shell which go >/dev/null 2>&1 && go env GOARCH)
ARCH ?= $(HOST_ARCH)
ifeq ($(ARCH),)
    $(error mandatory variable ARCH is empty, either set it when calling the command or make sure 'go env GOARCH' works)
endif

REGISTRY ?= gcr.io/k8s-staging-ingress-nginx

BASE_IMAGE ?= k8s.gcr.io/ingress-nginx/nginx:v20210809-g98288bc3c@sha256:f9363669cf26514c9548c1fe4f8f4e2f58dfb76616bcd638a0ff7f0ec3457c17

GOARCH=$(ARCH)

help:  ## Display this help
    @awk 'BEGIN {FS = ":.*##"; printf "
Usage:
  make 33[36m<target>33[0m
"} /^[a-zA-Z0-9_-]+:.*?##/ { printf "  33[36m%-15s33[0m %s
", $$1, $$2 } /^##@/ { printf "
33[1m%s33[0m
", substr($$0, 5) } ' $(MAKEFILE_LIST)

.PHONY: image
image: clean-image ## Build image for a particular arch.
    echo "Building docker image ($(ARCH))..."
    @docker build 
        --no-cache 
        --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)/controller:$(TAG) rootfs

.PHONY: clean-image
clean-image: ## Removes local image
    echo "removing old image $(REGISTRY)/controller:$(TAG)"
    @docker rmi -f $(REGISTRY)/controller:$(TAG) || true

.PHONY: build
build:  ## Build ingress controller, debug tool and pre-stop hook.
    @build/run-in-docker.sh 
        PKG=$(PKG) 
        ARCH=$(ARCH) 
        COMMIT_SHA=$(COMMIT_SHA) 
        REPO_INFO=$(REPO_INFO) 
        TAG=$(TAG) 
        GOBUILD_FLAGS=$(GOBUILD_FLAGS) 
        build/build.sh

.PHONY: build-plugin
build-plugin:  ## Build ingress-nginx krew plugin.
    @build/run-in-docker.sh 
        PKG=$(PKG) 
        ARCH=$(ARCH) 
        COMMIT_SHA=$(COMMIT_SHA) 
        REPO_INFO=$(REPO_INFO) 
        TAG=$(TAG) 
        GOBUILD_FLAGS=$(GOBUILD_FLAGS) 
        build/build-plugin.sh

.PHONY: clean
clean: ## Remove .gocache directory.
    rm -rf bin/ .gocache/ .cache/

.PHONY: static-check
static-check: ## Run verification script for boilerplate, codegen, gofmt, golint, lualint and chart-lint.
    @build/run-in-docker.sh 
        hack/verify-all.sh

.PHONY: test
test:  ## Run go unit tests.
    @build/run-in-docker.sh 
        PKG=$(PKG) 
        ARCH=$(ARCH) 
        COMMIT_SHA=$(COMMIT_SHA) 
        REPO_INFO=$(REPO_INFO) 
        TAG=$(TAG) 
        GOBUILD_FLAGS=$(GOBUILD_FLAGS) 
        build/test.sh

.PHONY: lua-test
lua-test: ## Run lua unit tests.
    @build/run-in-docker.sh 
        BUSTED_ARGS=$(BUSTED_ARGS) 
        build/test-lua.sh

.PHONY: e2e-test
e2e-test:  ## Run e2e tests (expects access to a working Kubernetes cluster).
    @build/run-e2e-suite.sh

.PHONY: e2e-test-binary
e2e-test-binary:  ## Build binary for e2e tests.
    @build/run-in-docker.sh 
        ginkgo build ./test/e2e

.PHONY: print-e2e-suite
print-e2e-suite: e2e-test-binary ## Prints information about the suite of e2e tests.
    @build/run-in-docker.sh 
        hack/print-e2e-suite.sh

.PHONY: vet
vet:
    @go vet $(shell go list ${PKG}/internal/... | grep -v vendor)

.PHONY: check_dead_links
check_dead_links: ## Check if the documentation contains dead links.
    @docker run -t 
      -v $$PWD:/tmp aledbf/awesome_bot:0.1 
      --allow-dupe 
      --allow-redirect $(shell find $$PWD -mindepth 1 -name "*.md" -printf '%P
' | grep -v vendor | grep -v Changelog.md)

.PHONY: dev-env
dev-env:  ## Starts a local Kubernetes cluster using kind, building and deploying the ingress controller.
    @build/dev-env.sh

.PHONY: dev-env-stop
dev-env-stop: ## Deletes local Kubernetes cluster created by kind.
    @kind delete cluster --name ingress-nginx-dev

.PHONY: live-docs
live-docs: ## Build and launch a local copy of the documentation website in http://localhost:8000
    @docker build -t ingress-nginx-docs .github/actions/mkdocs
    @docker run --rm -it 
        -p 8000:8000 
        -v ${PWD}:/docs 
        --entrypoint mkdocs 
        ingress-nginx-docs serve --dev-addr=0.0.0.0:8000

.PHONY: misspell
misspell:  ## Check for spelling errors.
    @go get github.com/client9/misspell/cmd/misspell
    misspell 
        -locale US 
        -error 
        cmd/* internal/* deploy/* docs/* design/* test/* README.md

.PHONY: kind-e2e-test
kind-e2e-test:  ## Run e2e tests using kind.
    @test/e2e/run.sh

.PHONY: kind-e2e-chart-tests
kind-e2e-chart-tests: ## Run helm chart e2e tests
    @test/e2e/run-chart-test.sh

.PHONY: run-ingress-controller
run-ingress-controller: ## Run the ingress controller locally using a kubectl proxy connection.
    @build/run-ingress-controller.sh

.PHONY: ensure-buildx
ensure-buildx:
    ./hack/init-buildx.sh

.PHONY: show-version
show-version:
    echo -n $(TAG)

PLATFORMS ?= amd64 arm arm64 s390x

EMPTY :=
SPACE := $(EMPTY) $(EMPTY)
COMMA := ,

.PHONY: release # Build a multi-arch docker image
release: ensure-buildx clean
    echo "Building binaries..."
    $(foreach PLATFORM,$(PLATFORMS), echo -n "$(PLATFORM)..."; ARCH=$(PLATFORM) make build;)

    echo "Building and pushing ingress-nginx image..."
    @docker buildx build 
        --no-cache 
        --push 
        --progress plain 
        --platform $(subst $(SPACE),$(COMMA),$(PLATFORMS)) 
        --build-arg BASE_IMAGE="$(BASE_IMAGE)" 
        --build-arg VERSION="$(TAG)" 
        --build-arg COMMIT_SHA="$(COMMIT_SHA)" 
        --build-arg BUILD_ID="$(BUILD_ID)" 
        -t $(REGISTRY)/controller:$(TAG) rootfs
View Code

build脚本中进行go build 构建

go build -o指定可执行类,默认根目录下main.go

#!/bin/bash

# Copyright 2018 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

if [ -n "$DEBUG" ]; then
    set -x
fi

set -o errexit
set -o nounset
set -o pipefail

declare -a mandatory
mandatory=(
  PKG
  ARCH
  COMMIT_SHA
  REPO_INFO
  TAG
)

missing=false
for var in "${mandatory[@]}"; do
  if [[ -z "${!var:-}" ]]; then
    echo "Environment variable $var must be set"
    missing=true
  fi
done

if [ "$missing" = true ]; then
  exit 1
fi

export CGO_ENABLED=0
export GOARCH=${ARCH}

go build 
  -trimpath -ldflags="-buildid= -w -s 
    -X ${PKG}/version.RELEASE=${TAG} 
    -X ${PKG}/version.COMMIT=${COMMIT_SHA} 
    -X ${PKG}/version.REPO=${REPO_INFO}" 
  -o "rootfs/bin/${ARCH}/nginx-ingress-controller" "${PKG}/cmd/nginx"

go build 
  -trimpath -ldflags="-buildid= -w -s 
    -X ${PKG}/version.RELEASE=${TAG} 
    -X ${PKG}/version.COMMIT=${COMMIT_SHA} 
    -X ${PKG}/version.REPO=${REPO_INFO}" 
  -o "rootfs/bin/${ARCH}/dbg" "${PKG}/cmd/dbg"

go build 
  -trimpath -ldflags="-buildid= -w -s 
    -X ${PKG}/version.RELEASE=${TAG} 
    -X ${PKG}/version.COMMIT=${COMMIT_SHA} 
    -X ${PKG}/version.REPO=${REPO_INFO}" 
  -o "rootfs/bin/${ARCH}/wait-shutdown" "${PKG}/cmd/waitshutdown"

看下入口

 plugin为单独按需构建

原文地址:https://www.cnblogs.com/it-worker365/p/15423138.html