{"id":493824,"date":"2026-09-08T06:40:55","date_gmt":"2026-09-08T06:40:55","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=493824"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=493824","title":{"rendered":"Kaniko vs BuildKit: \u0437\u0430\u043c\u0435\u0440\u044f\u0435\u043c \u0432\u0440\u0435\u043c\u044f, CPU \u0438 \u043f\u0430\u043c\u044f\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0438 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h3>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0412 Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u0432\u0441\u0442\u0430\u0451\u0442 \u0432\u043e\u043f\u0440\u043e\u0441:\u00a0<strong>\u0433\u0434\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c Docker image \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439?<\/strong>\u00a0\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u00ab\u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u00bb \u043d\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0443. \u0412\u044b\u043d\u043e\u0441 \u0441\u0431\u043e\u0440\u043e\u043a \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u0440\u0435\u0448\u0430\u0435\u0442 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u043b\u0438\u0448\u0430\u0435\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 k8s: \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0412\u041c \u043d\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443, \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0436\u043e\u0431\u044b \u043a\u043e\u043d\u043a\u0443\u0440\u0438\u0440\u0443\u044e\u0442 \u0437\u0430 \u043e\u0431\u0449\u0438\u0435 CPU, RAM \u0438 \u0434\u0438\u0441\u043a, \u0430 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043a\u044d\u0448 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u043e\u0447\u0438\u0441\u0442\u043a\u0438.<\/p>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0434\u0432\u0430 \u2014\u00a0<strong>Kaniko<\/strong>\u00a0\u0438\u00a0<strong>BuildKit<\/strong>. Kubernetes executor \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c\u00a0<strong>Kaniko<\/strong>\u00a0\u0438\u043b\u0438\u00a0<strong>BuildKit<\/strong>\u00a0\u043b\u0438\u0448\u0435\u043d \u044d\u0442\u0438\u0445 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432: \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u0430\u0445 \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u043d\u043e\u0434\u0430\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u044e\u0442\u0441\u044f, \u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u0434\u043b\u044f Docker-\u0434\u0435\u043c\u043e\u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f.<\/p>\n<ul>\n<li>\n<p><strong>Kaniko<\/strong>\u00a0(<a href=\"https:\/\/github.com\/GoogleContainerTools\/kaniko\" rel=\"noopener nofollow\">GoogleContainerTools\/kaniko<\/a>) \u2014 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043e\u0442 Google \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u0435\u0437 privileged-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u0421 \u0438\u044e\u043d\u044f 2025 \u0433\u043e\u0434\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>BuildKit<\/strong>\u00a0(<a href=\"https:\/\/github.com\/moby\/buildkit\" rel=\"noopener nofollow\">moby\/buildkit<\/a>) \u2014 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a\u00a0<code>docker build<\/code>, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0432 k8s \u0432 daemonless \u0438 rootless-\u0440\u0435\u0436\u0438\u043c\u0435 \u0431\u0435\u0437 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439 \u043d\u043e\u0434\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e\u00a0<strong>5 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432<\/strong>\u00a0\u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u043e\u0438\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432 \u043e\u0434\u043d\u0438\u0445 \u0438 \u0442\u0435\u0445 \u0436\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445, \u0441 \u0437\u0430\u043c\u0435\u0440\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f CPU\/RAM \u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043a\u044d\u0448\u0430. \u0412 \u043a\u043e\u043d\u0446\u0435 \u2014\u00a0<strong>\u0438\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0441\u0432\u043e\u0434\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430<\/strong>\u00a0\u0438 \u0440\u0430\u0437\u0431\u043e\u0440\u00a0<strong>\u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432<\/strong>\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d\u0430.<\/p>\n<p><strong>\u041a\u044d\u0448.<\/strong>\u00a0\u041e\u0431\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e registry-\u043a\u044d\u0448. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448 \u043d\u0430 \u043d\u043e\u0434\u0435 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u2014 \u043e\u043d \u043a\u043e\u043f\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0447\u0438\u0441\u0442\u043a\u0438. Registry-\u043a\u044d\u0448 \u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e: \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u043a\u044d\u0448\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u043e\u0433\u043e\u043d\u0435, \u0430 \u043c\u0443\u0441\u043e\u0440 \u043f\u043e\u0434\u0447\u0438\u0449\u0430\u0435\u0442 garbage collection \u0440\u0435\u0435\u0441\u0442\u0440\u0430. \u0425\u0440\u0430\u043d\u044f\u0441\u044c \u0432\u043d\u0435 \u043f\u043e\u0434\u0430, \u043e\u043d \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0441\u043c\u0435\u043d\u0443 \u043d\u043e\u0434\u044b.<\/p>\n<h3>\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b<\/h3>\n<p>\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u00a0<strong>5 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432<\/strong>\u00a0\u2014 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043d\u0430 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b\u0439 \u00ab\u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0441\u0431\u043e\u0440\u043a\u0438\u00bb:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u2116<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041f\u0440\u043e\u0435\u043a\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u042f\u0437\u044b\u043a\/Framework<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041f\u0440\u043e\u0444\u0438\u043b\u044c \u0441\u0431\u043e\u0440\u043a\u0438<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>Next.js<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">Node\/React SSR<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>npm ci<\/code>\u00a0+ \u0441\u0431\u043e\u0440\u043a\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/gitlab.com\/buildkit-vs-kaniko-benchmark\/nextjs\" rel=\"noopener nofollow\"><code>nextjs<\/code><\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>Nuxt 3<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">Node\/Vue SSR<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>npm ci<\/code>\u00a0+ \u0441\u0431\u043e\u0440\u043a\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/gitlab.com\/buildkit-vs-kaniko-benchmark\/nuxtjs\" rel=\"noopener nofollow\"><code>nuxtjs<\/code><\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">3<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>Go HTTP-\u0441\u0435\u0440\u0432\u0438\u0441<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">Go<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>go build<\/code>\u00a0\u2192 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a (\u0438\u0437 scratch)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/gitlab.com\/buildkit-vs-kaniko-benchmark\/golang\" rel=\"noopener nofollow\"><code>golang<\/code><\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">4<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>Android APK<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">Java\/Kotlin, Gradle<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>assembleRelease<\/code>, \u0442\u044f\u0436\u0451\u043b\u044b\u0439 Gradle\/SDK<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/gitlab.com\/buildkit-vs-kaniko-benchmark\/android\" rel=\"noopener nofollow\"><code>android<\/code><\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">5<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>ML: PyTorch inference<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">Python<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>pip install torch<\/code>\u00a0+ \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 ~1.3 \u0413\u0411 \u0432\u0435\u0441\u043e\u0432 \u0432 BUILD-\u0441\u0442\u0430\u0434\u0438\u0438 (public S3-\u0431\u0430\u043a\u0435\u0442)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/gitlab.com\/buildkit-vs-kaniko-benchmark\/ml-pytorch\" rel=\"noopener nofollow\"><code>ml-pytorch<\/code><\/a><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0441\u0442\u0435\u043d\u0434\u0430<\/h3>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7c2\/31e\/f41\/7c231ef41e9bc7b1127ba10063e28b3f.png\" alt=\"\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0441\u0442\u0435\u043d\u0434\u0430\" width=\"1133\" height=\"1140\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/7c2\/31e\/f41\/7c231ef41e9bc7b1127ba10063e28b3f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7c2\/31e\/f41\/7c231ef41e9bc7b1127ba10063e28b3f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0441\u0442\u0435\u043d\u0434\u0430<\/figcaption><\/div>\n<\/figure>\n<h3>\u0420\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435<\/h3>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435\u043c gitlab runner \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0447\u0442\u043e\u0431\u044b \u0443 \u0432\u0430\u0441 \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d Kubernetes \u043a\u043b\u0430\u0441\u0442\u0435\u0440, S3 \u0431\u0430\u043a\u0435\u0442 \u0438 Container Registry.<\/p>\n<p>\u0412 S3 \u0431\u0430\u043a\u0435\u0442 \u0437\u0430\u043b\u0438\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0432\u0435\u0441\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440\u00a0<a href=\"https:\/\/huggingface.co\/google-bert\/bert-large-uncased\/resolve\/main\/pytorch_model.bin\" rel=\"noopener nofollow\">pytorch_model<\/a>\u00a0\u0434\u043b\u044f job\u00a0<code>ml-pytorch<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c VictoriaMetrics k8s-stack.<\/p>\n<h4>1a. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 GitLab Runner<\/h4>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c GitLab Runner \u0441 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439\u00a0<code>values.yaml<\/code>:<\/p>\n<pre><code>gitlabUrl: https:\/\/gitlab.com\/# \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u0434\u0436\u043e\u0431\u043e\u0432. \u041f\u0430\u0440\u0430 kaniko+buildkit \u043e\u0434\u043d\u043e\u0433\u043e# \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e (2 \u0434\u0436\u043e\u0431\u0430), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 2 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.concurrent: 2# RBAC \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f\/\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0430\u043c\u0438 \u0434\u0436\u043e\u0431\u043e\u0432.rbac:  create: true  rules: []serviceAccount:  create: truerunners:  executor: kubernetes  # \u0422\u0435\u0433, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0434\u0436\u043e\u0431\u044b \u0432 .gitlab-ci.yml \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442 \u044d\u0442\u043e\u0442 \u0440\u0430\u043d\u043d\u0435\u0440.  tags: \"k8s-benchmark\"  # \u0420\u0430\u043d\u043d\u0435\u0440 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0436\u043e\u0431\u044b \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u0433\u043e\u043c.  runUntagged: false  # \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0444\u0438\u0433 executor'\u0430. \u0417\u0430\u0434\u0430\u0451\u043c \u043b\u0438\u043c\u0438\u0442\u044b build-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430  # (\u0442\u0435 \u0436\u0435 4 CPU \/ 4 GiB, \u0447\u0442\u043e \u0431\u044b\u043b\u0438 \u0443 \u0441\u0442\u0430\u0440\u044b\u0445 K8s-\u0434\u0436\u043e\u0431\u043e\u0432 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430).  config: |    [[runners]]      request_concurrency = 2      [runners.kubernetes]        namespace = \"{{ .Release.Namespace }}\"        image = \"alpine:3.20\"        cpu_request = \"1\"        cpu_limit = \"4\"        memory_request = \"1Gi\"        memory_limit = \"12Gi\"        helper_cpu_request = \"100m\"        helper_cpu_limit = \"500m\"        helper_memory_request = \"128Mi\"        helper_memory_limit = \"512Mi\"        # Build-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u0435\u0437 privileged (\u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0437\u0430\u043c\u0435\u0440\u043e\u0432 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u044b        # \u0441 \u043f\u0440\u0435\u0436\u043d\u0438\u043c \u0441\u0442\u0435\u043d\u0434\u043e\u043c). BuildKit \u0432 rootless-\u0440\u0435\u0436\u0438\u043c\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0441\u043b\u0430\u0431\u043b\u0435\u043d\u043d\u044b\u0439        # securityContext: seccomp\/apparmor Unconfined (\u043d\u0443\u0436\u0435\u043d unshare mount ns).        privileged = false        allow_privilege_escalation = true        [runners.kubernetes.build_container_security_context]          [runners.kubernetes.build_container_security_context.seccomp_profile]            type = \"Unconfined\"          [runners.kubernetes.build_container_security_context.app_armor_profile]            type = \"Unconfined\"        # \u0418\u043c\u0435\u043d\u0430 \u043f\u043e\u0434\u043e\u0432 \u0434\u0436\u043e\u0431\u043e\u0432 \u0432\u0430\u0436\u043d\u044b \u0434\u043b\u044f Grafana: GitLab Runner \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u043d\u0438\u0445        # GitLab project ID (runner-\u2026-project-&lt;ID&gt;-concurrent-\u2026), \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443        # \u0434\u0430\u0448\u0431\u043e\u0440\u0434 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u043e label `image`        # \u043c\u0435\u0442\u0440\u0438\u043a cAdvisor (\u2026\/kaniko\u2026 vs \u2026\/buildkit\u2026).        pull_policy = \"if-not-present\"resources:  requests:    cpu: 100m    memory: 128Mi  limits:    cpu: 500m    memory: 512Mi<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>2. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 GitLab CI<\/h4>\n<p>\u0412 \u0433\u0440\u0443\u043f\u043f\u0435\u00a0<code>gitlab.com\/buildkit-vs-kaniko-benchmark<\/code>\u00a0\u2192\u00a0<strong>Settings \u2192 CI\/CD \u2192 Variables<\/strong>\u00a0\u0437\u0430\u0434\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0434\u0430\u0442\u044c YCR_REGISTRY_ID.<\/p>\n<h4>3. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 GitLab Runner \u0434\u043b\u044f push \u0432 Yandex Container Registry<\/h4>\n<p>\u0414\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043f\u0443\u0448\u0430 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0432 YCR \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u044b, \u043f\u0430\u0440\u043e\u043b\u0438 \u0438\u043b\u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u044b, \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438:<\/p>\n<ol>\n<li>\n<p><strong>\u0421\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0439 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u043d\u043e\u0434 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 (<\/strong><code><strong>node_service_account<\/strong><\/code><strong>):<\/strong>\u00a0\u041f\u0440\u0438 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0447\u0435\u0440\u0435\u0437 Terraform \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u043c\u0443 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0443 \u043d\u043e\u0434 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 (<code>sa_k8s_node<\/code>) \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u044e\u0442\u0441\u044f \u0440\u043e\u043b\u0438\u00a0<code>container-registry.images.pusher<\/code>\u00a0\u0438\u00a0<code>container-registry.images.puller<\/code>\u00a0\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0435\u0441\u0442\u0440 (\u0441\u043c.\u00a0<a href=\"http:\/\/registry.tf\" rel=\"noopener nofollow\"><code>registry.tf<\/code><\/a>). \u041f\u043e\u0434\u044b GitLab Runner \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u0438\u0445 \u043d\u043e\u0434\u0430\u0445 \u0438 \u0438\u043c\u0435\u044e\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0436\u0438\u0432\u0443\u0449\u0435\u0433\u043e IAM-\u0442\u043e\u043a\u0435\u043d\u0430 \u0438\u0437 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u043e\u0434\u044b:<\/strong>\u00a0\u0412 \u0441\u0435\u043a\u0446\u0438\u0438\u00a0<code>before_script<\/code>\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e CI-\u0434\u0436\u043e\u0431\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u043e\u0434\u044b \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443\u00a0<code>169.254.169.254<\/code>\u00a0(\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 Google Compute Engine):<\/p>\n<pre><code>TOKEN=$(wget -q -O - --header=\"Metadata-Flavor: Google\" \\  \"http:\/\/169.254.169.254\/computeMetadata\/v1\/instance\/service-accounts\/default\/token\" \\  | sed -n 's\/.*\"access_token\":\"\\([^\"]*\\)\".*\/\\1\/p')<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u043e\u043a\u0435\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439 Yandex Cloud \u043d\u0430 \u0431\u0430\u0437\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043a \u043d\u043e\u0434\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0433\u043e \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430, \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 ~12 \u0447\u0430\u0441\u043e\u0432 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Docker (<\/strong><code><strong>config.json<\/strong><\/code><strong>):<\/strong>\u00a0\u0414\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 \u0440\u0435\u0435\u0441\u0442\u0440\u0435\u00a0<a href=\"http:\/\/cr.yandex\" rel=\"noopener nofollow\"><code>cr.yandex<\/code><\/a>\u00a0\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c\u00a0<code>iam<\/code>\u00a0\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c \u0442\u043e\u043a\u0435\u043d\u043e\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u043e\u043b\u044f:<\/p>\n<pre><code>AUTH=$(printf \"iam:%s\" \"$TOKEN\" | base64 | tr -d '\\n')# \u0414\u043b\u044f Kaniko (\/kaniko\/.docker\/config.json):mkdir -p \/kaniko\/.dockerecho \"{\\\"auths\\\":{\\\"$YCR_REGISTRY\\\":{\\\"auth\\\":\\\"$AUTH\\\"}}}\" &gt; \/kaniko\/.docker\/config.json# \u0414\u043b\u044f BuildKit (~\/.docker\/config.json):mkdir -p ~\/.dockerecho \"{\\\"auths\\\":{\\\"$YCR_REGISTRY\\\":{\\\"auth\\\":\\\"$AUTH\\\"}}}\" &gt; ~\/.docker\/config.json<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0423\u0442\u0438\u043b\u0438\u0442\u044b \u0441\u0431\u043e\u0440\u043a\u0438 (Kaniko \u0438 BuildKit) \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442 \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0440\u0435\u0435\u0441\u0442\u0440\u0435 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0435 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<\/li>\n<\/ol>\n<h4>4. \u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/h4>\n<p>\u042d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u0439\u00a0<code>.gitlab-ci.yml<\/code>\u00a0(\u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 5 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432;\u00a0<code>$CI_PROJECT_NAME<\/code>\u00a0\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043c\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f):<\/p>\n<pre><code>variables:  # cr.yandex \u2014 \u0432\u0435\u0440\u043d\u044b\u0439 \u0445\u043e\u0441\u0442 Yandex Container Registry  # (registry.yandex.cloud \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 DNS).  YCR_REGISTRY: cr.yandexstages:  - buildbefore_script: &amp;docker-auth  # \u041a\u043e\u0440\u043e\u0442\u043a\u043e\u0436\u0438\u0432\u0443\u0449\u0438\u0439 IAM-\u0442\u043e\u043a\u0435\u043d \u0438\u0437 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u043e\u0434\u044b -&gt; docker config \u0434\u043b\u044f push\/pull.  - mkdir -p \"$DOCKER_CONFIG\"  - TOKEN=$(wget -q -O - --header=\"Metadata-Flavor: Google\" \"http:\/\/169.254.169.254\/computeMetadata\/v1\/instance\/service-accounts\/default\/token\" | sed -n 's\/.*\"access_token\":\"\\([^\"]*\\)\".*\/\\1\/p')  - AUTH_B64=$(printf 'iam:%s' \"$TOKEN\" | base64 | tr -d '\\n')  - printf '{\"auths\":{\"%s\":{\"auth\":\"%s\"}}}' \"$YCR_REGISTRY\" \"$AUTH_B64\" &gt; \"$DOCKER_CONFIG\/config.json\"kaniko-build:  stage: build  image: gcr.io\/kaniko-project\/executor:v1.23.2-debug  variables:    DOCKER_CONFIG: \/kaniko\/.docker  script:    - \/kaniko\/executor        --dockerfile=Dockerfile        --context=dir:\/\/$CI_PROJECT_DIR        --destination=\"$YCR_REGISTRY\/$YCR_REGISTRY_ID\/$CI_PROJECT_NAME-kaniko:latest\"        --cache=true        --cache-repo=\"$YCR_REGISTRY\/$YCR_REGISTRY_ID\/$CI_PROJECT_NAME-kaniko\"buildkit-build:  stage: build  image: moby\/buildkit:v0.32.2-rootless  variables:    DOCKER_CONFIG: \/home\/user\/.docker    XDG_RUNTIME_DIR: \/tmp\/buildkit    BUILDKITD_FLAGS: --oci-worker-no-process-sandbox  script:    - buildctl-daemonless.sh build        --frontend dockerfile.v0        --local \"context=$CI_PROJECT_DIR\"        --local \"dockerfile=$CI_PROJECT_DIR\"        --output \"type=image,name=$YCR_REGISTRY\/$YCR_REGISTRY_ID\/$CI_PROJECT_NAME-buildkit:latest,push=true\"        --import-cache \"type=registry,ref=$YCR_REGISTRY\/$YCR_REGISTRY_ID\/$CI_PROJECT_NAME-buildkit\"        --export-cache \"type=registry,ref=$YCR_REGISTRY\/$YCR_REGISTRY_ID\/$CI_PROJECT_NAME-buildkit,mode=max\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0441\u043b\u0430\u0431\u043b\u0435\u043d\u043d\u044b\u0439 securityContext \u0434\u043b\u044f rootless BuildKit (<code>seccompProfile: Unconfined<\/code>,\u00a0<code>appArmorProfile: Unconfined<\/code>) \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0440\u0430\u043d\u043d\u0435\u0440\u0430 \u0432\u00a0<code>gitlab-runner\/values.yaml<\/code>\u00a0(<code>build_container_security_context<\/code>) \u2014 \u0432\u00a0<code>.gitlab-ci.yml<\/code>\u00a0\u0435\u0433\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<h4>5. \u0414\u0430\u0448\u0431\u043e\u0440\u0434 \u0432 Grafana<\/h4>\n<p>\u0414\u0430\u0448\u0431\u043e\u0440\u0434:\u00a0<a href=\"https:\/\/github.com\/patsevanton\/buildkit-vs-kaniko-benchmark\/blob\/main\/dashboards\/kaniko-vs-buildkit-per-project.json\" rel=\"noopener nofollow\">kaniko-vs-buildkit-per-project.json<\/a>\u00a0\u2014 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0432 Grafana \u0432\u0440\u0443\u0447\u043d\u0443\u044e (Dashboards \u2192 Import \u2192 Upload JSON).<\/p>\n<h4>\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430<\/h4>\n<p>\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0441\u043d\u044f\u0442\u044b \u043d\u0430\u00a0<strong>\u0442\u0451\u043f\u043b\u043e\u043c \u043f\u0440\u043e\u0433\u043e\u043d\u0435<\/strong>\u00a0(\u0441 \u043f\u0440\u043e\u0433\u0440\u0435\u0442\u044b\u043c registry-\u043a\u044d\u0448\u0435\u043c) \u2014 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 Kaniko \u0438 BuildKit \u0432 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043a\u044d\u0448-\u0445\u0438\u0442\u0430.<\/p>\n<p><em>Next.js \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 CPU (BuildKit \u0441\u043b\u0435\u0432\u0430, Kaniko \u0441\u043f\u0440\u0430\u0432\u0430), \u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448.<\/em>\u00a0<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/487\/d89\/fa5\/487d89fa597908020fdc2ada797fca4a.png\" alt=\"Next.js \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 CPU \u043d\u0430 \u0442\u0451\u043f\u043b\u043e\u043c \u043a\u044d\u0448\u0435\" title=\"Next.js \u2014 CPU\" width=\"1920\" height=\"1200\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/487\/d89\/fa5\/487d89fa597908020fdc2ada797fca4a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/487\/d89\/fa5\/487d89fa597908020fdc2ada797fca4a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Next.js \u2014 CPU<\/figcaption><\/div>\n<\/figure>\n<p><em>Next.js \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448.<\/em>\u00a0<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bba\/c6c\/fee\/bbac6cfee2a29d24bd161f84bee5e3b7.png\" alt=\"Next.js \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0442\u0451\u043f\u043b\u043e\u043c \u043a\u044d\u0448\u0435\" title=\"Next.js \u2014 Memory\" width=\"1920\" height=\"1200\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/bba\/c6c\/fee\/bbac6cfee2a29d24bd161f84bee5e3b7.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bba\/c6c\/fee\/bbac6cfee2a29d24bd161f84bee5e3b7.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Next.js \u2014 Memory<\/figcaption><\/div>\n<\/figure>\n<p><em>Nuxt 3 \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 CPU (BuildKit \u0441\u043b\u0435\u0432\u0430, Kaniko \u0441\u043f\u0440\u0430\u0432\u0430), \u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448.<\/em>\u00a0<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e49\/e13\/4c7\/e49e134c74aa20de6ff406dc282d5048.png\" alt=\"Nuxt 3 \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 CPU \u043d\u0430 \u0442\u0451\u043f\u043b\u043e\u043c \u043a\u044d\u0448\u0435\" title=\"Nuxt 3 \u2014 CPU\" width=\"1920\" height=\"1200\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/e49\/e13\/4c7\/e49e134c74aa20de6ff406dc282d5048.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e49\/e13\/4c7\/e49e134c74aa20de6ff406dc282d5048.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Nuxt 3 \u2014 CPU<\/figcaption><\/div>\n<\/figure>\n<p><em>Nuxt 3 \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448.<\/em>\u00a0<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9b4\/e94\/0ca\/9b4e940ca0cb2737cd463dc5d9ea43d5.png\" alt=\"Nuxt 3 \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0442\u0451\u043f\u043b\u043e\u043c \u043a\u044d\u0448\u0435\" title=\"Nuxt 3 \u2014 Memory\" width=\"1920\" height=\"1200\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/9b4\/e94\/0ca\/9b4e940ca0cb2737cd463dc5d9ea43d5.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9b4\/e94\/0ca\/9b4e940ca0cb2737cd463dc5d9ea43d5.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Nuxt 3 \u2014 Memory<\/figcaption><\/div>\n<\/figure>\n<p><em>Go HTTP-\u0441\u0435\u0440\u0432\u0438\u0441 \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 CPU (BuildKit \u0441\u043b\u0435\u0432\u0430, Kaniko \u0441\u043f\u0440\u0430\u0432\u0430), \u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448.<\/em>\u00a0<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9ff\/5fc\/ca5\/9ff5fcca58723deb9a95ccd117c6525a.png\" alt=\"Go HTTP-\u0441\u0435\u0440\u0432\u0438\u0441 \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 CPU \u043d\u0430 \u0442\u0451\u043f\u043b\u043e\u043c \u043a\u044d\u0448\u0435\" title=\"Go \u2014 CPU\" width=\"1920\" height=\"1200\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/9ff\/5fc\/ca5\/9ff5fcca58723deb9a95ccd117c6525a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9ff\/5fc\/ca5\/9ff5fcca58723deb9a95ccd117c6525a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Go \u2014 CPU<\/figcaption><\/div>\n<\/figure>\n<p><em>Go HTTP-\u0441\u0435\u0440\u0432\u0438\u0441 \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448.<\/em>\u00a0<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d4d\/e29\/3f9\/d4de293f9a4f068af7852c1bbbc55edb.png\" alt=\"Go HTTP-\u0441\u0435\u0440\u0432\u0438\u0441 \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0442\u0451\u043f\u043b\u043e\u043c \u043a\u044d\u0448\u0435\" title=\"Go \u2014 Memory\" width=\"1920\" height=\"1200\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d4d\/e29\/3f9\/d4de293f9a4f068af7852c1bbbc55edb.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d4d\/e29\/3f9\/d4de293f9a4f068af7852c1bbbc55edb.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Go \u2014 Memory<\/figcaption><\/div>\n<\/figure>\n<p><em>Android APK \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 CPU (BuildKit \u0441\u043b\u0435\u0432\u0430, Kaniko \u0441\u043f\u0440\u0430\u0432\u0430), \u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448.<\/em>\u00a0<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ff3\/777\/143\/ff3777143a35b8835db757ebc42c574d.png\" alt=\"Android APK \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 CPU \u043d\u0430 \u0442\u0451\u043f\u043b\u043e\u043c \u043a\u044d\u0448\u0435\" title=\"Android \u2014 CPU\" width=\"1920\" height=\"1200\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ff3\/777\/143\/ff3777143a35b8835db757ebc42c574d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ff3\/777\/143\/ff3777143a35b8835db757ebc42c574d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Android \u2014 CPU<\/figcaption><\/div>\n<\/figure>\n<p><em>Android APK \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448.<\/em>\u00a0<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cdd\/035\/a30\/cdd035a306db47418afd5947aa2203c1.png\" alt=\"Android APK \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0442\u0451\u043f\u043b\u043e\u043c \u043a\u044d\u0448\u0435\" title=\"Android \u2014 Memory\" width=\"1920\" height=\"1200\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/cdd\/035\/a30\/cdd035a306db47418afd5947aa2203c1.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cdd\/035\/a30\/cdd035a306db47418afd5947aa2203c1.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Android \u2014 Memory<\/figcaption><\/div>\n<\/figure>\n<p><em>ML: PyTorch inference \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 CPU (BuildKit \u0441\u043b\u0435\u0432\u0430, Kaniko \u0441\u043f\u0440\u0430\u0432\u0430), \u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448.<\/em>\u00a0<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ab2\/5de\/b3d\/ab25deb3d9c95a5263f24414ec156c05.png\" alt=\"ML: PyTorch inference \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 CPU \u043d\u0430 \u0442\u0451\u043f\u043b\u043e\u043c \u043a\u044d\u0448\u0435\" title=\"ML: PyTorch \u2014 CPU\" width=\"1920\" height=\"1200\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ab2\/5de\/b3d\/ab25deb3d9c95a5263f24414ec156c05.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ab2\/5de\/b3d\/ab25deb3d9c95a5263f24414ec156c05.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>ML: PyTorch \u2014 CPU<\/figcaption><\/div>\n<\/figure>\n<p><em>ML: PyTorch inference \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448.<\/em>\u00a0<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9f4\/5d6\/5a7\/9f45d65a780de1f864934eeafd8a65fc.png\" alt=\"ML: PyTorch inference \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0442\u0451\u043f\u043b\u043e\u043c \u043a\u044d\u0448\u0435\" title=\"ML: PyTorch \u2014 Memory\" width=\"1920\" height=\"1200\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/9f4\/5d6\/5a7\/9f45d65a780de1f864934eeafd8a65fc.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9f4\/5d6\/5a7\/9f45d65a780de1f864934eeafd8a65fc.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>ML: PyTorch \u2014 Memory<\/figcaption><\/div>\n<\/figure>\n<h4>\u0418\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0441\u0432\u043e\u0434\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 (\u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448)<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041f\u0440\u043e\u0435\u043a\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0412\u0440\u0435\u043c\u044f kaniko (\u0441)<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0412\u0440\u0435\u043c\u044f buildkit (\u0441)<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0412\u044b\u0438\u0433\u0440\u044b\u0448 BuildKit %<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">nextjs<\/p>\n<\/td>\n<td>\n<p align=\"left\">75<\/p>\n<\/td>\n<td>\n<p align=\"left\">13<\/p>\n<\/td>\n<td>\n<p align=\"left\">83<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">nuxtjs<\/p>\n<\/td>\n<td>\n<p align=\"left\">50<\/p>\n<\/td>\n<td>\n<p align=\"left\">13<\/p>\n<\/td>\n<td>\n<p align=\"left\">74<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">golang<\/p>\n<\/td>\n<td>\n<p align=\"left\">33<\/p>\n<\/td>\n<td>\n<p align=\"left\">13<\/p>\n<\/td>\n<td>\n<p align=\"left\">61<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">android<\/p>\n<\/td>\n<td>\n<p align=\"left\">109<\/p>\n<\/td>\n<td>\n<p align=\"left\">14<\/p>\n<\/td>\n<td>\n<p align=\"left\">87<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">ml-pytorch<\/p>\n<\/td>\n<td>\n<p align=\"left\">289<\/p>\n<\/td>\n<td>\n<p align=\"left\">19<\/p>\n<\/td>\n<td>\n<p align=\"left\">93<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041f\u0440\u043e\u0435\u043a\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">CPU kaniko (cores)<\/p>\n<\/th>\n<th>\n<p align=\"left\">CPU buildkit (cores)<\/p>\n<\/th>\n<th>\n<p align=\"left\">RAM kaniko<\/p>\n<\/th>\n<th>\n<p align=\"left\">RAM buildkit<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">nextjs<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.94<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.04<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.55 GiB<\/p>\n<\/td>\n<td>\n<p align=\"left\">3.2 MiB<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">nuxtjs<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.52<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.04<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.18 GiB<\/p>\n<\/td>\n<td>\n<p align=\"left\">3.5 MiB<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">golang<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.67<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.05<\/p>\n<\/td>\n<td>\n<p align=\"left\">88 MiB<\/p>\n<\/td>\n<td>\n<p align=\"left\">3.2 MiB<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">android<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.74<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.04<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.38 GiB<\/p>\n<\/td>\n<td>\n<p align=\"left\">3.2 MiB<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">ml-pytorch<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.78<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.04<\/p>\n<\/td>\n<td>\n<p align=\"left\">10.87 GiB<\/p>\n<\/td>\n<td>\n<p align=\"left\">3.5 MiB<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u0412\u044b\u0432\u043e\u0434<\/h3>\n<p>BuildKit \u043d\u0430 \u0432\u0441\u0435\u0445 \u043f\u044f\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0434\u0435\u0440\u0436\u0438\u0442 ~<strong>0.04\u20130.05 CPU<\/strong>\u00a0\u0438\u00a0<strong>~3 MiB RAM<\/strong>\u00a0(\u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430). \u042d\u0442\u043e cache hit: \u0441\u043b\u043e\u0438 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0438\u0437 registry, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0435\u0442. Kaniko \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u043a\u044d\u0448\u0435 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0433\u0440\u0443\u0437\u0438\u0442 CPU (<strong>0.67<\/strong>\u00a0\u043d\u0430 golang,\u00a0<strong>1.5\u20131.9<\/strong>\u00a0\u043d\u0430 Node\/Android\/ML) \u0438 \u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 working set:\u00a0<strong>88 MiB<\/strong>\u00a0(golang),\u00a0<strong>1.2\u20131.6 GiB<\/strong>\u00a0(nextjs\/nuxtjs\/android),\u00a0<strong>10.9 GiB<\/strong>\u00a0(ml-pytorch).<\/p>\n<p>\u0421\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438: BuildKit \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u00a0<strong>13\u201319 \u0441<\/strong>\u00a0\u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u0435; Kaniko \u2014 \u043e\u0442\u00a0<strong>33 \u0441<\/strong>\u00a0(golang) \u0434\u043e\u00a0<strong>289 \u0441<\/strong>\u00a0(ml-pytorch). \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043d\u0435 \u0432 \u00ab\u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439\u00bb, \u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448 BuildKit \u043f\u043e\u0447\u0442\u0438 \u043e\u0431\u043d\u0443\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443, \u0430 Kaniko \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0438 \u0438 \u0436\u0435\u0447\u044c CPU\/RAM.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1079670\/\">https:\/\/habr.com\/ru\/articles\/1079670\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u0412 Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u0432\u0441\u0442\u0430\u0451\u0442 \u0432\u043e\u043f\u0440\u043e\u0441:\u00a0\u0433\u0434\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c Docker image \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439?\u00a0\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u00ab\u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u00bb \u043d\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0443. \u0412\u044b\u043d\u043e\u0441 \u0441\u0431\u043e\u0440\u043e\u043a \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u0440\u0435\u0448\u0430\u0435\u0442 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u043b\u0438\u0448\u0430\u0435\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 k8s: \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0412\u041c \u043d\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443, \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0436\u043e\u0431\u044b \u043a\u043e\u043d\u043a\u0443\u0440\u0438\u0440\u0443\u044e\u0442 \u0437\u0430 \u043e\u0431\u0449\u0438\u0435 CPU, RAM \u0438 \u0434\u0438\u0441\u043a, \u0430 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043a\u044d\u0448 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u043e\u0447\u0438\u0441\u0442\u043a\u0438.\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0434\u0432\u0430 \u2014\u00a0Kaniko\u00a0\u0438\u00a0BuildKit. Kubernetes executor \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c\u00a0Kaniko\u00a0\u0438\u043b\u0438\u00a0BuildKit\u00a0\u043b\u0438\u0448\u0435\u043d \u044d\u0442\u0438\u0445 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432: \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u0430\u0445 \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u043d\u043e\u0434\u0430\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u044e\u0442\u0441\u044f, \u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u0434\u043b\u044f Docker-\u0434\u0435\u043c\u043e\u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f.Kaniko\u00a0(GoogleContainerTools\/kaniko) \u2014 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043e\u0442 Google \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u0435\u0437 privileged-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u0421 \u0438\u044e\u043d\u044f 2025 \u0433\u043e\u0434\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f.BuildKit\u00a0(moby\/buildkit) \u2014 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a\u00a0docker build, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0432 k8s \u0432 daemonless \u0438 rootless-\u0440\u0435\u0436\u0438\u043c\u0435 \u0431\u0435\u0437 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439 \u043d\u043e\u0434\u044b.\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e\u00a05 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432\u00a0\u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u043e\u0438\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432 \u043e\u0434\u043d\u0438\u0445 \u0438 \u0442\u0435\u0445 \u0436\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445, \u0441 \u0437\u0430\u043c\u0435\u0440\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f CPU\/RAM \u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043a\u044d\u0448\u0430. \u0412 \u043a\u043e\u043d\u0446\u0435 \u2014\u00a0\u0438\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0441\u0432\u043e\u0434\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u00a0\u0438 \u0440\u0430\u0437\u0431\u043e\u0440\u00a0\u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d\u0430.\u041a\u044d\u0448.\u00a0\u041e\u0431\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e registry-\u043a\u044d\u0448. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448 \u043d\u0430 \u043d\u043e\u0434\u0435 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u2014 \u043e\u043d \u043a\u043e\u043f\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0447\u0438\u0441\u0442\u043a\u0438. Registry-\u043a\u044d\u0448 \u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e: \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u043a\u044d\u0448\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u043e\u0433\u043e\u043d\u0435, \u0430 \u043c\u0443\u0441\u043e\u0440 \u043f\u043e\u0434\u0447\u0438\u0449\u0430\u0435\u0442 garbage collection \u0440\u0435\u0435\u0441\u0442\u0440\u0430. \u0425\u0440\u0430\u043d\u044f\u0441\u044c \u0432\u043d\u0435 \u043f\u043e\u0434\u0430, \u043e\u043d \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0441\u043c\u0435\u043d\u0443 \u043d\u043e\u0434\u044b.\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u00a05 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432\u00a0\u2014 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043d\u0430 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b\u0439 \u00ab\u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0441\u0431\u043e\u0440\u043a\u0438\u00bb:\u2116\u041f\u0440\u043e\u0435\u043a\u0442\u042f\u0437\u044b\u043a\/Framework\u041f\u0440\u043e\u0444\u0438\u043b\u044c \u0441\u0431\u043e\u0440\u043a\u0438\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u04391Next.jsNode\/React SSRnpm ci\u00a0+ \u0441\u0431\u043e\u0440\u043a\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430nextjs2Nuxt 3Node\/Vue SSRnpm ci\u00a0+ \u0441\u0431\u043e\u0440\u043a\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430nuxtjs3Go HTTP-\u0441\u0435\u0440\u0432\u0438\u0441Gogo build\u00a0\u2192 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a (\u0438\u0437 scratch)golang4Android APKJava\/Kotlin, GradleassembleRelease, \u0442\u044f\u0436\u0451\u043b\u044b\u0439 Gradle\/SDKandroid5ML: PyTorch inferencePythonpip install torch\u00a0+ \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 ~1.3 \u0413\u0411 \u0432\u0435\u0441\u043e\u0432 \u0432 BUILD-\u0441\u0442\u0430\u0434\u0438\u0438 (public S3-\u0431\u0430\u043a\u0435\u0442)ml-pytorch\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0441\u0442\u0435\u043d\u0434\u0430\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0441\u0442\u0435\u043d\u0434\u0430\u0420\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435\u041f\u0435\u0440\u0435\u0434 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435\u043c gitlab runner \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0447\u0442\u043e\u0431\u044b \u0443 \u0432\u0430\u0441 \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d Kubernetes \u043a\u043b\u0430\u0441\u0442\u0435\u0440, S3 \u0431\u0430\u043a\u0435\u0442 \u0438 Container Registry.\u0412 S3 \u0431\u0430\u043a\u0435\u0442 \u0437\u0430\u043b\u0438\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0432\u0435\u0441\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440\u00a0pytorch_model\u00a0\u0434\u043b\u044f job\u00a0ml-pytorch.\u0414\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c VictoriaMetrics k8s-stack.1a. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 GitLab Runner\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c GitLab Runner \u0441 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439\u00a0values.yaml:gitlabUrl: https:\/\/gitlab.com\/# \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u0434\u0436\u043e\u0431\u043e\u0432. \u041f\u0430\u0440\u0430 kaniko+buildkit \u043e\u0434\u043d\u043e\u0433\u043e# \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e (2 \u0434\u0436\u043e\u0431\u0430), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 2 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.concurrent: 2# RBAC \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f\/\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0430\u043c\u0438 \u0434\u0436\u043e\u0431\u043e\u0432.rbac:  create: true  rules: []serviceAccount:  create: truerunners:  executor: kubernetes  # \u0422\u0435\u0433, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0434\u0436\u043e\u0431\u044b \u0432 .gitlab-ci.yml \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442 \u044d\u0442\u043e\u0442 \u0440\u0430\u043d\u043d\u0435\u0440.  tags: &#171;k8s-benchmark&#187;  # \u0420\u0430\u043d\u043d\u0435\u0440 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0436\u043e\u0431\u044b \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u0433\u043e\u043c.  runUntagged: false  # \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0444\u0438\u0433 executor&#8217;\u0430. \u0417\u0430\u0434\u0430\u0451\u043c \u043b\u0438\u043c\u0438\u0442\u044b build-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430  # (\u0442\u0435 \u0436\u0435 4 CPU \/ 4 GiB, \u0447\u0442\u043e \u0431\u044b\u043b\u0438 \u0443 \u0441\u0442\u0430\u0440\u044b\u0445 K8s-\u0434\u0436\u043e\u0431\u043e\u0432 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430).  config: |    [[runners]]      request_concurrency = 2      [runners.kubernetes]        namespace = &#171;{{ .Release.Namespace }}&#187;        image = &#171;alpine:3.20&#187;        cpu_request = &#171;1&#187;        cpu_limit = &#171;4&#187;        memory_request = &#171;1Gi&#187;        memory_limit = &#171;12Gi&#187;        helper_cpu_request = &#171;100m&#187;        helper_cpu_limit = &#171;500m&#187;        helper_memory_request = &#171;128Mi&#187;        helper_memory_limit = &#171;512Mi&#187;        # Build-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u0435\u0437 privileged (\u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0437\u0430\u043c\u0435\u0440\u043e\u0432 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u044b        # \u0441 \u043f\u0440\u0435\u0436\u043d\u0438\u043c \u0441\u0442\u0435\u043d\u0434\u043e\u043c). BuildKit \u0432 rootless-\u0440\u0435\u0436\u0438\u043c\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0441\u043b\u0430\u0431\u043b\u0435\u043d\u043d\u044b\u0439        # securityContext: seccomp\/apparmor Unconfined (\u043d\u0443\u0436\u0435\u043d unshare mount ns).        privileged = false        allow_privilege_escalation = true        [runners.kubernetes.build_container_security_context]          [runners.kubernetes.build_container_security_context.seccomp_profile]            type = &#171;Unconfined&#187;          [runners.kubernetes.build_container_security_context.app_armor_profile]            type = &#171;Unconfined&#187;        # \u0418\u043c\u0435\u043d\u0430 \u043f\u043e\u0434\u043e\u0432 \u0434\u0436\u043e\u0431\u043e\u0432 \u0432\u0430\u0436\u043d\u044b \u0434\u043b\u044f Grafana: GitLab Runner \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u043d\u0438\u0445        # GitLab project ID (runner-\u2026-project-&lt;ID&gt;-concurrent-\u2026), \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443        # \u0434\u0430\u0448\u0431\u043e\u0440\u0434 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u043e label `image`        # \u043c\u0435\u0442\u0440\u0438\u043a cAdvisor (\u2026\/kaniko\u2026 vs \u2026\/buildkit\u2026).        pull_policy = &#171;if-not-present&#187;resources:  requests:    cpu: 100m    memory: 128Mi  limits:    cpu: 500m    memory: 512Mi2. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 GitLab CI\u0412 \u0433\u0440\u0443\u043f\u043f\u0435\u00a0gitlab.com\/buildkit-vs-kaniko-benchmark\u00a0\u2192\u00a0Settings \u2192 CI\/CD \u2192 Variables\u00a0\u0437\u0430\u0434\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0434\u0430\u0442\u044c YCR_REGISTRY_ID.3. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 GitLab Runner \u0434\u043b\u044f push \u0432 Yandex Container Registry\u0414\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043f\u0443\u0448\u0430 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0432 YCR \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u044b, \u043f\u0430\u0440\u043e\u043b\u0438 \u0438\u043b\u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u044b, \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438:\u0421\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0439 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u043d\u043e\u0434 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 (node_service_account):\u00a0\u041f\u0440\u0438 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0447\u0435\u0440\u0435\u0437 Terraform \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u043c\u0443 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0443 \u043d\u043e\u0434 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 (sa_k8s_node) \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u044e\u0442\u0441\u044f \u0440\u043e\u043b\u0438\u00a0container-registry.images.pusher\u00a0\u0438\u00a0container-registry.images.puller\u00a0\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0435\u0441\u0442\u0440 (\u0441\u043c.\u00a0registry.tf). \u041f\u043e\u0434\u044b GitLab Runner \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u0438\u0445 \u043d\u043e\u0434\u0430\u0445 \u0438 \u0438\u043c\u0435\u044e\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430.\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0436\u0438\u0432\u0443\u0449\u0435\u0433\u043e IAM-\u0442\u043e\u043a\u0435\u043d\u0430 \u0438\u0437 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u043e\u0434\u044b:\u00a0\u0412 \u0441\u0435\u043a\u0446\u0438\u0438\u00a0before_script\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e CI-\u0434\u0436\u043e\u0431\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u043e\u0434\u044b \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443\u00a0169.254.169.254\u00a0(\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 Google Compute Engine):TOKEN=$(wget -q -O &#8212; &#8212;header=&#187;Metadata-Flavor: Google&#187; \\  &#171;http:\/\/169.254.169.254\/computeMetadata\/v1\/instance\/service-accounts\/default\/token&#187; \\  | sed -n &#8216;s\/.*&#187;access_token&#187;:&#187;\\([^&#187;]*\\)&#187;.*\/\\1\/p&#8217;)\u0422\u043e\u043a\u0435\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439 Yandex Cloud \u043d\u0430 \u0431\u0430\u0437\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043a \u043d\u043e\u0434\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0433\u043e \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430, \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 ~12 \u0447\u0430\u0441\u043e\u0432 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.\u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Docker (config.json):\u00a0\u0414\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 \u0440\u0435\u0435\u0441\u0442\u0440\u0435\u00a0cr.yandex\u00a0\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c\u00a0iam\u00a0\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c \u0442\u043e\u043a\u0435\u043d\u043e\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u043e\u043b\u044f:AUTH=$(printf &#171;iam:%s&#187; &#171;$TOKEN&#187; | base64 | tr -d &#8216;\\n&#8217;)# \u0414\u043b\u044f Kaniko (\/kaniko\/.docker\/config.json):mkdir -p \/kaniko\/.dockerecho &#171;{\\&#187;auths\\&#187;:{\\&#187;$YCR_REGISTRY\\&#187;:{\\&#187;auth\\&#187;:\\&#187;$AUTH\\&#187;}}}&#187; &gt; \/kaniko\/.docker\/config.json# \u0414\u043b\u044f BuildKit (~\/.docker\/config.json):mkdir -p ~\/.dockerecho &#171;{\\&#187;auths\\&#187;:{\\&#187;$YCR_REGISTRY\\&#187;:{\\&#187;auth\\&#187;:\\&#187;$AUTH\\&#187;}}}&#187; &gt; ~\/.docker\/config.json\u0423\u0442\u0438\u043b\u0438\u0442\u044b \u0441\u0431\u043e\u0440\u043a\u0438 (Kaniko \u0438 BuildKit) \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442 \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0440\u0435\u0435\u0441\u0442\u0440\u0435 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0435 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.4. \u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438\u042d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u0439\u00a0.gitlab-ci.yml\u00a0(\u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 5 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432;\u00a0$CI_PROJECT_NAME\u00a0\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043c\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f):variables:  # cr.yandex \u2014 \u0432\u0435\u0440\u043d\u044b\u0439 \u0445\u043e\u0441\u0442 Yandex Container Registry  # (registry.yandex.cloud \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 DNS).  YCR_REGISTRY: cr.yandexstages:  &#8212; buildbefore_script: &amp;docker-auth  # \u041a\u043e\u0440\u043e\u0442\u043a\u043e\u0436\u0438\u0432\u0443\u0449\u0438\u0439 IAM-\u0442\u043e\u043a\u0435\u043d \u0438\u0437 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u043e\u0434\u044b -&gt; docker config \u0434\u043b\u044f push\/pull.  &#8212; mkdir -p &#171;$DOCKER_CONFIG&#187;  &#8212; TOKEN=$(wget -q -O &#8212; &#8212;header=&#187;Metadata-Flavor: Google&#187; &#171;http:\/\/169.254.169.254\/computeMetadata\/v1\/instance\/service-accounts\/default\/token&#187; | sed -n &#8216;s\/.*&#187;access_token&#187;:&#187;\\([^&#187;]*\\)&#187;.*\/\\1\/p&#8217;)  &#8212; AUTH_B64=$(printf &#8216;iam:%s&#8217; &#171;$TOKEN&#187; | base64 | tr -d &#8216;\\n&#8217;)  &#8212; printf &#8216;{&#171;auths&#187;:{&#171;%s&#187;:{&#171;auth&#187;:&#187;%s&#187;}}}&#8217; &#171;$YCR_REGISTRY&#187; &#171;$AUTH_B64&#187; &gt; &#171;$DOCKER_CONFIG\/config.json&#187;kaniko-build:  stage: build  image: gcr.io\/kaniko-project\/executor:v1.23.2-debug  variables:    DOCKER_CONFIG: \/kaniko\/.docker  script:    &#8212; \/kaniko\/executor        &#8212;dockerfile=Dockerfile        &#8212;context=dir:\/\/$CI_PROJECT_DIR        &#8212;destination=&#187;$YCR_REGISTRY\/$YCR_REGISTRY_ID\/$CI_PROJECT_NAME-kaniko:latest&#187;        &#8212;cache=true        &#8212;cache-repo=&#187;$YCR_REGISTRY\/$YCR_REGISTRY_ID\/$CI_PROJECT_NAME-kaniko&#187;buildkit-build:  stage: build  image: moby\/buildkit:v0.32.2-rootless  variables:    DOCKER_CONFIG: \/home\/user\/.docker    XDG_RUNTIME_DIR: \/tmp\/buildkit    BUILDKITD_FLAGS: &#8212;oci-worker-no-process-sandbox  script:    &#8212; buildctl-daemonless.sh build        &#8212;frontend dockerfile.v0        &#8212;local &#171;context=$CI_PROJECT_DIR&#187;        &#8212;local &#171;dockerfile=$CI_PROJECT_DIR&#187;        &#8212;output &#171;type=image,name=$YCR_REGISTRY\/$YCR_REGISTRY_ID\/$CI_PROJECT_NAME-buildkit:latest,push=true&#187;        &#8212;import-cache &#171;type=registry,ref=$YCR_REGISTRY\/$YCR_REGISTRY_ID\/$CI_PROJECT_NAME-buildkit&#187;        &#8212;export-cache &#171;type=registry,ref=$YCR_REGISTRY\/$YCR_REGISTRY_ID\/$CI_PROJECT_NAME-buildkit,mode=max&#187;\u041e\u0441\u043b\u0430\u0431\u043b\u0435\u043d\u043d\u044b\u0439 securityContext \u0434\u043b\u044f rootless BuildKit (seccompProfile: Unconfined,\u00a0appArmorProfile: Unconfined) \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0440\u0430\u043d\u043d\u0435\u0440\u0430 \u0432\u00a0gitlab-runner\/values.yaml\u00a0(build_container_security_context) \u2014 \u0432\u00a0.gitlab-ci.yml\u00a0\u0435\u0433\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.5. \u0414\u0430\u0448\u0431\u043e\u0440\u0434 \u0432 Grafana\u0414\u0430\u0448\u0431\u043e\u0440\u0434:\u00a0kaniko-vs-buildkit-per-project.json\u00a0\u2014 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0432 Grafana \u0432\u0440\u0443\u0447\u043d\u0443\u044e (Dashboards \u2192 Import \u2192 Upload JSON).\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0441\u043d\u044f\u0442\u044b \u043d\u0430\u00a0\u0442\u0451\u043f\u043b\u043e\u043c \u043f\u0440\u043e\u0433\u043e\u043d\u0435\u00a0(\u0441 \u043f\u0440\u043e\u0433\u0440\u0435\u0442\u044b\u043c registry-\u043a\u044d\u0448\u0435\u043c) \u2014 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 Kaniko \u0438 BuildKit \u0432 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043a\u044d\u0448-\u0445\u0438\u0442\u0430.Next.js \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 CPU (BuildKit \u0441\u043b\u0435\u0432\u0430, Kaniko \u0441\u043f\u0440\u0430\u0432\u0430), \u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448.\u00a0Next.js \u2014 CPUNext.js \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448.\u00a0Next.js \u2014 MemoryNuxt 3 \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 CPU (BuildKit \u0441\u043b\u0435\u0432\u0430, Kaniko \u0441\u043f\u0440\u0430\u0432\u0430), \u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448.\u00a0Nuxt 3 \u2014 CPUNuxt 3 \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448.\u00a0Nuxt 3 \u2014 MemoryGo HTTP-\u0441\u0435\u0440\u0432\u0438\u0441 \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 CPU (BuildKit \u0441\u043b\u0435\u0432\u0430, Kaniko \u0441\u043f\u0440\u0430\u0432\u0430), \u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448.\u00a0Go \u2014 CPUGo HTTP-\u0441\u0435\u0440\u0432\u0438\u0441 \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448.\u00a0Go \u2014 MemoryAndroid APK \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 CPU (BuildKit \u0441\u043b\u0435\u0432\u0430, Kaniko \u0441\u043f\u0440\u0430\u0432\u0430), \u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448.\u00a0Android \u2014 CPUAndroid APK \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448.\u00a0Android \u2014 MemoryML: PyTorch inference \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 CPU (BuildKit \u0441\u043b\u0435\u0432\u0430, Kaniko \u0441\u043f\u0440\u0430\u0432\u0430), \u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448.\u00a0ML: PyTorch \u2014 CPUML: PyTorch inference \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448.\u00a0ML: PyTorch \u2014 Memory\u0418\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0441\u0432\u043e\u0434\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 (\u0442\u0451\u043f\u043b\u044b\u0439 \u043a\u044d\u0448)\u041f\u0440\u043e\u0435\u043a\u0442\u0412\u0440\u0435\u043c\u044f kaniko (\u0441)\u0412\u0440\u0435\u043c\u044f buildkit (\u0441)\u0412\u044b\u0438\u0433\u0440\u044b\u0448 BuildKit %nextjs751383nuxtjs501374golang331361android1091487ml-pytorch2891993\u041f\u0440\u043e\u0435\u043a\u0442CPU kaniko (cores)CPU buildkit (cores)RAM kanikoRAM buildkitnextjs1.940.041.55 GiB3.2 MiBnuxtjs1.520.041.18 GiB3.5&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-493824","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/493824","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=493824"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/493824\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=493824"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=493824"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=493824"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}