Kaniko לבניית תמונות Docker ב-Kubernetes: הגדרה ואבטחה

בניית תמונות Docker ב-Kubernetes באמצעות Docker-in-Docker חושפת את מערכת המארח ויוצרת סיכוני אבטחה חמורים. אנחנו משתמשים ב-Kaniko, כלי שבונה תמונות ללא Docker daemon, כולו במרחב המשתמש. הצוות שלנו מגדיר את Kaniko כפתרון מוכן, ומבטיח בידוד, מהירות ותמיכה מתמשכת.

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1365
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

הרצת Docker-in-Docker (dind) בצינור CI בתוך Kubernetes פירושה עיגון של /var/run/docker.sock מהצומת לתוך קונטיינר הבנייה, מה שמעניק לו גישת root למארח. כל קוד שנבנה בצינור זה עלול לברוח מהקונטיינר — זהו לא איום היפותטי אלא ממשי, בדומה ל-CVE-2019-5736. אנו פותרים בעיה זו עם Kaniko — כלי לבניית תמונות Docker כולו במרחב המשתמש ללא דמון Docker. המהנדסים שלנו יישמו את Kaniko ביותר מ-50 פרויקטים, תוך הבטחת בידוד ומהירות בנייה. הודות לשכבת מטמון, עלויות תשתית CI מופחתות ב-40–50%, והחזר השקעה מושג בתוך החודש הראשון.

כיצד Kaniko בונה תמונות ללא דמון Docker

Kaniko מבצע כל הוראת Dockerfile בקונטיינר מבודד. במקום להשתמש במערכת קבצים overlay, הוא מצלם שינויים במערכת הקבצים לאחר כל פקודת RUN/COPY ויוצר שכבות ידנית. הוא פועל כמשתמש רגיל ואינו דורש --privileged. זה הופך בנייה לבטוחה גם באשכולות מרובי-דיירים. לפי הפרויקט, Kaniko נמצא בשימוש בייצור על ידי אלפי צוותים, והקוד שלו מתוחזק באופן פעיל על ידי הקהילה.

התקנת Kaniko שלב אחר שלב ב-GitLab CI

  1. הכן Secret עם אישורים. צור Kubernetes Secret מסוג docker-registry או הרכב config.json עם אימות לרג'יסטרי שלך.
  2. הגדר את תמונת Kaniko ב-CI. השתמש ב-gcr.io/kaniko-project/executor:v1.23.0-debug והעבר את הארגומנטים הדרושים.
  3. אפשר שכבת מטמון. הוסף דגלים --cache=true ו---cache-repo כדי להאיץ בניות חוזרות.
  4. הרץ את הבנייה. Kaniko יבנה את התמונה וידחוף אותה לרג'יסטרי ללא עיגון docker.sock.

דוגמה מינימלית:

---
build:
  image:
    name: gcr.io/kaniko-project/executor:v1.23.0-debug
    entrypoint: [""]
  script:
    - mkdir -p /kaniko/.docker
    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(echo -n $CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD | base64)\"}}}" > /kaniko/.docker/config.json
    - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --cache=true --cache-repo $CI_REGISTRY_IMAGE/cache

מה מספקת שכבת המטמון של Kaniko

build: image: name: gcr.io/kaniko-project/executor:v1.23.0-debug entrypoint: [""] script: - mkdir -p /kaniko/.docker - echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(echo -n $CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD | base64)\"}}}" > /kaniko/.docker/config.json - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --cache=true --cache-repo $CI_REGISTRY_IMAGE/cache — Kaniko שומר שכבות ביניים במאגר נפרד. בבניות חוזרות עם אותן הוראות והקשר, הוא עושה שימוש חוזר בשכבות מהמטמון. זה מקצר את זמן הבנייה לתמונות עם תלויות שלא השתנו. בפרויקטים שלנו, חיסכון בזמן מגיע ל-70% בבניות חוזרות, תוך קיצוץ עלויות CI בממוצע של 40-50%. אנו גם מגדירים מדיניות שמירת מטמון כדי למנוע הצפת הרג'יסטרי.

אפשרויות מצב צילום:

מצב תיאור מהירות דיוק
full ברירת מחדל: משווה את כל מערכת הקבצים מהיר נמוך (עלול לפספס שינויים)
redo מבצע מחדש את ההוראה ומשווה עם השכבה הקודמת איטי יותר גבוה

עבור רוב הפרויקטים, --cache=true מספיק, אך אם התמונה נבנית בצורה שגויה, עבור ל-full.

בנייה כ-Kubernetes Job

כדי להשתמש ב-Kaniko ישירות באשכול (לא ב-GitLab Runner), הפעל Kubernetes Job:

---
apiVersion: batch/v1
kind: Job
metadata:
  name: build-my-app
spec:
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: kaniko
          image: gcr.io/kaniko-project/executor:v1.23.0
          args:
            - "--dockerfile=/workspace/Dockerfile"
            - "--context=git://github.com/my-org/my-app#main"
            - "--destination=my-registry.io/my-app:latest"
            - "--cache=true"
            - "--cache-repo=my-registry.io/cache/my-app"
            - "--compressed-caching=false"
            - "--snapshot-mode=redo"
          volumeMounts:
            - name: docker-config
              mountPath: /kaniko/.docker
      volumes:
        - name: docker-config
          secret:
            secretName: registry-credentials
            items:
              - key: .dockerconfigjson
                path: config.json
---

redo — Kaniko משכפל את המאגר ישירות, אין צורך ב-PVC עם מקורות. עבור מאגרים פרטיים דרך SSH או עם טוקן: apiVersion: batch/v1 kind: Job metadata: name: build-my-app spec: template: spec: restartPolicy: Never containers: - name: kaniko image: gcr.io/kaniko-project/executor:v1.23.0 args: - "--dockerfile=/workspace/Dockerfile" - "--context=git://github.com/my-org/my-app#main" - "--destination=my-registry.io/my-app:latest" - "--cache=true" - "--cache-repo=my-registry.io/cache/my-app" - "--compressed-caching=false" - "--snapshot-mode=redo" volumeMounts: - name: docker-config mountPath: /kaniko/.docker volumes: - name: docker-config secret: secretName: registry-credentials items: - key: .dockerconfigjson path: config.json . --context=git:// — מצב מדויק יותר (ומעט איטי יותר) מאשר --git git_token=<token>. משמש כאשר התמונה שונה מהצפוי במצב ברירת מחדל.

בעיות נפוצות ופתרונות
  • שגיאה --snapshot-mode=redo עם 401 — full ב-error pushing image: failed to push קיים אך הפורמט שגוי. Kaniko מצפה בקפדנות ל-config.json. אם הרג'יסטרי משתמש ב-Docker Credential Helper (/kaniko/.docker/) — Kaniko אינו תומך בכך, נדרש {"auths":{"registry":{"auth":"base64(user:pass)"}}} מפורש.
  • בנייה איטית ללא מטמון — Kaniko אינו משתמש במטמון כברירת מחדל. credsStore + auth הם חובה להאצה. הבנייה הראשונה תמיד איטית — היא ממלאת את המטמון.
  • --cache=true — ניסיון להריץ תמונת ARM על צומת AMD64 או להיפך. עבור בניות מרובות-פלטפורמות, Kaniko תומך ב---cache-repo, אך הבנייה מתבצעת באמצעות אמולציה דרך QEMU, שהיא איטית משמעותית מאשר מקומית.
  • OCI runtime exec failed: exec format error גדול — Kaniko מעתיק את כל הקשר הבנייה לזיכרון לפני הבנייה. מאגר עם בינאריים, node_modules או קבצים גדולים עלול למצות את זיכרון ה-pod. פתרון: --custom-platform linux/arm64 שמחריג הכל מיותר.

כיצד Kaniko מתמודד עם בניות מרובות-פלטפורמות

Kaniko יכול לבנות תמונות עבור ארכיטקטורות אחרות באמצעות הדגל /workspace. עם זאת, אמולציה דרך QEMU מאטה את התהליך פי 2-3. לייצור, השתמש בצמתים מקומיים או בחוות בנייה לכל ארכיטקטורה. חלופה היא buildx, אך היא דורשת דמון Docker.

השוואה עם buildah ו-img

כלי גישה הרשאות מהירות
Kaniko צילום במרחב משתמש ללא בינוני
buildah overlayfs במרחב שמות משתמש ללא (גרסאות חדשות יותר) מהיר יותר
img runc + snapshotter ללא מהיר יותר
Docker DinD דמון docker root או privileged מהיר

Kaniko נבחר בשל פשטותו ותמיכה רחבה במערכות CI. buildah משמש כאשר יש צורך במהירות וקבלת הגדרת מרחב שמות משתמש על הצמתים מקובלת.

מה כלול ביישום Kaniko

אנו מספקים מחזור מלא: ביקורת תשתית נוכחית, עיצוב צינור מאובטח, הגדרת גישה לרג'יסטרי עם הרשאות מינימליות, העברת בניות קיימות, אופטימיזציה של מטמון, תיעוד והדרכת צוות. כתוצאה מכך, אתה מקבל:

  • CI/CD עובד עם Kaniko בתשתית שלך.
  • מטמון מוגדר עם מדיניות שמירה.
  • תיעוד לתחזוקה ושגיאות נפוצות.
  • המלצות לאופטימיזציה נוספת.

לוח זמנים — יום עד שלושה ימים. העלות מחושבת לאחר ביקורת תשתית. הזמן יישום Kaniko עם ערובה לאבטחה. קבל ייעוץ — נעריך את הפרויקט שלך ונציע יישום Kaniko מאובטח.

כל בניית CI שנייה בפרויקט שלך תהיה מהירה משמעותית, והסיכונים הקשורים לעיגון docker.sock יהפכו לנחלת העבר. צור קשר כדי לדון ביישום Kaniko ולקבל תוכנית העברה מותאמת אישית.