إنشاء مزرعة خوادم جاهزة للشبكة لـ Kubernetes باستخدام LTSP


في هذه المقالة ، أود أن أريكم تقنية رائعة ، أستخدمها بنجاح في Kubernetes. يمكن أن يكون مفيدًا حقًا لبناء مجموعات كبيرة.


من الآن فصاعدًا ، لم يعد عليك التفكير في تثبيت نظام التشغيل والحزم المنفصلة لكل عقدة. لماذا؟ يمكنك القيام بكل هذا تلقائيًا من خلال ملف Dockerfile!


حقيقة أنه يمكنك شراء مئات الخوادم الجديدة وإضافتها إلى بيئة عملك وجعلها جاهزة للاستخدام على الفور تقريبًا أمر مدهش حقًا!


مفتون؟ الآن دعونا نتحدث عن كل شيء بالترتيب.


الملخص


للبدء ، نحتاج إلى فهم كيفية عمل هذه الدائرة بالضبط.


باختصار ، لجميع العقد نجهز صورة واحدة مع نظام التشغيل ، Docker ، Kubelet وكل شيء آخر.
يتم إنشاء صورة النظام هذه مع النواة تلقائيًا بواسطة CI باستخدام ملف Dockerfile.
تقوم العقد النهائية بتحميل نظام التشغيل و kernel من هذه الصورة مباشرة عبر الشبكة.


تستخدم العقد تراكبات مثل نظام الملفات الجذر ، لذلك في حالة إعادة التشغيل ، ستفقد أي تغييرات (وكذلك في حالة حاويات عامل الميناء).
هناك تكوين رئيسي ، يمكنك فيه وصف نقاط التحميل وبعض الأوامر التي يجب تنفيذها عند تحميل العقدة (على سبيل المثال ، أمر لإضافة مفتاح ssh و kubeadm join )


عملية إعداد الصورة


سنستخدم مشروع LTSP لأنه يمنحنا كل ما نحتاجه لتنظيم تمهيد الشبكة.
بشكل عام ، LTSP عبارة عن حزمة من النصوص البرمجية التي تجعل حياتنا أسهل بكثير.


إنه يوفر وحدة initramfs ، والعديد من البرامج النصية المساعدة ، ونوعًا من نظام التكوين الذي يعد النظام في مرحلة مبكرة من التحميل ، حتى قبل استدعاء init.


هكذا تبدو إجراءات تحضير الصورة:


  • نشر النظام الأساسي في بيئة chroot.
  • نقوم بإجراء التغييرات اللازمة ، تثبيت البرنامج.
  • قم بتشغيل الأمر ltsp-build-image

بعد ذلك مباشرة ستحصل على صورة مضغوطة من هذا chroot مع جميع البرامج المثبتة في الداخل.
ستقوم كل عقدة بتنزيل هذه الصورة في وقت التمهيد واستخدامها كجذور.
للتحديث ، ما عليك سوى إعادة تشغيل العقدة ، وسيتم تنزيل الصورة الجديدة واستخدامها للجذور.


مكونات الخادم


يتضمن جزء الخادم من LTSP في حالتنا مكونين فقط:


  • خادم TFTP - TFTP هو بروتوكول تهيئة ، يتم استخدامه لتحميل النواة ، و initramfs والتكوين الرئيسي - lts.conf.
  • خادم NBD - بروتوكول NBD المستخدم لتقديم صورة جذور مضغوطة للعملاء. هذه هي أسرع طريقة ، ولكن إذا رغبت في ذلك ، يمكن استبدالها بـ NFS أو AoE.

تحتاج أيضًا إلى:


  • خادم DHCP - سيوزع تكوين IP والعديد من الخيارات الإضافية التي سيحتاجها عملاؤنا حتى يتمكنوا من التمهيد من خادم LTSP.

عملية تحميل العقدة


وصف عملية تحميل العقدة


  • أولاً ، ستطلب العقدة عنوان IP DHCP وخيارات next-server ، filename .
  • ثم ستقوم العقدة بتطبيق الإعدادات وتنزيل أداة تحميل التشغيل (pxelinux أو grub)
  • سوف يقوم برنامج bootloader بتنزيل التكوين وتحميله بالنواة و initramfs.
  • بعد ذلك ، سيتم تحميل النواة و initramfs بخيارات محددة محددة للنواة.
  • في وقت التمهيد ، ستقوم وحدات initramfs بمعالجة المعلمات من cmdline وتنفيذ بعض الإجراءات ، مثل توصيل جهاز nbd ، وإعداد جذور التراكب ، إلخ.
  • بعد ذلك ، بدلاً من الحرف الأول المعتاد ، سيتم استدعاء ltsp-init الخاص.
  • ستقوم نصوص ltsp-init بإعداد النظام في وقت مبكر قبل استدعاء الحرف الأول الرئيسي. بشكل أساسي ، يتم استخدام الخيارات من lts.conf (ملف التكوين الرئيسي) هنا: هذا هو تحديث السجلات في fstab و rc.local ، إلخ.
  • ثم سيكون هناك مكالمة إلى init الرئيسية (systemd) ، والتي ستقوم بتحميل النظام الذي تم تكوينه بالفعل كالمعتاد ، وتثبيت الموارد المشتركة من fstab ، وإطلاق الأهداف والخدمات ، وتنفيذ الأوامر من rc.local.
  • ونتيجة لذلك ، نحصل على نظام تم تكوينه وتحميله بالكامل ، جاهزين لمزيد من الإجراءات.

إعداد الخادم


كما قلت ، أجهز خادم LTSP بالصورة المسحوبة تلقائيًا باستخدام ملف Dockerfile. هذه الطريقة ليست سيئة ، لأنه يمكن وصف جميع خطوات البناء في مستودع git الخاص بك. يمكنك التحكم في الإصدارات واستخدام العلامات وتطبيق CI وكل ما تستخدمه لإعداد مشاريع Docker المعتادة.


من ناحية أخرى ، يمكنك نشر خادم LTSP يدويًا باتباع جميع الخطوات يدويًا ، وقد يكون هذا جيدًا لأغراض التدريب وفهم المبادئ الأساسية.
قم بتشغيل الأوامر المدرجة في المقالة يدويًا إذا كنت تريد فقط تجربة LTSP بدون ملف Dockerfile.


قائمة الرقع المستخدمة


في الوقت الحالي ، لدى LTSP بعض العيوب ، ومؤلفو المشروع ليسوا على استعداد كبير لقبول التصحيحات. لحسن الحظ ، يمكن تخصيص LTSP بسهولة ، لذلك قمت بإعداد بعض التصحيحات لنفسي ، وسأعطيها هنا.
ربما يوما ما سوف تنضج في الشوكة إذا قبل المجتمع قراري بحرارة.


  • ميزة grub.diff
    بشكل افتراضي ، لا يدعم LTSP EFI ، لذلك قمت بإعداد تصحيح يضيف GRUB2 مع دعم EFI.
  • feature_preinit.diff
    يضيف هذا التصحيح خيار PREINIT إلى lts.conf ، والذي يسمح لك بتشغيل أوامر عشوائية قبل استدعاء الحرف الرئيسي. يمكن أن يكون هذا مفيدًا لتعديل وحدات systemd وإعدادات الشبكة. من الجدير بالذكر أنه يتم حفظ جميع المتغيرات من بيئة التمهيد ، ويمكنك استخدامها في البرامج النصية الخاصة بك التي يتم استدعاؤها من خلال هذا الخيار.
  • feature_initramfs_params_from_lts_conf.diff
    يحل المشكلة مع خيار NBD_TO_RAM المعطل ، بعد هذا التصحيح يمكنك تحديده في lts.conf داخل chroot. (ليست تلك الموجودة في دليل tftp)
  • nbd-server-wrapper.sh
    هذا ليس تصحيحًا ، ولكنه مجرد نص برمجي ، يسمح لك بتشغيل خادم nbd في foregroud ، ستحتاجه إذا كنت ترغب في تشغيل خادم nbd داخل حاوية Docker.

مراحل Dockerfile


سنستخدم بناء المرحلة في ملف Dockerfile لحفظ الأجزاء الضرورية فقط من صورة عامل الميناء لدينا ، وسيتم استبعاد الأجزاء المتبقية غير المستخدمة من الصورة النهائية.


 ltsp-base (    ltsp ) | |---basesystem | ( chroot-     ) | | | |---builder | | (    ,  ) | | | '---ltsp-image | (  , docker, kubelet   squashed ) | '---final-stage ( squashed ,   initramfs   stage) 

المرحلة 1: قاعدة ltsp


حسنًا ، لنبدأ ، هذا هو الجزء الأول من ملف Dockerfile:


 FROM ubuntu:16.04 as ltsp-base ADD nbd-server-wrapper.sh /bin/ ADD /patches/feature-grub.diff /patches/feature-grub.diff RUN apt-get -y update \ && apt-get -y install \ ltsp-server \ tftpd-hpa \ nbd-server \ grub-common \ grub-pc-bin \ grub-efi-amd64-bin \ curl \ patch \ && sed -i 's|in_target mount|in_target_nofail mount|' \ /usr/share/debootstrap/functions \ #   EFI   Grub (#1745251) && patch -p2 -d /usr/sbin < /patches/feature-grub.diff \ && rm -rf /var/lib/apt/lists \ && apt-get clean 

في الوقت الحالي ، تم تثبيت صورة عامل الميناء لدينا بالفعل:


  • خادم NBD
  • خادم TFTP
  • نصوص LTSP مع دعم محمل إقلاع grub (لـ EFI)

المرحلة 2: نظام الأساس


في هذه المرحلة ، سنقوم بإعداد بيئة chroot مع النظام الأساسي وتثبيت البرنامج الرئيسي مع kernel.
سنستخدم debootstrap المعتاد بدلاً من ltsp-build-client لإعداد الصورة ، لأن ltsp-build-client سيقوم بتثبيت واجهة المستخدم الرسومية وبعض الأشياء الأخرى غير الضرورية التي من الواضح أننا لن نكون مفيدين لنشر الخوادم.


 FROM ltsp-base as basesystem ARG DEBIAN_FRONTEND=noninteractive #    RUN mkdir -p /opt/ltsp/amd64/proc/self/fd \ && touch /opt/ltsp/amd64/proc/self/fd/3 \ && debootstrap --arch amd64 xenial /opt/ltsp/amd64 \ && rm -rf /opt/ltsp/amd64/proc/* #   RUN echo "\ deb http://archive.ubuntu.com/ubuntu xenial main restricted universe multiverse\n\ deb http://archive.ubuntu.com/ubuntu xenial-updates main restricted universe multiverse\n\ deb http://archive.ubuntu.com/ubuntu xenial-security main restricted universe multiverse" \ > /opt/ltsp/amd64/etc/apt/sources.list \ && ltsp-chroot apt-get -y update \ && ltsp-chroot apt-get -y upgrade #   LTSP RUN ltsp-chroot apt-get -y install ltsp-client-core #   initramfs # 1:    /etc/lts.conf    (#1680490) # 2:   PREINIT   lts.conf ADD /patches /patches RUN patch -p4 -d /opt/ltsp/amd64/usr/share < /patches/feature_initramfs_params_from_lts_conf.diff \ && patch -p3 -d /opt/ltsp/amd64/usr/share < /patches/feature_preinit.diff #  LTSP_NBD_TO_RAM    ,     ram: RUN echo "[Default]\nLTSP_NBD_TO_RAM = true" \ > /opt/ltsp/amd64/etc/lts.conf #   RUN echo 'APT::Install-Recommends "0";\nAPT::Install-Suggests "0";' \ >> /opt/ltsp/amd64/etc/apt/apt.conf.d/01norecommend \ && ltsp-chroot apt-get -y install \ software-properties-common \ apt-transport-https \ ca-certificates \ ssh \ bridge-utils \ pv \ jq \ vlan \ bash-completion \ screen \ vim \ mc \ lm-sensors \ htop \ jnettop \ rsync \ curl \ wget \ tcpdump \ arping \ apparmor-utils \ nfs-common \ telnet \ sysstat \ ipvsadm \ ipset \ make #   RUN ltsp-chroot apt-get -y install linux-generic-hwe-16.04 

يرجى ملاحظة أن بعض الحزم ، مثل lvm2 ، قد تواجه مشاكل. لم يتم تحسينها بشكل كامل للتثبيت في جذر غير مميز. تحاول البرامج النصية لما بعد التثبيت استدعاء الأوامر ذات الامتيازات التي قد تفشل وتمنع تثبيت الحزمة بأكملها.


الحل:


  • يمكن تثبيت بعضها دون مشاكل إذا قمت بتثبيتها قبل تثبيت النواة (على سبيل المثال ، lvm2)
  • ولكن بالنسبة للبعض منهم ، ستحتاج إلى استخدام هذا الحل البديل للتثبيت دون تثبيت برنامج نصي.

المرحلة 3: البناء


في هذه المرحلة ، يمكننا جمع جميع البرامج الضرورية ووحدات النواة من المصادر ، ومن الرائع جدًا أن تتمكن من القيام بذلك في هذه المرحلة ، في الوضع التلقائي بالكامل.
تخطي هذه الخطوة إذا لم تكن بحاجة إلى جمع أي شيء من الفنانين.


سأعطيك مثالاً على تثبيت أحدث إصدار من برنامج تشغيل MLNX_EN:


 FROM basesystem as builder #  cpuinfo (   ) RUN cp /proc/cpuinfo /opt/ltsp/amd64/proc/cpuinfo #    Mellanox driver RUN ltsp-chroot sh -cx \ ' VERSION=4.3-1.0.1.0-ubuntu16.04-x86_64 \ && curl -L http://www.mellanox.com/downloads/ofed/MLNX_EN-${VERSION%%-ubuntu*}/mlnx-en-${VERSION}.tgz \ | tar xzf - \ && export \ DRIVER_DIR="$(ls -1 | grep "MLNX_OFED_LINUX-\|mlnx-en-")" \ KERNEL="$(ls -1t /lib/modules/ | head -n1)" \ && cd "$DRIVER_DIR" \ && ./*install --kernel "$KERNEL" --without-dkms --add-kernel-support \ && cd - \ && rm -rf "$DRIVER_DIR" /tmp/mlnx-en* /tmp/ofed*' #    RUN ltsp-chroot sh -c \ ' export KERNEL="$(ls -1t /usr/src/ | grep -m1 "^linux-headers" | sed "s/^linux-headers-//g")" \ && tar cpzf /modules.tar.gz /lib/modules/${KERNEL}/updates' 

المرحلة 4: صورة ltsp


في هذه المرحلة سنحدد ما جمعناه في الخطوة السابقة:


 FROM basesystem as ltsp-image #    COPY --from=builder /opt/ltsp/amd64/modules.tar.gz /opt/ltsp/amd64/modules.tar.gz #    RUN ltsp-chroot sh -c \ ' export KERNEL="$(ls -1t /usr/src/ | grep -m1 "^linux-headers" | sed "s/^linux-headers-//g")" \ && tar xpzf /modules.tar.gz \ && depmod -a "${KERNEL}" \ && rm -f /modules.tar.gz' 

سنقوم الآن بإجراء تغييرات إضافية لإكمال صورة LTSP الخاصة بنا:


 #  docker RUN ltsp-chroot sh -c \ ' curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - \ && echo "deb https://download.docker.com/linux/ubuntu xenial stable" \ > /etc/apt/sources.list.d/docker.list \ && apt-get -y update \ && apt-get -y install \ docker-ce=$(apt-cache madison docker-ce | grep 18.06 | head -1 | awk "{print $ 3}")' #    docker RUN DOCKER_OPTS="$(echo \ --storage-driver=overlay2 \ --iptables=false \ --ip-masq=false \ --log-driver=json-file \ --log-opt=max-size=10m \ --log-opt=max-file=5 \ )" \ && sed "/^ExecStart=/ s|$| $DOCKER_OPTS|g" \ /opt/ltsp/amd64/lib/systemd/system/docker.service \ > /opt/ltsp/amd64/etc/systemd/system/docker.service #  kubeadm, kubelet  kubectl RUN ltsp-chroot sh -c \ ' curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - \ && echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" \ > /etc/apt/sources.list.d/kubernetes.list \ && apt-get -y update \ && apt-get -y install kubelet kubeadm kubectl cri-tools' #    RUN rm -f /opt/ltsp/amd64/etc/apt/apt.conf.d/20auto-upgrades #   apparmor RUN ltsp-chroot find /etc/apparmor.d \ -maxdepth 1 \ -type f \ -name "sbin.*" \ -o -name "usr.*" \ -exec ln -sf "{}" /etc/apparmor.d/disable/ \; #    (cmdline) RUN KERNEL_OPTIONS="$(echo \ init=/sbin/init-ltsp \ forcepae \ console=tty1 \ console=ttyS0,9600n8 \ nvme_core.default_ps_max_latency_us=0 \ )" \ && sed -i "/^CMDLINE_LINUX_DEFAULT=/ s|=.*|=\"${KERNEL_OPTIONS}\"|" \ "/opt/ltsp/amd64/etc/ltsp/update-kernels.conf" 

الآن قم بعمل صورة ممزوجة من جذرنا:


 #   RUN rm -rf /opt/ltsp/amd64/var/lib/apt/lists \ && ltsp-chroot apt-get clean #  squashed  RUN ltsp-update-image 

المرحلة 5: المرحلة النهائية


في المرحلة النهائية ، نقوم فقط بحفظ صورتنا ونسقنا الممزقة باستخدام initramfs


 FROM ltsp-base COPY --from=ltsp-image /opt/ltsp/images /opt/ltsp/images COPY --from=ltsp-image /etc/nbd-server/conf.d /etc/nbd-server/conf.d COPY --from=ltsp-image /var/lib/tftpboot /var/lib/tftpboot 

حسنًا ، لدينا الآن صورة عامل ميناء تشمل:


  • خادم TFTP
  • خادم NBD
  • محمل الإقلاع
  • نواة مع initramfs
  • صورة الجذور ممرود

استخدم


حسنًا ، الآن بعد أن أصبحت صورة Docker مع خادم LTSP و kernel و initramfs و rootfs squashed جاهزة تمامًا ، يمكننا تشغيل النشر معها.


يمكننا القيام بذلك كالمعتاد ، ولكن هناك مشكلة أخرى علينا حلها.
للأسف ، لا يمكننا استخدام خدمة Kubernetes المعتادة لنشرنا ، لأنه في وقت التمهيد ليست العقد جزءًا من مجموعة Kubernetes وتحتاج إلى استخدام externalIP ، لكن Kubernetes تستخدم دائمًا NAT لـ externalIP ولا توجد حاليًا طريقة لتغيير هذا السلوك.


أعرف طريقتين لتجنب هذا: استخدام hostNetwork: true أو استخدام الأنابيب ، الخيار الثاني سيوفر لنا أيضًا التسامح مع الخطأ ، كما في حالة الفشل ، سيتم نقل عنوان IP إلى عقدة أخرى مع الحاوية. لسوء الحظ ، لا تعد المواسير طريقة محلية وأقل أمانًا.
إذا كنت تعرف أي حل أكثر ملاءمة ، فيرجى إخبارنا بذلك.


فيما يلي مثال للنشر مع hostNetwork:


 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: ltsp-server labels: app: ltsp-server spec: selector: matchLabels: name: ltsp-server replicas: 1 template: metadata: labels: name: ltsp-server spec: hostNetwork: true containers: - name: tftpd image: registry.example.org/example/ltsp:latest command: [ "/usr/sbin/in.tftpd", "-L", "-u", "tftp", "-a", ":69", "-s", "/var/lib/tftpboot" ] lifecycle: postStart: exec: command: ["/bin/sh", "-c", "cd /var/lib/tftpboot/ltsp/amd64; ln -sf config/lts.conf ." ] volumeMounts: - name: config mountPath: "/var/lib/tftpboot/ltsp/amd64/config" - name: nbd-server image: registry.example.org/example/ltsp:latest command: [ "/bin/nbd-server-wrapper.sh" ] volumes: - name: config configMap: name: ltsp-config 

كما لاحظت ، يُستخدم ملف configmap مع ملف lts.conf هنا أيضًا.
كمثال ، سأقدم جزءًا من التكوين الخاص بي:


 apiVersion: v1 kind: ConfigMap metadata: name: ltsp-config data: lts.conf: | [default] KEEP_SYSTEM_SERVICES = "ssh ureadahead dbus-org.freedesktop.login1 systemd-logind polkitd cgmanager ufw rpcbind nfs-kernel-server" PREINIT_00_TIME = "ln -sf /usr/share/zoneinfo/Europe/Prague /etc/localtime" PREINIT_01_FIX_HOSTNAME = "sed -i '/^127.0.0.2/d' /etc/hosts" PREINIT_02_DOCKER_OPTIONS = "sed -i 's|^ExecStart=.*|ExecStart=/usr/bin/dockerd -H fd:// --storage-driver overlay2 --iptables=false --ip-masq=false --log-driver=json-file --log-opt=max-size=10m --log-opt=max-file=5|' /etc/systemd/system/docker.service" FSTAB_01_SSH = "/dev/data/ssh /etc/ssh ext4 nofail,noatime,nodiratime 0 0" FSTAB_02_JOURNALD = "/dev/data/journal /var/log/journal ext4 nofail,noatime,nodiratime 0 0" FSTAB_03_DOCKER = "/dev/data/docker /var/lib/docker ext4 nofail,noatime,nodiratime 0 0" # Each command will stop script execution when fail RCFILE_01_SSH_SERVER = "cp /rofs/etc/ssh/*_config /etc/ssh; ssh-keygen -A" RCFILE_02_SSH_CLIENT = "mkdir -p /root/.ssh/; echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBSLYRaORL2znr1V4a3rjDn3HDHn2CsvUNK1nv8+CctoICtJOPXl6zQycI9KXNhANfJpc6iQG1ZPZUR74IiNhNIKvOpnNRPyLZ5opm01MVIDIZgi9g0DUks1g5gLV5LKzED8xYKMBmAfXMxh/nsP9KEvxGvTJB3OD+/bBxpliTl5xY3Eu41+VmZqVOz3Yl98+X8cZTgqx2dmsHUk7VKN9OZuCjIZL9MtJCZyOSRbjuo4HFEssotR1mvANyz+BUXkjqv2pEa0I2vGQPk1VDul5TpzGaN3nOfu83URZLJgCrX+8whS1fzMepUYrbEuIWq95esjn0gR6G4J7qlxyguAb9 admin@kubernetes' >> /root/.ssh/authorized_keys" RCFILE_03_KERNEL_DEBUG = "sysctl -w kernel.unknown_nmi_panic=1 kernel.softlockup_panic=1; modprobe netconsole netconsole=@/vmbr0,@10.9.0.15/" RCFILE_04_SYSCTL = "sysctl -w fs.file-max=20000000 fs.nr_open=20000000 net.ipv4.neigh.default.gc_thresh1=80000 net.ipv4.neigh.default.gc_thresh2=90000 net.ipv4.neigh.default.gc_thresh3=100000" RCFILE_05_FORWARD = "echo 1 > /proc/sys/net/ipv4/ip_forward" RCFILE_06_MODULES = "modprobe br_netfilter" RCFILE_07_JOIN_K8S = "kubeadm join --token 2a4576.504356e45fa3d365 10.9.0.20:6443 --discovery-token-ca-cert-hash sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" " سه-آر إس إيه AAAAB3NzaC1yc2EAAAADAQABAAABAQDBSLYRaORL2znr1V4a3rjDn3HDHn2CsvUNK1nv8 + CctoICtJOPXl6zQycI9KXNhANfJpc6iQG1ZPZUR74IiNhNIKvOpnNRPyLZ5opm01MVIDIZgi9g0DUks1g5gLV5LKzED8xYKMBmAfXMxh / nsP9KEvxGvTJB3OD + / + bBxpliTl5xY3Eu41 VmZqVOz3Yl98 + X8cZTgqx2dmsHUk7VKN9OZuCjIZL9MtJCZyOSRbjuo4HFEssotR1mvANyz + BUXkjqv2pEa0I2vGQPk1VDul5TpzGaN3nOfu83URZLJgCrX + 8whS1fzMepUYrbEuIWq95esjn0gR6G4J7qlxyguAb9 الادارة @ kubernetes '>> /root/.ssh/authorized_keys " apiVersion: v1 kind: ConfigMap metadata: name: ltsp-config data: lts.conf: | [default] KEEP_SYSTEM_SERVICES = "ssh ureadahead dbus-org.freedesktop.login1 systemd-logind polkitd cgmanager ufw rpcbind nfs-kernel-server" PREINIT_00_TIME = "ln -sf /usr/share/zoneinfo/Europe/Prague /etc/localtime" PREINIT_01_FIX_HOSTNAME = "sed -i '/^127.0.0.2/d' /etc/hosts" PREINIT_02_DOCKER_OPTIONS = "sed -i 's|^ExecStart=.*|ExecStart=/usr/bin/dockerd -H fd:// --storage-driver overlay2 --iptables=false --ip-masq=false --log-driver=json-file --log-opt=max-size=10m --log-opt=max-file=5|' /etc/systemd/system/docker.service" FSTAB_01_SSH = "/dev/data/ssh /etc/ssh ext4 nofail,noatime,nodiratime 0 0" FSTAB_02_JOURNALD = "/dev/data/journal /var/log/journal ext4 nofail,noatime,nodiratime 0 0" FSTAB_03_DOCKER = "/dev/data/docker /var/lib/docker ext4 nofail,noatime,nodiratime 0 0" # Each command will stop script execution when fail RCFILE_01_SSH_SERVER = "cp /rofs/etc/ssh/*_config /etc/ssh; ssh-keygen -A" RCFILE_02_SSH_CLIENT = "mkdir -p /root/.ssh/; echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBSLYRaORL2znr1V4a3rjDn3HDHn2CsvUNK1nv8+CctoICtJOPXl6zQycI9KXNhANfJpc6iQG1ZPZUR74IiNhNIKvOpnNRPyLZ5opm01MVIDIZgi9g0DUks1g5gLV5LKzED8xYKMBmAfXMxh/nsP9KEvxGvTJB3OD+/bBxpliTl5xY3Eu41+VmZqVOz3Yl98+X8cZTgqx2dmsHUk7VKN9OZuCjIZL9MtJCZyOSRbjuo4HFEssotR1mvANyz+BUXkjqv2pEa0I2vGQPk1VDul5TpzGaN3nOfu83URZLJgCrX+8whS1fzMepUYrbEuIWq95esjn0gR6G4J7qlxyguAb9 admin@kubernetes' >> /root/.ssh/authorized_keys" RCFILE_03_KERNEL_DEBUG = "sysctl -w kernel.unknown_nmi_panic=1 kernel.softlockup_panic=1; modprobe netconsole netconsole=@/vmbr0,@10.9.0.15/" RCFILE_04_SYSCTL = "sysctl -w fs.file-max=20000000 fs.nr_open=20000000 net.ipv4.neigh.default.gc_thresh1=80000 net.ipv4.neigh.default.gc_thresh2=90000 net.ipv4.neigh.default.gc_thresh3=100000" RCFILE_05_FORWARD = "echo 1 > /proc/sys/net/ipv4/ip_forward" RCFILE_06_MODULES = "modprobe br_netfilter" RCFILE_07_JOIN_K8S = "kubeadm join --token 2a4576.504356e45fa3d365 10.9.0.20:6443 --discovery-token-ca-cert-hash sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" 

  • KEEP_SYSTEM_SERVICES - أثناء التمهيد LTSP يحذف تلقائيًا بعض الخدمات ، هذا المتغير مطلوب لمنع هذا السلوك للخدمات المدرجة هنا.
  • PREINIT_ * - سيتم تنفيذ الأوامر المدرجة هنا قبل تشغيل systemd (تمت إضافة هذه الميزة بواسطة patch_preinit.diff patch)
  • FSTAB_ * - ستتم إضافة الأسطر المدرجة هنا إلى ملف /etc/fstab .
    قد تلاحظ أنني nofail خيار nofail ، فهو يعطي السلوك التالي ، أنه في حالة عدم وجود القسم ، يستمر التنزيل بدون أخطاء.
  • RCFILE_ * - ستتم إضافة هذه الأوامر إلى ملف rc.local ، الذي سيتم استدعاؤه بواسطة systemd في وقت التمهيد.
    هنا أقوم بتحميل وحدات kernel الضرورية ، وتشغيل بعض إعدادات sysctl ، ثم تشغيل أمر kubeadm join ، الذي يضيف العقدة إلى مجموعة kubernetes.

يمكنك الحصول على معلومات أكثر تفصيلاً حول جميع المتغيرات من صفحة دليل lts.conf .


الآن يمكنك تكوين DHCP الخاص بك. بشكل أساسي ، ما تحتاجه هو تحديد خيارات next-server filename .


أستخدم خادم ISC-DHCP ، وسأعطي مثالاً عن dhcpd.conf :


 shared-network ltsp-netowrk { subnet 10.9.0.0 netmask 255.255.0.0 { authoritative; default-lease-time -1; max-lease-time -1; option domain-name "example.org"; option domain-name-servers 10.9.0.1; option routers 10.9.0.1; next-server ltsp-1; # write ltsp-server hostname here if option architecture = 00:07 { filename "/ltsp/amd64/grub/x86_64-efi/core.efi"; } else { filename "/ltsp/amd64/grub/i386-pc/core.0"; } range 10.9.200.0 10.9.250.254; } 

يمكنك البدء بهذا ، ولكن بالنسبة لي ، لدي العديد من خوادم LTSP ولكل عقدة أقوم بتكوين عنوان IP ثابت منفصل والخيارات الضرورية باستخدام Ansible playbook.


جرب بدء العقدة الأولى وإذا تم عمل كل شيء بشكل صحيح ، فستحصل على نظام محمل عليه. ستتم أيضًا إضافة العقدة إلى مجموعة Kubernetes.


الآن يمكنك محاولة إجراء التغييرات الخاصة بك.


إذا كنت بحاجة إلى شيء أكثر ، فلاحظ أنه يمكن تخصيص LTSP بسهولة شديدة لتناسب احتياجاتك. لا تتردد في البحث في المصدر ، حيث يمكنك العثور على الكثير من الإجابات.


انضم إلى قناة Telegram: ltsp_ru .

Source: https://habr.com/ru/post/ar423785/


All Articles