מדריך הקמה של קלסטר Kubernetes מקומי לבדיקות\מעבדה - חלק ב - הקמה

הקמה

בחלק זה אסקור את תהליך ההקמה של ה-VMים, אלו יהיו מכונות (3 במספר) שעליהן נתקין את הקלסטר. בעוד שאני משתמש ב-Vagrant בכדי להקים את המכונות, אתם לא חייבים להשתמש באותו פתרון, למרות שזה מפשט את היצירה זה עלול להוסיף עבודה נוספת ומשמעותית אם אין לכם סביבה זהה לשלי.

אני אתקין את גרסה 1.28.0 (גרסה אחרונה שזמינה בעת כתיבת המדריך), תהליך התקנה זה יהיה שונה משמעותית מגרסאות 1.24 ואחורה, ואני משער שככל שהמדריך הזה יזדקן הרלוונטיות שלו לגרסאות מתקדמות יותר גם יפחת.

סט התקנות וגרסאות:

  • Vagrant (לא חובה).
  • Libvirt (לא חובה, תצטרך פתרון וירטואליזציה חלופי).
  • Debian 12 - Bookworm.
  • Containerd 1.6.20~ds1-1+b1.

יצירת ה-VMים

כמו שציינתי, אני משתמש ב-Vagrant בכדי לייצר את ה-VMים, הם יהיו מבוססים על Debian 12. קובץ ההגדרות שלי (Vagrantfile) נראה ככה:

# -*- mode: ruby -*-
# vi: set ft=ruby :

servers=[
  {
    :hostname => "hkrim-k8s-1",
    :ip => "192.168.33.11",
    :box => "debian/bookworm64",
    :ram => 4096,
    :cpu => 2,
    :disk_size => 10
  },
  {
    :hostname => "hkrim-k8s-2",
    :ip => "192.168.33.12",
    :box => "debian/bookworm64",
    :ram => 4096,
    :cpu => 2,
    :disk_size => 10
  },
  {
    :hostname => "hkrim-k8s-3",
    :ip => "192.168.33.13",
    :box => "debian/bookworm64",
    :ram => 4096,
    :cpu => 2,
    :disk_size => 10
  }
]

Vagrant.configure("2") do |config|
    # Resize eth0's mtu to '1392'.
    config.vm.provision "shell",
        run: "always",
        inline: "sudo ip link set dev eth0 mtu 1392"

    # Have to disable 'rsync', as it will try to install packages
    # and fail before the MTU was corrected.
    config.nfs.verify_installed = false
    config.vm.synced_folder './sync', '/vagrant', type: 'rsync', disabled: true

    servers.each do |machine|
        config.vm.define machine[:hostname] do |node|
            node.vm.box = machine[:box]
            node.vm.hostname = machine[:hostname]

            # Host-to-host network
            node.vm.network :private_network,
                :ip => machine[:ip],
                :libvirt__domain_name => "hkrim.local"

            node.vm.provider :libvirt do |lv|
                lv.machine_virtual_size = machine[:disk_size]
                lv.qemu_use_session = false
                lv.cpus = machine[:cpu]
                lv.driver = "kvm"
                lv.memory = machine[:ram]
                lv.nic_model_type = "e1000"
                lv.nested = true
            end
        end
    end
end

לאחר שיצרתם את הקובץ, תריצו את הפקודה vagrant up --parallel.

פלט

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

  • אני מייצר 3 מכונות שמבוססות על דביאן 12.
  • ההוסט של כל מכונה הוא יחודי hkrim-k8s-? (סימן שאלה = 1, 2 או 3 בהתאם למכונה).
  • לכל מכונה יהיו 2 כרטיסי רשת, כרטיס רשת עם גישה לאינטרנט, וכרטיס רשת פנימי עם הכתובת 192.168.33.1? (סימן שאלה = 1, 2 או 3 בהתאם למכונה). חלק זה חשוב מאוד, כי התקשורת של הקלסטר תבצע באמצעות כרטיסי רשת אלו.
  • הקצאה של זכרון, ליבות וכונן.
  • אצלי ספציפית יש טופולוגית רשת מסויימת, אז אני צריך להקטין את ה-MTU ל-1392.
  • אני מייצר בלולאה 3 מכונות.
  • אני מאפשר Nested Virtualization.

ברגע שהמכונות באוויר, נותר לנו להתחבר אליהן.

התחברות ועדכון

אני משתמש ב-Tilix (טרמינל שמאפשר לי לסנכן פקודות בין טאבים, אשמח לשמוע במה אתם משתמשים), אני מתחבר בטאב נפרד לכל מכונה, בעזרת הפקודה vagrant ssh hkrim-k8s-1 (למכונה הראשונה, החליפו את 1 עם 2 ו-3 בשביל המכונות הבאות בטאבים אחרים).

לאחר שהתחברתי, אני אריץ 2 פקודות, עדכון של המנהל חבילות, ועדכון החבילות לאחר מכן. אל תשכחו לעבור למנהל מערכת בכדי לבצע את הפעולה (sudo -i).

sudo -i
apt update
apt dist-upgrade

לאחר העדכון, במיוחד אם היו עדכוני קרנל, מומלץ לאתחל את המכונות בעזרת הפקודה reboot.

שיעורי בית: תייצרו סקריפט (provision) שמבצע את כל ההתקנה באופן אוטומטי. אתגר, מה תצטרכו לעשות בכדי להבדיל בין הפקודות שרצות על ה-control-node משאר ה-VMים? רמז: הסתכלו בחלק העליון של ה-Vagrantfile, איך אפשר להשתמש ב-map של המשתנים?

וידוי דרישות

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

דרישות מערכת

  • לכל הפחות 2 גיגה זכרון פר מכונה.
  • לכל הפחות 2 ליבות פר מכונה.
  • תקשורת מלאה בין המכונות (אפשר ומומלץ להשתמש בפיירוואל, אך תצטרכו לפתוח פורטים מסויימים לתקשורת).
  • hostname, mac address, product_uuid יחודי.
  • ביטול של swap.

התקנה של Container Runtime

הפקודות הבאות דורשות רוט (sudo -i), אם אתחלתם, אל תשכחו להריץ לפני הפקודות שמצויינות בהמשך המדריך.

כפי שראינו בחלק א, קוברנטיס תומך במספר מנועים, אנחנו נתקין Containerd. אם התקנו בעבר container engine אחר, נצטרך להסיר את החבילות הקשורות אליו (מומלץ להתחיל ממכונות נקיות).

apt install containerd
פלט

טעינת מודלים והגדרות קרנל

נטען ונוודא שבכל אתחול המודל overlay filesystem ו-br_netfilter נטענים:

# Loading the module for the current run
modprobe overlay
modprobe br_netfilter

# Making sure the module will auto load in future system starts
cat <<EOF > /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

נצטרך גם לאפשר תקשורת (ip forward, bridge):

# Updating sysctl kernel flags
cat <<EOF > /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# Apply these changes
sysctl --system

הגדרות Containerd

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

# Creating default skel containerd configuration
containerd config default > /etc/containerd/config.toml

לאחר שהקובץ נוצר, תערכו אותו (nano, vi או כל עורך אחר שאתם מעדיפים), חפשו אחר השורה plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options, ותחתיה יהיה פרמטר SystemdCgroup, שנו את הערך שלו ל-true.

לדוגמה

לאחר שהקובץ עודכן, תאתחלו את containerd בעזרת הפקודה systemctl restart containerd, מומלץ גם לבדוק את הלוגים בעזרת systemctl status containerd ו-journalctl -fu containerd.

לא לשכוח

וודא כי SWAP מבוטל

kubeadm לא יאפשר את ההתקנה אם Swap מופעל, זה בגלל ש-swap מוביל לביצועים ירודים ואף במקרים קיצוניים לתקיעות. תצטרכו לבטל את ה-swap במקרה ומוגדר אצלכם.

# Find out if you have swap
free -m
swapon --show

# if you do, it usually configured in /etc/fstab

קוד יחודי

וודאו כי ה-Product UUID של כל המכונות יחודי:

cat /sys/class/dmi/id/product_uuid

וודאו כי הכתובת חומרה של הכרטיסי רשת יחודי

ip -o link show dev eth0 | grep -Po 'ether \K[^ ]*'
ip -o link show dev eth1 | grep -Po 'ether \K[^ ]*'

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

בחלק הבא (ג), נמשיך בההתקנה והגדרה של הקלסטר בעזרת kubeadm.