From c4fc9bba6c292970f7f8e82b8033afbe31f07c9a Mon Sep 17 00:00:00 2001 From: Claudiu Belu Date: Thu, 18 Jun 2020 19:35:04 -0700 Subject: [PATCH] Adds Windows support for etcd image We can use docker buildx in order to build and push Windows images from the same Linux node, as long as the Dockerfile does not have any RUN commands in the Windows step. We also need to create a non-default builder instance in order to be able to build and push Windows images. The Windows images have to be built and pushed directly to the registry. For Windows containers without Hyper-V isolation, the host OS Version and the Container OS Version need to match, which is why we added multiple Windows OS Versions to the building process. For the manifest list, we need to also annotate the Windows OS Version, so the Windows nodes will be able to pull the proper image from the manifest list. Adds support for Windows OS Versions: 1809, 2004, 20H2, ltsc2022. Bumped etcd image revision. --- cluster/images/etcd/Dockerfile.windows | 28 +++++++++++++++++++++++ cluster/images/etcd/README.md | 6 ++++- cluster/images/etcd/cloudbuild.yaml | 2 ++ cluster/images/etcd/migrate-if-needed.bat | 21 +++++++++++++++++ 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 cluster/images/etcd/Dockerfile.windows create mode 100755 cluster/images/etcd/migrate-if-needed.bat diff --git a/cluster/images/etcd/Dockerfile.windows b/cluster/images/etcd/Dockerfile.windows new file mode 100644 index 00000000000..1c35d62d32e --- /dev/null +++ b/cluster/images/etcd/Dockerfile.windows @@ -0,0 +1,28 @@ +# Copyright 2021 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. + +ARG RUNNERIMAGE +FROM ${RUNNERIMAGE} + +EXPOSE 2379 2380 4001 7001 + +COPY etcd* etcdctl* /usr/local/bin/ +COPY cp* /usr/local/bin/ +COPY migrate-if-needed.bat /usr/local/bin/ +COPY migrate /usr/local/bin/migrate.exe + +# NOTE(claudiub): docker buildx sets the PATH env variable to a Linux-like PATH, +# # which is not desirable. See: https://github.com/moby/buildkit/issues/1560 +# # TODO(claudiub): remove this once the issue has been resolved. +ENV PATH="C:\usr\local\bin;C:\Windows\system32;C:\Windows;" diff --git a/cluster/images/etcd/README.md b/cluster/images/etcd/README.md index b6d1c0b077b..324a24fa395 100644 --- a/cluster/images/etcd/README.md +++ b/cluster/images/etcd/README.md @@ -22,7 +22,8 @@ but can also be used as the etcd target version. Always run `/usr/local/bin/migrate` (or the `/usr/local/bin/migrate-if-needed.sh` wrapper script) before starting the etcd -server. +server. On Windows, run `C:\bin\migrate.exe` (or the `C:\bin\migrate-if-needed.bat +wrapper script`). `migrate` writes a `version.txt` file to track the "current" version of etcd that was used to persist data to disk. A "target" version may also be provided @@ -49,6 +50,9 @@ For `amd64`, official `etcd` and `etcdctl` binaries are downloaded from Github to maintain official support. For other architectures, `etcd` is cross-compiled from source. Arch-specific `busybox` images serve as base images. +Windows images can be built on Linux nodes due to `docker buildx`, but they will +only be created and pushed when using the `all-push` make target. + #### How to release First, update `ETCD_VERSION` and `REVSION` in the `Makefile`. diff --git a/cluster/images/etcd/cloudbuild.yaml b/cluster/images/etcd/cloudbuild.yaml index 592e6efa380..5d77c98d962 100644 --- a/cluster/images/etcd/cloudbuild.yaml +++ b/cluster/images/etcd/cloudbuild.yaml @@ -18,5 +18,7 @@ steps: - '-c' - | gcloud auth configure-docker \ + && docker buildx create --name img-builder --use \ + && docker buildx inspect --bootstrap \ && docker run --rm --privileged linuxkit/binfmt:4ea3b9b0938cbd19834c096aa31ff475cc75d281 \ && make all-push diff --git a/cluster/images/etcd/migrate-if-needed.bat b/cluster/images/etcd/migrate-if-needed.bat new file mode 100755 index 00000000000..a264f82a883 --- /dev/null +++ b/cluster/images/etcd/migrate-if-needed.bat @@ -0,0 +1,21 @@ +@echo off +REM Copyright 2021 The Kubernetes Authors. +REM +REM Licensed under the Apache License, Version 2.0 (the "License"); +REM you may not use this file except in compliance with the License. +REM You may obtain a copy of the License at +REM +REM http://www.apache.org/licenses/LICENSE-2.0 +REM +REM Unless required by applicable law or agreed to in writing, software +REM distributed under the License is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM See the License for the specific language governing permissions and +REM limitations under the License. + +REM DEPRECATED: +REM The functionality has been moved to migrate binary and this script +REM if left for backward compatibility with previous manifests. It will be +REM removed in the future. + +C:\bin\migrate.exe