Bangun server server yang siap-jaringan untuk Kubernet menggunakan LTSP


Pada artikel ini, saya ingin menunjukkan kepada Anda satu teknologi keren, saya berhasil menggunakannya untuk Kubernetes. Ini bisa sangat berguna untuk membangun kelompok besar.


Mulai sekarang, Anda tidak perlu lagi berpikir untuk menginstal OS dan paket terpisah untuk setiap node. Mengapa Anda dapat melakukan semua ini secara otomatis melalui Dockerfile!


Fakta bahwa Anda dapat membeli ratusan server baru, menambahkannya ke lingkungan kerja Anda dan segera membuatnya siap untuk digunakan sungguh menakjubkan!


Penasaran? Sekarang mari kita bicara tentang semuanya secara berurutan.


Ringkasan


Untuk memulai, kita perlu memahami persis bagaimana sirkuit ini bekerja.


Secara singkat, untuk semua node kami sedang mempersiapkan satu gambar dengan OS, Docker, Kubelet dan yang lainnya.
Gambar sistem ini bersama dengan kernel secara otomatis dibangun oleh CI menggunakan Dockerfile.
Node akhir memuat OS dan kernel dari gambar ini secara langsung melalui jaringan.


Node menggunakan overlayfs sebagai sistem file root, jadi jika terjadi reboot, perubahan apa pun akan hilang (serta dalam kasus kontainer buruh pelabuhan).
Ada konfigurasi utama, di dalamnya Anda dapat menggambarkan titik-titik mount dan beberapa perintah yang harus dieksekusi ketika node dimuat (misalnya, perintah untuk menambahkan kunci ssh dan kubeadm join )


Proses persiapan gambar


Kami akan menggunakan proyek LTSP karena memberi kami semua yang kami butuhkan untuk mengatur boot jaringan.
Secara umum, LTSP adalah kumpulan skrip shell yang membuat hidup kita jauh lebih mudah.


Ini menyediakan modul initramfs, beberapa skrip pembantu, dan beberapa jenis sistem konfigurasi yang menyiapkan sistem pada tahap awal pemuatan, bahkan sebelum memanggil init.


Beginilah tampilan prosedur persiapan gambar:


  • Menyebarkan sistem basis di lingkungan chroot.
  • Kami melakukan perubahan yang diperlukan, menginstal perangkat lunak.
  • Jalankan perintah ltsp-build-image

Tepat setelah itu Anda akan mendapatkan gambar terkompresi dari chroot ini dengan semua perangkat lunak yang diinstal di dalamnya.
Setiap node akan mengunduh gambar ini saat boot dan menggunakannya sebagai rootfs.
Untuk memperbarui, cukup restart simpul, gambar baru akan diunduh dan digunakan untuk rootfs.


Komponen server


Bagian server LTSP dalam kasus kami hanya mencakup dua komponen:


  • TFTP server - TFTP adalah protokol inisialisasi, digunakan untuk memuat kernel, initramfs dan config-lts.conf utama.
  • Server NBD - Protokol NBD yang digunakan untuk mengirimkan gambar rootf yang terkompresi ke klien. Ini adalah metode tercepat, tetapi jika diinginkan, itu dapat diganti dengan NFS atau AoE.

Anda juga harus memiliki:


  • Server DHCP - ia akan mendistribusikan konfigurasi IP dan beberapa opsi tambahan yang dibutuhkan klien kami sehingga mereka dapat melakukan booting dari server LTSP kami.

Proses pemuatan simpul


Deskripsi proses pemuatan simpul


  • Pertama, node akan meminta alamat IP DHCP dan opsi untuk next-server , filename .
  • Kemudian node akan menerapkan pengaturan dan mengunduh bootloader (pxelinux atau grub)
  • Bootloader akan mengunduh dan memuat konfigurasi dengan kernel dan initramfs.
  • Kemudian ia akan memuat kernel dan initramfs dengan opsi spesifik yang ditentukan untuk kernel.
  • Pada saat boot, modul initramfs akan memproses parameter dari cmdline dan melakukan beberapa tindakan, seperti menghubungkan perangkat nbd, menyiapkan rootfs overlay, dll.
  • Setelah itu, alih-alih init biasa, ltsp-init khusus akan dipanggil.
  • Skrip ltsp-init akan menyiapkan sistem sejak awal sebelum init utama dipanggil. Pada dasarnya, opsi dari lts.conf (file konfigurasi utama) digunakan di sini: ini memperbarui catatan dalam fstab dan rc.local, dll.
  • Kemudian akan ada panggilan ke init utama (systemd), yang akan memuat sistem yang sudah dikonfigurasi seperti biasa, me-mount sumber daya bersama dari fstab, meluncurkan target dan layanan, dan menjalankan perintah dari rc.local.
  • Sebagai hasilnya, kami mendapatkan sistem yang sepenuhnya dikonfigurasi dan dimuat, siap untuk tindakan lebih lanjut.

Persiapan server


Seperti yang saya katakan, saya menyiapkan server LTSP dengan gambar terjepit secara otomatis menggunakan Dockerfile. Metode ini tidak buruk, karena semua langkah untuk membangun dapat dijelaskan di repositori git Anda. Anda dapat mengontrol versi, menggunakan tag, menerapkan CI dan semua sama yang akan Anda gunakan untuk persiapan proyek Docker biasa.


Di sisi lain, Anda dapat menggunakan server LTSP secara manual dengan mengikuti semua langkah secara manual, ini bisa baik untuk tujuan pelatihan dan untuk memahami prinsip-prinsip dasar.
Jalankan perintah yang tercantum dalam artikel secara manual jika Anda hanya ingin mencoba LTSP tanpa Dockerfile.


Daftar tambalan bekas


Saat ini, LTSP memiliki beberapa kekurangan, dan penulis proyek tidak mau menerima koreksi. Untungnya, LTSP mudah disesuaikan, jadi saya menyiapkan beberapa tambalan untuk diri saya sendiri, saya akan berikan di sini.
Mungkin suatu hari nanti saya akan matang dalam percabangan jika komunitas dengan hangat menerima keputusan saya.


  • feature-grub.diff
    Secara default, LTSP tidak mendukung EFI, jadi saya menyiapkan tambalan yang menambahkan GRUB2 dengan dukungan EFI.
  • feature_preinit.diff
    Patch ini menambahkan opsi PREINIT ke lts.conf, yang memungkinkan Anda untuk menjalankan perintah arbitrer sebelum memanggil init utama. Ini dapat berguna untuk memodifikasi unit systemd dan pengaturan jaringan. Perlu dicatat bahwa semua variabel dari lingkungan boot disimpan, dan Anda dapat menggunakannya dalam skrip yang dipanggil melalui opsi ini.
  • feature_initramfs_params_from_lts_conf.diff
    Memecahkan masalah dengan opsi NBD_TO_RAM yang dinonaktifkan, setelah tambalan ini Anda dapat menentukannya di lts.conf di dalam chroot. (bukan yang ada di direktori tftp)
  • nbd-server-wrapper.sh
    Ini bukan tambalan, tetapi hanya skrip shell, ini memungkinkan Anda untuk menjalankan nbd-server di foregroud, Anda akan memerlukannya jika Anda ingin menjalankan nbd-server di dalam wadah Docker.

Tahap Dockerfile


Kami akan menggunakan tahap bangunan di Dockerfile kami untuk menyimpan hanya bagian-bagian yang diperlukan dari gambar buruh pelabuhan kami, bagian-bagian yang tidak terpakai yang tersisa akan dikeluarkan dari gambar akhir.


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

Tahap 1: ltsp-base


OK, mari kita mulai, ini adalah bagian pertama dari Dockerfile kami:


 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 

Saat ini, gambar buruh pelabuhan kami telah diinstal sebagai berikut:


  • Server NBD
  • Server TFTP
  • Skrip LTSP dengan dukungan bootloader grub (untuk EFI)

Tahap 2: sistem basis


Pada tahap ini, kami akan menyiapkan lingkungan chroot dengan sistem dasar dan menginstal perangkat lunak utama dengan kernel.
Kami akan menggunakan debootstrap biasa alih - alih ltsp-build-client untuk menyiapkan gambar, karena ltsp-build-client akan menginstal GUI dan beberapa hal lain yang tidak perlu yang kami jelas tidak akan berguna untuk menggunakan server.


 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 

Harap dicatat bahwa beberapa paket, seperti lvm2, mungkin mengalami masalah. Mereka tidak sepenuhnya dioptimalkan untuk instalasi dalam chroot yang tidak terjangkau. Skrip postinstall mereka mencoba untuk memanggil perintah istimewa yang mungkin gagal dan memblokir instalasi seluruh paket.


Solusi:


  • Beberapa dapat diinstal tanpa masalah jika Anda menginstalnya sebelum menginstal kernel (misalnya, lvm2)
  • Tetapi untuk beberapa dari mereka, Anda harus menggunakan solusi ini untuk menginstal tanpa skrip postinstall.

Tahap 3: pembangun


Pada tahap ini, kita dapat mengumpulkan semua perangkat lunak dan modul kernel yang diperlukan dari sumber, sangat keren bahwa dimungkinkan untuk melakukan ini pada tahap ini, dalam mode otomatis penuh.
Lewati langkah ini jika Anda tidak perlu mengumpulkan apa pun dari artis.


Saya akan memberikan contoh menginstal driver MLNX_EN versi terbaru:


 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' 

Tahap 4: ltsp-image


Pada tahap ini kami akan menetapkan apa yang telah kami kumpulkan di langkah sebelumnya:


 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' 

Sekarang kami akan membuat perubahan tambahan untuk melengkapi gambar LTSP kami:


 #  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" 

Sekarang buat gambar pendek dari chroot kami:


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

Tahap 5: Tahap akhir


Pada tahap akhir, kita hanya menyimpan image dan kernel yang tergencet dengan 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 

Oke, sekarang kami memiliki gambar buruh pelabuhan yang meliputi:


  • Server TFTP
  • Server NBD
  • bootloader yang dikonfigurasi
  • kernel dengan initramfs
  • gambar rootfs tergencet

Gunakan


OK, sekarang karena gambar Docker kami dengan server LTSP, kernel, initramfs dan squffs rootfs sudah sepenuhnya siap, kami dapat menjalankan penyebaran dengan itu.


Kita bisa melakukan ini seperti biasa, tetapi ada masalah lain yang harus kita pecahkan.
Sayangnya, kami tidak dapat menggunakan layanan Kubernet biasa untuk penyebaran kami, karena pada saat boot node bukan bagian dari kluster Kubernet dan mereka perlu menggunakan externalIP, tetapi Kubernetes selalu menggunakan NAT untuk externalIP dan saat ini tidak ada cara untuk mengubah perilaku ini.


Saya tahu dua cara untuk menghindari ini: gunakan hostNetwork: true atau use pipework , opsi kedua juga akan memberi kita toleransi kesalahan, seperti jika terjadi kegagalan, alamat IP akan pindah ke node lain dengan wadah. Sayangnya pipework bukan metode asli dan kurang aman.
Jika Anda mengetahui solusi yang lebih cocok, silakan beri tahu kami.


Berikut adalah contoh penerapan dengan 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 

Seperti yang mungkin Anda perhatikan, configmap dengan file lts.conf juga digunakan di sini.
Sebagai contoh, saya akan memberikan bagian dari konfigurasi saya:


 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" 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBSLYRaORL2znr1V4a3rjDn3HDHn2CsvUNK1nv8 + CctoICtJOPXl6zQycI9KXNhANfJpc6iQG1ZPZUR74IiNhNIKvOpnNRPyLZ5opm01MVIDIZgi9g0DUks1g5gLV5LKzED8xYKMBmAfXMxh / nsP9KEvxGvTJB3OD + / bBxpliTl5xY3Eu41 + VmZqVOz3Yl98 + X8cZTgqx2dmsHUk7VKN9OZuCjIZL9MtJCZyOSRbjuo4HFEssotR1mvANyz + BUXkjqv2pEa0I2vGQPk1VDul5TpzGaN3nOfu83URZLJgCrX + 8whS1fzMepUYrbEuIWq95esjn0gR6G4J7qlxyguAb9 admin @ 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 - selama boot LTSP secara otomatis menghapus beberapa layanan, variabel ini diperlukan untuk mencegah perilaku ini untuk layanan yang tercantum di sini.
  • PREINIT_ * - perintah yang tercantum di sini akan dieksekusi sebelum menjalankan systemd (fitur ini ditambahkan oleh feature_preinit.diff patch)
  • FSTAB_ * - baris yang tercantum di sini akan ditambahkan ke file /etc/fstab .
    Anda mungkin memperhatikan bahwa saya menggunakan opsi nofail , ini memberikan perilaku berikut, bahwa jika bagian itu tidak ada, unduhan berlanjut tanpa kesalahan.
  • RCFILE_ * - perintah ini akan ditambahkan ke file rc.local , yang akan dipanggil oleh systemd saat boot.
    Di sini saya memuat modul kernel yang diperlukan, menjalankan beberapa pengaturan sysctl, dan kemudian menjalankan perintah kubeadm join , yang menambahkan node ke cluster kubernetes.

Anda bisa mendapatkan informasi lebih rinci tentang semua variabel dari halaman manual lts.conf .


Sekarang Anda dapat mengkonfigurasi DHCP Anda. Pada dasarnya, yang Anda butuhkan di sana adalah untuk menentukan opsi next-server dan filename .


Saya menggunakan server ISC-DHCP, saya akan memberikan contoh 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; } 

Anda dapat mulai dengan ini, tetapi bagi saya, saya memiliki beberapa server LTSP dan untuk setiap node saya mengkonfigurasi alamat IP statis yang terpisah dan opsi yang diperlukan menggunakan buku pedoman yang dimungkinkan.


Coba mulai simpul pertama Anda dan jika semuanya dilakukan dengan benar, Anda akan mendapatkan sistem yang dimuat di dalamnya. Node juga akan ditambahkan ke cluster Kubernetes.


Sekarang Anda dapat mencoba membuat perubahan sendiri.


Jika Anda membutuhkan sesuatu yang lebih, perhatikan bahwa LTSP dapat dengan mudah disesuaikan agar sesuai dengan kebutuhan Anda. Jangan ragu untuk melihat ke sumbernya, di sana Anda dapat menemukan banyak jawaban.


Bergabunglah dengan saluran Telegram kami: @ltsp_ru .

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


All Articles