diff --git a/build/build-image/Dockerfile b/build/build-image/Dockerfile index e37a241de8..57b4300508 100644 --- a/build/build-image/Dockerfile +++ b/build/build-image/Dockerfile @@ -19,7 +19,7 @@ FROM gcr.io/google_containers/kube-cross:KUBE_BUILD_IMAGE_CROSS_TAG RUN touch /kube-build-image # To run as non-root we sometimes need to rebuild go stdlib packages. -RUN chmod -R a+rwx /usr/local/go/pkg +RUN chmod -R a+rwx /usr/local/go/pkg ${K8S_PATCHED_GOROOT}/pkg # For running integration tests /var/run/kubernetes is required # and should be writable by user diff --git a/build/build-image/cross/Dockerfile b/build/build-image/cross/Dockerfile index 811ee9943e..d2887e9b55 100644 --- a/build/build-image/cross/Dockerfile +++ b/build/build-image/cross/Dockerfile @@ -77,3 +77,22 @@ RUN export ETCD_VERSION=v3.0.17; \ && cd /usr/local/src/etcd \ && curl -fsSL https://github.com/coreos/etcd/releases/download/${ETCD_VERSION}/etcd-${ETCD_VERSION}-linux-amd64.tar.gz | tar -xz \ && ln -s ../src/etcd/etcd-${ETCD_VERSION}-linux-amd64/etcd /usr/local/bin/ + + +# There is a significant performance regression in Go 1.8 comparing to Go 1.7. +# Until this is solved in Go itself, we are patching 1.8.1 version of Go to +# reduce the impact of this regression - for more detailed discussion see: +# https://github.com/kubernetes/kubernetes/issues/45216 +# +# TODO: Once this issue is fixed in Go itself, we can get rid of the code below. +ENV K8S_PATCHED_GOLANG_VERSION=1.8.1 \ + K8S_PATCHED_GOROOT=/usr/local/go_k8s_patched +RUN mkdir -p ${K8S_PATCHED_GOROOT} \ + && curl -sSL https://github.com/golang/go/archive/go${K8S_PATCHED_GOLANG_VERSION}.tar.gz | tar -xz -C ${K8S_PATCHED_GOROOT} --strip-components=1 + +COPY go_181_performance_fix.patch ${K8S_PATCHED_GOROOT}/ +RUN cd ${K8S_PATCHED_GOROOT} \ + && patch -p1 < go_181_performance_fix.patch \ + && cd src \ + && GOROOT_FINAL=${K8S_PATCHED_GOROOT} GOROOT_BOOTSTRAP=/usr/local/go ./make.bash \ + && for platform in ${KUBE_CROSSPLATFORMS}; do GOOS=${platform%/*} GOARCH=${platform##*/} GOROOT=${K8S_PATCHED_GOROOT} go install std; done diff --git a/build/build-image/cross/VERSION b/build/build-image/cross/VERSION index ddd7b0809a..de541432f1 100644 --- a/build/build-image/cross/VERSION +++ b/build/build-image/cross/VERSION @@ -1 +1 @@ -v1.8.1-1 +v1.8.1-2 diff --git a/build/build-image/cross/go_181_performance_fix.patch b/build/build-image/cross/go_181_performance_fix.patch new file mode 100644 index 0000000000..64f942937c --- /dev/null +++ b/build/build-image/cross/go_181_performance_fix.patch @@ -0,0 +1,24 @@ +diff --git a/src/net/http/h2_bundle.go b/src/net/http/h2_bundle.go +index 4536b2ff5d..84e78534a9 100644 +--- a/src/net/http/h2_bundle.go ++++ b/src/net/http/h2_bundle.go +@@ -3536,9 +3536,17 @@ func (sc *http2serverConn) serve() { + sc.idleTimerCh = sc.idleTimer.C + } + +- var gracefulShutdownCh <-chan struct{} ++ var gracefulShutdownCh chan struct{} + if sc.hs != nil { +- gracefulShutdownCh = http2h1ServerShutdownChan(sc.hs) ++ ch := http2h1ServerShutdownChan(sc.hs) ++ gracefulShutdownCh = make(chan struct{}) ++ go func() { ++ select { ++ case <-sc.doneServing: ++ case <-ch: ++ close(gracefulShutdownCh) ++ } ++ }() + } + + go sc.readFrames() diff --git a/hack/lib/golang.sh b/hack/lib/golang.sh index 3f5f9efbe7..1156f9c516 100755 --- a/hack/lib/golang.sh +++ b/hack/lib/golang.sh @@ -267,6 +267,10 @@ kube::golang::set_platform_envs() { # Do not set CC when building natively on a platform, only if cross-compiling from linux/amd64 if [[ $(kube::golang::host_platform) == "linux/amd64" ]]; then + # We are currently using go 1.8.1, which has significant performance + # regression. Until this is fixed in Golang head, we are using patched + # version of Go that eliminates this problem. + export GOROOT=${K8S_PATCHED_GOROOT:-${GOROOT}} # Dynamic CGO linking for other server architectures than linux/amd64 goes here # If you want to include support for more server platforms than these, add arch-specific gcc names here