Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add multi-arch (arm64) support for docker/podman drivers #9969

Merged
merged 25 commits into from
Jan 13, 2021

Conversation

ilya-zuyev
Copy link
Contributor

@ilya-zuyev ilya-zuyev commented Dec 15, 2020

This PR changes kicbase image to multi-arch format, supporting arm64/linux architecture and enables docker driver for arm64 systems

In the example below I'm using ilyazuyev/kicbase:pr-test image name for demo purposes

ilyaz@skeletron --- » KICBASE_IMAGE_REGISTRIES=ilyazuyev/kicbase:pr-test make push-kic-base-image

env DOCKER_CLI_EXPERIMENTAL=enabled docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
Setting /usr/bin/qemu-alpha-static as binfmt interpreter for alpha
Setting /usr/bin/qemu-arm-static as binfmt interpreter for arm
Setting /usr/bin/qemu-armeb-static as binfmt interpreter for armeb
Setting /usr/bin/qemu-sparc-static as binfmt interpreter for sparc
Setting /usr/bin/qemu-sparc32plus-static as binfmt interpreter for sparc32plus
Setting /usr/bin/qemu-sparc64-static as binfmt interpreter for sparc64
Setting /usr/bin/qemu-ppc-static as binfmt interpreter for ppc
Setting /usr/bin/qemu-ppc64-static as binfmt interpreter for ppc64
Setting /usr/bin/qemu-ppc64le-static as binfmt interpreter for ppc64le
Setting /usr/bin/qemu-m68k-static as binfmt interpreter for m68k
Setting /usr/bin/qemu-mips-static as binfmt interpreter for mips
Setting /usr/bin/qemu-mipsel-static as binfmt interpreter for mipsel
Setting /usr/bin/qemu-mipsn32-static as binfmt interpreter for mipsn32
Setting /usr/bin/qemu-mipsn32el-static as binfmt interpreter for mipsn32el
Setting /usr/bin/qemu-mips64-static as binfmt interpreter for mips64
Setting /usr/bin/qemu-mips64el-static as binfmt interpreter for mips64el
Setting /usr/bin/qemu-sh4-static as binfmt interpreter for sh4
Setting /usr/bin/qemu-sh4eb-static as binfmt interpreter for sh4eb
Setting /usr/bin/qemu-s390x-static as binfmt interpreter for s390x
Setting /usr/bin/qemu-aarch64-static as binfmt interpreter for aarch64
Setting /usr/bin/qemu-aarch64_be-static as binfmt interpreter for aarch64_be
Setting /usr/bin/qemu-hppa-static as binfmt interpreter for hppa
Setting /usr/bin/qemu-riscv32-static as binfmt interpreter for riscv32
Setting /usr/bin/qemu-riscv64-static as binfmt interpreter for riscv64
Setting /usr/bin/qemu-xtensa-static as binfmt interpreter for xtensa
Setting /usr/bin/qemu-xtensaeb-static as binfmt interpreter for xtensaeb
Setting /usr/bin/qemu-microblaze-static as binfmt interpreter for microblaze
Setting /usr/bin/qemu-microblazeel-static as binfmt interpreter for microblazeel
Setting /usr/bin/qemu-or1k-static as binfmt interpreter for or1k
env DOCKER_CLI_EXPERIMENTAL=enabled docker buildx rm --builder minikube-builder || true
error: no builder "minikube-builder" found


env DOCKER_CLI_EXPERIMENTAL=enabled docker buildx create --name kicbase-builder --buildkitd-flags '--debug' --use || true
error: existing instance for kicbase-builder but no append mode, specify --node to make changes for existing instances
Error response from daemon: manifest for ilyazuyev/kicbase:pr-test not found: manifest unknown: manifest unknown
Image doesn't exist in registry

⚠️  'Are you sure you want to push ilyazuyev/kicbase:pr-test ?'
Do you want to proceed? (Y/N): y
env DOCKER_CLI_EXPERIMENTAL=enabled docker buildx build --platform linux/arm64,linux/amd64 -t ilyazuyev/kicbase:pr-test --push  --build-arg COMMIT_SHA=v1.16.0-"9c4a76581c9c2562feb204a108eeb09f5c54e6a9" ./deploy/kicbase
[+] Building 10.0s (47/70)                                                                          
 => [internal] load build definition from Dockerfile                                           0.0s
 => => transferring dockerfile: 32B                                                            0.0s
 => [internal] load .dockerignore                                                              0.0s
 => => transferring context: 2B                                                                0.0s
 => [linux/amd64 internal] load metadata for docker.io/library/ubuntu:focal-20201106           0.9s
 => [auth] library/ubuntu:pull token for registry-1.docker.io                                  0.0s
 => [linux/arm64 internal] load metadata for docker.io/library/ubuntu:focal-20201106           1.7s
 => [internal] load build context                                                              0.0s
 => => transferring context: 443B                                                              0.0s
 => [linux/arm64  1/32] FROM docker.io/library/ubuntu:focal-20201106@sha256:c95a8e48bf88e9849  0.0s
 => => resolve docker.io/library/ubuntu:focal-20201106@sha256:c95a8e48bf88e9849f3e0f723d9f49f  0.0s
 => [linux/amd64  1/32] FROM docker.io/library/ubuntu:focal-20201106@sha256:c95a8e48bf88e9849  0.0s
 => => resolve docker.io/library/ubuntu:focal-20201106@sha256:c95a8e48bf88e9849f3e0f723d9f49f  0.0s
 => CACHED [linux/arm64  2/32] COPY 10-network-security.conf /etc/sysctl.d/10-network-securit  0.0s
 => CACHED [linux/arm64  3/32] COPY 11-tcp-mtu-probing.conf /etc/sysctl.d/11-tcp-mtu-probing.  0.0s
 => CACHED [linux/arm64  4/32] COPY clean-install /usr/local/bin/clean-install                 0.0s
 => CACHED [linux/arm64  5/32] COPY entrypoint /usr/local/bin/entrypoint                       0.0s
 => CACHED [linux/arm64  6/32] RUN echo "Ensuring scripts are executable ..."     && chmod +x  0.0s
 => CACHED [linux/arm64  7/32] RUN clean-install     lz4     gnupg     sudo     openssh-serve  0.0s
 => CACHED [linux/arm64  8/32] RUN sh -c "echo 'deb https://download.docker.com/linux/ubuntu   0.0s
 => CACHED [linux/arm64  9/32] RUN export ARCH=$(dpkg --print-architecture | sed 's/ppc64el/p  0.0s
 => [linux/arm64 10/32] RUN sh -c "echo 'deb https://download.opensuse.org/repositories/devel  8.1s
 => => # Get:3 https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbun
 => => # tu_20.04  InRelease [1634 B]                                                              
 => => # Get:4 http://ports.ubuntu.com/ubuntu-ports focal-updates InRelease [114 kB]              
 => => # Get:5 http://ports.ubuntu.com/ubuntu-ports focal-backports InRelease [101 kB]            
 => => # Get:6 http://ports.ubuntu.com/ubuntu-ports focal-security InRelease [109 kB]              
 => => # Get:7 https://download.docker.com/linux/ubuntu focal/stable arm64 Packages [6174 B]      
 => CACHED [linux/amd64  2/32] COPY 10-network-security.conf /etc/sysctl.d/10-network-securit  0.0s
 => CACHED [linux/amd64  3/32] COPY 11-tcp-mtu-probing.conf /etc/sysctl.d/11-tcp-mtu-probing.  0.0s
 => CACHED [linux/amd64  4/32] COPY clean-install /usr/local/bin/clean-install                 0.0s
 => CACHED [linux/amd64  5/32] COPY entrypoint /usr/local/bin/entrypoint                       0.0s
 => CACHED [linux/amd64  6/32] RUN echo "Ensuring scripts are executable ..."     && chmod +x  0.0s
 => CACHED [linux/amd64  7/32] RUN clean-install     lz4     gnupg     sudo     openssh-serve  0.0s
 => CACHED [linux/amd64  8/32] RUN sh -c "echo 'deb https://download.docker.com/linux/ubuntu   0.0s
 => CACHED [linux/amd64  9/32] RUN export ARCH=$(dpkg --print-architecture | sed 's/ppc64el/p  0.0s
 => CACHED [linux/amd64 10/32] RUN sh -c "echo 'deb https://download.opensuse.org/repositorie  0.0s
 => CACHED [linux/amd64 11/32] RUN sh -c "echo 'deb https://download.opensuse.org/repositorie  0.0s
 => CACHED [linux/amd64 12/32] RUN sh -c "echo 'deb http://download.opensuse.org/repositories  0.0s
 => CACHED [linux/amd64 13/32] COPY automount/minikube-automount /usr/sbin/minikube-automount  0.0s
 => CACHED [linux/amd64 14/32] COPY automount/minikube-automount.service /usr/lib/systemd/sys  0.0s
 => CACHED [linux/amd64 15/32] RUN ln -fs /usr/lib/systemd/system/minikube-automount.service   0.0s
 => CACHED [linux/amd64 16/32] COPY scheduled-stop/minikube-scheduled-stop /var/lib/minikube/  0.0s
 => CACHED [linux/amd64 17/32] COPY scheduled-stop/minikube-scheduled-stop.service /usr/lib/s  0.0s
 => CACHED [linux/amd64 18/32] RUN ln -fs /usr/lib/systemd/system/minikube-scheduled-stop.ser  0.0s
 => CACHED [linux/amd64 19/32] RUN systemctl disable containerd && systemctl disable crio &&   0.0s
 => CACHED [linux/amd64 20/32] RUN systemctl enable docker.service && systemctl enable podman  0.0s
 => CACHED [linux/amd64 21/32] RUN mkdir /var/run/sshd                                         0.0s
 => CACHED [linux/amd64 22/32] RUN echo 'root:root' |chpasswd                                  0.0s
 => CACHED [linux/amd64 23/32] RUN sed -ri 's/^#?PermitRootLogin\s+.*/PermitRootLogin yes/' /  0.0s
 => CACHED [linux/amd64 24/32] RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config   0.0s
 => CACHED [linux/amd64 25/32] RUN sed -ri 's/dns files/files dns/g' /etc/nsswitch.conf        0.0s
 => CACHED [linux/amd64 26/32] RUN adduser --ingroup docker --disabled-password --gecos '' do  0.0s
 => CACHED [linux/amd64 27/32] RUN adduser docker sudo                                         0.0s
 => CACHED [linux/amd64 28/32] RUN adduser docker podman                                       0.0s
 => CACHED [linux/amd64 29/32] RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers         0.0s
 => CACHED [linux/amd64 30/32] RUN mkdir /home/docker/.ssh                                     0.0s
 => CACHED [linux/amd64 31/32] RUN mkdir -p /kind                                              0.0s
 => CACHED [linux/amd64 32/32] RUN rm -rf   /usr/share/doc/*   /usr/share/man/*   /usr/share/  0.0s
 
 [skip]
 
  => exporting to image                                                                       789.0s
 => => exporting layers                                                                       20.1s
 => => exporting manifest sha256:6259cc1fcbddc89344e698c2143a3319891fb0f86eec7ff39c0cc2fa1cc3  0.0s
 => => exporting config sha256:a2513a598ee67b204ba18107590dd3226f0e83c26514ab708a6bd88cd88de6  0.0s
 => => exporting manifest sha256:d294dec113c9da7948e063b0bc609ba97b35de48aa47d9eff9d9686fbd12  0.0s
 => => exporting config sha256:989c8c2a18b426c83c33be861bff77b131424d02397ac870db18d0ee0ad4ca  0.0s
 => => exporting manifest list sha256:b31df643a3636a09b67cacd8dc8fbf4700e6ff3831bc7f33eee15f3  0.0s
 => => pushing layers                                                                        762.5s
 => => pushing manifest for docker.io/ilyazuyev/kicbase:pr-test                             6.1s
 => [auth] ilyazuyev/kicbase:pull,push token for registry-1.docker.io                          0.0s
 => [auth] ilyazuyev/kicbase:pull,push token for registry-1.docker.io                          0.0s

Then on an arm64 machine:

ubuntu@ip-172-31-39-30:~$ uname -a
Linux ip-172-31-39-30 5.4.0-1032-aws #33-Ubuntu SMP Wed Dec 9 17:17:06 UTC 2020 aarch64 aarch64 aarch64 GNU/Linux
ubuntu@ip-172-31-39-30:~/src/minikube$ time ./out/minikube start --driver=docker --base-image=ilyazuyev/kicbase:pr-test
* minikube v1.16.0 on Ubuntu 20.04 (arm64)
* Using the docker driver based on user configuration
* Starting control plane node minikube in cluster minikube
* Creating docker container (CPUs=2, Memory=2200MB) .../ E0108 21:05:57.103205  411350 cache.go:63] save image to file "k8s.gcr.io/etcd-arm64:3.4.13-0" -> "/home/ubuntu/.minikube/cache/images/k8s.gcr.io/etcd-arm64_3.4.13-0" failed: nil image for k8s.gcr.io/etcd-arm64:3.4.13-0: GET https://k8s.gcr.io/v2/etcd-arm64/manifests/3.4.13-0: MANIFEST_UNKNOWN: Failed to fetch "3.4.13-0" from request "/v2/etcd-arm64/manifests/3.4.13-0".
- E0108 21:06:05.577136  411350 cache.go:194] Error caching images:  Caching images for kubeadm: caching images: caching image "/home/ubuntu/.minikube/cache/images/k8s.gcr.io/etcd-arm64_3.4.13-0": nil image for k8s.gcr.io/etcd-arm64:3.4.13-0: GET https://k8s.gcr.io/v2/etcd-arm64/manifests/3.4.13-0: MANIFEST_UNKNOWN: Failed to fetch "3.4.13-0" from request "/v2/etcd-arm64/manifests/3.4.13-0".

* Preparing Kubernetes v1.20.0 on Docker 20.10.2 ...| X Unable to load cached images: loading cached images: stat /home/ubuntu/.minikube/cache/images/k8s.gcr.io/etcd-arm64_3.4.13-0: no such file or directory
    > kubectl.sha256: 64 B / 64 B [--------------------------] 100.00% ? p/s 0s
    > kubelet.sha256: 64 B / 64 B [--------------------------] 100.00% ? p/s 0s
    > kubeadm.sha256: 64 B / 64 B [--------------------------] 100.00% ? p/s 0s
    > kubeadm: 34.50 MiB / 34.50 MiB [----------------] 100.00% 6.07 MiB p/s 6s
    > kubectl: 35.44 MiB / 35.44 MiB [---------------] 100.00% 3.05 MiB p/s 12s
    > kubelet: 100.53 MiB / 100.53 MiB [-------------] 100.00% 2.97 MiB p/s 34s

  - Generating certificates and keys ...
  - Booting up control plane ...
  - Configuring RBAC rules ...
* Verifying Kubernetes components...
* Enabled addons: storage-provisioner, default-storageclass
* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

real    1m33.658s
user    0m9.940s
sys     0m3.225s
ubuntu@ip-172-31-39-30:~/src/minikube$ 
ubuntu@ip-172-31-39-30:~/src/minikube$ docker ps
CONTAINER ID        IMAGE                       COMMAND                  CREATED              STATUS              PORTS                                                                                                      NAMES
35651baf3934        ilyazuyev/kicbase:pr-test   "/usr/local/bin/entr…"   About a minute ago   Up About a minute   127.0.0.1:32811->22/tcp, 127.0.0.1:32810->2376/tcp, 127.0.0.1:32809->5000/tcp, 127.0.0.1:32808->8443/tcp   minikube
ubuntu@ip-172-31-39-30:~/src/minikube$ 
ubuntu@ip-172-31-39-30:~/src/minikube$ kubectl get pods --all-namespaces
NAMESPACE     NAME                               READY   STATUS    RESTARTS   AGE
kube-system   coredns-74ff55c5b-tbdb2            1/1     Running   0          58s
kube-system   etcd-minikube                      1/1     Running   0          70s
kube-system   kube-apiserver-minikube            1/1     Running   0          70s
kube-system   kube-controller-manager-minikube   1/1     Running   0          70s
kube-system   kube-proxy-jrpht                   1/1     Running   0          58s
kube-system   kube-scheduler-minikube            1/1     Running   0          70s
kube-system   storage-provisioner                1/1     Running   0          73s
ubuntu@ip-172-31-39-30:~/src/minikube$ 

@k8s-ci-robot k8s-ci-robot added cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. size/M Denotes a PR that changes 30-99 lines, ignoring generated files. labels Dec 15, 2020
@tstromberg
Copy link
Contributor

Any reason for the name change?

@ilya-zuyev
Copy link
Contributor Author

ilya-zuyev commented Dec 17, 2020

Any reason for the name change?

The idea is to support both multi-arch kicbase image and the amd64 only for some time.
Docker buildkit support is still kind of experimental feature, just to avoid potential problems with old docker versions on client machines we try to use kicbase-multiarch and if it can't be used for some reason we fallback to the amd64 kicbase

@tstromberg
Copy link
Contributor

tstromberg commented Dec 17, 2020

AFAIK, buildx is experimental, but multi-arch pulls should not be experimental any longer. Docker updated all of it's images to multi-arch back in 2017: https://www.docker.com/blog/docker-official-images-now-multi-platform/

Kubernetes dropped suffixes for architectures about 2 years ago. To make the code simpler, I would suggest we do the same until a specific limitation can be identified.

@afbjorklund
Copy link
Collaborator

afbjorklund commented Dec 17, 2020

What we (and they) did for the other images, is that we used the arch suffix for the specific images.

k8s.gcr.io/kube-proxy-amd64:v1.20.0
Digest: sha256:f0c3f51c1216bcab9bfd5146eb2810f604a1c4ff2718bc3a1028cc089f8aeac7

      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1786,
         "digest": "sha256:f0c3f51c1216bcab9bfd5146eb2810f604a1c4ff2718bc3a1028cc089f8aeac7",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      },

k8s.gcr.io/kube-proxy-arm64:v1.20.0
Digest: sha256:8537b2a8f4aa57e890b838ceaa2d3317d3ff31a936cc3cc82c96e0689f34853c

      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1786,
         "digest": "sha256:8537b2a8f4aa57e890b838ceaa2d3317d3ff31a936cc3cc82c96e0689f34853c",
         "platform": {
            "architecture": "arm64",
            "os": "linux"
         }
      },

So you would have a "foo-amd64" and an "foo-arm64", and then a manifest for those called "foo".

The user is only exposed to the manifest name:tag, and then it pulls the images behind the curtain

v1.20.0: Pulling from kube-proxy
Digest: sha256:40423415eebbd598d1c2660a0a38606ad1d949ea9404c405eaf25929163b479d
Status: Image is up to date for k8s.gcr.io/kube-proxy:v1.20.0
k8s.gcr.io/kube-proxy:v1.20.0

Note that this "image" is just the (JSON) manifest, it's not actually a real image with layers and stuff.

https://k8s.gcr.io/v2/kube-proxy/manifests/v1.20.0

@afbjorklund
Copy link
Collaborator

afbjorklund commented Dec 17, 2020

AFAIK, buildx is experimental, but multi-arch pulls should not be experimental any longer.

The main problem is that the daemon doesn't understand architectures.

So you can only work with one architecture at the time, when cross-building.
If you need to do something else, you need to work with a (local?) registry.

I did that workaround in my multi-image build, when kic inherited from kind...

#9227 (comment)
afbjorklund@41fb020

@ilya-zuyev
Copy link
Contributor Author

AFAIK, buildx is experimental, but multi-arch pulls should not be experimental any longer. Docker updated all of it's images to multi-arch back in 2017: https://www.docker.com/blog/docker-official-images-now-multi-platform/

Kubernetes dropped suffixes for architectures about 2 years ago. To make the code simpler, I would suggest we do the same until a specific limitation can be identified.

ok, makes sense. will fix.

Makefile Show resolved Hide resolved
Makefile Show resolved Hide resolved
@@ -26,15 +26,29 @@ const (
// Version is the current version of kic
Version = "v0.0.15-snapshot4"
// SHA of the kic base image
baseImageSHA = "ef1f485b5a1cfa4c989bc05e153f0a8525968ec999e242efff871cbb31649c16"
baseImageSHA = "ef1f485b5a1cfa4c989bc05e153f0a8525968ec999e242efff871cbb31649c16"
baseMultiArchImageSHA = "todo"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

get rid of this line

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done.

@@ -26,15 +26,29 @@ const (
// Version is the current version of kic
Version = "v0.0.15-snapshot4"
// SHA of the kic base image
baseImageSHA = "ef1f485b5a1cfa4c989bc05e153f0a8525968ec999e242efff871cbb31649c16"
baseImageSHA = "ef1f485b5a1cfa4c989bc05e153f0a8525968ec999e242efff871cbb31649c16"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lets verify if SHA is same for arm64 and amd if not, we should have two shas in the code

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ubuntu@ip-172-31-39-30:~/src/minikube$ uname -a 
Linux ip-172-31-39-30 5.4.0-1032-aws #33-Ubuntu SMP Wed Dec 9 17:17:06 UTC 2020 aarch64 aarch64 aarch64 GNU/Linux
ubuntu@ip-172-31-39-30:~/src/minikube$ docker inspect --format='{{index .RepoDigests 0}}' ilyazuyev/kicbase:pr-test
ilyazuyev/kicbase@sha256:949338df4b157b907fbc9b27466c160c609f2f0f17c5dce73d2ceda084fedb69
izuyev@izuyev-macbookpro --- ~ » uname -a
Darwin izuyev-macbookpro.roam.corp.google.com 19.6.0 Darwin Kernel Version 19.6.0: Thu Oct 29 22:56:45 PDT 2020; root:xnu-6153.141.2.2~1/RELEASE_X86_64 x86_64
izuyev@izuyev-macbookpro --- ~ » docker inspect --format='{{index .RepoDigests 0}}' ilyazuyev/kicbase:pr-test
ilyazuyev/kicbase@sha256:949338df4b157b907fbc9b27466c160c609f2f0f17c5dce73d2ceda084fedb69
izuyev@izuyev-macbookpro --- ~ » 

It's the same sha1

@k8s-ci-robot k8s-ci-robot added size/S Denotes a PR that changes 10-29 lines, ignoring generated files. and removed size/M Denotes a PR that changes 30-99 lines, ignoring generated files. labels Jan 6, 2021
@k8s-ci-robot k8s-ci-robot added size/M Denotes a PR that changes 30-99 lines, ignoring generated files. and removed size/S Denotes a PR that changes 10-29 lines, ignoring generated files. labels Jan 8, 2021
@medyagh medyagh self-requested a review January 9, 2021 02:43
pkg/drivers/kic/types.go Show resolved Hide resolved
@medyagh
Copy link
Member

medyagh commented Jan 12, 2021

/ok-to-test

@k8s-ci-robot k8s-ci-robot added the ok-to-test Indicates a non-member PR verified by an org member that is safe to test. label Jan 12, 2021
@medyagh
Copy link
Member

medyagh commented Jan 12, 2021

/retest-this-please

@medyagh medyagh self-requested a review January 12, 2021 20:25
Makefile Outdated Show resolved Hide resolved
@medyagh medyagh changed the title Multi-arch kicbase add multi-arch (arm64) support for docker/podman drivers Jan 13, 2021
@medyagh medyagh self-requested a review January 13, 2021 00:06
Copy link
Member

@medyagh medyagh left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thank you for the good work on this PR, feel free to merge after docker_linux tests are normal

@k8s-ci-robot
Copy link
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: ilya-zuyev, medyagh

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@k8s-ci-robot k8s-ci-robot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Jan 13, 2021
@ilya-zuyev ilya-zuyev merged commit d3ad8ca into kubernetes:master Jan 13, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
approved Indicates a PR has been approved by an approver from all required OWNERS files. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. ok-to-test Indicates a non-member PR verified by an org member that is safe to test. size/M Denotes a PR that changes 30-99 lines, ignoring generated files.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants