From 4865b6bdfa335efc411398fe29ffc551681b0a5e Mon Sep 17 00:00:00 2001 From: nunix Date: Thu, 14 Dec 2023 13:21:53 +0000 Subject: [PATCH] deploy: 0b0bbac1e436f8cbf6ef6db97d008b0e5b5556ac --- 1.2/architecture/index.html | 7 ++++--- 1.2/backup/index.html | 7 ++++--- 1.2/cloud-config-reference/index.html | 7 ++++--- 1.2/cluster-reference/index.html | 9 ++++++--- 1.2/custom-certificate/index.html | 7 ++++--- 1.2/customizing/index.html | 7 ++++--- 1.2/elemental-plans/index.html | 7 ++++--- 1.2/elemental_behind_proxy/index.html | 9 ++++++--- 1.2/elementaloperatorchart-reference/index.html | 7 ++++--- 1.2/hardwarelabels/index.html | 9 ++++++--- 1.2/index.html | 7 ++++--- 1.2/installation/index.html | 7 ++++--- 1.2/inventory-management/index.html | 7 ++++--- 1.2/kubernetesversions/index.html | 7 ++++--- .../index.html | 7 ++++--- 1.2/machineregistration-reference/index.html | 7 ++++--- 1.2/quickstart-cli/index.html | 9 ++++++--- 1.2/quickstart-ui/index.html | 9 ++++++--- 1.2/rancher-vmware/index.html | 7 ++++--- 1.2/release-notes/index.html | 7 ++++--- 1.2/removable-device-cloudconfig/index.html | 7 ++++--- 1.2/restore/index.html | 7 ++++--- 1.2/seedimage-reference/index.html | 7 ++++--- 1.2/smbios/index.html | 9 ++++++--- 1.2/tpm/index.html | 9 ++++++--- 1.2/troubleshooting-rancher-upgrades/index.html | 7 ++++--- 1.2/troubleshooting-restore/index.html | 7 ++++--- 1.2/troubleshooting-upgrade/index.html | 7 ++++--- 1.2/upgrade/index.html | 9 ++++++--- 1.2/wifi/index.html | 7 ++++--- 404.html | 2 +- architecture/index.html | 7 ++++--- assets/js/007e4478.243025d0.js | 1 - assets/js/007e4478.f7288912.js | 1 + assets/js/008566e2.171e7aa9.js | 1 - assets/js/008566e2.91610a07.js | 1 + assets/js/01042c73.2cdc191c.js | 1 - assets/js/01042c73.7c197e98.js | 1 + assets/js/06b06a7e.866ad55d.js | 1 + assets/js/06b06a7e.de2342b6.js | 1 - assets/js/0c9f3389.3e3e7520.js | 1 - assets/js/0c9f3389.9ebc0052.js | 1 + assets/js/0ec254a1.68e2ea59.js | 1 - assets/js/0ec254a1.96646f8a.js | 1 + assets/js/17f29b2a.13d720c8.js | 1 - assets/js/17f29b2a.c3e81c17.js | 1 + assets/js/1b0f8c91.51385573.js | 1 - assets/js/1b0f8c91.9f2ba2e3.js | 1 + assets/js/1b128653.42b5656b.js | 1 - assets/js/1b128653.6056253e.js | 1 + assets/js/1b33c654.2500b11c.js | 1 + assets/js/1b33c654.a5895cab.js | 1 - assets/js/1c67841d.6f3ca700.js | 1 - assets/js/1c67841d.a8723990.js | 1 + assets/js/1e6929a8.b476ea49.js | 1 + assets/js/1e6929a8.bbd13471.js | 1 - assets/js/26511e9d.33d49855.js | 1 + assets/js/26511e9d.80d13872.js | 1 - .../js/{2a824f8b.d3a263b3.js => 2a824f8b.83c55e0a.js} | 2 +- assets/js/314a742e.138abbcd.js | 1 - assets/js/314a742e.cd01912c.js | 1 + assets/js/3238e5ae.812bec08.js | 1 + assets/js/3238e5ae.9c6f1068.js | 1 - assets/js/33b676a1.107946a2.js | 1 - assets/js/33b676a1.e72c30e3.js | 1 + assets/js/34e5c9d0.30eab101.js | 1 + assets/js/34e5c9d0.7676da55.js | 1 - .../js/{3b8c55ea.2c8c5b1d.js => 3b8c55ea.fe236857.js} | 2 +- assets/js/3cb329d3.7dd00817.js | 1 - assets/js/3cb329d3.cad8a96d.js | 1 + .../js/{3d72abfc.db76b006.js => 3d72abfc.1d97420d.js} | 2 +- assets/js/3f318b85.7d4d1836.js | 1 - assets/js/3f318b85.a0aef04d.js | 1 + assets/js/410f4fd3.0a373c7d.js | 1 + assets/js/410f4fd3.d472f304.js | 1 - assets/js/41a53309.20b7ee18.js | 1 - assets/js/41a53309.38b3ecaa.js | 1 + assets/js/426e6027.d7be71b0.js | 1 - assets/js/426e6027.fdfd164c.js | 1 + assets/js/43c9fc1f.7230944f.js | 1 - assets/js/43c9fc1f.9b61099e.js | 1 + assets/js/44234b90.b9123fb8.js | 1 + assets/js/44234b90.e22542ac.js | 1 - assets/js/4601e8b1.cacc4273.js | 1 + assets/js/4601e8b1.d6bdb742.js | 1 - assets/js/475573de.93ee040e.js | 1 - assets/js/475573de.fbef9d21.js | 1 + assets/js/515d27de.243480e3.js | 1 + assets/js/515d27de.cfaeb529.js | 1 - .../js/{5281b7a2.6e0ce740.js => 5281b7a2.82cee175.js} | 2 +- assets/js/54dca98f.39c023f6.js | 1 - assets/js/54dca98f.86d3ed35.js | 1 + assets/js/578c0857.2b190e0d.js | 1 + assets/js/578c0857.399a357b.js | 1 - .../js/{5792c77d.c1638897.js => 5792c77d.be7b3b80.js} | 2 +- assets/js/5c2870c5.2c517fd4.js | 1 - assets/js/5c2870c5.603ee4c7.js | 1 + assets/js/5d57b743.2e83a67c.js | 1 - assets/js/5d57b743.83252c7b.js | 1 + assets/js/5eb1fa47.7532541a.js | 1 - assets/js/5eb1fa47.9994edd5.js | 1 + assets/js/5f11e417.1d785b6d.js | 1 - assets/js/5f11e417.767dd3d1.js | 1 + assets/js/639e78ad.2a3212a7.js | 1 - assets/js/639e78ad.f78e1fd7.js | 1 + assets/js/65295181.5f3359a1.js | 1 + assets/js/65295181.fe80ffe0.js | 1 - assets/js/6654e683.a9af6535.js | 1 + assets/js/6654e683.c868b00c.js | 1 - assets/js/6e738032.90ced99b.js | 1 - assets/js/6e738032.93d70adc.js | 1 + assets/js/6ffb9ece.14ec47c0.js | 1 + assets/js/6ffb9ece.ffdefc5e.js | 1 - assets/js/70b99476.0b97e05f.js | 1 - assets/js/70b99476.31ab229c.js | 1 + assets/js/72c75985.a1c9f42c.js | 1 - assets/js/72c75985.e28c9fa5.js | 1 + assets/js/76faf03d.0a6be094.js | 1 - assets/js/76faf03d.4bb09eca.js | 1 + assets/js/7f011206.0f957a55.js | 1 - assets/js/7f011206.bb1c2c22.js | 1 + assets/js/807ea154.6f3e93e5.js | 1 + assets/js/807ea154.7ff7d588.js | 1 - assets/js/82d729f6.0cd8c1ba.js | 1 + assets/js/82d729f6.ab7b499c.js | 1 - assets/js/866c3a03.acaff01e.js | 1 - assets/js/866c3a03.dda3f66f.js | 1 + assets/js/8699bfc7.03fc0ce4.js | 1 + assets/js/8699bfc7.22e7e3ee.js | 1 - assets/js/8a4439a6.c1c15b37.js | 1 - assets/js/8a4439a6.f877937c.js | 1 + assets/js/8a54026e.14fb0e94.js | 1 - assets/js/8a54026e.c3648038.js | 1 + assets/js/8d09d3e9.08d1d35e.js | 1 - assets/js/8d09d3e9.676d4bf2.js | 1 + assets/js/8d83cde9.5857bbea.js | 1 + assets/js/8d83cde9.6ce3e5b9.js | 1 - assets/js/906c60a4.1e13a403.js | 1 + assets/js/906c60a4.de82c8fe.js | 1 - assets/js/93551644.24080d59.js | 1 + assets/js/93551644.73cd7e74.js | 1 - assets/js/98a47304.0f7fffba.js | 1 + assets/js/98a47304.99903d3a.js | 1 - assets/js/99ca7d3f.2c4623ef.js | 1 - assets/js/99ca7d3f.911cc353.js | 1 + assets/js/9de08282.a251a46b.js | 1 - assets/js/9de08282.c2eda208.js | 1 + assets/js/9ff227f5.153b5cfb.js | 1 + assets/js/9ff227f5.36665cef.js | 1 - assets/js/a555a233.3b00468c.js | 1 - assets/js/a555a233.d5bb2818.js | 1 + assets/js/a584eeb7.52a1567f.js | 1 - assets/js/a584eeb7.f6572b3a.js | 1 + assets/js/aa481173.b7eff4da.js | 1 - assets/js/aa481173.f471fe49.js | 1 + assets/js/aa67c710.115ad5fd.js | 1 - assets/js/aa67c710.7943bc71.js | 1 + assets/js/aba5156d.11ba512e.js | 1 - assets/js/aba5156d.6e6090a6.js | 1 + assets/js/acc249a7.afd79e0a.js | 1 + assets/js/acc249a7.cc1e5360.js | 1 - assets/js/ae61c247.0289edab.js | 1 + assets/js/ae61c247.b9473023.js | 1 - assets/js/b02e4210.3999e4a9.js | 1 - assets/js/b02e4210.4e3a7699.js | 1 + assets/js/b037c97a.3a868624.js | 1 - assets/js/b037c97a.4d238169.js | 1 + assets/js/b3210992.6de473be.js | 1 + assets/js/b3210992.a1e96a74.js | 1 - assets/js/b80d3b11.006544bf.js | 1 - assets/js/b80d3b11.9ab9cb25.js | 1 + assets/js/bb3fbf9f.35ae4380.js | 1 + assets/js/bb3fbf9f.62f24dad.js | 1 - assets/js/bd2c0bea.229ff471.js | 1 - assets/js/bd2c0bea.9d4b0195.js | 1 + assets/js/c377a04b.4f79ac86.js | 1 - assets/js/c377a04b.5dad62c5.js | 1 + assets/js/c395c3b1.192df8fe.js | 1 - assets/js/c395c3b1.52a88a05.js | 1 + assets/js/c395f53e.1cd7f8e1.js | 1 + assets/js/c395f53e.362e7fcd.js | 1 - assets/js/c541ae51.26ea00c1.js | 1 + assets/js/c541ae51.9051816f.js | 1 - assets/js/cc55a3ba.6e943ecb.js | 1 - assets/js/cc55a3ba.a189dbc9.js | 1 + assets/js/ccc14432.0181111c.js | 1 + assets/js/ccc14432.e631397b.js | 1 - assets/js/ce8372b3.abcf1913.js | 1 + assets/js/ce8372b3.e6766f01.js | 1 - assets/js/cf169a96.27586135.js | 1 - assets/js/cf169a96.82fda36c.js | 1 + assets/js/d0681c17.02a14704.js | 1 + assets/js/d0681c17.30b8173a.js | 1 - assets/js/d49b78bc.b9ef8d5a.js | 1 + assets/js/d49b78bc.c73752a2.js | 1 - assets/js/d68e3ab2.16be6c5c.js | 1 + assets/js/d68e3ab2.7f182de8.js | 1 - assets/js/d8f7dbb7.3cfc277a.js | 1 - assets/js/d8f7dbb7.e6c89814.js | 1 + assets/js/dd6e5f02.66edbd80.js | 1 + assets/js/dd6e5f02.afb00e23.js | 1 - assets/js/e24c3caa.01159749.js | 1 + assets/js/e24c3caa.61457071.js | 1 - assets/js/e647254d.87ddbedd.js | 1 + assets/js/e647254d.adc5fbbe.js | 1 - assets/js/ea530098.76121ba4.js | 1 - assets/js/ea530098.8b46ebf3.js | 1 + assets/js/eba81707.088d8e94.js | 1 - assets/js/eba81707.bc5892af.js | 1 + assets/js/eff9ec8d.2d5ea61d.js | 1 + assets/js/eff9ec8d.57a7dfe8.js | 1 - assets/js/f3d26829.46d6b853.js | 1 - assets/js/f3d26829.dd481f36.js | 1 + .../js/{f86526c6.e5951dc1.js => f86526c6.d48d5fad.js} | 2 +- assets/js/fdc326ca.a82b89f4.js | 1 + assets/js/fdc326ca.ffd08fda.js | 1 - ...time~main.43bce24f.js => runtime~main.e601b306.js} | 2 +- backup/index.html | 7 ++++--- cloud-config-reference/index.html | 7 ++++--- cluster-reference/index.html | 11 +++++++---- custom-certificate/index.html | 7 ++++--- customizing/index.html | 7 ++++--- elemental-plans/index.html | 7 ++++--- elemental_behind_proxy/index.html | 9 ++++++--- elementaloperatorchart-reference/index.html | 7 ++++--- hardwarelabels/index.html | 9 ++++++--- index.html | 7 ++++--- installation/index.html | 7 ++++--- inventory-management/index.html | 7 ++++--- kubernetesversions/index.html | 7 ++++--- machineinventoryselectortemplate-reference/index.html | 7 ++++--- machineregistration-reference/index.html | 7 ++++--- next/airgap/index.html | 7 ++++--- next/architecture/index.html | 7 ++++--- next/backup/index.html | 7 ++++--- next/cloud-config-reference/index.html | 7 ++++--- next/cluster-reference/index.html | 9 ++++++--- next/custom-certificate/index.html | 7 ++++--- next/customizing/index.html | 7 ++++--- next/elemental-plans/index.html | 7 ++++--- next/elemental_behind_proxy/index.html | 9 ++++++--- next/elementaloperatorchart-reference/index.html | 7 ++++--- next/hardwarelabels/index.html | 9 ++++++--- next/index.html | 7 ++++--- next/installation/index.html | 7 ++++--- next/inventory-management/index.html | 9 +++++---- next/kubernetesversions/index.html | 7 ++++--- .../index.html | 7 ++++--- next/machineregistration-reference/index.html | 7 ++++--- next/quickstart-cli/index.html | 9 ++++++--- next/quickstart-ui/index.html | 9 ++++++--- next/rancher-vmware/index.html | 7 ++++--- next/release-notes/index.html | 7 ++++--- next/removable-device-cloudconfig/index.html | 7 ++++--- next/reset/index.html | 7 ++++--- next/restore/index.html | 7 ++++--- next/seedimage-reference/index.html | 7 ++++--- next/smbios/index.html | 9 ++++++--- next/tpm/index.html | 9 ++++++--- next/troubleshooting-rancher-upgrades/index.html | 7 ++++--- next/troubleshooting-reset/index.html | 7 ++++--- next/troubleshooting-restore/index.html | 7 ++++--- next/troubleshooting-upgrade/index.html | 7 ++++--- next/upgrade/index.html | 9 ++++++--- next/wifi/index.html | 7 ++++--- quickstart-cli/index.html | 9 ++++++--- quickstart-ui/index.html | 9 ++++++--- rancher-vmware/index.html | 7 ++++--- release-notes/index.html | 7 ++++--- removable-device-cloudconfig/index.html | 7 ++++--- reset/index.html | 7 ++++--- restore/index.html | 7 ++++--- search/index.html | 2 +- seedimage-reference/index.html | 7 ++++--- smbios/index.html | 9 ++++++--- tpm/index.html | 9 ++++++--- troubleshooting-rancher-upgrades/index.html | 7 ++++--- troubleshooting-reset/index.html | 7 ++++--- troubleshooting-restore/index.html | 7 ++++--- troubleshooting-upgrade/index.html | 7 ++++--- upgrade/index.html | 9 ++++++--- wifi/index.html | 7 ++++--- 282 files changed, 528 insertions(+), 385 deletions(-) delete mode 100644 assets/js/007e4478.243025d0.js create mode 100644 assets/js/007e4478.f7288912.js delete mode 100644 assets/js/008566e2.171e7aa9.js create mode 100644 assets/js/008566e2.91610a07.js delete mode 100644 assets/js/01042c73.2cdc191c.js create mode 100644 assets/js/01042c73.7c197e98.js create mode 100644 assets/js/06b06a7e.866ad55d.js delete mode 100644 assets/js/06b06a7e.de2342b6.js delete mode 100644 assets/js/0c9f3389.3e3e7520.js create mode 100644 assets/js/0c9f3389.9ebc0052.js delete mode 100644 assets/js/0ec254a1.68e2ea59.js create mode 100644 assets/js/0ec254a1.96646f8a.js delete mode 100644 assets/js/17f29b2a.13d720c8.js create mode 100644 assets/js/17f29b2a.c3e81c17.js delete mode 100644 assets/js/1b0f8c91.51385573.js create mode 100644 assets/js/1b0f8c91.9f2ba2e3.js delete mode 100644 assets/js/1b128653.42b5656b.js create mode 100644 assets/js/1b128653.6056253e.js create mode 100644 assets/js/1b33c654.2500b11c.js delete mode 100644 assets/js/1b33c654.a5895cab.js delete mode 100644 assets/js/1c67841d.6f3ca700.js create mode 100644 assets/js/1c67841d.a8723990.js create mode 100644 assets/js/1e6929a8.b476ea49.js delete mode 100644 assets/js/1e6929a8.bbd13471.js create mode 100644 assets/js/26511e9d.33d49855.js delete mode 100644 assets/js/26511e9d.80d13872.js rename assets/js/{2a824f8b.d3a263b3.js => 2a824f8b.83c55e0a.js} (81%) delete mode 100644 assets/js/314a742e.138abbcd.js create mode 100644 assets/js/314a742e.cd01912c.js create mode 100644 assets/js/3238e5ae.812bec08.js delete mode 100644 assets/js/3238e5ae.9c6f1068.js delete mode 100644 assets/js/33b676a1.107946a2.js create mode 100644 assets/js/33b676a1.e72c30e3.js create mode 100644 assets/js/34e5c9d0.30eab101.js delete mode 100644 assets/js/34e5c9d0.7676da55.js rename assets/js/{3b8c55ea.2c8c5b1d.js => 3b8c55ea.fe236857.js} (92%) delete mode 100644 assets/js/3cb329d3.7dd00817.js create mode 100644 assets/js/3cb329d3.cad8a96d.js rename assets/js/{3d72abfc.db76b006.js => 3d72abfc.1d97420d.js} (92%) delete mode 100644 assets/js/3f318b85.7d4d1836.js create mode 100644 assets/js/3f318b85.a0aef04d.js create mode 100644 assets/js/410f4fd3.0a373c7d.js delete mode 100644 assets/js/410f4fd3.d472f304.js delete mode 100644 assets/js/41a53309.20b7ee18.js create mode 100644 assets/js/41a53309.38b3ecaa.js delete mode 100644 assets/js/426e6027.d7be71b0.js create mode 100644 assets/js/426e6027.fdfd164c.js delete mode 100644 assets/js/43c9fc1f.7230944f.js create mode 100644 assets/js/43c9fc1f.9b61099e.js create mode 100644 assets/js/44234b90.b9123fb8.js delete mode 100644 assets/js/44234b90.e22542ac.js create mode 100644 assets/js/4601e8b1.cacc4273.js delete mode 100644 assets/js/4601e8b1.d6bdb742.js delete mode 100644 assets/js/475573de.93ee040e.js create mode 100644 assets/js/475573de.fbef9d21.js create mode 100644 assets/js/515d27de.243480e3.js delete mode 100644 assets/js/515d27de.cfaeb529.js rename assets/js/{5281b7a2.6e0ce740.js => 5281b7a2.82cee175.js} (81%) delete mode 100644 assets/js/54dca98f.39c023f6.js create mode 100644 assets/js/54dca98f.86d3ed35.js create mode 100644 assets/js/578c0857.2b190e0d.js delete mode 100644 assets/js/578c0857.399a357b.js rename assets/js/{5792c77d.c1638897.js => 5792c77d.be7b3b80.js} (81%) delete mode 100644 assets/js/5c2870c5.2c517fd4.js create mode 100644 assets/js/5c2870c5.603ee4c7.js delete mode 100644 assets/js/5d57b743.2e83a67c.js create mode 100644 assets/js/5d57b743.83252c7b.js delete mode 100644 assets/js/5eb1fa47.7532541a.js create mode 100644 assets/js/5eb1fa47.9994edd5.js delete mode 100644 assets/js/5f11e417.1d785b6d.js create mode 100644 assets/js/5f11e417.767dd3d1.js delete mode 100644 assets/js/639e78ad.2a3212a7.js create mode 100644 assets/js/639e78ad.f78e1fd7.js create mode 100644 assets/js/65295181.5f3359a1.js delete mode 100644 assets/js/65295181.fe80ffe0.js create mode 100644 assets/js/6654e683.a9af6535.js delete mode 100644 assets/js/6654e683.c868b00c.js delete mode 100644 assets/js/6e738032.90ced99b.js create mode 100644 assets/js/6e738032.93d70adc.js create mode 100644 assets/js/6ffb9ece.14ec47c0.js delete mode 100644 assets/js/6ffb9ece.ffdefc5e.js delete mode 100644 assets/js/70b99476.0b97e05f.js create mode 100644 assets/js/70b99476.31ab229c.js delete mode 100644 assets/js/72c75985.a1c9f42c.js create mode 100644 assets/js/72c75985.e28c9fa5.js delete mode 100644 assets/js/76faf03d.0a6be094.js create mode 100644 assets/js/76faf03d.4bb09eca.js delete mode 100644 assets/js/7f011206.0f957a55.js create mode 100644 assets/js/7f011206.bb1c2c22.js create mode 100644 assets/js/807ea154.6f3e93e5.js delete mode 100644 assets/js/807ea154.7ff7d588.js create mode 100644 assets/js/82d729f6.0cd8c1ba.js delete mode 100644 assets/js/82d729f6.ab7b499c.js delete mode 100644 assets/js/866c3a03.acaff01e.js create mode 100644 assets/js/866c3a03.dda3f66f.js create mode 100644 assets/js/8699bfc7.03fc0ce4.js delete mode 100644 assets/js/8699bfc7.22e7e3ee.js delete mode 100644 assets/js/8a4439a6.c1c15b37.js create mode 100644 assets/js/8a4439a6.f877937c.js delete mode 100644 assets/js/8a54026e.14fb0e94.js create mode 100644 assets/js/8a54026e.c3648038.js delete mode 100644 assets/js/8d09d3e9.08d1d35e.js create mode 100644 assets/js/8d09d3e9.676d4bf2.js create mode 100644 assets/js/8d83cde9.5857bbea.js delete mode 100644 assets/js/8d83cde9.6ce3e5b9.js create mode 100644 assets/js/906c60a4.1e13a403.js delete mode 100644 assets/js/906c60a4.de82c8fe.js create mode 100644 assets/js/93551644.24080d59.js delete mode 100644 assets/js/93551644.73cd7e74.js create mode 100644 assets/js/98a47304.0f7fffba.js delete mode 100644 assets/js/98a47304.99903d3a.js delete mode 100644 assets/js/99ca7d3f.2c4623ef.js create mode 100644 assets/js/99ca7d3f.911cc353.js delete mode 100644 assets/js/9de08282.a251a46b.js create mode 100644 assets/js/9de08282.c2eda208.js create mode 100644 assets/js/9ff227f5.153b5cfb.js delete mode 100644 assets/js/9ff227f5.36665cef.js delete mode 100644 assets/js/a555a233.3b00468c.js create mode 100644 assets/js/a555a233.d5bb2818.js delete mode 100644 assets/js/a584eeb7.52a1567f.js create mode 100644 assets/js/a584eeb7.f6572b3a.js delete mode 100644 assets/js/aa481173.b7eff4da.js create mode 100644 assets/js/aa481173.f471fe49.js delete mode 100644 assets/js/aa67c710.115ad5fd.js create mode 100644 assets/js/aa67c710.7943bc71.js delete mode 100644 assets/js/aba5156d.11ba512e.js create mode 100644 assets/js/aba5156d.6e6090a6.js create mode 100644 assets/js/acc249a7.afd79e0a.js delete mode 100644 assets/js/acc249a7.cc1e5360.js create mode 100644 assets/js/ae61c247.0289edab.js delete mode 100644 assets/js/ae61c247.b9473023.js delete mode 100644 assets/js/b02e4210.3999e4a9.js create mode 100644 assets/js/b02e4210.4e3a7699.js delete mode 100644 assets/js/b037c97a.3a868624.js create mode 100644 assets/js/b037c97a.4d238169.js create mode 100644 assets/js/b3210992.6de473be.js delete mode 100644 assets/js/b3210992.a1e96a74.js delete mode 100644 assets/js/b80d3b11.006544bf.js create mode 100644 assets/js/b80d3b11.9ab9cb25.js create mode 100644 assets/js/bb3fbf9f.35ae4380.js delete mode 100644 assets/js/bb3fbf9f.62f24dad.js delete mode 100644 assets/js/bd2c0bea.229ff471.js create mode 100644 assets/js/bd2c0bea.9d4b0195.js delete mode 100644 assets/js/c377a04b.4f79ac86.js create mode 100644 assets/js/c377a04b.5dad62c5.js delete mode 100644 assets/js/c395c3b1.192df8fe.js create mode 100644 assets/js/c395c3b1.52a88a05.js create mode 100644 assets/js/c395f53e.1cd7f8e1.js delete mode 100644 assets/js/c395f53e.362e7fcd.js create mode 100644 assets/js/c541ae51.26ea00c1.js delete mode 100644 assets/js/c541ae51.9051816f.js delete mode 100644 assets/js/cc55a3ba.6e943ecb.js create mode 100644 assets/js/cc55a3ba.a189dbc9.js create mode 100644 assets/js/ccc14432.0181111c.js delete mode 100644 assets/js/ccc14432.e631397b.js create mode 100644 assets/js/ce8372b3.abcf1913.js delete mode 100644 assets/js/ce8372b3.e6766f01.js delete mode 100644 assets/js/cf169a96.27586135.js create mode 100644 assets/js/cf169a96.82fda36c.js create mode 100644 assets/js/d0681c17.02a14704.js delete mode 100644 assets/js/d0681c17.30b8173a.js create mode 100644 assets/js/d49b78bc.b9ef8d5a.js delete mode 100644 assets/js/d49b78bc.c73752a2.js create mode 100644 assets/js/d68e3ab2.16be6c5c.js delete mode 100644 assets/js/d68e3ab2.7f182de8.js delete mode 100644 assets/js/d8f7dbb7.3cfc277a.js create mode 100644 assets/js/d8f7dbb7.e6c89814.js create mode 100644 assets/js/dd6e5f02.66edbd80.js delete mode 100644 assets/js/dd6e5f02.afb00e23.js create mode 100644 assets/js/e24c3caa.01159749.js delete mode 100644 assets/js/e24c3caa.61457071.js create mode 100644 assets/js/e647254d.87ddbedd.js delete mode 100644 assets/js/e647254d.adc5fbbe.js delete mode 100644 assets/js/ea530098.76121ba4.js create mode 100644 assets/js/ea530098.8b46ebf3.js delete mode 100644 assets/js/eba81707.088d8e94.js create mode 100644 assets/js/eba81707.bc5892af.js create mode 100644 assets/js/eff9ec8d.2d5ea61d.js delete mode 100644 assets/js/eff9ec8d.57a7dfe8.js delete mode 100644 assets/js/f3d26829.46d6b853.js create mode 100644 assets/js/f3d26829.dd481f36.js rename assets/js/{f86526c6.e5951dc1.js => f86526c6.d48d5fad.js} (91%) create mode 100644 assets/js/fdc326ca.a82b89f4.js delete mode 100644 assets/js/fdc326ca.ffd08fda.js rename assets/js/{runtime~main.43bce24f.js => runtime~main.e601b306.js} (57%) diff --git a/1.2/architecture/index.html b/1.2/architecture/index.html index b97c3f825..aee2b2c49 100644 --- a/1.2/architecture/index.html +++ b/1.2/architecture/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
Skip to main content
Version: 1.2

Architecture

+
Version: 1.2
+

Architecture

The Elemental stack can be divided in two main parts: the Elemental OS, an immutable and customizable OS which comprises the tools and the steps needed to prepare the Cloud Native OS image and perform the actual OS installation on the host, and the Elemental Operator, that allows central management of the Elemental OS via Rancher, the Kubernetes way.

Elemental Architecture​

Elemental OS​

diff --git a/1.2/backup/index.html b/1.2/backup/index.html index 4a764fc6c..fbeca11e5 100644 --- a/1.2/backup/index.html +++ b/1.2/backup/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
Version: 1.2

Backup

+
Version: 1.2
+

Backup

Since Elemental runs as part of Rancher, the Elemental resources are bundled in the Rancher backup.
For more details about Rancher backups, restore, and disaster recovery options, please follow the official Rancher documentation.

Install rancher-backup operator for Rancher​

diff --git a/1.2/cloud-config-reference/index.html b/1.2/cloud-config-reference/index.html index a3c0325bf..cab77e6e7 100644 --- a/1.2/cloud-config-reference/index.html +++ b/1.2/cloud-config-reference/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
Version: 1.2

Cloud-config Reference

+
Version: 1.2
+

Cloud-config Reference

All custom configuration applied on top of a fresh deployment should come from the cloud-config section in a MachineRegistration.

This will get run by elemental-cli run-stage during the boot stage, and diff --git a/1.2/cluster-reference/index.html b/1.2/cluster-reference/index.html index 46dbd9950..74beeca21 100644 --- a/1.2/cluster-reference/index.html +++ b/1.2/cluster-reference/index.html @@ -3,18 +3,21 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -

Version: 1.2

Cluster reference

+
Version: 1.2
+ + +

Cluster reference

A Cluster definition includes a kubernetesVersion and a list of machinePools to deploy the cluster to.

For how to select a kubernetesVersion please check our Kubernetes Versions page.

A machinePool is a bundle of configuration with a ObjectReference so the cluster is deployed to those machinePools diff --git a/1.2/custom-certificate/index.html b/1.2/custom-certificate/index.html index 45dae1fcf..e15c0ff7f 100644 --- a/1.2/custom-certificate/index.html +++ b/1.2/custom-certificate/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -

Version: 1.2

How to add a custom certificate​

+
Version: 1.2
+

How to add a custom certificate​

Prerequisite: A certificate in .pem format

Goal: Make a custom certificate available system-wide

This is for certificates used by system-level services.

Kubernetes workloads should bring their certificates within the diff --git a/1.2/customizing/index.html b/1.2/customizing/index.html index ce97d476f..669f35a70 100644 --- a/1.2/customizing/index.html +++ b/1.2/customizing/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -

Version: 1.2

Customize Elemental Install

+
Version: 1.2
+

Customize Elemental Install

Elemental Teal images can be customized in different ways. One option is to provide additional resources within the installation media so that during installation, or diff --git a/1.2/elemental-plans/index.html b/1.2/elemental-plans/index.html index 6b19017d3..94296cc9c 100644 --- a/1.2/elemental-plans/index.html +++ b/1.2/elemental-plans/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -

Version: 1.2

Introduction​

+
Version: 1.2
+

Introduction​

Elemental uses the Rancher System Agent, renamed to Elemental System Agent, to initially bootstrap the node with a simple plan.

The plan will apply the following configurations:

    diff --git a/1.2/elemental_behind_proxy/index.html b/1.2/elemental_behind_proxy/index.html index 336ed986b..943854f2c 100644 --- a/1.2/elemental_behind_proxy/index.html +++ b/1.2/elemental_behind_proxy/index.html @@ -3,18 +3,21 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
    Version: 1.2

    Introduction​

    +
    Version: 1.2
    + + +

    Introduction​

    In a lot of enterprise environments, servers or VMs running on premises do not have direct Internet access. Instead, the connection to external services is done through a HTTP(S) proxy for security reasons. This tutorial shows you how to set up an Elemental deployment in such an environment.

    important note

    This guide will not cover the Rancher installation behind a proxy. It's a different use case and you can find the detailed documentation here.

    info

    For this documentation, we assume you are using a SUSE family system (like Elemental Teal), so proxy settings have to be written in /etc/sysconfig/proxy.

    diff --git a/1.2/elementaloperatorchart-reference/index.html b/1.2/elementaloperatorchart-reference/index.html index 1defc973b..f89b7b185 100644 --- a/1.2/elementaloperatorchart-reference/index.html +++ b/1.2/elementaloperatorchart-reference/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
    Version: 1.2

    Elemental Operator Helm Chart

    +
    Version: 1.2
    +

    Elemental Operator Helm Chart

    The Elemental Operator is responsible for managing the Elemental versions and maintaining a machine inventory to assist with edge or bare metal installations.

    The associated chart bootstraps an elemental-operator deployment on the Rancher Manager v2.6 cluster using the Helm package manager.

    Prerequisites​

    diff --git a/1.2/hardwarelabels/index.html b/1.2/hardwarelabels/index.html index 131608dcc..5de1ed639 100644 --- a/1.2/hardwarelabels/index.html +++ b/1.2/hardwarelabels/index.html @@ -3,18 +3,21 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
    Version: 1.2

    Hardware Labels​

    +
    Version: 1.2
    + + +

    Hardware Labels​

    When a node is registered, hardware data is collected and made available to the MachineRegistration in the same way as SMBIOS data.

    This data can be used for easy identification and selection via a MachineSelector.

    The following are available for templating:

    diff --git a/1.2/index.html b/1.2/index.html index 0b0097063..8f51bd3d1 100644 --- a/1.2/index.html +++ b/1.2/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
    Version: 1.2

    Overview

    +
    Version: 1.2
    +

    Overview

    Elemental is a software stack enabling centralized, full cloud-native OS management with Kubernetes.

    The Elemental Stack consists of a handful of packages on top of SLE Micro for Rancher:

      diff --git a/1.2/installation/index.html b/1.2/installation/index.html index c8789ab15..0fc2c9feb 100644 --- a/1.2/installation/index.html +++ b/1.2/installation/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
      Version: 1.2

      Installation

      +
      Version: 1.2
      +

      Installation

      Overview​

      Elemental stack provides OS management using OCI containers and Kubernetes. The Elemental stack installation encompasses the installation of the Elemental Operator into the diff --git a/1.2/inventory-management/index.html b/1.2/inventory-management/index.html index 54a0d9f11..98c4879d3 100644 --- a/1.2/inventory-management/index.html +++ b/1.2/inventory-management/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -

      Version: 1.2

      Inventory Management​

      +
      Version: 1.2
      +

      Inventory Management​

      The Elemental operator can hold an inventory of machines and the mapping of the machine to it's configuration and assigned cluster.

      MachineInventory​

      diff --git a/1.2/kubernetesversions/index.html b/1.2/kubernetesversions/index.html index 44393c030..694ccdaf6 100644 --- a/1.2/kubernetesversions/index.html +++ b/1.2/kubernetesversions/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
      Version: 1.2

      Valid Versions​

      +
      Version: 1.2
      +

      Valid Versions​

      The list of valid versions for the kubernetesVersion field can be determined from the Rancher metadata using the following commands.

      k3s:

      diff --git a/1.2/machineinventoryselectortemplate-reference/index.html b/1.2/machineinventoryselectortemplate-reference/index.html index 236d9c371..bba8075da 100644 --- a/1.2/machineinventoryselectortemplate-reference/index.html +++ b/1.2/machineinventoryselectortemplate-reference/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
      Version: 1.2

      MachineInventorySelectorTemplate reference

      +
      Version: 1.2
      +

      MachineInventorySelectorTemplate reference

      The MachineInventorySelectorTemplate is the resource responsible of defining the matching criteria to pair an inventoried machine with a Cluster resource.

      The relevant key is the selector which includes label selector expressions.

      MachineInventorySelectorTemplate
      apiVersion: elemental.cattle.io/v1beta1
      kind: MachineInventorySelectorTemplate
      metadata:
      name: my-machine-selector
      namespace: fleet-default
      spec:
      template:
      spec:
      selector:
      ...
      diff --git a/1.2/machineregistration-reference/index.html b/1.2/machineregistration-reference/index.html index 43d06df46..1a7760341 100644 --- a/1.2/machineregistration-reference/index.html +++ b/1.2/machineregistration-reference/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
      Version: 1.2

      MachineRegistration reference

      +
      Version: 1.2
      +

      MachineRegistration reference

      The MachineRegistration resource is the responsible of defining a machine registration end point. Once created it generates a registration URL used by nodes to register so they are inventoried.

      There are several keys that can be configured under a MachineRegistration resource spec.

      MachineRegistration
      apiVersion: elemental.cattle.io/v1beta1
      kind: MachineRegistration
      metadata:
      name: my-nodes
      namespace: fleet-default
      spec:
      machineName: name
      machineInventoryLabels:
      label: value
      machineInventoryAnnotations:
      annotation: value
      config:
      cloud-config:
      ...
      elemental:
      registration:
      ...
      install:
      ...
      diff --git a/1.2/quickstart-cli/index.html b/1.2/quickstart-cli/index.html index 8ca69542e..0c056a54d 100644 --- a/1.2/quickstart-cli/index.html +++ b/1.2/quickstart-cli/index.html @@ -3,18 +3,21 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
      Version: 1.2

      Elemental the command line way

      +
      Version: 1.2
      + + +

      Elemental the command line way

      Follow this guide to have an auto-deployed cluster via rke2/k3s and managed by Rancher with the only help of an Elemental Teal ISO.

      Prerequisites​

      diff --git a/1.2/quickstart-ui/index.html b/1.2/quickstart-ui/index.html index 8aeb7349f..09cbe266f 100644 --- a/1.2/quickstart-ui/index.html +++ b/1.2/quickstart-ui/index.html @@ -3,18 +3,21 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
      Version: 1.2

      Elemental the visual way

      +
      Version: 1.2
      + + +

      Elemental the visual way

      This quickstart will show you how to deploy the Elemental plugin into an existing Rancher Manager instance.

      Once installed, you'll be able to provision a new Elemental cluster based on RKE2 or K3s.

      Prerequisites​

      diff --git a/1.2/rancher-vmware/index.html b/1.2/rancher-vmware/index.html index 5461a143e..57c7ccfbf 100644 --- a/1.2/rancher-vmware/index.html +++ b/1.2/rancher-vmware/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
      Version: 1.2

      How to use Elemental with Rancher and VMware

      +
      Version: 1.2
      +

      How to use Elemental with Rancher and VMware

      Excerpt​

      In this document we will see how we can enable elemental support in Rancher and then build iso and test it on a vm in VMware mimicking it for an edge device.

      Prerequisites​

      diff --git a/1.2/release-notes/index.html b/1.2/release-notes/index.html index ba36d606c..6222587c5 100644 --- a/1.2/release-notes/index.html +++ b/1.2/release-notes/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
      Version: 1.2

      Release Notes

      +
      Version: 1.2
      +

      Release Notes

      The Elemental project stack is made of various components such as the Operator and UI for example.

      Each of these components have an independent development lifecycle with its own versioning. Once a new version is ready, meaning it fully integrates with the others components of the Elemental project stack, a release is made.

      Here's the different components, their latest version and a link to the respective release notes on GitHub:

      diff --git a/1.2/removable-device-cloudconfig/index.html b/1.2/removable-device-cloudconfig/index.html index 9d8afcacd..1705aa79c 100644 --- a/1.2/removable-device-cloudconfig/index.html +++ b/1.2/removable-device-cloudconfig/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
      Version: 1.2

      How to include cloud-config files from removable devices​

      +
      Version: 1.2
      +

      How to include cloud-config files from removable devices​

      Elemental Teal supports loading cloud-config files from specific block devices. In particular supports loading cloud-config files from an ISO having CIDATA as the volume ID or any vFAT formatted device labeled with CIDATA. If a device matching this criteria is found on early boot the Elemental client will diff --git a/1.2/restore/index.html b/1.2/restore/index.html index 04765052b..db38e827a 100644 --- a/1.2/restore/index.html +++ b/1.2/restore/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -

      Version: 1.2

      Restore

      +
      Version: 1.2
      +

      Restore

      Follow this guide to restore an Elemental configuration from a backup with Rancher.

      Prepare rancher-backup operator and backup files for restoring​

      Go to official Rancher documentation and make sure that rancher-backup operator is installed and has access to backup files.

      diff --git a/1.2/seedimage-reference/index.html b/1.2/seedimage-reference/index.html index 9acb92b2b..535c17040 100644 --- a/1.2/seedimage-reference/index.html +++ b/1.2/seedimage-reference/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
      Version: 1.2

      SeedImage reference

      +
      Version: 1.2
      +

      SeedImage reference

      A SeedImage resource allows to build an ISO that can be used to install Elemental onto a node.
      It requires a baseImage, i.e., a URL to an Elemental installation ISO, and a registrationRef reference to a MachineRegistration resource, from which the registration part of the Elemental configuration is extracted and injected in the ISO to produce the final seed image.
      It is also possible to inject ISO customizations in the cloud-config field.

      diff --git a/1.2/smbios/index.html b/1.2/smbios/index.html index 309bc4c71..53b343dab 100644 --- a/1.2/smbios/index.html +++ b/1.2/smbios/index.html @@ -3,18 +3,21 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
      Version: 1.2

      Introduction​

      +
      Version: 1.2
      + + +

      Introduction​

      The System Management BIOS (SMBIOS) specification defines data structures (and access methods) that can be used to read management information produced by the BIOS of a computer.

      This allows us to gather hardware information about the running system and use that as part of our labels.

      How does Elemental uses SMBIOS data?​

      diff --git a/1.2/tpm/index.html b/1.2/tpm/index.html index ab49697e3..d3e23081b 100644 --- a/1.2/tpm/index.html +++ b/1.2/tpm/index.html @@ -3,18 +3,21 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
      Version: 1.2

      Trusted Platform Module 2.0 (TPM)

      +
      Version: 1.2
      + + +

      Trusted Platform Module 2.0 (TPM)

      Trusted Platform Module (TPM, also known as ISO/IEC 11889) is an international standard for a secure cryptoprocessor, a dedicated microcontroller designed to secure hardware through integrated cryptographic keys. The term can also refer to a chip conforming to the standard.

      Add TPM module to virtual machine​

      Easy way to add TPM to virtual machine is to use Libvirt with Virt-manager

      diff --git a/1.2/troubleshooting-rancher-upgrades/index.html b/1.2/troubleshooting-rancher-upgrades/index.html index d93261213..710074e36 100644 --- a/1.2/troubleshooting-rancher-upgrades/index.html +++ b/1.2/troubleshooting-rancher-upgrades/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
      Version: 1.2

      Troubleshooting Rancher upgrades

      +
      Version: 1.2
      +

      Troubleshooting Rancher upgrades

      warning

      Upgrading to Rancher v2.7.2 will fail if Elemental clusters are defined. The rancher pod gets stuck in a crash loop (see https://github.com/rancher/rancher/issues/41145).

      Note that the issue is present only if at least one Elemental cluster is defined.

      To workaround the issue create an empty dynamicschemas.management.cattle.io resource named machineinventoryselectortemplate:

      diff --git a/1.2/troubleshooting-restore/index.html b/1.2/troubleshooting-restore/index.html index 03d8f1c38..7780ae935 100644 --- a/1.2/troubleshooting-restore/index.html +++ b/1.2/troubleshooting-restore/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
      Version: 1.2

      Troubleshooting restore

      +
      Version: 1.2
      +

      Troubleshooting restore

      warning

      When a restore is performed, do not restart the rancher-system-agent on elemental nodes as it can stale and end with the following error:

      panic: error while connecting to Kubernetes cluster: the server has asked for the client to provide credentials

      If you face this problem, please follow the procedure below.

      Before you initiate a restore, you need to copy /var/lib/rancher/agent/rancher2_connection_info.json from the elemental node to a place where you have access with Rancher UI.

      Once the file is copied, download the rancher-agent-token-update.sh script from the Elemental repository:

      diff --git a/1.2/troubleshooting-upgrade/index.html b/1.2/troubleshooting-upgrade/index.html index d39ca7934..984dbde10 100644 --- a/1.2/troubleshooting-upgrade/index.html +++ b/1.2/troubleshooting-upgrade/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
      Version: 1.2

      Troubleshooting upgrade

      +
      Version: 1.2
      +

      Troubleshooting upgrade

      Upgrade Flow

      For a high level overview of the upgrade workflow, please refer to the image above.

      Rancher side​

      diff --git a/1.2/upgrade/index.html b/1.2/upgrade/index.html index 5b37f6ab4..99ac0307a 100644 --- a/1.2/upgrade/index.html +++ b/1.2/upgrade/index.html @@ -3,18 +3,21 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
      Version: 1.2

      Upgrade

      +
      Version: 1.2
      + + +

      Upgrade

      All components in Elemental are managed using Kubernetes. Below is how to use Kubernetes approaches to upgrade the components.

      Elemental Teal node upgrade​

      diff --git a/1.2/wifi/index.html b/1.2/wifi/index.html index c2896f304..11143f2e3 100644 --- a/1.2/wifi/index.html +++ b/1.2/wifi/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
      Version: 1.2

      How to configure Wi-Fi​

      +
      Version: 1.2
      +

      How to configure Wi-Fi​

      important note

      This guide describes how to configure Wi-Fi on a freshly installed operating system. For some reasons, like no wired network connection availabe, you may want to also use Wi-Fi when you boot from the ISO.

      This is possible by using a cloud-config definition in the SeedImage resource. You can refer to the same instructions as below on how to create it.

      diff --git a/404.html b/404.html index c0ca4c70a..53054d7fb 100644 --- a/404.html +++ b/404.html @@ -10,7 +10,7 @@ - + diff --git a/architecture/index.html b/architecture/index.html index 39c6077ce..ef5d29e61 100644 --- a/architecture/index.html +++ b/architecture/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
      Version: 1.3

      Architecture

      +
      Version: 1.3
      +

      Architecture

      The Elemental stack can be divided in two main parts: the Elemental OS, an immutable and customizable OS which comprises the tools and the steps needed to prepare the Cloud Native OS image and perform the actual OS installation on the host, and the Elemental Operator, that allows central management of the Elemental OS via Rancher, the Kubernetes way.

      Elemental Architecture​

      Elemental OS​

      diff --git a/assets/js/007e4478.243025d0.js b/assets/js/007e4478.243025d0.js deleted file mode 100644 index a281d6e9a..000000000 --- a/assets/js/007e4478.243025d0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7108],{5485:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=s(5893),t=s(1151);const o={sidebar_label:"Kubernetes versions",title:""},a=void 0,i={id:"kubernetesversions",title:"",description:"Valid Versions",source:"@site/versioned_docs/version-1.3/kubernetesversions.md",sourceDirName:".",slug:"/kubernetesversions",permalink:"/kubernetesversions",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Kubernetes versions",title:""},sidebar:"docs",previous:{title:"Elemental Operator Helm Chart",permalink:"/elementaloperatorchart-reference"},next:{title:"Smbios",permalink:"/smbios"}},l={},c=[{value:"Valid Versions",id:"valid-versions",level:2}];function d(e){const n={code:"code",h2:"h2",p:"p",pre:"pre",strong:"strong",...(0,t.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"valid-versions",children:"Valid Versions"}),"\n",(0,r.jsxs)(n.p,{children:["The list of valid versions for the ",(0,r.jsx)(n.code,{children:"kubernetesVersion"})," field can be determined\nfrom the Rancher metadata using the following commands."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"k3s:"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"curl -sL https://raw.githubusercontent.com/rancher/kontainer-driver-metadata/release-v2.6/data/data.json | jq -r '.k3s.releases[].version'\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"rke2:"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"curl -sL https://raw.githubusercontent.com/rancher/kontainer-driver-metadata/release-v2.6/data/data.json | jq -r '.rke2.releases[].version'\n"})})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},1151:(e,n,s)=>{s.d(n,{Z:()=>i,a:()=>a});var r=s(7294);const t={},o=r.createContext(t);function a(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/007e4478.f7288912.js b/assets/js/007e4478.f7288912.js new file mode 100644 index 000000000..da31556e7 --- /dev/null +++ b/assets/js/007e4478.f7288912.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7108],{5485:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var s=r(5893),t=r(1151);const o={sidebar_label:"Kubernetes versions",title:""},i=void 0,a={id:"kubernetesversions",title:"",description:"Valid Versions",source:"@site/versioned_docs/version-1.3/kubernetesversions.md",sourceDirName:".",slug:"/kubernetesversions",permalink:"/kubernetesversions",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Kubernetes versions",title:""},sidebar:"docs",previous:{title:"Elemental Operator Helm Chart",permalink:"/elementaloperatorchart-reference"},next:{title:"Smbios",permalink:"/smbios"}},c={},l=[{value:"Valid Versions",id:"valid-versions",level:2}];function d(e){const n={code:"code",h2:"h2",p:"p",pre:"pre",strong:"strong",...(0,t.a)(),...e.components},{Head:r}=n;return r||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(r,{children:(0,s.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/kubernetesversions"})}),"\n",(0,s.jsx)(n.h2,{id:"valid-versions",children:"Valid Versions"}),"\n",(0,s.jsxs)(n.p,{children:["The list of valid versions for the ",(0,s.jsx)(n.code,{children:"kubernetesVersion"})," field can be determined\nfrom the Rancher metadata using the following commands."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"k3s:"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"curl -sL https://raw.githubusercontent.com/rancher/kontainer-driver-metadata/release-v2.6/data/data.json | jq -r '.k3s.releases[].version'\n"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"rke2:"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"curl -sL https://raw.githubusercontent.com/rancher/kontainer-driver-metadata/release-v2.6/data/data.json | jq -r '.rke2.releases[].version'\n"})})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},1151:(e,n,r)=>{r.d(n,{Z:()=>a,a:()=>i});var s=r(7294);const t={},o=s.createContext(t);function i(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/008566e2.171e7aa9.js b/assets/js/008566e2.171e7aa9.js deleted file mode 100644 index 05b1d0240..000000000 --- a/assets/js/008566e2.171e7aa9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[3206],{1127:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>u,frontMatter:()=>c,metadata:()=>s,toc:()=>d});var o=i(5893),t=i(1151);const c={sidebar_label:"Include cloud-config from removable devices",title:""},l=void 0,s={id:"removable-device-cloudconfig",title:"",description:"How to include cloud-config files from removable devices",source:"@site/versioned_docs/version-1.3/removable-device-cloudconfig.md",sourceDirName:".",slug:"/removable-device-cloudconfig",permalink:"/removable-device-cloudconfig",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Include cloud-config from removable devices",title:""},sidebar:"docs",previous:{title:"How to use Elemental with Rancher and VMware",permalink:"/rancher-vmware"},next:{title:"Add a custom certificate",permalink:"/custom-certificate"}},a={},d=[{value:"How to include cloud-config files from removable devices",id:"how-to-include-cloud-config-files-from-removable-devices",level:3},{value:"Include non cloud-config data",id:"include-non-cloud-config-data",level:4}];function r(e){const n={a:"a",code:"code",em:"em",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h3,{id:"how-to-include-cloud-config-files-from-removable-devices",children:"How to include cloud-config files from removable devices"}),"\n",(0,o.jsxs)(n.p,{children:["Elemental Teal supports loading ",(0,o.jsx)(n.a,{href:"/cloud-config-reference",children:"cloud-config"})," files from specific block devices.\nIn particular supports loading cloud-config files from an ISO having ",(0,o.jsx)(n.code,{children:"CIDATA"})," as the volume ID or any vFAT formatted\ndevice labeled with ",(0,o.jsx)(n.code,{children:"CIDATA"}),". If a device matching this criteria is found on early boot the Elemental client will\nread it and look for a ",(0,o.jsx)(n.code,{children:"user-data"})," file in its root."]}),"\n",(0,o.jsx)(n.p,{children:"As an example an ISO including a cloud-config file can be created on a Linux host with the procedure below."}),"\n",(0,o.jsxs)(n.p,{children:["Create a ",(0,o.jsx)(n.code,{children:"user-data"})," file with the cloud-config data in it. In the example below we just set a\nproxy:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:'title="user-data" showLineNumbers',children:'#cloud-config\nwrite_files:\n- path: /etc/sysconfig/proxy\n append: true\n content: |\n PROXY_ENABLED="yes"\n HTTP_PROXY=http://some.domain.org:8080\n HTTPS_PROXY=https://some.domain.org:8080\n NO_PROXY="localhost, 127.0.0.1"\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Once the ",(0,o.jsx)(n.code,{children:"user-data"})," file exists create an ISO including only this file by using the ",(0,o.jsx)(n.code,{children:"mkisofs"})," Linux utility:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"mkisof -o cidata.iso -V CIDATA -J -r user-data\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The result is an ISO labeled with ",(0,o.jsx)(n.code,{children:"CIDATA"})," including the ",(0,o.jsx)(n.code,{children:"user-data"})," file."]}),"\n",(0,o.jsxs)(n.p,{children:["At boot the ",(0,o.jsx)(n.code,{children:"user-data"})," file will be copied as is to ",(0,o.jsx)(n.code,{children:"/oem/user-data"})," and in case it contains cloud-config data\nan extra copy will be added as ",(0,o.jsx)(n.code,{children:"/oem/user-data.yaml"}),". The file ",(0,o.jsx)(n.code,{children:"/oem/user-data.yaml"})," will be parsed\non any later cloud-init stage."]}),"\n",(0,o.jsxs)(n.p,{children:["Since the data is copied to ",(0,o.jsx)(n.code,{children:"/oem"})," it will be persistent, hence on follow up reboots the removable device is\nnot required to be present any more. If still present on follow up reboots, it just overwrites any\naleady pre-existing data."]}),"\n",(0,o.jsx)(n.h4,{id:"include-non-cloud-config-data",children:"Include non cloud-config data"}),"\n",(0,o.jsxs)(n.p,{children:["If the ",(0,o.jsx)(n.code,{children:"user-data"})," is not containing cloud-config data the Elemental client will just copy it as\nis to ",(0,o.jsx)(n.code,{children:"/oem/user-data"}),". Only ",(0,o.jsx)(n.code,{children:"*.yaml"})," files are parsed when executing cloud-init stages, so in that\ncase the file will be ignored by cloud-init services."]}),"\n",(0,o.jsxs)(n.p,{children:["If the ",(0,o.jsx)(n.code,{children:"user-data"})," contains a script the Elemental client will, in addition, try to execute it. The way\nElemental client determines if ",(0,o.jsx)(n.code,{children:"user-data"})," is a script or not is by the presence of a ",(0,o.jsx)(n.em,{children:"Shebang"})," in the\nfirst line. For example, the previous ",(0,o.jsx)(n.code,{children:"user-data"})," file could be rewritten as:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="user-data" showLineNumbers',children:'#!/bin/bash\n\ncat <> /etc/sysconfig/proxy\nPROXY_ENABLED="yes"\nHTTP_PROXY=http://some.domain.org:8080\nHTTPS_PROXY=https://some.domain.org:8080\nNO_PROXY="localhost, 127.0.0.1"\nEOF\n'})})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(r,{...e})}):r(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>s,a:()=>l});var o=i(7294);const t={},c=o.createContext(t);function l(e){const n=o.useContext(c);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),o.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/008566e2.91610a07.js b/assets/js/008566e2.91610a07.js new file mode 100644 index 000000000..60a4b9955 --- /dev/null +++ b/assets/js/008566e2.91610a07.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[3206],{1127:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>u,frontMatter:()=>c,metadata:()=>s,toc:()=>d});var i=o(5893),t=o(1151);const c={sidebar_label:"Include cloud-config from removable devices",title:""},l=void 0,s={id:"removable-device-cloudconfig",title:"",description:"How to include cloud-config files from removable devices",source:"@site/versioned_docs/version-1.3/removable-device-cloudconfig.md",sourceDirName:".",slug:"/removable-device-cloudconfig",permalink:"/removable-device-cloudconfig",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Include cloud-config from removable devices",title:""},sidebar:"docs",previous:{title:"How to use Elemental with Rancher and VMware",permalink:"/rancher-vmware"},next:{title:"Add a custom certificate",permalink:"/custom-certificate"}},a={},d=[{value:"How to include cloud-config files from removable devices",id:"how-to-include-cloud-config-files-from-removable-devices",level:3},{value:"Include non cloud-config data",id:"include-non-cloud-config-data",level:4}];function r(e){const n={a:"a",code:"code",em:"em",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,t.a)(),...e.components},{Head:o}=n;return o||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o,{children:(0,i.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/removable-device-cloudconfig"})}),"\n",(0,i.jsx)(n.h3,{id:"how-to-include-cloud-config-files-from-removable-devices",children:"How to include cloud-config files from removable devices"}),"\n",(0,i.jsxs)(n.p,{children:["Elemental Teal supports loading ",(0,i.jsx)(n.a,{href:"/cloud-config-reference",children:"cloud-config"})," files from specific block devices.\nIn particular supports loading cloud-config files from an ISO having ",(0,i.jsx)(n.code,{children:"CIDATA"})," as the volume ID or any vFAT formatted\ndevice labeled with ",(0,i.jsx)(n.code,{children:"CIDATA"}),". If a device matching this criteria is found on early boot the Elemental client will\nread it and look for a ",(0,i.jsx)(n.code,{children:"user-data"})," file in its root."]}),"\n",(0,i.jsx)(n.p,{children:"As an example an ISO including a cloud-config file can be created on a Linux host with the procedure below."}),"\n",(0,i.jsxs)(n.p,{children:["Create a ",(0,i.jsx)(n.code,{children:"user-data"})," file with the cloud-config data in it. In the example below we just set a\nproxy:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="user-data" showLineNumbers',children:'#cloud-config\nwrite_files:\n- path: /etc/sysconfig/proxy\n append: true\n content: |\n PROXY_ENABLED="yes"\n HTTP_PROXY=http://some.domain.org:8080\n HTTPS_PROXY=https://some.domain.org:8080\n NO_PROXY="localhost, 127.0.0.1"\n'})}),"\n",(0,i.jsxs)(n.p,{children:["Once the ",(0,i.jsx)(n.code,{children:"user-data"})," file exists create an ISO including only this file by using the ",(0,i.jsx)(n.code,{children:"mkisofs"})," Linux utility:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"mkisof -o cidata.iso -V CIDATA -J -r user-data\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The result is an ISO labeled with ",(0,i.jsx)(n.code,{children:"CIDATA"})," including the ",(0,i.jsx)(n.code,{children:"user-data"})," file."]}),"\n",(0,i.jsxs)(n.p,{children:["At boot the ",(0,i.jsx)(n.code,{children:"user-data"})," file will be copied as is to ",(0,i.jsx)(n.code,{children:"/oem/user-data"})," and in case it contains cloud-config data\nan extra copy will be added as ",(0,i.jsx)(n.code,{children:"/oem/user-data.yaml"}),". The file ",(0,i.jsx)(n.code,{children:"/oem/user-data.yaml"})," will be parsed\non any later cloud-init stage."]}),"\n",(0,i.jsxs)(n.p,{children:["Since the data is copied to ",(0,i.jsx)(n.code,{children:"/oem"})," it will be persistent, hence on follow up reboots the removable device is\nnot required to be present any more. If still present on follow up reboots, it just overwrites any\naleady pre-existing data."]}),"\n",(0,i.jsx)(n.h4,{id:"include-non-cloud-config-data",children:"Include non cloud-config data"}),"\n",(0,i.jsxs)(n.p,{children:["If the ",(0,i.jsx)(n.code,{children:"user-data"})," is not containing cloud-config data the Elemental client will just copy it as\nis to ",(0,i.jsx)(n.code,{children:"/oem/user-data"}),". Only ",(0,i.jsx)(n.code,{children:"*.yaml"})," files are parsed when executing cloud-init stages, so in that\ncase the file will be ignored by cloud-init services."]}),"\n",(0,i.jsxs)(n.p,{children:["If the ",(0,i.jsx)(n.code,{children:"user-data"})," contains a script the Elemental client will, in addition, try to execute it. The way\nElemental client determines if ",(0,i.jsx)(n.code,{children:"user-data"})," is a script or not is by the presence of a ",(0,i.jsx)(n.em,{children:"Shebang"})," in the\nfirst line. For example, the previous ",(0,i.jsx)(n.code,{children:"user-data"})," file could be rewritten as:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="user-data" showLineNumbers',children:'#!/bin/bash\n\ncat <> /etc/sysconfig/proxy\nPROXY_ENABLED="yes"\nHTTP_PROXY=http://some.domain.org:8080\nHTTPS_PROXY=https://some.domain.org:8080\nNO_PROXY="localhost, 127.0.0.1"\nEOF\n'})})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(r,{...e})}):r(e)}},1151:(e,n,o)=>{o.d(n,{Z:()=>s,a:()=>l});var i=o(7294);const t={},c=i.createContext(t);function l(e){const n=i.useContext(c);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),i.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/01042c73.2cdc191c.js b/assets/js/01042c73.2cdc191c.js deleted file mode 100644 index 2a8904fda..000000000 --- a/assets/js/01042c73.2cdc191c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8886],{187:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>s,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>c});var a=t(5893),l=t(1151);const r={slug:"/",sidebar_label:"Overview",title:""},s="Overview",i={id:"index",title:"",description:"Elemental is a software stack enabling centralized, full cloud-native OS management with Kubernetes.",source:"@site/versioned_docs/version-1.2/index.md",sourceDirName:".",slug:"/",permalink:"/1.2/",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{slug:"/",sidebar_label:"Overview",title:""},sidebar:"docs",next:{title:"Elemental the visual way",permalink:"/1.2/quickstart-ui"}},o={},c=[{value:"What is Elemental Teal ?",id:"what-is-elemental-teal-",level:2},{value:"Elemental on x86-64 hardware",id:"elemental-on-x86-64-hardware",level:3},{value:"Elemental on ARM hardware",id:"elemental-on-arm-hardware",level:3},{value:"Elemental on other hardware",id:"elemental-on-other-hardware",level:3},{value:"Ready to give it a try?",id:"ready-to-give-it-a-try",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.a)(),...e.components},{Vars:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Vars",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"overview",children:"Overview"}),"\n",(0,a.jsx)(n.p,{children:"Elemental is a software stack enabling centralized, full cloud-native OS management with Kubernetes."}),"\n",(0,a.jsx)(n.p,{children:"The Elemental Stack consists of a handful of packages on top of SLE Micro for Rancher:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-toolkit"})," - Includes a set of OS utilities to enable OS management via containers. Includes dracut modules, bootloader configuration, cloud-init style configuration services, etc."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-operator"})," - Connects to Rancher Manager and handles MachineRegistration and MachineInventory CRDs."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-register"})," - Registers machines via machineRegistrations and installs them via elemental-cli."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-cli"})," - Installs any elemental-toolkit based derivative. Basically an installer based on our A/B install and upgrade system."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"rancher-system-agent"}),' - Runs on the installed system and gets instructions ("Plans") from Rancher Manager what to install and run on the system.']}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["Cluster Node OSes are built and maintained via container images through the ",(0,a.jsx)(t,{name:"elemental_cli_name"})," and they can be installed on new hosts using the ",(0,a.jsx)(t,{link:"elemental_ui_url",name:"elemental_ui_name"})," for ",(0,a.jsx)(n.a,{href:"https://www.rancher.com/products/rancher",children:"Rancher Manager"})," or the ",(0,a.jsx)(t,{link:"elemental_cli_url",name:"elemental_cli_name"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(t,{link:"elemental_operator_url",name:"elemental_operator_name"})," and the ",(0,a.jsx)(t,{link:"ranchersystemagent_url",name:"ranchersystemagent_name"})," enable Rancher Manager to fully control Elemental clusters, from the installation and management of the OS on the Nodes to the provisioning of new K3s or RKE2 clusters in a centralized way."]}),"\n",(0,a.jsx)(n.h2,{id:"what-is-elemental-teal-",children:"What is Elemental Teal ?"}),"\n",(0,a.jsx)(n.p,{children:'Elemental Teal is a combination of "SLE Micro for Rancher" with the Rancher Elemental stack.'}),"\n",(0,a.jsx)(n.p,{children:'SLE Micro for Rancher is a containerized and "stripped to the bones" OS layer. At its core, it only requires grub2, dracut, a kernel, and systemd.'}),"\n",(0,a.jsx)(n.p,{children:"It's sole purpose is to run Kubernetes (k3s or RKE2), with everything controlled through Rancher Manager."}),"\n",(0,a.jsxs)(n.p,{children:["Elemental Teal is built in the ",(0,a.jsx)(n.a,{href:"https://build.opensuse.org/package/show/isv:Rancher:Elemental:Stable:Teal53/node-image",children:"openSUSE Build Service"}),"\nand available through the ",(0,a.jsx)(n.a,{href:"https://registry.suse.com",children:"SUSE Registry"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["You can check latest versions available with ",(0,a.jsx)(n.a,{href:"https://github.com/containers/skopeo",children:"skopeo"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-console",metastring:"showLineNumbers",children:"skopeo list-tags docker://registry.suse.com/rancher/elemental-teal/5.3\n"})}),"\n",(0,a.jsx)(n.h3,{id:"elemental-on-x86-64-hardware",children:"Elemental on x86-64 hardware"}),"\n",(0,a.jsx)(n.p,{children:"Elemental Teal is production ready and fully supported on x86-64 starting with Rancher v2.7.0."}),"\n",(0,a.jsx)(n.h3,{id:"elemental-on-arm-hardware",children:"Elemental on ARM hardware"}),"\n",(0,a.jsx)(n.p,{children:"ARM (aarch64) is functional in the development stage. ARM is currently only tested on Raspberry Pi 4 Model B with k3s 1.24.8 (or later). Feedback is welcome."}),"\n",(0,a.jsx)(n.h3,{id:"elemental-on-other-hardware",children:"Elemental on other hardware"}),"\n",(0,a.jsx)(n.p,{children:"Elemental is currently targeting 'edge' scenarios and does therefore not support other hardware. We will re-assess this as the market evolves."}),"\n",(0,a.jsx)(n.h2,{id:"ready-to-give-it-a-try",children:"Ready to give it a try?"}),"\n",(0,a.jsx)(n.p,{children:"Get an Elemental Cluster up and running with your preferred method"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["With Rancher manager ",(0,a.jsx)(n.a,{href:"/1.2/quickstart-ui",children:"Elemental plugin"})]}),"\n",(0,a.jsxs)(n.li,{children:["With the ",(0,a.jsx)(n.a,{href:"/1.2/quickstart-cli",children:"Elemental CLI"})]}),"\n"]}),"\n",(0,a.jsx)(n.admonition,{title:"What's next?",type:"note",children:(0,a.jsxs)(n.p,{children:["Want more details? Take a look at the ",(0,a.jsx)(n.a,{href:"/1.2/architecture",children:"Architecture"})," section or reach out to the ",(0,a.jsx)(t,{link:"elemental_slack_url",name:"elemental_slack_name"})," Slack channel."]})})]})}function d(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>i,a:()=>s});var a=t(7294);const l={},r=a.createContext(l);function s(e){const n=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:s(e.components),a.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/01042c73.7c197e98.js b/assets/js/01042c73.7c197e98.js new file mode 100644 index 000000000..88339aa7c --- /dev/null +++ b/assets/js/01042c73.7c197e98.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8886],{187:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>s,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>c});var a=t(5893),l=t(1151);const r={slug:"/",sidebar_label:"Overview",title:""},s="Overview",i={id:"index",title:"",description:"Elemental is a software stack enabling centralized, full cloud-native OS management with Kubernetes.",source:"@site/versioned_docs/version-1.2/index.md",sourceDirName:".",slug:"/",permalink:"/1.2/",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{slug:"/",sidebar_label:"Overview",title:""},sidebar:"docs",next:{title:"Elemental the visual way",permalink:"/1.2/quickstart-ui"}},o={},c=[{value:"What is Elemental Teal ?",id:"what-is-elemental-teal-",level:2},{value:"Elemental on x86-64 hardware",id:"elemental-on-x86-64-hardware",level:3},{value:"Elemental on ARM hardware",id:"elemental-on-arm-hardware",level:3},{value:"Elemental on other hardware",id:"elemental-on-other-hardware",level:3},{value:"Ready to give it a try?",id:"ready-to-give-it-a-try",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.a)(),...e.components},{Head:t,Vars:r}=n;return t||m("Head",!0),r||m("Vars",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t,{children:(0,a.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com"})}),"\n",(0,a.jsx)(n.h1,{id:"overview",children:"Overview"}),"\n",(0,a.jsx)(n.p,{children:"Elemental is a software stack enabling centralized, full cloud-native OS management with Kubernetes."}),"\n",(0,a.jsx)(n.p,{children:"The Elemental Stack consists of a handful of packages on top of SLE Micro for Rancher:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-toolkit"})," - Includes a set of OS utilities to enable OS management via containers. Includes dracut modules, bootloader configuration, cloud-init style configuration services, etc."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-operator"})," - Connects to Rancher Manager and handles MachineRegistration and MachineInventory CRDs."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-register"})," - Registers machines via machineRegistrations and installs them via elemental-cli."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-cli"})," - Installs any elemental-toolkit based derivative. Basically an installer based on our A/B install and upgrade system."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"rancher-system-agent"}),' - Runs on the installed system and gets instructions ("Plans") from Rancher Manager what to install and run on the system.']}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["Cluster Node OSes are built and maintained via container images through the ",(0,a.jsx)(r,{name:"elemental_cli_name"})," and they can be installed on new hosts using the ",(0,a.jsx)(r,{link:"elemental_ui_url",name:"elemental_ui_name"})," for ",(0,a.jsx)(n.a,{href:"https://www.rancher.com/products/rancher",children:"Rancher Manager"})," or the ",(0,a.jsx)(r,{link:"elemental_cli_url",name:"elemental_cli_name"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(r,{link:"elemental_operator_url",name:"elemental_operator_name"})," and the ",(0,a.jsx)(r,{link:"ranchersystemagent_url",name:"ranchersystemagent_name"})," enable Rancher Manager to fully control Elemental clusters, from the installation and management of the OS on the Nodes to the provisioning of new K3s or RKE2 clusters in a centralized way."]}),"\n",(0,a.jsx)(n.h2,{id:"what-is-elemental-teal-",children:"What is Elemental Teal ?"}),"\n",(0,a.jsx)(n.p,{children:'Elemental Teal is a combination of "SLE Micro for Rancher" with the Rancher Elemental stack.'}),"\n",(0,a.jsx)(n.p,{children:'SLE Micro for Rancher is a containerized and "stripped to the bones" OS layer. At its core, it only requires grub2, dracut, a kernel, and systemd.'}),"\n",(0,a.jsx)(n.p,{children:"It's sole purpose is to run Kubernetes (k3s or RKE2), with everything controlled through Rancher Manager."}),"\n",(0,a.jsxs)(n.p,{children:["Elemental Teal is built in the ",(0,a.jsx)(n.a,{href:"https://build.opensuse.org/package/show/isv:Rancher:Elemental:Stable:Teal53/node-image",children:"openSUSE Build Service"}),"\nand available through the ",(0,a.jsx)(n.a,{href:"https://registry.suse.com",children:"SUSE Registry"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["You can check latest versions available with ",(0,a.jsx)(n.a,{href:"https://github.com/containers/skopeo",children:"skopeo"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-console",metastring:"showLineNumbers",children:"skopeo list-tags docker://registry.suse.com/rancher/elemental-teal/5.3\n"})}),"\n",(0,a.jsx)(n.h3,{id:"elemental-on-x86-64-hardware",children:"Elemental on x86-64 hardware"}),"\n",(0,a.jsx)(n.p,{children:"Elemental Teal is production ready and fully supported on x86-64 starting with Rancher v2.7.0."}),"\n",(0,a.jsx)(n.h3,{id:"elemental-on-arm-hardware",children:"Elemental on ARM hardware"}),"\n",(0,a.jsx)(n.p,{children:"ARM (aarch64) is functional in the development stage. ARM is currently only tested on Raspberry Pi 4 Model B with k3s 1.24.8 (or later). Feedback is welcome."}),"\n",(0,a.jsx)(n.h3,{id:"elemental-on-other-hardware",children:"Elemental on other hardware"}),"\n",(0,a.jsx)(n.p,{children:"Elemental is currently targeting 'edge' scenarios and does therefore not support other hardware. We will re-assess this as the market evolves."}),"\n",(0,a.jsx)(n.h2,{id:"ready-to-give-it-a-try",children:"Ready to give it a try?"}),"\n",(0,a.jsx)(n.p,{children:"Get an Elemental Cluster up and running with your preferred method"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["With Rancher manager ",(0,a.jsx)(n.a,{href:"/1.2/quickstart-ui",children:"Elemental plugin"})]}),"\n",(0,a.jsxs)(n.li,{children:["With the ",(0,a.jsx)(n.a,{href:"/1.2/quickstart-cli",children:"Elemental CLI"})]}),"\n"]}),"\n",(0,a.jsx)(n.admonition,{title:"What's next?",type:"note",children:(0,a.jsxs)(n.p,{children:["Want more details? Take a look at the ",(0,a.jsx)(n.a,{href:"/1.2/architecture",children:"Architecture"})," section or reach out to the ",(0,a.jsx)(r,{link:"elemental_slack_url",name:"elemental_slack_name"})," Slack channel."]})})]})}function d(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}function m(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,n,t)=>{t.d(n,{Z:()=>i,a:()=>s});var a=t(7294);const l={},r=a.createContext(l);function s(e){const n=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:s(e.components),a.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/06b06a7e.866ad55d.js b/assets/js/06b06a7e.866ad55d.js new file mode 100644 index 000000000..538265d43 --- /dev/null +++ b/assets/js/06b06a7e.866ad55d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[3148],{6960:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>l,default:()=>x,frontMatter:()=>i,metadata:()=>c,toc:()=>o});var s=n(5893),r=n(1151),d=n(1819);const i={sidebar_label:"Hardware Labels",title:""},l=void 0,c={id:"hardwarelabels",title:"",description:"Hardware Labels",source:"@site/docs/hardwarelabels.md",sourceDirName:".",slug:"/hardwarelabels",permalink:"/next/hardwarelabels",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Hardware Labels",title:""},sidebar:"docs",previous:{title:"Smbios",permalink:"/next/smbios"},next:{title:"Inventory Management",permalink:"/next/inventory-management"}},a={},o=[{value:"Hardware Labels",id:"hardware-labels",level:2},{value:"Block device drive types",id:"block-device-drive-types",level:3},{value:"Block device controller types",id:"block-device-controller-types",level:3},{value:"Example MachineRegistration",id:"example-machineregistration",level:3}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.a)(),...e.components},{CodeBlock:n,Head:i}=t;return n||j("CodeBlock",!0),i||j("Head",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i,{children:(0,s.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/hardwarelabels"})}),"\n","\n","\n",(0,s.jsx)(t.h2,{id:"hardware-labels",children:"Hardware Labels"}),"\n",(0,s.jsxs)(t.p,{children:["When a node is registered, hardware data is collected and made available to the MachineRegistration in the same way as ",(0,s.jsx)(t.a,{href:"/next/smbios",children:"SMBIOS data"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["This data can be used for easy identification and selection via a ",(0,s.jsx)(t.a,{href:"/next/machineinventoryselectortemplate-reference",children:"MachineSelector"}),"."]}),"\n",(0,s.jsx)(t.p,{children:"The following are available for templating:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Label"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Memory/Total Physical Bytes}"})}),(0,s.jsx)(t.td,{children:"The total RAM memory in the node, expressed in bytes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/CPU/Total Cores}"})}),(0,s.jsx)(t.td,{children:"Total CPU cores"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/CPU/Total Threads}"})}),(0,s.jsx)(t.td,{children:"Total CPU threads"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/CPU/Vendor}"})}),(0,s.jsx)(t.td,{children:"CPU vendor"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/CPU/Model}"})}),(0,s.jsx)(t.td,{children:"CPU model"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/GPU/Vendor}"})}),(0,s.jsx)(t.td,{children:"GPU vendor (Only available if the node has an identifiable GPU)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/GPU/Model}"})}),(0,s.jsx)(t.td,{children:"GPU model (Only available if the node has an identifiable GPU)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Network/Number Interfaces}"})}),(0,s.jsx)(t.td,{children:"Number of network interfaces in the system"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Network/{Iface name}/Name}"})}),(0,s.jsx)(t.td,{children:"Network interface name"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Network/{Iface name}/IsVirtual}"})}),(0,s.jsx)(t.td,{children:"Boolean indicating virtual network interface"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/Number Devices}"})}),(0,s.jsx)(t.td,{children:"Number of block devices in the system (includes DVD and USB drives)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Name}"})}),(0,s.jsx)(t.td,{children:"Device name of the block device (i.e. sda, sr0, vda, etc...)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Removable}"})}),(0,s.jsx)(t.td,{children:"Whether this block device is removable (i.e. DVD)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Size}"})}),(0,s.jsx)(t.td,{children:"Total space in this block device, expressed in bytes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Drive Type}"})}),(0,s.jsx)(t.td,{children:"Drive type of this block device, see table below"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Storage Controller}"})}),(0,s.jsx)(t.td,{children:"Controller type for this block device connection, see table below"})]})]})]}),"\n",(0,s.jsx)(t.admonition,{title:"info",type:"info",children:(0,s.jsxs)(t.p,{children:["On both ",(0,s.jsx)(t.code,{children:"Block Devices"})," and ",(0,s.jsx)(t.code,{children:"Network"})," the device name is used as a sub-block, as there could be more than one device."]})}),"\n",(0,s.jsx)(t.h3,{id:"block-device-drive-types",children:"Block device drive types"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Type"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"HDD"}),(0,s.jsx)(t.td,{children:"Hard disk drive"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"FDD"}),(0,s.jsx)(t.td,{children:"Floppy disk drive"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ODD"}),(0,s.jsx)(t.td,{children:"Optical disk drive"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SSD"}),(0,s.jsx)(t.td,{children:"Solid-state drive"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"virtual"}),(0,s.jsx)(t.td,{children:"virtual drive i.e. loop devices"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Unknown"}),(0,s.jsx)(t.td,{children:"unknown drive type"})]})]})]}),"\n",(0,s.jsx)(t.h3,{id:"block-device-controller-types",children:"Block device controller types"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Type"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"IDE"}),(0,s.jsx)(t.td,{children:"Integrated Drive Electronics"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SCSI"}),(0,s.jsx)(t.td,{children:"Small computer system interface"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"NVMe"}),(0,s.jsx)(t.td,{children:"Non-volatile Memory Express"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"MMC"}),(0,s.jsx)(t.td,{children:"Multi-media controller (used for mobile phone storage devices)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"virtio"}),(0,s.jsx)(t.td,{children:"Virtualized storage controller/driver"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"loop"}),(0,s.jsx)(t.td,{children:"loop device"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Unknown"}),(0,s.jsx)(t.td,{children:"unknown controller type"})]})]})]}),"\n",(0,s.jsx)(t.h3,{id:"example-machineregistration",children:"Example MachineRegistration"}),"\n",(0,s.jsx)(n,{language:"yaml",title:"registration example with smbios labels",showLineNumbers:!0,children:d.Z})]})}function x(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}function j(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1819:(e,t,n)=>{n.d(t,{Z:()=>s});const s='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineInventoryLabels:\n elemental.cattle.io/CpuTotalCores: "${System Data/CPU/Total Cores}"\n elemental.cattle.io/CpuTotalThreads: "${System Data/CPU/Total Threads}"\n elemental.cattle.io/TotalMemoryBytes: "${System Data/Memory/Total Physical Bytes}"\n elemental.cattle.io/NumberBlockDevices: "${System Data/Block Devices/Number Devices}"\n'},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>i});var s=n(7294);const r={},d=s.createContext(r);function i(e){const t=s.useContext(d);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),s.createElement(d.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/06b06a7e.de2342b6.js b/assets/js/06b06a7e.de2342b6.js deleted file mode 100644 index 9715ac2d1..000000000 --- a/assets/js/06b06a7e.de2342b6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[3148],{6960:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>l,default:()=>x,frontMatter:()=>i,metadata:()=>c,toc:()=>o});var s=n(5893),r=n(1151),d=n(1819);const i={sidebar_label:"Hardware Labels",title:""},l=void 0,c={id:"hardwarelabels",title:"",description:"Hardware Labels",source:"@site/docs/hardwarelabels.md",sourceDirName:".",slug:"/hardwarelabels",permalink:"/next/hardwarelabels",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Hardware Labels",title:""},sidebar:"docs",previous:{title:"Smbios",permalink:"/next/smbios"},next:{title:"Inventory Management",permalink:"/next/inventory-management"}},a={},o=[{value:"Hardware Labels",id:"hardware-labels",level:2},{value:"Block device drive types",id:"block-device-drive-types",level:3},{value:"Block device controller types",id:"block-device-controller-types",level:3},{value:"Example MachineRegistration",id:"example-machineregistration",level:3}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.a)(),...e.components},{CodeBlock:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("CodeBlock",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"hardware-labels",children:"Hardware Labels"}),"\n",(0,s.jsxs)(t.p,{children:["When a node is registered, hardware data is collected and made available to the MachineRegistration in the same way as ",(0,s.jsx)(t.a,{href:"/next/smbios",children:"SMBIOS data"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["This data can be used for easy identification and selection via a ",(0,s.jsx)(t.a,{href:"/next/machineinventoryselectortemplate-reference",children:"MachineSelector"}),"."]}),"\n",(0,s.jsx)(t.p,{children:"The following are available for templating:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Label"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Memory/Total Physical Bytes}"})}),(0,s.jsx)(t.td,{children:"The total RAM memory in the node, expressed in bytes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/CPU/Total Cores}"})}),(0,s.jsx)(t.td,{children:"Total CPU cores"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/CPU/Total Threads}"})}),(0,s.jsx)(t.td,{children:"Total CPU threads"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/CPU/Vendor}"})}),(0,s.jsx)(t.td,{children:"CPU vendor"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/CPU/Model}"})}),(0,s.jsx)(t.td,{children:"CPU model"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/GPU/Vendor}"})}),(0,s.jsx)(t.td,{children:"GPU vendor (Only available if the node has an identifiable GPU)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/GPU/Model}"})}),(0,s.jsx)(t.td,{children:"GPU model (Only available if the node has an identifiable GPU)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Network/Number Interfaces}"})}),(0,s.jsx)(t.td,{children:"Number of network interfaces in the system"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Network/{Iface name}/Name}"})}),(0,s.jsx)(t.td,{children:"Network interface name"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Network/{Iface name}/IsVirtual}"})}),(0,s.jsx)(t.td,{children:"Boolean indicating virtual network interface"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/Number Devices}"})}),(0,s.jsx)(t.td,{children:"Number of block devices in the system (includes DVD and USB drives)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Name}"})}),(0,s.jsx)(t.td,{children:"Device name of the block device (i.e. sda, sr0, vda, etc...)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Removable}"})}),(0,s.jsx)(t.td,{children:"Whether this block device is removable (i.e. DVD)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Size}"})}),(0,s.jsx)(t.td,{children:"Total space in this block device, expressed in bytes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Drive Type}"})}),(0,s.jsx)(t.td,{children:"Drive type of this block device, see table below"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Storage Controller}"})}),(0,s.jsx)(t.td,{children:"Controller type for this block device connection, see table below"})]})]})]}),"\n",(0,s.jsx)(t.admonition,{title:"info",type:"info",children:(0,s.jsxs)(t.p,{children:["On both ",(0,s.jsx)(t.code,{children:"Block Devices"})," and ",(0,s.jsx)(t.code,{children:"Network"})," the device name is used as a sub-block, as there could be more than one device."]})}),"\n",(0,s.jsx)(t.h3,{id:"block-device-drive-types",children:"Block device drive types"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Type"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"HDD"}),(0,s.jsx)(t.td,{children:"Hard disk drive"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"FDD"}),(0,s.jsx)(t.td,{children:"Floppy disk drive"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ODD"}),(0,s.jsx)(t.td,{children:"Optical disk drive"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SSD"}),(0,s.jsx)(t.td,{children:"Solid-state drive"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"virtual"}),(0,s.jsx)(t.td,{children:"virtual drive i.e. loop devices"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Unknown"}),(0,s.jsx)(t.td,{children:"unknown drive type"})]})]})]}),"\n",(0,s.jsx)(t.h3,{id:"block-device-controller-types",children:"Block device controller types"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Type"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"IDE"}),(0,s.jsx)(t.td,{children:"Integrated Drive Electronics"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SCSI"}),(0,s.jsx)(t.td,{children:"Small computer system interface"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"NVMe"}),(0,s.jsx)(t.td,{children:"Non-volatile Memory Express"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"MMC"}),(0,s.jsx)(t.td,{children:"Multi-media controller (used for mobile phone storage devices)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"virtio"}),(0,s.jsx)(t.td,{children:"Virtualized storage controller/driver"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"loop"}),(0,s.jsx)(t.td,{children:"loop device"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Unknown"}),(0,s.jsx)(t.td,{children:"unknown controller type"})]})]})]}),"\n",(0,s.jsx)(t.h3,{id:"example-machineregistration",children:"Example MachineRegistration"}),"\n",(0,s.jsx)(n,{language:"yaml",title:"registration example with smbios labels",showLineNumbers:!0,children:d.Z})]})}function x(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},1819:(e,t,n)=>{n.d(t,{Z:()=>s});const s='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineInventoryLabels:\n elemental.cattle.io/CpuTotalCores: "${System Data/CPU/Total Cores}"\n elemental.cattle.io/CpuTotalThreads: "${System Data/CPU/Total Threads}"\n elemental.cattle.io/TotalMemoryBytes: "${System Data/Memory/Total Physical Bytes}"\n elemental.cattle.io/NumberBlockDevices: "${System Data/Block Devices/Number Devices}"\n'},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>i});var s=n(7294);const r={},d=s.createContext(r);function i(e){const t=s.useContext(d);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),s.createElement(d.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0c9f3389.3e3e7520.js b/assets/js/0c9f3389.3e3e7520.js deleted file mode 100644 index bf2c029ff..000000000 --- a/assets/js/0c9f3389.3e3e7520.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4454],{6231:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var o=t(5893),a=t(1151),r=t(4713);const i={sidebar_label:"Smbios",title:""},s=void 0,l={id:"smbios",title:"",description:"Introduction",source:"@site/docs/smbios.md",sourceDirName:".",slug:"/smbios",permalink:"/next/smbios",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Smbios",title:""},sidebar:"docs",previous:{title:"Kubernetes versions",permalink:"/next/kubernetesversions"},next:{title:"Hardware Labels",permalink:"/next/hardwarelabels"}},c={},d=[{value:"Introduction",id:"introduction",level:2},{value:"How does Elemental uses SMBIOS data?",id:"how-does-elemental-uses-smbios-data",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,a.a)(),...e.components},{CodeBlock:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("CodeBlock",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,o.jsx)(n.p,{children:"The System Management BIOS (SMBIOS) specification defines data structures (and access methods) that can be used to read management information produced by the BIOS of a computer."}),"\n",(0,o.jsx)(n.p,{children:"This allows us to gather hardware information about the running system and use that as part of our labels."}),"\n",(0,o.jsx)(n.h2,{id:"how-does-elemental-uses-smbios-data",children:"How does Elemental uses SMBIOS data?"}),"\n",(0,o.jsxs)(n.p,{children:["The registration client tries to gather SMBIOS data by running ",(0,o.jsx)(n.code,{children:"dmidecode"})," during the initial registration of the node and that data is\nsent to the registration controller to use on interpolating different fields in the inventory that we create for that node."]}),"\n",(0,o.jsxs)(n.p,{children:["Currently, we support interpolating that data into the ",(0,o.jsx)(n.code,{children:"machineName"})," and the ",(0,o.jsx)(n.code,{children:"machineInventoryLabels"})," of a ",(0,o.jsx)(n.a,{href:"/next/machineregistration-reference",children:"machineRegistration"})]}),"\n",(0,o.jsx)(n.p,{children:"The interpolation format is as follows:"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"{$KEY/VALUE}"})," and ",(0,o.jsx)(n.code,{children:"${KEY/SUBKEY/VALUE}"})]}),"\n",(0,o.jsxs)(n.p,{children:["This can be mixed with normal strings so ",(0,o.jsx)(n.code,{children:"my-prefix-${KEY/VALUE}"})," would result into the resolved values with ",(0,o.jsx)(n.code,{children:"my-prefix-"})," prefixed"]}),"\n",(0,o.jsx)(n.p,{children:"For example, having the following SMBIOS data:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-console",metastring:"showLineNumbers",children:"System Information\n\tManufacturer: My manufacturer\n\tProduct Name: Awesome PC\n\tVersion: Not Specified\n\tSerial Number: THX1138\n\tFamily: Toretto\n"})}),"\n",(0,o.jsxs)(n.p,{children:["And setting the ",(0,o.jsx)(n.code,{children:"machineName"})," to ",(0,o.jsx)(n.code,{children:"serial-${System Information/Serial Number}"})," would result in the final value of ",(0,o.jsx)(n.code,{children:"serial-THX1138"})]}),"\n",(0,o.jsxs)(n.p,{children:["This is useful to generate automatic names for machines based on their hardware values, for example using the UUID or the Product name.\nOur default ",(0,o.jsx)(n.code,{children:"machineName"})," when the registration values are empty is ",(0,o.jsx)(n.code,{children:'"m-${System Information/UUID}"'}),"."]}),"\n",(0,o.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,o.jsxs)(n.p,{children:["All non-valid characters will be changed into ",(0,o.jsx)(n.code,{children:"-"})," automatically on parse. Valid characters for labels are alphanumeric and ",(0,o.jsx)(n.code,{children:"-"}),",",(0,o.jsx)(n.code,{children:"_"})," and ",(0,o.jsx)(n.code,{children:"."}),"\nFor machineName the constraints are stricter as that value is used for the hostname so valid values are lowercase alphanumeric and ",(0,o.jsx)(n.code,{children:"-"})," only."]})}),"\n",(0,o.jsx)(n.p,{children:"A good use of SMBIOS data is to set up different labels for all your machines and get those values from the hardware directly."}),"\n",(0,o.jsxs)(n.p,{children:["Having your ",(0,o.jsx)(n.code,{children:"machineInventoryLabels"})," on the ",(0,o.jsx)(n.a,{href:"/next/machineregistration-reference",children:"machineRegistration"})," set to SMBIOS data would allow\nyou to use selectors down the line to select similar machines."]}),"\n",(0,o.jsxs)(n.p,{children:["For example using the following label ",(0,o.jsx)(n.code,{children:'cpuFamily: "${Processor Information/Family}'})," would allow you to use a selector to search for i7 cpus in your machine fleet."]}),"\n",(0,o.jsx)(t,{language:"yaml",title:"registration example with smbios labels",showLineNumbers:!0,children:r.Z})]})}function m(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},4713:(e,n,t)=>{t.d(n,{Z:()=>o});const o='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>i});var o=t(7294);const a={},r=o.createContext(a);function i(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0c9f3389.9ebc0052.js b/assets/js/0c9f3389.9ebc0052.js new file mode 100644 index 000000000..123748002 --- /dev/null +++ b/assets/js/0c9f3389.9ebc0052.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4454],{6231:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var o=t(5893),a=t(1151),r=t(4713);const i={sidebar_label:"Smbios",title:""},s=void 0,l={id:"smbios",title:"",description:"Introduction",source:"@site/docs/smbios.md",sourceDirName:".",slug:"/smbios",permalink:"/next/smbios",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Smbios",title:""},sidebar:"docs",previous:{title:"Kubernetes versions",permalink:"/next/kubernetesversions"},next:{title:"Hardware Labels",permalink:"/next/hardwarelabels"}},c={},d=[{value:"Introduction",id:"introduction",level:2},{value:"How does Elemental uses SMBIOS data?",id:"how-does-elemental-uses-smbios-data",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,a.a)(),...e.components},{CodeBlock:t,Head:i}=n;return t||u("CodeBlock",!0),i||u("Head",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i,{children:(0,o.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/smbios"})}),"\n","\n","\n",(0,o.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,o.jsx)(n.p,{children:"The System Management BIOS (SMBIOS) specification defines data structures (and access methods) that can be used to read management information produced by the BIOS of a computer."}),"\n",(0,o.jsx)(n.p,{children:"This allows us to gather hardware information about the running system and use that as part of our labels."}),"\n",(0,o.jsx)(n.h2,{id:"how-does-elemental-uses-smbios-data",children:"How does Elemental uses SMBIOS data?"}),"\n",(0,o.jsxs)(n.p,{children:["The registration client tries to gather SMBIOS data by running ",(0,o.jsx)(n.code,{children:"dmidecode"})," during the initial registration of the node and that data is\nsent to the registration controller to use on interpolating different fields in the inventory that we create for that node."]}),"\n",(0,o.jsxs)(n.p,{children:["Currently, we support interpolating that data into the ",(0,o.jsx)(n.code,{children:"machineName"})," and the ",(0,o.jsx)(n.code,{children:"machineInventoryLabels"})," of a ",(0,o.jsx)(n.a,{href:"/next/machineregistration-reference",children:"machineRegistration"})]}),"\n",(0,o.jsx)(n.p,{children:"The interpolation format is as follows:"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"{$KEY/VALUE}"})," and ",(0,o.jsx)(n.code,{children:"${KEY/SUBKEY/VALUE}"})]}),"\n",(0,o.jsxs)(n.p,{children:["This can be mixed with normal strings so ",(0,o.jsx)(n.code,{children:"my-prefix-${KEY/VALUE}"})," would result into the resolved values with ",(0,o.jsx)(n.code,{children:"my-prefix-"})," prefixed"]}),"\n",(0,o.jsx)(n.p,{children:"For example, having the following SMBIOS data:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-console",metastring:"showLineNumbers",children:"System Information\n\tManufacturer: My manufacturer\n\tProduct Name: Awesome PC\n\tVersion: Not Specified\n\tSerial Number: THX1138\n\tFamily: Toretto\n"})}),"\n",(0,o.jsxs)(n.p,{children:["And setting the ",(0,o.jsx)(n.code,{children:"machineName"})," to ",(0,o.jsx)(n.code,{children:"serial-${System Information/Serial Number}"})," would result in the final value of ",(0,o.jsx)(n.code,{children:"serial-THX1138"})]}),"\n",(0,o.jsxs)(n.p,{children:["This is useful to generate automatic names for machines based on their hardware values, for example using the UUID or the Product name.\nOur default ",(0,o.jsx)(n.code,{children:"machineName"})," when the registration values are empty is ",(0,o.jsx)(n.code,{children:'"m-${System Information/UUID}"'}),"."]}),"\n",(0,o.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,o.jsxs)(n.p,{children:["All non-valid characters will be changed into ",(0,o.jsx)(n.code,{children:"-"})," automatically on parse. Valid characters for labels are alphanumeric and ",(0,o.jsx)(n.code,{children:"-"}),",",(0,o.jsx)(n.code,{children:"_"})," and ",(0,o.jsx)(n.code,{children:"."}),"\nFor machineName the constraints are stricter as that value is used for the hostname so valid values are lowercase alphanumeric and ",(0,o.jsx)(n.code,{children:"-"})," only."]})}),"\n",(0,o.jsx)(n.p,{children:"A good use of SMBIOS data is to set up different labels for all your machines and get those values from the hardware directly."}),"\n",(0,o.jsxs)(n.p,{children:["Having your ",(0,o.jsx)(n.code,{children:"machineInventoryLabels"})," on the ",(0,o.jsx)(n.a,{href:"/next/machineregistration-reference",children:"machineRegistration"})," set to SMBIOS data would allow\nyou to use selectors down the line to select similar machines."]}),"\n",(0,o.jsxs)(n.p,{children:["For example using the following label ",(0,o.jsx)(n.code,{children:'cpuFamily: "${Processor Information/Family}'})," would allow you to use a selector to search for i7 cpus in your machine fleet."]}),"\n",(0,o.jsx)(t,{language:"yaml",title:"registration example with smbios labels",showLineNumbers:!0,children:r.Z})]})}function m(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}function u(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},4713:(e,n,t)=>{t.d(n,{Z:()=>o});const o='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>i});var o=t(7294);const a={},r=o.createContext(a);function i(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0ec254a1.68e2ea59.js b/assets/js/0ec254a1.68e2ea59.js deleted file mode 100644 index e5e0d60f1..000000000 --- a/assets/js/0ec254a1.68e2ea59.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7803],{433:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>c,default:()=>p,frontMatter:()=>l,metadata:()=>d,toc:()=>m});var i=t(5893),s=t(1151),a=t(6506),r=t(8638),o=t(2624);const l={sidebar_label:"Elemental behind proxy",title:""},c=void 0,d={id:"elemental_behind_proxy",title:"",description:"Introduction",source:"@site/versioned_docs/version-1.2/elemental_behind_proxy.md",sourceDirName:".",slug:"/elemental_behind_proxy",permalink:"/1.2/elemental_behind_proxy",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Elemental behind proxy",title:""},sidebar:"docs",previous:{title:"Configure Wi-Fi",permalink:"/1.2/wifi"},next:{title:"How to use Elemental with Rancher and VMware",permalink:"/1.2/rancher-vmware"}},h={},m=[{value:"Introduction",id:"introduction",level:2},{value:"Elemental-register",id:"elemental-register",level:2},{value:"Create Elemental cluster",id:"create-elemental-cluster",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components},{CodeBlock:l,TabItem:c,Tabs:d}=n;return l||g("CodeBlock",!0),c||g("TabItem",!0),d||g("Tabs",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsx)(n.p,{children:"In a lot of enterprise environments, servers or VMs running on premises do not have direct Internet access. Instead, the connection to external services is done through a HTTP(S) proxy for security reasons. This tutorial shows you how to set up an Elemental deployment in such an environment."}),"\n",(0,i.jsx)(n.admonition,{title:"important note",type:"caution",children:(0,i.jsxs)(n.p,{children:["This guide will not cover the Rancher installation behind a proxy. It's a different use case and you can find the detailed documentation ",(0,i.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/pages-for-subheaders/rancher-behind-an-http-proxy",children:"here"}),"."]})}),"\n",(0,i.jsx)(n.admonition,{title:"info",type:"info",children:(0,i.jsxs)(n.p,{children:["For this documentation, we assume you are using a SUSE family system (like Elemental Teal), so proxy settings have to be written in ",(0,i.jsx)(n.code,{children:"/etc/sysconfig/proxy"}),"."]})}),"\n",(0,i.jsx)(n.p,{children:"Proxy settings must be configured in the following locations:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Machine Registration Endpoint"}),"\n",(0,i.jsx)(n.li,{children:"SeedImage resource"}),"\n",(0,i.jsx)(n.li,{children:"Elemental cluster configuration"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"elemental-system-agent"})," needs proxy settings to reach the Rancher Manager.\nTo achieve that, you need to fill the cloud-init section of the Machine Registration Endpoint."]}),"\n",(0,i.jsxs)(n.p,{children:["You can do it either with ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/quickstart-ui#add-a-machine-registration-endpoint",children:"UI"})," or ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/quickstart-cli#prepare-your-kubernetes-resources",children:"CLI"}),"."]}),"\n",(0,i.jsxs)(d,{children:[(0,i.jsx)(c,{value:"cliRegistration",label:"CLI",default:!0,children:(0,i.jsx)(l,{language:"yaml",title:"registration.yaml",showLineNumbers:!0,children:a.Z})}),(0,i.jsx)(c,{value:"uiRegistration",label:"UI",default:!0,children:(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Add proxy settings in Machine Registration",src:t(3536).Z+"",width:"668",height:"650"})})})]}),"\n",(0,i.jsx)(n.h2,{id:"elemental-register",children:"Elemental-register"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/architecture/#elemental-register-client",children:"Elemental-register"})," is the first communication endpoint between the new host and Rancher Manager, this is the first place where proxy settings need to be set."]}),"\n",(0,i.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,i.jsx)(n.p,{children:"At the time of writing, it's only possible to configure proxy settings for the ISO with the CLI. The proxy settings aren't implemented in the UI."})}),"\n",(0,i.jsxs)(n.p,{children:["The process happens when you boot your Elemental ISO for the first time, in order to configure the proxy settings you have to include a ",(0,i.jsx)(n.code,{children:"cloud-init"})," definition in the ISO.\nTo do that, you have to create a ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/seedimage-reference/",children:"SeedImage"})," definition."]}),"\n",(0,i.jsx)(l,{language:"yaml",title:"seedimage.yaml",showLineNumbers:!0,children:r.Z}),"\n",(0,i.jsxs)(n.p,{children:["Apply the YAML with ",(0,i.jsx)(n.code,{children:"kubectl"})," and then, print your SeedImage definition to get the URL to download it:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"kubectl apply -f \nkubectl get seedimage -n -o yaml\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Boot the ISO and you should see your new system appears in ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/architecture#machineinventory",children:"Machine inventory"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"create-elemental-cluster",children:"Create Elemental cluster"}),"\n",(0,i.jsx)(n.p,{children:"For this step, you can use either the UI or CLI."}),"\n",(0,i.jsxs)(d,{children:[(0,i.jsxs)(c,{value:"cliCluster",label:"CLI",default:!0,children:[(0,i.jsx)(l,{language:"yaml",title:"cluster.yaml",showLineNumbers:!0,children:o.Z}),(0,i.jsxs)(n.p,{children:["You can see that proxy settings are added below ",(0,i.jsx)(n.code,{children:"agentEnvVars"}),"."]})]}),(0,i.jsx)(c,{value:"uiCluster",label:"UI",default:!0,children:(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Add proxy settings for Elemental cluster",src:t(3351).Z+"",width:"1756",height:"516"})})})]})]})}function p(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}function g(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},2624:(e,n,t)=>{t.d(n,{Z:()=>i});const i="kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: my-cluster\n namespace: fleet-default\nspec:\n agentEnvVars:\n - name: HTTP_PROXY\n value: http://:\n - name: HTTPS_PROXY\n value: https://:\n - name: NO_PROXY\n value: localhost,127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local\n rkeConfig:\n machineGlobalConfig:\n etcd-expose-metrics: false\n profile: null\n machinePools:\n - controlPlaneRole: true\n etcdRole: true\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: my-machine-selector\n name: pool1\n quantity: 1\n unhealthyNodeTimeout: 0s\n workerRole: true\n machineSelectorConfig:\n - config:\n protect-kernel-defaults: false\n registries: {}\n kubernetesVersion: v1.24.8+k3s1\n"},6506:(e,n,t)=>{t.d(n,{Z:()=>i});const i='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n write_files:\n - path: /etc/sysconfig/proxy\n append: true\n content: |\n PROXY_ENABLED="yes"\n HTTP_PROXY=http://:\n HTTPS_PROXY=https://:\n NO_PROXY="localhost, 127.0.0.1"\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n registration:\n emulate-tpm: true\n'},8638:(e,n,t)=>{t.d(n,{Z:()=>i});const i='apiVersion: elemental.cattle.io/v1beta1\nkind: SeedImage\nmetadata:\n name: ...\n namespace: ...\nspec:\n baseImage: https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable:/Teal53/media/iso/elemental-teal.x86_64.iso\n cloud-config:\n write_files:\n - path: /etc/sysconfig/proxy\n append: true\n content: |\n PROXY_ENABLED="yes"\n HTTP_PROXY=http://:\n HTTPS_PROXY=https://:\n NO_PROXY="localhost, 127.0.0.1"\n registrationRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineRegistration\n name: ...\n namespace: ...\n'},3351:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/proxy-settings-cluster-ui-7303e94b634e59942023814ceff5f54f.png"},3536:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/proxy-settings-machine-registration-ui-887aa84b2d739e775e490d74062979fe.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>r});var i=t(7294);const s={},a=i.createContext(s);function r(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0ec254a1.96646f8a.js b/assets/js/0ec254a1.96646f8a.js new file mode 100644 index 000000000..af79c460d --- /dev/null +++ b/assets/js/0ec254a1.96646f8a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7803],{433:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>c,default:()=>p,frontMatter:()=>l,metadata:()=>d,toc:()=>m});var i=t(5893),a=t(1151),s=t(6506),r=t(8638),o=t(2624);const l={sidebar_label:"Elemental behind proxy",title:""},c=void 0,d={id:"elemental_behind_proxy",title:"",description:"Introduction",source:"@site/versioned_docs/version-1.2/elemental_behind_proxy.md",sourceDirName:".",slug:"/elemental_behind_proxy",permalink:"/1.2/elemental_behind_proxy",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Elemental behind proxy",title:""},sidebar:"docs",previous:{title:"Configure Wi-Fi",permalink:"/1.2/wifi"},next:{title:"How to use Elemental with Rancher and VMware",permalink:"/1.2/rancher-vmware"}},h={},m=[{value:"Introduction",id:"introduction",level:2},{value:"Elemental-register",id:"elemental-register",level:2},{value:"Create Elemental cluster",id:"create-elemental-cluster",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components},{CodeBlock:l,Head:c,TabItem:d,Tabs:h}=n;return l||g("CodeBlock",!0),c||g("Head",!0),d||g("TabItem",!0),h||g("Tabs",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(c,{children:(0,i.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/elemental_behind_proxy"})}),"\n","\n","\n",(0,i.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsx)(n.p,{children:"In a lot of enterprise environments, servers or VMs running on premises do not have direct Internet access. Instead, the connection to external services is done through a HTTP(S) proxy for security reasons. This tutorial shows you how to set up an Elemental deployment in such an environment."}),"\n",(0,i.jsx)(n.admonition,{title:"important note",type:"caution",children:(0,i.jsxs)(n.p,{children:["This guide will not cover the Rancher installation behind a proxy. It's a different use case and you can find the detailed documentation ",(0,i.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/pages-for-subheaders/rancher-behind-an-http-proxy",children:"here"}),"."]})}),"\n",(0,i.jsx)(n.admonition,{title:"info",type:"info",children:(0,i.jsxs)(n.p,{children:["For this documentation, we assume you are using a SUSE family system (like Elemental Teal), so proxy settings have to be written in ",(0,i.jsx)(n.code,{children:"/etc/sysconfig/proxy"}),"."]})}),"\n",(0,i.jsx)(n.p,{children:"Proxy settings must be configured in the following locations:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Machine Registration Endpoint"}),"\n",(0,i.jsx)(n.li,{children:"SeedImage resource"}),"\n",(0,i.jsx)(n.li,{children:"Elemental cluster configuration"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"elemental-system-agent"})," needs proxy settings to reach the Rancher Manager.\nTo achieve that, you need to fill the cloud-init section of the Machine Registration Endpoint."]}),"\n",(0,i.jsxs)(n.p,{children:["You can do it either with ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/quickstart-ui#add-a-machine-registration-endpoint",children:"UI"})," or ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/quickstart-cli#prepare-your-kubernetes-resources",children:"CLI"}),"."]}),"\n",(0,i.jsxs)(h,{children:[(0,i.jsx)(d,{value:"cliRegistration",label:"CLI",default:!0,children:(0,i.jsx)(l,{language:"yaml",title:"registration.yaml",showLineNumbers:!0,children:s.Z})}),(0,i.jsx)(d,{value:"uiRegistration",label:"UI",default:!0,children:(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Add proxy settings in Machine Registration",src:t(3536).Z+"",width:"668",height:"650"})})})]}),"\n",(0,i.jsx)(n.h2,{id:"elemental-register",children:"Elemental-register"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/architecture/#elemental-register-client",children:"Elemental-register"})," is the first communication endpoint between the new host and Rancher Manager, this is the first place where proxy settings need to be set."]}),"\n",(0,i.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,i.jsx)(n.p,{children:"At the time of writing, it's only possible to configure proxy settings for the ISO with the CLI. The proxy settings aren't implemented in the UI."})}),"\n",(0,i.jsxs)(n.p,{children:["The process happens when you boot your Elemental ISO for the first time, in order to configure the proxy settings you have to include a ",(0,i.jsx)(n.code,{children:"cloud-init"})," definition in the ISO.\nTo do that, you have to create a ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/seedimage-reference/",children:"SeedImage"})," definition."]}),"\n",(0,i.jsx)(l,{language:"yaml",title:"seedimage.yaml",showLineNumbers:!0,children:r.Z}),"\n",(0,i.jsxs)(n.p,{children:["Apply the YAML with ",(0,i.jsx)(n.code,{children:"kubectl"})," and then, print your SeedImage definition to get the URL to download it:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"kubectl apply -f \nkubectl get seedimage -n -o yaml\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Boot the ISO and you should see your new system appears in ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/architecture#machineinventory",children:"Machine inventory"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"create-elemental-cluster",children:"Create Elemental cluster"}),"\n",(0,i.jsx)(n.p,{children:"For this step, you can use either the UI or CLI."}),"\n",(0,i.jsxs)(h,{children:[(0,i.jsxs)(d,{value:"cliCluster",label:"CLI",default:!0,children:[(0,i.jsx)(l,{language:"yaml",title:"cluster.yaml",showLineNumbers:!0,children:o.Z}),(0,i.jsxs)(n.p,{children:["You can see that proxy settings are added below ",(0,i.jsx)(n.code,{children:"agentEnvVars"}),"."]})]}),(0,i.jsx)(d,{value:"uiCluster",label:"UI",default:!0,children:(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Add proxy settings for Elemental cluster",src:t(3351).Z+"",width:"1756",height:"516"})})})]})]})}function p(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}function g(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},2624:(e,n,t)=>{t.d(n,{Z:()=>i});const i="kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: my-cluster\n namespace: fleet-default\nspec:\n agentEnvVars:\n - name: HTTP_PROXY\n value: http://:\n - name: HTTPS_PROXY\n value: https://:\n - name: NO_PROXY\n value: localhost,127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local\n rkeConfig:\n machineGlobalConfig:\n etcd-expose-metrics: false\n profile: null\n machinePools:\n - controlPlaneRole: true\n etcdRole: true\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: my-machine-selector\n name: pool1\n quantity: 1\n unhealthyNodeTimeout: 0s\n workerRole: true\n machineSelectorConfig:\n - config:\n protect-kernel-defaults: false\n registries: {}\n kubernetesVersion: v1.24.8+k3s1\n"},6506:(e,n,t)=>{t.d(n,{Z:()=>i});const i='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n write_files:\n - path: /etc/sysconfig/proxy\n append: true\n content: |\n PROXY_ENABLED="yes"\n HTTP_PROXY=http://:\n HTTPS_PROXY=https://:\n NO_PROXY="localhost, 127.0.0.1"\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n registration:\n emulate-tpm: true\n'},8638:(e,n,t)=>{t.d(n,{Z:()=>i});const i='apiVersion: elemental.cattle.io/v1beta1\nkind: SeedImage\nmetadata:\n name: ...\n namespace: ...\nspec:\n baseImage: https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable:/Teal53/media/iso/elemental-teal.x86_64.iso\n cloud-config:\n write_files:\n - path: /etc/sysconfig/proxy\n append: true\n content: |\n PROXY_ENABLED="yes"\n HTTP_PROXY=http://:\n HTTPS_PROXY=https://:\n NO_PROXY="localhost, 127.0.0.1"\n registrationRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineRegistration\n name: ...\n namespace: ...\n'},3351:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/proxy-settings-cluster-ui-7303e94b634e59942023814ceff5f54f.png"},3536:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/proxy-settings-machine-registration-ui-887aa84b2d739e775e490d74062979fe.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>r});var i=t(7294);const a={},s=i.createContext(a);function r(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/17f29b2a.13d720c8.js b/assets/js/17f29b2a.13d720c8.js deleted file mode 100644 index 61889e4ae..000000000 --- a/assets/js/17f29b2a.13d720c8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[2644],{7944:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>s,metadata:()=>l,toc:()=>d});var a=t(5893),r=t(1151);const s={sidebar_label:"Upgrade",title:""},o="Troubleshooting upgrade",l={id:"troubleshooting-upgrade",title:"",description:"Upgrade Flow",source:"@site/versioned_docs/version-1.3/troubleshooting-upgrade.md",sourceDirName:".",slug:"/troubleshooting-upgrade",permalink:"/troubleshooting-upgrade",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Upgrade",title:""},sidebar:"docs",previous:{title:"Restore",permalink:"/troubleshooting-restore"},next:{title:"Reset",permalink:"/troubleshooting-reset"}},i={},d=[{value:"Rancher side",id:"rancher-side",level:2},{value:"Elemental Cluster side",id:"elemental-cluster-side",level:2}];function c(e){const n={admonition:"admonition",br:"br",code:"code",h1:"h1",h2:"h2",img:"img",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components},{Details:s}=n;return s||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"troubleshooting-upgrade",children:"Troubleshooting upgrade"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"Upgrade Flow",src:t(100).Z+"",width:"883",height:"831"})}),"\n",(0,a.jsx)(n.p,{children:"For a high level overview of the upgrade workflow, please refer to the image above."}),"\n",(0,a.jsx)(n.h2,{id:"rancher-side",children:"Rancher side"}),"\n",(0,a.jsx)(n.p,{children:"In this example we upgraded the cluster nodes with the following ManagedOSImage definition:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to or track the latest tag\n osImage: "registry.suse.com/rancher/elemental-teal/5.4:latest"\n clusterTargets:\n - clusterName: my-cluster\n'})}),"\n",(0,a.jsxs)(n.p,{children:["Once the ",(0,a.jsx)(n.code,{children:"ManagedOSImage"})," is applied, the ",(0,a.jsx)(n.code,{children:"elemental-operator"})," will verify it and generate a related ",(0,a.jsx)(n.code,{children:"Bundle"}),".",(0,a.jsx)(n.br,{}),"\n","The ",(0,a.jsx)(n.code,{children:"Bundle"})," name will be prefixed with ",(0,a.jsx)(n.code,{children:"mos"})," and then the ",(0,a.jsx)(n.code,{children:"ManagedOSImage"})," name. In this case ",(0,a.jsx)(n.code,{children:"mos-my-upgrade"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["In the ",(0,a.jsx)(n.code,{children:"Bundle"})," definition, you will find the details about the upgrade plan and the desired target.",(0,a.jsx)(n.br,{}),"\n","For example:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n fleet-default get bundle mos-my-upgrade -o yaml\n"})}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Example"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: fleet.cattle.io/v1alpha1\nkind: Bundle\nmetadata:\n creationTimestamp: "2023-06-16T09:01:47Z"\n generation: 1\n name: mos-my-upgrade\n namespace: fleet-default\n ownerReferences:\n - apiVersion: elemental.cattle.io/v1beta1\n controller: true\n kind: ManagedOSImage\n name: my-upgrade\n uid: e468ed21-23bb-487a-a022-dbc7ef753720\n resourceVersion: "1038645"\n uid: 35e83fc4-28c8-4b10-8059-cae6cdff2cda\nspec:\n resources:\n - content: \'{"kind":"ClusterRole","apiVersion":"rbac.authorization.k8s.io/v1","metadata":{"name":"os-upgrader-my-upgrade","creationTimestamp":null},"rules":[{"verbs":["update","get","list","watch","patch"],"apiGroups":[""],"resources":["nodes"]},{"verbs":["list"],"apiGroups":[""],"resources":["pods"]}]}\'\n name: ClusterRole--os-upgrader-my-upgrade-296a3abf3451.yaml\n - content: \'{"kind":"ClusterRoleBinding","apiVersion":"rbac.authorization.k8s.io/v1","metadata":{"name":"os-upgrader-my-upgrade","creationTimestamp":null},"subjects":[{"kind":"ServiceAccount","name":"os-upgrader-my-upgrade","namespace":"cattle-system"}],"roleRef":{"apiGroup":"rbac.authorization.k8s.io","kind":"ClusterRole","name":"os-upgrader-my-upgrade"}}\'\n name: ClusterRoleBinding--os-upgrader-my-upgrade-f63eaecde935.yaml\n - content: \'{"kind":"ServiceAccount","apiVersion":"v1","metadata":{"name":"os-upgrader-my-upgrade","namespace":"cattle-system","creationTimestamp":null}}\'\n name: ServiceAccount-cattle-system-os-upgrader-my-upgrade-ce93d-01096.yaml\n - content: \'{"kind":"Secret","apiVersion":"v1","metadata":{"name":"os-upgrader-my-upgrade","namespace":"cattle-system","creationTimestamp":null},"data":{"cloud-config":""}}\'\n name: Secret-cattle-system-os-upgrader-my-upgrade-a997ee6a67ef.yaml\n - content: \'{"kind":"Plan","apiVersion":"upgrade.cattle.io/v1","metadata":{"name":"os-upgrader-my-upgrade","namespace":"cattle-system","creationTimestamp":null},"spec":{"concurrency":1,"nodeSelector":{},"serviceAccountName":"os-upgrader-my-upgrade","version":"latest","secrets":[{"name":"os-upgrader-my-upgrade","path":"/run/data"}],"tolerations":[{"operator":"Exists"}],"cordon":true,"upgrade":{"image":"registry.suse.com/rancher/elemental-teal/5.4","command":["/usr/sbin/suc-upgrade"]}},"status":{}}\'\n name: Plan-cattle-system-os-upgrader-my-upgrade-273c2c09afca.yaml\n targets:\n - clusterName: my-cluster\n.\n.\n.\n'})})]}),"\n",(0,a.jsx)(n.h2,{id:"elemental-cluster-side",children:"Elemental Cluster side"}),"\n",(0,a.jsxs)(n.p,{children:["Any Elemental Teal node correctly registered and part of the target cluster will fetch the bundle and start applying it.",(0,a.jsx)(n.br,{}),"\n","This operation is performed by the Rancher's ",(0,a.jsx)(n.code,{children:"system-upgrade-controller"})," running on the Elemental Cluster.",(0,a.jsx)(n.br,{}),"\n","To monitor the correct operation of this controller, you can read its logs:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system logs deployment/system-upgrade-controller\n"})}),"\n",(0,a.jsxs)(n.p,{children:["If everything is correct, the ",(0,a.jsx)(n.code,{children:"system-upgrade-controller"})," will create an upgrade job for each targeted machine.",(0,a.jsx)(n.br,{}),"\n","The job names will use the Plan name (",(0,a.jsx)(n.code,{children:"os-upgrader-my-upgrade"}),") and the target machine hostname (",(0,a.jsx)(n.code,{children:"my-host"}),") for easy discoverability.",(0,a.jsx)(n.br,{}),"\n","For example: ",(0,a.jsx)(n.code,{children:"apply-os-upgrader-my-upgrade-on-my-host-7a25e"}),(0,a.jsx)(n.br,{}),"\n","You can monitor these jobs with:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system get jobs\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Each job will use a ",(0,a.jsx)(n.code,{children:"privileged: true"})," container with the Elemental Teal image specified in the ",(0,a.jsx)(n.code,{children:"ManagedOSImage"})," definition. This container will try to upgrade the system and perform a reboot."]}),"\n",(0,a.jsx)(n.p,{children:"If the job fails, you can check its status by examining the logs:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system logs job.batch/apply-os-upgrader-my-upgrade-on-my-host-7a25e\n"})}),"\n",(0,a.jsxs)(n.admonition,{title:"Two stages job process",type:"info",children:[(0,a.jsxs)(n.p,{children:["Note that the upgrade process is performed in two stages.",(0,a.jsx)(n.br,{}),"\n","You will notice that the same job is ran twice and the first one ends with the ",(0,a.jsx)(n.code,{children:"Uknown"})," Status and will not complete.",(0,a.jsx)(n.br,{}),"\n",(0,a.jsx)(n.strong,{children:"This is to be expected"}),", as Elemental Teal relies on the job to be ran again after the machine restarts, so that it can verify the new version was installed correctly.",(0,a.jsx)(n.br,{}),"\n","You will notice a second run of the job, this time completing correctly."]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system get jobs \nNAMESPACE NAME COMPLETIONS DURATION AGE\ncattle-system apply-os-upgrader-my-upgrade-on-my-host-0b392 1/1 2m34s 6m23s\ncattle-system apply-os-upgrader-my-upgrade-on-my-host-7a25e 0/1 6m23s 6m23s\n"})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system get pods \nNAME READY STATUS RESTARTS AGE\napply-os-upgrader-my-upgrade-on-my-host-zbkrh 0/1 Completed 0 9m40s\napply-os-upgrader-my-upgrade-on-my-host-zvrff 0/1 Unknown 0 12m\n"})})]})]})}function m(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},100:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/troubleshooting-upgrade-d04ebc28593991d53a8c0e59bb2a666b.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>o});var a=t(7294);const r={},s=a.createContext(r);function o(e){const n=a.useContext(s);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),a.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/17f29b2a.c3e81c17.js b/assets/js/17f29b2a.c3e81c17.js new file mode 100644 index 000000000..511e2b295 --- /dev/null +++ b/assets/js/17f29b2a.c3e81c17.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[2644],{7944:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>s,metadata:()=>l,toc:()=>d});var a=t(5893),r=t(1151);const s={sidebar_label:"Upgrade",title:""},o="Troubleshooting upgrade",l={id:"troubleshooting-upgrade",title:"",description:"Upgrade Flow",source:"@site/versioned_docs/version-1.3/troubleshooting-upgrade.md",sourceDirName:".",slug:"/troubleshooting-upgrade",permalink:"/troubleshooting-upgrade",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Upgrade",title:""},sidebar:"docs",previous:{title:"Restore",permalink:"/troubleshooting-restore"},next:{title:"Reset",permalink:"/troubleshooting-reset"}},i={},d=[{value:"Rancher side",id:"rancher-side",level:2},{value:"Elemental Cluster side",id:"elemental-cluster-side",level:2}];function c(e){const n={admonition:"admonition",br:"br",code:"code",h1:"h1",h2:"h2",img:"img",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components},{Details:s,Head:o}=n;return s||u("Details",!0),o||u("Head",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o,{children:(0,a.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/troubleshooting-upgrade"})}),"\n",(0,a.jsx)(n.h1,{id:"troubleshooting-upgrade",children:"Troubleshooting upgrade"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"Upgrade Flow",src:t(100).Z+"",width:"883",height:"831"})}),"\n",(0,a.jsx)(n.p,{children:"For a high level overview of the upgrade workflow, please refer to the image above."}),"\n",(0,a.jsx)(n.h2,{id:"rancher-side",children:"Rancher side"}),"\n",(0,a.jsx)(n.p,{children:"In this example we upgraded the cluster nodes with the following ManagedOSImage definition:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to or track the latest tag\n osImage: "registry.suse.com/rancher/elemental-teal/5.4:latest"\n clusterTargets:\n - clusterName: my-cluster\n'})}),"\n",(0,a.jsxs)(n.p,{children:["Once the ",(0,a.jsx)(n.code,{children:"ManagedOSImage"})," is applied, the ",(0,a.jsx)(n.code,{children:"elemental-operator"})," will verify it and generate a related ",(0,a.jsx)(n.code,{children:"Bundle"}),".",(0,a.jsx)(n.br,{}),"\n","The ",(0,a.jsx)(n.code,{children:"Bundle"})," name will be prefixed with ",(0,a.jsx)(n.code,{children:"mos"})," and then the ",(0,a.jsx)(n.code,{children:"ManagedOSImage"})," name. In this case ",(0,a.jsx)(n.code,{children:"mos-my-upgrade"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["In the ",(0,a.jsx)(n.code,{children:"Bundle"})," definition, you will find the details about the upgrade plan and the desired target.",(0,a.jsx)(n.br,{}),"\n","For example:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n fleet-default get bundle mos-my-upgrade -o yaml\n"})}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Example"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: fleet.cattle.io/v1alpha1\nkind: Bundle\nmetadata:\n creationTimestamp: "2023-06-16T09:01:47Z"\n generation: 1\n name: mos-my-upgrade\n namespace: fleet-default\n ownerReferences:\n - apiVersion: elemental.cattle.io/v1beta1\n controller: true\n kind: ManagedOSImage\n name: my-upgrade\n uid: e468ed21-23bb-487a-a022-dbc7ef753720\n resourceVersion: "1038645"\n uid: 35e83fc4-28c8-4b10-8059-cae6cdff2cda\nspec:\n resources:\n - content: \'{"kind":"ClusterRole","apiVersion":"rbac.authorization.k8s.io/v1","metadata":{"name":"os-upgrader-my-upgrade","creationTimestamp":null},"rules":[{"verbs":["update","get","list","watch","patch"],"apiGroups":[""],"resources":["nodes"]},{"verbs":["list"],"apiGroups":[""],"resources":["pods"]}]}\'\n name: ClusterRole--os-upgrader-my-upgrade-296a3abf3451.yaml\n - content: \'{"kind":"ClusterRoleBinding","apiVersion":"rbac.authorization.k8s.io/v1","metadata":{"name":"os-upgrader-my-upgrade","creationTimestamp":null},"subjects":[{"kind":"ServiceAccount","name":"os-upgrader-my-upgrade","namespace":"cattle-system"}],"roleRef":{"apiGroup":"rbac.authorization.k8s.io","kind":"ClusterRole","name":"os-upgrader-my-upgrade"}}\'\n name: ClusterRoleBinding--os-upgrader-my-upgrade-f63eaecde935.yaml\n - content: \'{"kind":"ServiceAccount","apiVersion":"v1","metadata":{"name":"os-upgrader-my-upgrade","namespace":"cattle-system","creationTimestamp":null}}\'\n name: ServiceAccount-cattle-system-os-upgrader-my-upgrade-ce93d-01096.yaml\n - content: \'{"kind":"Secret","apiVersion":"v1","metadata":{"name":"os-upgrader-my-upgrade","namespace":"cattle-system","creationTimestamp":null},"data":{"cloud-config":""}}\'\n name: Secret-cattle-system-os-upgrader-my-upgrade-a997ee6a67ef.yaml\n - content: \'{"kind":"Plan","apiVersion":"upgrade.cattle.io/v1","metadata":{"name":"os-upgrader-my-upgrade","namespace":"cattle-system","creationTimestamp":null},"spec":{"concurrency":1,"nodeSelector":{},"serviceAccountName":"os-upgrader-my-upgrade","version":"latest","secrets":[{"name":"os-upgrader-my-upgrade","path":"/run/data"}],"tolerations":[{"operator":"Exists"}],"cordon":true,"upgrade":{"image":"registry.suse.com/rancher/elemental-teal/5.4","command":["/usr/sbin/suc-upgrade"]}},"status":{}}\'\n name: Plan-cattle-system-os-upgrader-my-upgrade-273c2c09afca.yaml\n targets:\n - clusterName: my-cluster\n.\n.\n.\n'})})]}),"\n",(0,a.jsx)(n.h2,{id:"elemental-cluster-side",children:"Elemental Cluster side"}),"\n",(0,a.jsxs)(n.p,{children:["Any Elemental Teal node correctly registered and part of the target cluster will fetch the bundle and start applying it.",(0,a.jsx)(n.br,{}),"\n","This operation is performed by the Rancher's ",(0,a.jsx)(n.code,{children:"system-upgrade-controller"})," running on the Elemental Cluster.",(0,a.jsx)(n.br,{}),"\n","To monitor the correct operation of this controller, you can read its logs:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system logs deployment/system-upgrade-controller\n"})}),"\n",(0,a.jsxs)(n.p,{children:["If everything is correct, the ",(0,a.jsx)(n.code,{children:"system-upgrade-controller"})," will create an upgrade job for each targeted machine.",(0,a.jsx)(n.br,{}),"\n","The job names will use the Plan name (",(0,a.jsx)(n.code,{children:"os-upgrader-my-upgrade"}),") and the target machine hostname (",(0,a.jsx)(n.code,{children:"my-host"}),") for easy discoverability.",(0,a.jsx)(n.br,{}),"\n","For example: ",(0,a.jsx)(n.code,{children:"apply-os-upgrader-my-upgrade-on-my-host-7a25e"}),(0,a.jsx)(n.br,{}),"\n","You can monitor these jobs with:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system get jobs\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Each job will use a ",(0,a.jsx)(n.code,{children:"privileged: true"})," container with the Elemental Teal image specified in the ",(0,a.jsx)(n.code,{children:"ManagedOSImage"})," definition. This container will try to upgrade the system and perform a reboot."]}),"\n",(0,a.jsx)(n.p,{children:"If the job fails, you can check its status by examining the logs:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system logs job.batch/apply-os-upgrader-my-upgrade-on-my-host-7a25e\n"})}),"\n",(0,a.jsxs)(n.admonition,{title:"Two stages job process",type:"info",children:[(0,a.jsxs)(n.p,{children:["Note that the upgrade process is performed in two stages.",(0,a.jsx)(n.br,{}),"\n","You will notice that the same job is ran twice and the first one ends with the ",(0,a.jsx)(n.code,{children:"Uknown"})," Status and will not complete.",(0,a.jsx)(n.br,{}),"\n",(0,a.jsx)(n.strong,{children:"This is to be expected"}),", as Elemental Teal relies on the job to be ran again after the machine restarts, so that it can verify the new version was installed correctly.",(0,a.jsx)(n.br,{}),"\n","You will notice a second run of the job, this time completing correctly."]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system get jobs \nNAMESPACE NAME COMPLETIONS DURATION AGE\ncattle-system apply-os-upgrader-my-upgrade-on-my-host-0b392 1/1 2m34s 6m23s\ncattle-system apply-os-upgrader-my-upgrade-on-my-host-7a25e 0/1 6m23s 6m23s\n"})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system get pods \nNAME READY STATUS RESTARTS AGE\napply-os-upgrader-my-upgrade-on-my-host-zbkrh 0/1 Completed 0 9m40s\napply-os-upgrader-my-upgrade-on-my-host-zvrff 0/1 Unknown 0 12m\n"})})]})]})}function m(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}function u(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},100:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/troubleshooting-upgrade-d04ebc28593991d53a8c0e59bb2a666b.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>o});var a=t(7294);const r={},s=a.createContext(r);function o(e){const n=a.useContext(s);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),a.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1b0f8c91.51385573.js b/assets/js/1b0f8c91.51385573.js deleted file mode 100644 index d7bd13c85..000000000 --- a/assets/js/1b0f8c91.51385573.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[5489],{7693:(e,r,a)=>{a.r(r),a.d(r,{assets:()=>i,contentTitle:()=>s,default:()=>h,frontMatter:()=>c,metadata:()=>o,toc:()=>l});var n=a(5893),t=a(1151);const c={sidebar_label:"Backup",title:""},s="Backup",o={id:"backup",title:"",description:"Since Elemental runs as part of Rancher, the Elemental resources are bundled in the Rancher backup.",source:"@site/docs/backup.md",sourceDirName:".",slug:"/backup",permalink:"/next/backup",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Backup",title:""},sidebar:"docs",previous:{title:"Machine Reset",permalink:"/next/reset"},next:{title:"Restore",permalink:"/next/restore"}},i={},l=[{value:"Install rancher-backup operator for Rancher",id:"install-rancher-backup-operator-for-rancher",level:2},{value:"Backup Elemental with rancher-backup operator",id:"backup-elemental-with-rancher-backup-operator",level:2}];function u(e){const r={a:"a",br:"br",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(r.h1,{id:"backup",children:"Backup"}),"\n",(0,n.jsxs)(r.p,{children:["Since Elemental runs as part of Rancher, the Elemental resources are bundled in the Rancher backup.",(0,n.jsx)(r.br,{}),"\n","For more details about Rancher backups, restore, and disaster recovery options, please follow the official ",(0,n.jsx)(r.a,{href:"https://ranchermanager.docs.rancher.com/pages-for-subheaders/backup-restore-configuration",children:"Rancher documentation"}),"."]}),"\n",(0,n.jsx)(r.h2,{id:"install-rancher-backup-operator-for-rancher",children:"Install rancher-backup operator for Rancher"}),"\n",(0,n.jsxs)(r.p,{children:["Follow the ",(0,n.jsx)(r.a,{href:"https://docs.ranchermanager.rancher.io/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-rancher",children:"Rancher backup guide"})," to learn how to install and configure the Rancher backup-operator."]}),"\n",(0,n.jsxs)(r.p,{children:["Note that for single node Rancher installations the backup workflow is different.",(0,n.jsx)(r.br,{}),"\n","You may follow the official ",(0,n.jsx)(r.a,{href:"https://ranchermanager.docs.rancher.com/v2.6/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-docker-installed-rancher",children:"documentation"})," to learn more."]}),"\n",(0,n.jsx)(r.h2,{id:"backup-elemental-with-rancher-backup-operator",children:"Backup Elemental with rancher-backup operator"}),"\n",(0,n.jsxs)(r.p,{children:["Create a ",(0,n.jsx)(r.code,{children:"backup object"})," (adapted to your needs) to backup Rancher running on a Kubernetes cluster."]}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: resources.cattle.io/v1\nkind: Backup\nmetadata:\n name: rancher-backup\nspec:\n resourceSetName: rancher-resource-set\n schedule: "10 3 * * *"\n retentionCount: 10\n'})}),"\n",(0,n.jsxs)(r.p,{children:["The rancher-backup operator offers several options for schedule, encryption, and storage classes.",(0,n.jsx)(r.br,{}),"\n","You can explore all options by reading the ",(0,n.jsx)(r.a,{href:"https://ranchermanager.docs.rancher.com/reference-guides/backup-restore-configuration/backup-configuration",children:"official documentation"}),"."]}),"\n",(0,n.jsx)(r.p,{children:"Check logs from rancher-backup operator."}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl logs -n cattle-resources-system -l app.kubernetes.io/name=rancher-backup -f\n"})}),"\n",(0,n.jsx)(r.p,{children:"Verify if backup file was created on Persistent Volume."}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"...\nINFO[2022/10/17 07:45:04] Finding files starting with /var/lib/backups/rancher-backup-430169aa-edde-4a61-85e8-858f625a755b*.tar.gz \nINFO[2022/10/17 07:45:04] File rancher-backup-430169aa-edde-4a61-85e8-858f625a755b-2022-10-17T05-15-00Z.tar.gz was created at 2022-10-17 0\n...\n"})})]})}function h(e={}){const{wrapper:r}={...(0,t.a)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},1151:(e,r,a)=>{a.d(r,{Z:()=>o,a:()=>s});var n=a(7294);const t={},c=n.createContext(t);function s(e){const r=n.useContext(c);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),n.createElement(c.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1b0f8c91.9f2ba2e3.js b/assets/js/1b0f8c91.9f2ba2e3.js new file mode 100644 index 000000000..c8a4a35d1 --- /dev/null +++ b/assets/js/1b0f8c91.9f2ba2e3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[5489],{7693:(e,r,a)=>{a.r(r),a.d(r,{assets:()=>i,contentTitle:()=>o,default:()=>h,frontMatter:()=>c,metadata:()=>s,toc:()=>l});var n=a(5893),t=a(1151);const c={sidebar_label:"Backup",title:""},o="Backup",s={id:"backup",title:"",description:"Since Elemental runs as part of Rancher, the Elemental resources are bundled in the Rancher backup.",source:"@site/docs/backup.md",sourceDirName:".",slug:"/backup",permalink:"/next/backup",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Backup",title:""},sidebar:"docs",previous:{title:"Machine Reset",permalink:"/next/reset"},next:{title:"Restore",permalink:"/next/restore"}},i={},l=[{value:"Install rancher-backup operator for Rancher",id:"install-rancher-backup-operator-for-rancher",level:2},{value:"Backup Elemental with rancher-backup operator",id:"backup-elemental-with-rancher-backup-operator",level:2}];function u(e){const r={a:"a",br:"br",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,t.a)(),...e.components},{Head:a}=r;return a||function(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a,{children:(0,n.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/backup"})}),"\n",(0,n.jsx)(r.h1,{id:"backup",children:"Backup"}),"\n",(0,n.jsxs)(r.p,{children:["Since Elemental runs as part of Rancher, the Elemental resources are bundled in the Rancher backup.",(0,n.jsx)(r.br,{}),"\n","For more details about Rancher backups, restore, and disaster recovery options, please follow the official ",(0,n.jsx)(r.a,{href:"https://ranchermanager.docs.rancher.com/pages-for-subheaders/backup-restore-configuration",children:"Rancher documentation"}),"."]}),"\n",(0,n.jsx)(r.h2,{id:"install-rancher-backup-operator-for-rancher",children:"Install rancher-backup operator for Rancher"}),"\n",(0,n.jsxs)(r.p,{children:["Follow the ",(0,n.jsx)(r.a,{href:"https://docs.ranchermanager.rancher.io/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-rancher",children:"Rancher backup guide"})," to learn how to install and configure the Rancher backup-operator."]}),"\n",(0,n.jsxs)(r.p,{children:["Note that for single node Rancher installations the backup workflow is different.",(0,n.jsx)(r.br,{}),"\n","You may follow the official ",(0,n.jsx)(r.a,{href:"https://ranchermanager.docs.rancher.com/v2.6/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-docker-installed-rancher",children:"documentation"})," to learn more."]}),"\n",(0,n.jsx)(r.h2,{id:"backup-elemental-with-rancher-backup-operator",children:"Backup Elemental with rancher-backup operator"}),"\n",(0,n.jsxs)(r.p,{children:["Create a ",(0,n.jsx)(r.code,{children:"backup object"})," (adapted to your needs) to backup Rancher running on a Kubernetes cluster."]}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: resources.cattle.io/v1\nkind: Backup\nmetadata:\n name: rancher-backup\nspec:\n resourceSetName: rancher-resource-set\n schedule: "10 3 * * *"\n retentionCount: 10\n'})}),"\n",(0,n.jsxs)(r.p,{children:["The rancher-backup operator offers several options for schedule, encryption, and storage classes.",(0,n.jsx)(r.br,{}),"\n","You can explore all options by reading the ",(0,n.jsx)(r.a,{href:"https://ranchermanager.docs.rancher.com/reference-guides/backup-restore-configuration/backup-configuration",children:"official documentation"}),"."]}),"\n",(0,n.jsx)(r.p,{children:"Check logs from rancher-backup operator."}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl logs -n cattle-resources-system -l app.kubernetes.io/name=rancher-backup -f\n"})}),"\n",(0,n.jsx)(r.p,{children:"Verify if backup file was created on Persistent Volume."}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"...\nINFO[2022/10/17 07:45:04] Finding files starting with /var/lib/backups/rancher-backup-430169aa-edde-4a61-85e8-858f625a755b*.tar.gz \nINFO[2022/10/17 07:45:04] File rancher-backup-430169aa-edde-4a61-85e8-858f625a755b-2022-10-17T05-15-00Z.tar.gz was created at 2022-10-17 0\n...\n"})})]})}function h(e={}){const{wrapper:r}={...(0,t.a)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},1151:(e,r,a)=>{a.d(r,{Z:()=>s,a:()=>o});var n=a(7294);const t={},c=n.createContext(t);function o(e){const r=n.useContext(c);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function s(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),n.createElement(c.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1b128653.42b5656b.js b/assets/js/1b128653.42b5656b.js deleted file mode 100644 index 2cd22f3aa..000000000 --- a/assets/js/1b128653.42b5656b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8681],{2405:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var t=a(5893),l=a(1151);const i={sidebar_label:"Air-Gapped Installation",title:""},r=void 0,s={id:"airgap",title:"",description:"Install Elemental in an Air-Gapped Environment",source:"@site/docs/airgap.md",sourceDirName:".",slug:"/airgap",permalink:"/next/airgap",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Air-Gapped Installation",title:""},sidebar:"docs",previous:{title:"Add a custom certificate",permalink:"/next/custom-certificate"},next:{title:"Rancher upgrades",permalink:"/next/troubleshooting-rancher-upgrades"}},o={},c=[{value:"Install Elemental in an Air-Gapped Environment",id:"install-elemental-in-an-air-gapped-environment",level:2},{value:"Assumptions",id:"assumptions",level:3},{value:"Download Elemental charts and Elemental images",id:"download-elemental-charts-and-elemental-images",level:3},{value:"Perform Elemental installation using the generated artifacts",id:"perform-elemental-installation-using-the-generated-artifacts",level:3},{value:"Elemental UI Extension",id:"elemental-ui-extension",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,l.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"install-elemental-in-an-air-gapped-environment",children:"Install Elemental in an Air-Gapped Environment"}),"\n",(0,t.jsx)(n.h3,{id:"assumptions",children:"Assumptions"}),"\n",(0,t.jsxs)(n.p,{children:["A Rancher air-gapped installation should be already configured as per the ",(0,t.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/pages-for-subheaders/air-gapped-helm-cli-install",children:"official Rancher documentation"}),".\nIn particular, a private registry should be available in the air-gapped infrastructure."]}),"\n",(0,t.jsx)(n.h3,{id:"download-elemental-charts-and-elemental-images",children:"Download Elemental charts and Elemental images"}),"\n",(0,t.jsx)(n.p,{children:"In order to run Elemental in an air-gapped environment the following artifacts are needed:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"the Elemental Operator charts"}),"\n",(0,t.jsxs)(n.li,{children:["the container images referenced in the charts (the ",(0,t.jsx)(n.em,{children:"elemental-operator"})," and ",(0,t.jsx)(n.em,{children:"seedimage-builder"})," images)"]}),"\n",(0,t.jsx)(n.li,{children:"the containerized OS images"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Moreover, it could be handy to create a ",(0,t.jsx)(n.em,{children:"channel image"})," referencing the containerized OS images available.\nThe official channel image (the ",(0,t.jsx)(n.em,{children:"elemental-teal-channel"})," one) references absolute URLs of the OS images on the official suse registry, so it cannot be used in an air-gapped scenario."]}),"\n",(0,t.jsxs)(n.p,{children:["All these steps can be performed by executing the ",(0,t.jsxs)(n.a,{href:"https://raw.githubusercontent.com/rancher/elemental-operator/main/scripts/elemental-airgap.sh",children:[(0,t.jsx)(n.code,{children:"elemental-airgap.sh"})," script"]})," from a host with Internet access.\nYou can provide manually downloaded Elemental charts to the script or let it download the helm charts for you.\n",(0,t.jsx)(n.code,{children:"elemental-airgap.sh"})," will inspect the Elemental Operator chart, identify all the required container images, download and save them in an archive.\nIt will also build a new OS channel image with OS URLs pointing to the private registry (which must be specified as an argument on the command line)."]}),"\n",(0,t.jsx)(n.p,{children:"Here we will download all the artifacts and build a custom channel from the latest stable release of Elemental:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget https://raw.githubusercontent.com/rancher/elemental-operator/main/scripts/elemental-airgap.sh\nchmod 755 elemental-airgap.sh\n./elemental-airgap.sh stable -r \n"})}),"\n",(0,t.jsx)(n.p,{children:"once completed (the script may take a while) the following files will be available in the current dir:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"elemental-operator-crds-chart-<*VERSION*>.tgz"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"elemental-operator-chart-<*VERSION*>.tgz"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"elemental-images.txt"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"elemental-images.tar.gz"})}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"perform-elemental-installation-using-the-generated-artifacts",children:"Perform Elemental installation using the generated artifacts"}),"\n",(0,t.jsx)(n.p,{children:"All the above files should be copied to a host which:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Has access to the private registry. If the private registry requires authentication log into it:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shellnocolor",metastring:"showLineNumbers",children:"docker login \n"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Has the kubectl binary installed and configured to access the air-gapped Rancher cluster."}),"\n",(0,t.jsx)(n.li,{children:"Has the helm binary installed."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Two steps are needed to perform the Elemental installation:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["load the archive with all the required container images on the private registry:\nthis could be done using the ",(0,t.jsx)(n.code,{children:"rancher-load-images.sh"})," script distributed with the Rancher release and already used for the Rancher air-gapped deployment:"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shellnocolor",metastring:"showLineNumbers",children:"rancher-load-images.sh \\\n --image-list elemental-images.txt \\\n --images elemental-images.tar.gz \\\n --registry \n"})}),"\n",(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsx)(n.li,{children:"install the downloaded elemental charts configuring the local registry and the newly created channel:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shellnocolor",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system \\\n --install elemental-operator-crds elemental-operator-crds-chart-.tgz\n\nhelm upgrade --create-namespace -n cattle-elemental-system \\\n --install elemental-operator elemental-operator-chart-.tgz \\\n --set registryUrl= \\\n --set channel.repository=rancher/elemental-teal-channel-\n"})}),"\n",(0,t.jsx)(n.admonition,{title:"The elemental airgap script outputs the required commands",type:"info",children:(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"elemental-airgap.sh"})," scripts prints out the required commands shown above but using the actual chart version and the provided registry URL to allow to just copy and paste."]})}),"\n",(0,t.jsx)(n.h3,{id:"elemental-ui-extension",children:"Elemental UI Extension"}),"\n",(0,t.jsx)(n.p,{children:"Rancher 2.7.x doesn't support UI extensions plugin in air-gapped environments, and so the Elemental UI is not available in Rancher 2.7.x."}),"\n",(0,t.jsx)(n.p,{children:"The Elemental UI plugin will be present in the available UI extensions in Rancher 2.8.0."})]})}function h(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,a)=>{a.d(n,{Z:()=>s,a:()=>r});var t=a(7294);const l={},i=t.createContext(l);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1b128653.6056253e.js b/assets/js/1b128653.6056253e.js new file mode 100644 index 000000000..fd1130db6 --- /dev/null +++ b/assets/js/1b128653.6056253e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8681],{2405:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>o,contentTitle:()=>i,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>c});var t=a(5893),l=a(1151);const r={sidebar_label:"Air-Gapped Installation",title:""},i=void 0,s={id:"airgap",title:"",description:"Install Elemental in an Air-Gapped Environment",source:"@site/docs/airgap.md",sourceDirName:".",slug:"/airgap",permalink:"/next/airgap",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Air-Gapped Installation",title:""},sidebar:"docs",previous:{title:"Add a custom certificate",permalink:"/next/custom-certificate"},next:{title:"Rancher upgrades",permalink:"/next/troubleshooting-rancher-upgrades"}},o={},c=[{value:"Install Elemental in an Air-Gapped Environment",id:"install-elemental-in-an-air-gapped-environment",level:2},{value:"Assumptions",id:"assumptions",level:3},{value:"Download Elemental charts and Elemental images",id:"download-elemental-charts-and-elemental-images",level:3},{value:"Perform Elemental installation using the generated artifacts",id:"perform-elemental-installation-using-the-generated-artifacts",level:3},{value:"Elemental UI Extension",id:"elemental-ui-extension",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,l.a)(),...e.components},{Head:a}=n;return a||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(a,{children:(0,t.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/airgap"})}),"\n",(0,t.jsx)(n.h2,{id:"install-elemental-in-an-air-gapped-environment",children:"Install Elemental in an Air-Gapped Environment"}),"\n",(0,t.jsx)(n.h3,{id:"assumptions",children:"Assumptions"}),"\n",(0,t.jsxs)(n.p,{children:["A Rancher air-gapped installation should be already configured as per the ",(0,t.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/pages-for-subheaders/air-gapped-helm-cli-install",children:"official Rancher documentation"}),".\nIn particular, a private registry should be available in the air-gapped infrastructure."]}),"\n",(0,t.jsx)(n.h3,{id:"download-elemental-charts-and-elemental-images",children:"Download Elemental charts and Elemental images"}),"\n",(0,t.jsx)(n.p,{children:"In order to run Elemental in an air-gapped environment the following artifacts are needed:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"the Elemental Operator charts"}),"\n",(0,t.jsxs)(n.li,{children:["the container images referenced in the charts (the ",(0,t.jsx)(n.em,{children:"elemental-operator"})," and ",(0,t.jsx)(n.em,{children:"seedimage-builder"})," images)"]}),"\n",(0,t.jsx)(n.li,{children:"the containerized OS images"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Moreover, it could be handy to create a ",(0,t.jsx)(n.em,{children:"channel image"})," referencing the containerized OS images available.\nThe official channel image (the ",(0,t.jsx)(n.em,{children:"elemental-teal-channel"})," one) references absolute URLs of the OS images on the official suse registry, so it cannot be used in an air-gapped scenario."]}),"\n",(0,t.jsxs)(n.p,{children:["All these steps can be performed by executing the ",(0,t.jsxs)(n.a,{href:"https://raw.githubusercontent.com/rancher/elemental-operator/main/scripts/elemental-airgap.sh",children:[(0,t.jsx)(n.code,{children:"elemental-airgap.sh"})," script"]})," from a host with Internet access.\nYou can provide manually downloaded Elemental charts to the script or let it download the helm charts for you.\n",(0,t.jsx)(n.code,{children:"elemental-airgap.sh"})," will inspect the Elemental Operator chart, identify all the required container images, download and save them in an archive.\nIt will also build a new OS channel image with OS URLs pointing to the private registry (which must be specified as an argument on the command line)."]}),"\n",(0,t.jsx)(n.p,{children:"Here we will download all the artifacts and build a custom channel from the latest stable release of Elemental:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget https://raw.githubusercontent.com/rancher/elemental-operator/main/scripts/elemental-airgap.sh\nchmod 755 elemental-airgap.sh\n./elemental-airgap.sh stable -r \n"})}),"\n",(0,t.jsx)(n.p,{children:"once completed (the script may take a while) the following files will be available in the current dir:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"elemental-operator-crds-chart-<*VERSION*>.tgz"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"elemental-operator-chart-<*VERSION*>.tgz"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"elemental-images.txt"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"elemental-images.tar.gz"})}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"perform-elemental-installation-using-the-generated-artifacts",children:"Perform Elemental installation using the generated artifacts"}),"\n",(0,t.jsx)(n.p,{children:"All the above files should be copied to a host which:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Has access to the private registry. If the private registry requires authentication log into it:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shellnocolor",metastring:"showLineNumbers",children:"docker login \n"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Has the kubectl binary installed and configured to access the air-gapped Rancher cluster."}),"\n",(0,t.jsx)(n.li,{children:"Has the helm binary installed."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Two steps are needed to perform the Elemental installation:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["load the archive with all the required container images on the private registry:\nthis could be done using the ",(0,t.jsx)(n.code,{children:"rancher-load-images.sh"})," script distributed with the Rancher release and already used for the Rancher air-gapped deployment:"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shellnocolor",metastring:"showLineNumbers",children:"rancher-load-images.sh \\\n --image-list elemental-images.txt \\\n --images elemental-images.tar.gz \\\n --registry \n"})}),"\n",(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsx)(n.li,{children:"install the downloaded elemental charts configuring the local registry and the newly created channel:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shellnocolor",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system \\\n --install elemental-operator-crds elemental-operator-crds-chart-.tgz\n\nhelm upgrade --create-namespace -n cattle-elemental-system \\\n --install elemental-operator elemental-operator-chart-.tgz \\\n --set registryUrl= \\\n --set channel.repository=rancher/elemental-teal-channel-\n"})}),"\n",(0,t.jsx)(n.admonition,{title:"The elemental airgap script outputs the required commands",type:"info",children:(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"elemental-airgap.sh"})," scripts prints out the required commands shown above but using the actual chart version and the provided registry URL to allow to just copy and paste."]})}),"\n",(0,t.jsx)(n.h3,{id:"elemental-ui-extension",children:"Elemental UI Extension"}),"\n",(0,t.jsx)(n.p,{children:"Rancher 2.7.x doesn't support UI extensions plugin in air-gapped environments, and so the Elemental UI is not available in Rancher 2.7.x."}),"\n",(0,t.jsx)(n.p,{children:"The Elemental UI plugin will be present in the available UI extensions in Rancher 2.8.0."})]})}function h(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,a)=>{a.d(n,{Z:()=>s,a:()=>i});var t=a(7294);const l={},r=t.createContext(l);function i(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1b33c654.2500b11c.js b/assets/js/1b33c654.2500b11c.js new file mode 100644 index 000000000..25f8478c9 --- /dev/null +++ b/assets/js/1b33c654.2500b11c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[803],{4317:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>s,metadata:()=>l,toc:()=>d});var a=t(5893),r=t(1151);const s={sidebar_label:"Upgrade",title:""},o="Troubleshooting upgrade",l={id:"troubleshooting-upgrade",title:"",description:"Upgrade Flow",source:"@site/versioned_docs/version-1.2/troubleshooting-upgrade.md",sourceDirName:".",slug:"/troubleshooting-upgrade",permalink:"/1.2/troubleshooting-upgrade",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Upgrade",title:""},sidebar:"docs",previous:{title:"Restore",permalink:"/1.2/troubleshooting-restore"},next:{title:"Release Notes",permalink:"/1.2/release-notes"}},i={},d=[{value:"Rancher side",id:"rancher-side",level:2},{value:"Elemental Cluster side",id:"elemental-cluster-side",level:2}];function c(e){const n={admonition:"admonition",br:"br",code:"code",h1:"h1",h2:"h2",img:"img",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components},{Details:s,Head:o}=n;return s||u("Details",!0),o||u("Head",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o,{children:(0,a.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/troubleshooting-upgrade"})}),"\n",(0,a.jsx)(n.h1,{id:"troubleshooting-upgrade",children:"Troubleshooting upgrade"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"Upgrade Flow",src:t(1474).Z+"",width:"883",height:"831"})}),"\n",(0,a.jsx)(n.p,{children:"For a high level overview of the upgrade workflow, please refer to the image above."}),"\n",(0,a.jsx)(n.h2,{id:"rancher-side",children:"Rancher side"}),"\n",(0,a.jsx)(n.p,{children:"In this example we upgraded the cluster nodes with the following ManagedOSImage definition:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to or track the latest tag\n osImage: "registry.suse.com/rancher/elemental-teal/5.3:latest"\n clusterTargets:\n - clusterName: my-cluster\n'})}),"\n",(0,a.jsxs)(n.p,{children:["Once the ",(0,a.jsx)(n.code,{children:"ManagedOSImage"})," is applied, the ",(0,a.jsx)(n.code,{children:"elemental-operator"})," will verify it and generate a related ",(0,a.jsx)(n.code,{children:"Bundle"}),".",(0,a.jsx)(n.br,{}),"\n","The ",(0,a.jsx)(n.code,{children:"Bundle"})," name will be prefixed with ",(0,a.jsx)(n.code,{children:"mos"})," and then the ",(0,a.jsx)(n.code,{children:"ManagedOSImage"})," name. In this case ",(0,a.jsx)(n.code,{children:"mos-my-upgrade"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["In the ",(0,a.jsx)(n.code,{children:"Bundle"})," definition, you will find the details about the upgrade plan and the desired target.",(0,a.jsx)(n.br,{}),"\n","For example:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n fleet-default get bundle mos-my-upgrade -o yaml\n"})}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Example"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: fleet.cattle.io/v1alpha1\nkind: Bundle\nmetadata:\n creationTimestamp: "2023-06-16T09:01:47Z"\n generation: 1\n name: mos-my-upgrade\n namespace: fleet-default\n ownerReferences:\n - apiVersion: elemental.cattle.io/v1beta1\n controller: true\n kind: ManagedOSImage\n name: my-upgrade\n uid: e468ed21-23bb-487a-a022-dbc7ef753720\n resourceVersion: "1038645"\n uid: 35e83fc4-28c8-4b10-8059-cae6cdff2cda\nspec:\n resources:\n - content: \'{"kind":"ClusterRole","apiVersion":"rbac.authorization.k8s.io/v1","metadata":{"name":"os-upgrader-my-upgrade","creationTimestamp":null},"rules":[{"verbs":["update","get","list","watch","patch"],"apiGroups":[""],"resources":["nodes"]},{"verbs":["list"],"apiGroups":[""],"resources":["pods"]}]}\'\n name: ClusterRole--os-upgrader-my-upgrade-296a3abf3451.yaml\n - content: \'{"kind":"ClusterRoleBinding","apiVersion":"rbac.authorization.k8s.io/v1","metadata":{"name":"os-upgrader-my-upgrade","creationTimestamp":null},"subjects":[{"kind":"ServiceAccount","name":"os-upgrader-my-upgrade","namespace":"cattle-system"}],"roleRef":{"apiGroup":"rbac.authorization.k8s.io","kind":"ClusterRole","name":"os-upgrader-my-upgrade"}}\'\n name: ClusterRoleBinding--os-upgrader-my-upgrade-f63eaecde935.yaml\n - content: \'{"kind":"ServiceAccount","apiVersion":"v1","metadata":{"name":"os-upgrader-my-upgrade","namespace":"cattle-system","creationTimestamp":null}}\'\n name: ServiceAccount-cattle-system-os-upgrader-my-upgrade-ce93d-01096.yaml\n - content: \'{"kind":"Secret","apiVersion":"v1","metadata":{"name":"os-upgrader-my-upgrade","namespace":"cattle-system","creationTimestamp":null},"data":{"cloud-config":""}}\'\n name: Secret-cattle-system-os-upgrader-my-upgrade-a997ee6a67ef.yaml\n - content: \'{"kind":"Plan","apiVersion":"upgrade.cattle.io/v1","metadata":{"name":"os-upgrader-my-upgrade","namespace":"cattle-system","creationTimestamp":null},"spec":{"concurrency":1,"nodeSelector":{},"serviceAccountName":"os-upgrader-my-upgrade","version":"latest","secrets":[{"name":"os-upgrader-my-upgrade","path":"/run/data"}],"tolerations":[{"operator":"Exists"}],"cordon":true,"upgrade":{"image":"registry.suse.com/rancher/elemental-teal/5.3","command":["/usr/sbin/suc-upgrade"]}},"status":{}}\'\n name: Plan-cattle-system-os-upgrader-my-upgrade-273c2c09afca.yaml\n targets:\n - clusterName: my-cluster\n.\n.\n.\n'})})]}),"\n",(0,a.jsx)(n.h2,{id:"elemental-cluster-side",children:"Elemental Cluster side"}),"\n",(0,a.jsxs)(n.p,{children:["Any Elemental Teal node correctly registered and part of the target cluster will fetch the bundle and start applying it.",(0,a.jsx)(n.br,{}),"\n","This operation is performed by the Rancher's ",(0,a.jsx)(n.code,{children:"system-upgrade-controller"})," running on the Elemental Cluster.",(0,a.jsx)(n.br,{}),"\n","To monitor the correct operation of this controller, you can read its logs:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system logs deployment/system-upgrade-controller\n"})}),"\n",(0,a.jsxs)(n.p,{children:["If everything is correct, the ",(0,a.jsx)(n.code,{children:"system-upgrade-controller"})," will create an upgrade job for each targeted machine.",(0,a.jsx)(n.br,{}),"\n","The job names will use the Plan name (",(0,a.jsx)(n.code,{children:"os-upgrader-my-upgrade"}),") and the target machine hostname (",(0,a.jsx)(n.code,{children:"my-host"}),") for easy discoverability.",(0,a.jsx)(n.br,{}),"\n","For example: ",(0,a.jsx)(n.code,{children:"apply-os-upgrader-my-upgrade-on-my-host-7a25e"}),(0,a.jsx)(n.br,{}),"\n","You can monitor these jobs with:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system get jobs\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Each job will use a ",(0,a.jsx)(n.code,{children:"privileged: true"})," container with the Elemental Teal image specified in the ",(0,a.jsx)(n.code,{children:"ManagedOSImage"})," definition. This container will try to upgrade the system and perform a reboot."]}),"\n",(0,a.jsx)(n.p,{children:"If the job fails, you can check its status by examining the logs:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system logs job.batch/apply-os-upgrader-my-upgrade-on-my-host-7a25e\n"})}),"\n",(0,a.jsxs)(n.admonition,{title:"Two stages job process",type:"info",children:[(0,a.jsxs)(n.p,{children:["Note that the upgrade process is performed in two stages.",(0,a.jsx)(n.br,{}),"\n","You will notice that the same job is ran twice and the first one ends with the ",(0,a.jsx)(n.code,{children:"Uknown"})," Status and will not complete.",(0,a.jsx)(n.br,{}),"\n",(0,a.jsx)(n.strong,{children:"This is to be expected"}),", as Elemental Teal relies on the job to be ran again after the machine restarts, so that it can verify the new version was installed correctly.",(0,a.jsx)(n.br,{}),"\n","You will notice a second run of the job, this time completing correctly."]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system get jobs \nNAMESPACE NAME COMPLETIONS DURATION AGE\ncattle-system apply-os-upgrader-my-upgrade-on-my-host-0b392 1/1 2m34s 6m23s\ncattle-system apply-os-upgrader-my-upgrade-on-my-host-7a25e 0/1 6m23s 6m23s\n"})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system get pods \nNAME READY STATUS RESTARTS AGE\napply-os-upgrader-my-upgrade-on-my-host-zbkrh 0/1 Completed 0 9m40s\napply-os-upgrader-my-upgrade-on-my-host-zvrff 0/1 Unknown 0 12m\n"})})]})]})}function m(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}function u(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1474:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/troubleshooting-upgrade-d04ebc28593991d53a8c0e59bb2a666b.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>o});var a=t(7294);const r={},s=a.createContext(r);function o(e){const n=a.useContext(s);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),a.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1b33c654.a5895cab.js b/assets/js/1b33c654.a5895cab.js deleted file mode 100644 index 91c29ca07..000000000 --- a/assets/js/1b33c654.a5895cab.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[803],{4317:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>s,metadata:()=>l,toc:()=>d});var a=t(5893),r=t(1151);const s={sidebar_label:"Upgrade",title:""},o="Troubleshooting upgrade",l={id:"troubleshooting-upgrade",title:"",description:"Upgrade Flow",source:"@site/versioned_docs/version-1.2/troubleshooting-upgrade.md",sourceDirName:".",slug:"/troubleshooting-upgrade",permalink:"/1.2/troubleshooting-upgrade",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Upgrade",title:""},sidebar:"docs",previous:{title:"Restore",permalink:"/1.2/troubleshooting-restore"},next:{title:"Release Notes",permalink:"/1.2/release-notes"}},i={},d=[{value:"Rancher side",id:"rancher-side",level:2},{value:"Elemental Cluster side",id:"elemental-cluster-side",level:2}];function c(e){const n={admonition:"admonition",br:"br",code:"code",h1:"h1",h2:"h2",img:"img",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components},{Details:s}=n;return s||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"troubleshooting-upgrade",children:"Troubleshooting upgrade"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"Upgrade Flow",src:t(1474).Z+"",width:"883",height:"831"})}),"\n",(0,a.jsx)(n.p,{children:"For a high level overview of the upgrade workflow, please refer to the image above."}),"\n",(0,a.jsx)(n.h2,{id:"rancher-side",children:"Rancher side"}),"\n",(0,a.jsx)(n.p,{children:"In this example we upgraded the cluster nodes with the following ManagedOSImage definition:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to or track the latest tag\n osImage: "registry.suse.com/rancher/elemental-teal/5.3:latest"\n clusterTargets:\n - clusterName: my-cluster\n'})}),"\n",(0,a.jsxs)(n.p,{children:["Once the ",(0,a.jsx)(n.code,{children:"ManagedOSImage"})," is applied, the ",(0,a.jsx)(n.code,{children:"elemental-operator"})," will verify it and generate a related ",(0,a.jsx)(n.code,{children:"Bundle"}),".",(0,a.jsx)(n.br,{}),"\n","The ",(0,a.jsx)(n.code,{children:"Bundle"})," name will be prefixed with ",(0,a.jsx)(n.code,{children:"mos"})," and then the ",(0,a.jsx)(n.code,{children:"ManagedOSImage"})," name. In this case ",(0,a.jsx)(n.code,{children:"mos-my-upgrade"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["In the ",(0,a.jsx)(n.code,{children:"Bundle"})," definition, you will find the details about the upgrade plan and the desired target.",(0,a.jsx)(n.br,{}),"\n","For example:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n fleet-default get bundle mos-my-upgrade -o yaml\n"})}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Example"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: fleet.cattle.io/v1alpha1\nkind: Bundle\nmetadata:\n creationTimestamp: "2023-06-16T09:01:47Z"\n generation: 1\n name: mos-my-upgrade\n namespace: fleet-default\n ownerReferences:\n - apiVersion: elemental.cattle.io/v1beta1\n controller: true\n kind: ManagedOSImage\n name: my-upgrade\n uid: e468ed21-23bb-487a-a022-dbc7ef753720\n resourceVersion: "1038645"\n uid: 35e83fc4-28c8-4b10-8059-cae6cdff2cda\nspec:\n resources:\n - content: \'{"kind":"ClusterRole","apiVersion":"rbac.authorization.k8s.io/v1","metadata":{"name":"os-upgrader-my-upgrade","creationTimestamp":null},"rules":[{"verbs":["update","get","list","watch","patch"],"apiGroups":[""],"resources":["nodes"]},{"verbs":["list"],"apiGroups":[""],"resources":["pods"]}]}\'\n name: ClusterRole--os-upgrader-my-upgrade-296a3abf3451.yaml\n - content: \'{"kind":"ClusterRoleBinding","apiVersion":"rbac.authorization.k8s.io/v1","metadata":{"name":"os-upgrader-my-upgrade","creationTimestamp":null},"subjects":[{"kind":"ServiceAccount","name":"os-upgrader-my-upgrade","namespace":"cattle-system"}],"roleRef":{"apiGroup":"rbac.authorization.k8s.io","kind":"ClusterRole","name":"os-upgrader-my-upgrade"}}\'\n name: ClusterRoleBinding--os-upgrader-my-upgrade-f63eaecde935.yaml\n - content: \'{"kind":"ServiceAccount","apiVersion":"v1","metadata":{"name":"os-upgrader-my-upgrade","namespace":"cattle-system","creationTimestamp":null}}\'\n name: ServiceAccount-cattle-system-os-upgrader-my-upgrade-ce93d-01096.yaml\n - content: \'{"kind":"Secret","apiVersion":"v1","metadata":{"name":"os-upgrader-my-upgrade","namespace":"cattle-system","creationTimestamp":null},"data":{"cloud-config":""}}\'\n name: Secret-cattle-system-os-upgrader-my-upgrade-a997ee6a67ef.yaml\n - content: \'{"kind":"Plan","apiVersion":"upgrade.cattle.io/v1","metadata":{"name":"os-upgrader-my-upgrade","namespace":"cattle-system","creationTimestamp":null},"spec":{"concurrency":1,"nodeSelector":{},"serviceAccountName":"os-upgrader-my-upgrade","version":"latest","secrets":[{"name":"os-upgrader-my-upgrade","path":"/run/data"}],"tolerations":[{"operator":"Exists"}],"cordon":true,"upgrade":{"image":"registry.suse.com/rancher/elemental-teal/5.3","command":["/usr/sbin/suc-upgrade"]}},"status":{}}\'\n name: Plan-cattle-system-os-upgrader-my-upgrade-273c2c09afca.yaml\n targets:\n - clusterName: my-cluster\n.\n.\n.\n'})})]}),"\n",(0,a.jsx)(n.h2,{id:"elemental-cluster-side",children:"Elemental Cluster side"}),"\n",(0,a.jsxs)(n.p,{children:["Any Elemental Teal node correctly registered and part of the target cluster will fetch the bundle and start applying it.",(0,a.jsx)(n.br,{}),"\n","This operation is performed by the Rancher's ",(0,a.jsx)(n.code,{children:"system-upgrade-controller"})," running on the Elemental Cluster.",(0,a.jsx)(n.br,{}),"\n","To monitor the correct operation of this controller, you can read its logs:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system logs deployment/system-upgrade-controller\n"})}),"\n",(0,a.jsxs)(n.p,{children:["If everything is correct, the ",(0,a.jsx)(n.code,{children:"system-upgrade-controller"})," will create an upgrade job for each targeted machine.",(0,a.jsx)(n.br,{}),"\n","The job names will use the Plan name (",(0,a.jsx)(n.code,{children:"os-upgrader-my-upgrade"}),") and the target machine hostname (",(0,a.jsx)(n.code,{children:"my-host"}),") for easy discoverability.",(0,a.jsx)(n.br,{}),"\n","For example: ",(0,a.jsx)(n.code,{children:"apply-os-upgrader-my-upgrade-on-my-host-7a25e"}),(0,a.jsx)(n.br,{}),"\n","You can monitor these jobs with:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system get jobs\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Each job will use a ",(0,a.jsx)(n.code,{children:"privileged: true"})," container with the Elemental Teal image specified in the ",(0,a.jsx)(n.code,{children:"ManagedOSImage"})," definition. This container will try to upgrade the system and perform a reboot."]}),"\n",(0,a.jsx)(n.p,{children:"If the job fails, you can check its status by examining the logs:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system logs job.batch/apply-os-upgrader-my-upgrade-on-my-host-7a25e\n"})}),"\n",(0,a.jsxs)(n.admonition,{title:"Two stages job process",type:"info",children:[(0,a.jsxs)(n.p,{children:["Note that the upgrade process is performed in two stages.",(0,a.jsx)(n.br,{}),"\n","You will notice that the same job is ran twice and the first one ends with the ",(0,a.jsx)(n.code,{children:"Uknown"})," Status and will not complete.",(0,a.jsx)(n.br,{}),"\n",(0,a.jsx)(n.strong,{children:"This is to be expected"}),", as Elemental Teal relies on the job to be ran again after the machine restarts, so that it can verify the new version was installed correctly.",(0,a.jsx)(n.br,{}),"\n","You will notice a second run of the job, this time completing correctly."]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system get jobs \nNAMESPACE NAME COMPLETIONS DURATION AGE\ncattle-system apply-os-upgrader-my-upgrade-on-my-host-0b392 1/1 2m34s 6m23s\ncattle-system apply-os-upgrader-my-upgrade-on-my-host-7a25e 0/1 6m23s 6m23s\n"})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system get pods \nNAME READY STATUS RESTARTS AGE\napply-os-upgrader-my-upgrade-on-my-host-zbkrh 0/1 Completed 0 9m40s\napply-os-upgrader-my-upgrade-on-my-host-zvrff 0/1 Unknown 0 12m\n"})})]})]})}function m(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},1474:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/troubleshooting-upgrade-d04ebc28593991d53a8c0e59bb2a666b.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>o});var a=t(7294);const r={},s=a.createContext(r);function o(e){const n=a.useContext(s);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),a.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1c67841d.6f3ca700.js b/assets/js/1c67841d.6f3ca700.js deleted file mode 100644 index b90ea9468..000000000 --- a/assets/js/1c67841d.6f3ca700.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[3920],{825:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>d});var t=i(5893),a=i(1151);const l={sidebar_label:"Customize Elemental Install",title:""},o="Customize Elemental Install",s={id:"customizing",title:"",description:"Elemental Teal images can be customized in different ways.",source:"@site/versioned_docs/version-1.3/customizing.md",sourceDirName:".",slug:"/customizing",permalink:"/customizing",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Customize Elemental Install",title:""},sidebar:"docs",previous:{title:"Upgrade",permalink:"/upgrade"},next:{title:"Elemental plans",permalink:"/elemental-plans"}},r={},d=[{value:"Customize installation ISO and installation process",id:"customize-installation-iso-and-installation-process",level:2},{value:"Common customization pattern",id:"common-customization-pattern",level:3},{value:"Custom Elemental client configuration file",id:"custom-elemental-client-configuration-file",level:4},{value:"Adding additional cloud-init files within the installed OS",id:"adding-additional-cloud-init-files-within-the-installed-os",level:4},{value:"Adding installation hooks or boot stages for the live system",id:"adding-installation-hooks-or-boot-stages-for-the-live-system",level:4},{value:"Adding extra driver binaries into the ISO example",id:"adding-extra-driver-binaries-into-the-iso-example",level:3},{value:"Adding extra LVM volume group disks during the installation",id:"adding-extra-lvm-volume-group-disks-during-the-installation",level:3},{value:"Repacking the ISO image with extra files",id:"repacking-the-iso-image-with-extra-files",level:3},{value:"Remastering a custom docker image",id:"remastering-a-custom-docker-image",level:2},{value:"Create a custom bootable installation media",id:"create-a-custom-bootable-installation-media",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"customize-elemental-install",children:"Customize Elemental Install"}),"\n",(0,t.jsx)(n.p,{children:"Elemental Teal images can be customized in different ways.\nOne option is to provide\nadditional resources within the installation media so that during installation, or\neventually at boot time, additional binaries such as drivers can be included."}),"\n",(0,t.jsx)(n.p,{children:"Another option would be to remaster the Elemental Teal by simply using a docker build.\nElemental Teal is a regular container image, so it is absolutely possible to create\na new image using a Dockerfile based on Elemental Teal image."}),"\n",(0,t.jsx)(n.h2,{id:"customize-installation-iso-and-installation-process",children:"Customize installation ISO and installation process"}),"\n",(0,t.jsx)(n.p,{children:"In order to adapt the installation ISO a simple approach is to append extra configuration\nfiles into the ISO root in an analog way the registration yaml configuration file\nis added."}),"\n",(0,t.jsx)(n.h3,{id:"common-customization-pattern",children:"Common customization pattern"}),"\n",(0,t.jsxs)(n.p,{children:["Elemental Teal installation can be customized in three different non-exclusive ways. First, including\nsome custom Elemental client configuration file, second, by including additional cloud-init files to execute at\nboot time, and finally, by including ",(0,t.jsx)(n.code,{children:"cloud-init"})," files such as installation hooks or boot stages evaluated during\nthe live system boot itself."]}),"\n",(0,t.jsxs)(n.p,{children:["A common pattern is to combine the three ways described above. This pattern will allow you to add custom steps during the installation and add ",(0,t.jsx)(n.code,{children:"cloud-init"})," files to be evaluated at boot time."]}),"\n",(0,t.jsxs)(n.p,{children:["Additional config files can be added dynamically boot time by generating the ISO via a ",(0,t.jsx)(n.a,{href:"/seedimage-reference",children:"SeedImage"})," including custom cloud-config data."]}),"\n",(0,t.jsx)(n.p,{children:"To apply this pattern, the following files need to be included in the ISO or generated at boot time:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["A ",(0,t.jsx)(n.a,{href:"https://rancher.github.io/elemental-toolkit/docs/customizing/general_configuration/",children:"configuration file"}),"\nfor the elemental client. The file must be named ",(0,t.jsx)(n.code,{children:"config.yaml"})," and located by default in ",(0,t.jsx)(n.code,{children:"/etc/elemental"}),".\nThis path can be configured as part of the installation parameters of a ",(0,t.jsx)(n.a,{href:"/machineregistration-reference",children:"MachineRegistration"})," resource."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["The additional ",(0,t.jsx)(n.code,{children:"cloud-init"})," files to be included into the installed system. They\nallow to perform custom operations at boot time."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["The installation hooks are evalutated at install time. They allow to perform custom operations\nduring the installation process (include extra software, set additional disks...). The same\nway ",(0,t.jsx)(n.code,{children:"cloud-init"})," files can be included to perform custom operations during the live installation\nmedia boot time."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"custom-elemental-client-configuration-file",children:"Custom Elemental client configuration file"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/rancher/elemental-toolkit/blob/main/docs/elemental.md",children:"Elemental client"})," ",(0,t.jsx)(n.code,{children:"install"}),", ",(0,t.jsx)(n.code,{children:"upgrade"})," and ",(0,t.jsx)(n.code,{children:"reset"})," commands can be configured with a ",(0,t.jsx)(n.a,{href:"https://rancher.github.io/elemental-toolkit/docs/customizing/general_configuration/",children:"custom configuration file"})," located by default in ",(0,t.jsx)(n.code,{children:"/etc/elemental/config.yaml"}),".\nIf you have multiple yaml files, you need to add them in the ",(0,t.jsx)(n.code,{children:"/etc/elemental/config.d"})," directory."]}),"\n",(0,t.jsx)(n.p,{children:"A simple example to set hooks location could be:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"extra-partitions:\n - size: 10240\n fs: ext4\n label: EXTRA_PARTITION\n"})}),"\n",(0,t.jsx)(n.p,{children:"The above example sets an additional extra partition during the installation."}),"\n",(0,t.jsx)(n.h4,{id:"adding-additional-cloud-init-files-within-the-installed-os",children:"Adding additional cloud-init files within the installed OS"}),"\n",(0,t.jsxs)(n.p,{children:["In order to include additional cloud-init files during the installation they need\nto be added to the installation data into the MachineRegistration resource. More specific\nthe ",(0,t.jsx)(n.code,{children:"config-urls"})," field is used for this exact purpose. See ",(0,t.jsx)(n.a,{href:"/machineregistration-reference",children:"MachineRegistration reference"})," page."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"config-urls"})," is a list of string literals where each item is an HTTP URL or a local path pointing to a\ncloud-init file. The local path is evaluated during\nthe installation, hence it must exists within the installation media, commonly an ISO image."]}),"\n",(0,t.jsxs)(n.p,{children:["By default, Elemental Teal live systems mount the ISO root at ",(0,t.jsx)(n.code,{children:"/run/initramfs/live"})," which is also the default path set for ",(0,t.jsx)(n.code,{children:"config-url"})," in ",(0,t.jsx)(n.code,{children:"MachineRegistrations"}),":\nSee the example below:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n ...\n config:\n ...\n elemental:\n ...\n install:\n ...\n config-urls:\n - "/run/initramfs/live/oem/custom_config.yaml"\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Elemental Teal live ISOs, when booted, have the ISO root mounted at ",(0,t.jsx)(n.code,{children:"/run/initramfs/live"}),".\nAccording to that, the ISO for the example above is expected to include the ",(0,t.jsx)(n.code,{children:"/oem/custom_config.yaml"})," file."]}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"/run/initramfs/live"})," is a readonly mountpoint and it's not an appropriate path for dynamically generated content at ISO boot."]})}),"\n",(0,t.jsx)(n.h4,{id:"adding-installation-hooks-or-boot-stages-for-the-live-system",children:"Adding installation hooks or boot stages for the live system"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/rancher/elemental-cli",children:"Elemental client"})," ",(0,t.jsx)(n.code,{children:"install"}),", ",(0,t.jsx)(n.code,{children:"upgrade"})," and ",(0,t.jsx)(n.code,{children:"reset"})," procedures include four different hooks:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"before-install"}),": executed after all partition mountpoints are set."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"after-install-chroot"}),": executed after deploying the OS image and before unmounting the associated loop filesystem image. Runs chrooted to the OS image."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"after-install"}),": executed just after the after-install-chroot hook. It is not chrooted."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"post-install"}),": executed as the very last step before ending the installation, partitions are still mounted, the loop devices for the image is not."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Hooks are provided as ",(0,t.jsx)(n.code,{children:"cloud-init"})," stages. Equivalent hooks exist for ",(0,t.jsx)(n.code,{children:"reset"})," and ",(0,t.jsx)(n.code,{children:"upgrade"})," procedures.\nThey are loaded from the ",(0,t.jsx)(n.code,{children:"/iso-config"})," folder in ISO filesystem root. In fact, hooks are regular ",(0,t.jsx)(n.code,{children:"cloud-init"})," stages with the\nonly difference that Elemental client parses them during ",(0,t.jsx)(n.code,{children:"install"}),", ",(0,t.jsx)(n.code,{children:"upgrade"})," or ",(0,t.jsx)(n.code,{children:"reset"})," actions, rather than boot time.\nNote any boot stage included this way will be executed during the live installation media boot."]}),"\n",(0,t.jsxs)(n.p,{children:["Hooks are evaluated during ",(0,t.jsx)(n.code,{children:"install"}),",",(0,t.jsx)(n.code,{children:"reset"})," and ",(0,t.jsx)(n.code,{children:"upgrade"})," action from ",(0,t.jsx)(n.code,{children:"/oem"}),", ",(0,t.jsx)(n.code,{children:"/system/oem"})," and ",(0,t.jsx)(n.code,{children:"/usr/local/cloud-config"})," paths,\nhowever for the live ISOs there is an additional the path ",(0,t.jsx)(n.code,{children:"/run/initramfs/live/iso-config"})," included. Note the ",(0,t.jsx)(n.code,{children:"/run/initramfs/live"}),"\nprefix is the mount point of the ISO filesystem of the Elemental Live ISO once booted."]}),"\n",(0,t.jsx)(n.h3,{id:"adding-extra-driver-binaries-into-the-iso-example",children:"Adding extra driver binaries into the ISO example"}),"\n",(0,t.jsx)(n.p,{children:"This example is covering the case in which extra driver binaries are included into the ISO\nand during the installation they are installed over the OS image."}),"\n",(0,t.jsx)(n.p,{children:"For that use case the following files are required:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"additional binaries to install (they could be in the form of RPMs)"}),"\n",(0,t.jsx)(n.li,{children:"additional hooks file to copy binaries into the persistent storage and to install them"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Let's create an ",(0,t.jsx)(n.code,{children:"overlay"})," directory to create the directory tree that needs to be\nadded into the ISO root. In that case the ",(0,t.jsx)(n.code,{children:"overlay"})," directory could contain:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"overlay/\n data/\n extra_drivers/\n some_driver.rpm\n iso-config/\n install_hooks.yaml\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"overlay/iso-config/install_hooks.yaml"})," could be as:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'name: "Install extra drivers"\nstages:\n before-install:\n # Preload data to the persistent storage\n # During installation persistent partition is mounted at /run/cos/persistent\n - commands:\n - rsync -a /run/initramfs/live/data/ /run/cos/persistent\n after-install-chroot:\n # extra_drivers folder is at `/usr/local/extra_drivers` from the OS image chroot\n - commands:\n - rpm -iv /usr/local/extra_drivers/some_driver.rpm\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Note the installation hooks only cover installation procedures, for upgrades equivalent\n",(0,t.jsx)(n.code,{children:"before-upgrade"})," and/or ",(0,t.jsx)(n.code,{children:"after-upgrade-chroot"})," should be defined."]}),"\n",(0,t.jsx)(n.h3,{id:"adding-extra-lvm-volume-group-disks-during-the-installation",children:"Adding extra LVM volume group disks during the installation"}),"\n",(0,t.jsx)(n.p,{children:"This example is covering the setup of an host with multiple disks and some of them used\nas part of an LVM setup."}),"\n",(0,t.jsxs)(n.p,{children:["As an example, we have an host with three disks (",(0,t.jsx)(n.code,{children:"/dev/sda"}),", ",(0,t.jsx)(n.code,{children:"/dev/sdb"}),"\nand ",(0,t.jsx)(n.code,{children:"/dev/sdc"}),")."]}),"\n",(0,t.jsxs)(n.p,{children:["The first disk is used for a regular Elemental Teal installation\nand the other remaining two are used as part of a LVM group where arbitrary logical volumes\nare created, formatted and mounted at boot time via an extended ",(0,t.jsx)(n.code,{children:"fstab"})," file."]}),"\n",(0,t.jsx)(n.p,{children:"For this example, the following files are required:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["additional ",(0,t.jsx)(n.code,{children:"clout-init"})," files included in the installed system"]}),"\n",(0,t.jsx)(n.li,{children:"additional installation hooks to prepare the LVM volumes during the installation"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Let's create an ",(0,t.jsx)(n.code,{children:"overlay"})," directory to create the directory tree that needs to be\nadded into the ISO root. In that case the ",(0,t.jsx)(n.code,{children:"overlay"})," directory could contain:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"overlay/\n oem/\n lvm_volumes_in_fstab.yaml\n iso-config/\n lvm_volumes_hook.yaml\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The installation hook ",(0,t.jsx)(n.code,{children:"overlay/iso-config/lvm_volumes_hook.yaml"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'name: "Create LVM logic volumes over some physical disks"\nstages:\n post-install:\n - name: "Create physical volume, volume group and logical volumes"\n if: \'[ -e "/dev/sdb" ] && [ -e "/dev/sdc" ]\'\n commands:\n - | \n # Create the physical volume, volume group and logical volumes\n pvcreate /dev/sdb /dev/sdc\n vgcreate elementalLVM /dev/sdb /dev/sdc\n lvcreate -L 8G -n elementalVol1 elementalLVM\n lvcreate -l 100%FREE -n elementalVol2 elementalLVM\n\n # Trigger udev detection\n if [ ! -e "/dev/elementalLVM/elementalVol1" ] || [ ! -e "/dev/elementalLVM/elementalVol2" ]; then\n sleep 10\n udevadm settle\n fi\n\n # Ensure devices are already available\n [ -e "/dev/elementalLVM/elementalVol1" ] || exit 1\n [ -e "/dev/elementalLVM/elementalVol2" ] || exit 1\n\n # Format logical volumes with a known label for later use in fstab\n mkfs.xfs -L eVol1 /dev/elementalLVM/elementalVol1\n mkfs.xfs -L eVol2 /dev/elementalLVM/elementalVol2\n'})}),"\n",(0,t.jsx)(n.p,{children:"The LVM devices are created and formatted as desired. This is a good\nexample of an installation hook, as this setup is only needed once, at installation\ntime. As an alternative, the same action could be done on first boot, however it would\nrequire a more sophisticated logic to ensure it's only applied once at first boot."}),"\n",(0,t.jsxs)(n.p,{children:["Finally, the boot time ",(0,t.jsx)(n.code,{children:"cloud-init"})," files contain the mount points settings and trigger the\naction of mounting those mountpoints. The Elemental OS ",(0,t.jsx)(n.code,{children:"fstab"})," file is ephemeral and it's\ndynamically created at boot time. That's why it doesn't exist during the installation and\ncan't be used in an installation hook."]}),"\n",(0,t.jsxs)(n.p,{children:["Here's an example of ",(0,t.jsx)(n.code,{children:"overlay/oem/lvm_volumes_in_fstab.yaml"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'name: "Mount LVM volumes"\nstages:\n initramfs:\n - name: "Extend fstab to mount LVM logical volumes at boot"\n commands:\n - |\n echo "LABEL=eVol1 /usr/local/eVol1 xfs defaults 0 0" >> /etc/fstab\n echo "LABEL=eVol2 /usr/local/eVol2 xfs defaults 0 0" >> /etc/fstab\n'})}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"initramfs"})," stage is the last stage before switching to the actual root tree.\nAt this stage, the ",(0,t.jsx)(n.code,{children:"/etc/fstab"})," file already exists and can be adapted before\nswitching root. Once running in the final root tree, SystemD will handle the rest of the initialization and apply it."]})}),"\n",(0,t.jsxs)(n.p,{children:["This cloud-init file should be included into the ",(0,t.jsx)(n.code,{children:"/oem"})," directory on the installed\nsystem. ",(0,t.jsx)(n.code,{children:"/oem"})," is a mount point for the OEM partition. In order to include extra files,\nthey should be listed as ",(0,t.jsx)(n.code,{children:"config-urls"})," within the Registration CRD at the\nmanagement cluster."]}),"\n",(0,t.jsx)(n.h3,{id:"repacking-the-iso-image-with-extra-files",children:"Repacking the ISO image with extra files"}),"\n",(0,t.jsxs)(n.p,{children:["Assuming an ",(0,t.jsx)(n.code,{children:"overlay"})," folder was created in the current directory containing all\nadditional files to be appended, the following ",(0,t.jsx)(n.code,{children:"xorriso"})," command adds the extra files:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"xorriso -indev elemental-teal.x86_64.iso -outdev elemental-teal.custom.x86_64.iso -map overlay / -boot_image any replay\n"})}),"\n",(0,t.jsxs)(n.p,{children:["For that a ",(0,t.jsx)(n.code,{children:"xorriso"})," equal or higher than version 1.5 is required."]}),"\n",(0,t.jsx)(n.h2,{id:"remastering-a-custom-docker-image",children:"Remastering a custom docker image"}),"\n",(0,t.jsx)(n.p,{children:"Since Elemental Teal image is a Docker image it can also be used as a base image\nin a Dockerfile in order to create a new container image."}),"\n",(0,t.jsx)(n.p,{children:"Imagine some additional package from an extra repository is required, the following example\nshow case how this could be added:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-docker",metastring:"showLineNumbers",children:'# The version of Elemental to modify\nFROM registry.suse.com/rancher/elemental-teal/5.4:latest\n\n# Custom commands\nRUN rpm --import && \\\n zypper addrepo --refresh extra_repo && \\\n zypper install -y \n\n# IMPORTANT: /etc/os-release is used for versioning/upgrade. The\n# values here should reflect the tag of the image currently being built\nARG IMAGE_REPO=norepo\nARG IMAGE_TAG=latest\nRUN \\\n sed -i -e "s/^IMAGE_REPO=.*/IMAGE_REPO=\\"${IMAGE_REPO}\\"/g" /etc/os-release && \\\n sed -i -e "s/^IMAGE_TAG=.*/IMAGE_TAG=\\"${IMAGE_TAG}\\"/g" /etc/os-release && \\\n sed -i -e "s/^IMAGE=.*/IMAGE=\\"${IMAGE_REPO}:${IMAGE_TAG}\\"/g" /etc/os-release\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Where ",(0,t.jsx)(n.code,{children:"latest"})," is the base version we want to customize."]}),"\n",(0,t.jsx)(n.p,{children:"And then the following commands"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"docker build --build-arg IMAGE_REPO=myrepo/custom-build \\\n --build-arg IMAGE_TAG=v1.1.1 \\\n -t myrepo/custom-build:v1.1.1 .\ndocker push myrepo/custom-build:v1.1.1\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The new customized OS is available as the Docker image ",(0,t.jsx)(n.code,{children:"myrepo/custom-build:v1.1.1"})," and it can\nbe run and verified using docker with"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"docker run -it myrepo/custom-build:v1.1.1 bash\n"})}),"\n",(0,t.jsx)(n.h2,{id:"create-a-custom-bootable-installation-media",children:"Create a custom bootable installation media"}),"\n",(0,t.jsx)(n.p,{children:"Elemental Teal leverages container images to build its root filesystems; therefore, it is possible\nto use it in a multi-stage environment to create custom bootable media that bundles a custom container image."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-docker",metastring:"showLineNumbers",children:'FROM registry.suse.com/rancher/elemental-teal/5.4:latest as os\n\n# Check the section on remastering a custom docker image\n\nFROM registry.suse.com/rancher/elemental-builder-image/5.4:latest AS builder\n\nARG TARGETARCH\nWORKDIR /iso\nCOPY --from=os / rootfs\n\n# work around buildah issue: https://github.com/containers/buildah/issues/4242\nRUN rm rootfs/etc/resolv.conf\n\nRUN --mount=type=bind,source=./,target=/output,rw \\\n elemental build-iso \\\n dir:rootfs \\\n --bootloader-in-rootfs \\\n --squash-no-compression \\\n -o /output -n "elemental-teal-${TARGETARCH}"\n'})}),"\n",(0,t.jsx)(n.p,{children:"Modify the container image template and afterwards run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"buildah build --tag myrepo/custom-build:v1.1.1 \\\n --build-arg IMAGE_REPO=myrepo/custom-build \\\n --build-arg IMAGE_TAG=v1.1.1 \\\n .\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The new customized installation media can be found in ",(0,t.jsx)(n.code,{children:"elemental-teal-amd64.iso"}),"."]}),"\n",(0,t.jsx)(n.admonition,{title:"important",type:"caution",children:(0,t.jsxs)(n.p,{children:["You still need to ",(0,t.jsx)(n.a,{href:"quickstart-cli#preparing-the-installation-seed-image",children:"prepare the installation image"})," so it can be used to boot and provision the machine."]})})]})}function h(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>s,a:()=>o});var t=i(7294);const a={},l=t.createContext(a);function o(e){const n=t.useContext(l);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),t.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1c67841d.a8723990.js b/assets/js/1c67841d.a8723990.js new file mode 100644 index 000000000..940a71134 --- /dev/null +++ b/assets/js/1c67841d.a8723990.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[3920],{825:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var t=i(5893),a=i(1151);const o={sidebar_label:"Customize Elemental Install",title:""},l="Customize Elemental Install",s={id:"customizing",title:"",description:"Elemental Teal images can be customized in different ways.",source:"@site/versioned_docs/version-1.3/customizing.md",sourceDirName:".",slug:"/customizing",permalink:"/customizing",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Customize Elemental Install",title:""},sidebar:"docs",previous:{title:"Upgrade",permalink:"/upgrade"},next:{title:"Elemental plans",permalink:"/elemental-plans"}},r={},d=[{value:"Customize installation ISO and installation process",id:"customize-installation-iso-and-installation-process",level:2},{value:"Common customization pattern",id:"common-customization-pattern",level:3},{value:"Custom Elemental client configuration file",id:"custom-elemental-client-configuration-file",level:4},{value:"Adding additional cloud-init files within the installed OS",id:"adding-additional-cloud-init-files-within-the-installed-os",level:4},{value:"Adding installation hooks or boot stages for the live system",id:"adding-installation-hooks-or-boot-stages-for-the-live-system",level:4},{value:"Adding extra driver binaries into the ISO example",id:"adding-extra-driver-binaries-into-the-iso-example",level:3},{value:"Adding extra LVM volume group disks during the installation",id:"adding-extra-lvm-volume-group-disks-during-the-installation",level:3},{value:"Repacking the ISO image with extra files",id:"repacking-the-iso-image-with-extra-files",level:3},{value:"Remastering a custom docker image",id:"remastering-a-custom-docker-image",level:2},{value:"Create a custom bootable installation media",id:"create-a-custom-bootable-installation-media",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components},{Head:i}=n;return i||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i,{children:(0,t.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/customizing"})}),"\n",(0,t.jsx)(n.h1,{id:"customize-elemental-install",children:"Customize Elemental Install"}),"\n",(0,t.jsx)(n.p,{children:"Elemental Teal images can be customized in different ways.\nOne option is to provide\nadditional resources within the installation media so that during installation, or\neventually at boot time, additional binaries such as drivers can be included."}),"\n",(0,t.jsx)(n.p,{children:"Another option would be to remaster the Elemental Teal by simply using a docker build.\nElemental Teal is a regular container image, so it is absolutely possible to create\na new image using a Dockerfile based on Elemental Teal image."}),"\n",(0,t.jsx)(n.h2,{id:"customize-installation-iso-and-installation-process",children:"Customize installation ISO and installation process"}),"\n",(0,t.jsx)(n.p,{children:"In order to adapt the installation ISO a simple approach is to append extra configuration\nfiles into the ISO root in an analog way the registration yaml configuration file\nis added."}),"\n",(0,t.jsx)(n.h3,{id:"common-customization-pattern",children:"Common customization pattern"}),"\n",(0,t.jsxs)(n.p,{children:["Elemental Teal installation can be customized in three different non-exclusive ways. First, including\nsome custom Elemental client configuration file, second, by including additional cloud-init files to execute at\nboot time, and finally, by including ",(0,t.jsx)(n.code,{children:"cloud-init"})," files such as installation hooks or boot stages evaluated during\nthe live system boot itself."]}),"\n",(0,t.jsxs)(n.p,{children:["A common pattern is to combine the three ways described above. This pattern will allow you to add custom steps during the installation and add ",(0,t.jsx)(n.code,{children:"cloud-init"})," files to be evaluated at boot time."]}),"\n",(0,t.jsxs)(n.p,{children:["Additional config files can be added dynamically boot time by generating the ISO via a ",(0,t.jsx)(n.a,{href:"/seedimage-reference",children:"SeedImage"})," including custom cloud-config data."]}),"\n",(0,t.jsx)(n.p,{children:"To apply this pattern, the following files need to be included in the ISO or generated at boot time:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["A ",(0,t.jsx)(n.a,{href:"https://rancher.github.io/elemental-toolkit/docs/customizing/general_configuration/",children:"configuration file"}),"\nfor the elemental client. The file must be named ",(0,t.jsx)(n.code,{children:"config.yaml"})," and located by default in ",(0,t.jsx)(n.code,{children:"/etc/elemental"}),".\nThis path can be configured as part of the installation parameters of a ",(0,t.jsx)(n.a,{href:"/machineregistration-reference",children:"MachineRegistration"})," resource."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["The additional ",(0,t.jsx)(n.code,{children:"cloud-init"})," files to be included into the installed system. They\nallow to perform custom operations at boot time."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["The installation hooks are evalutated at install time. They allow to perform custom operations\nduring the installation process (include extra software, set additional disks...). The same\nway ",(0,t.jsx)(n.code,{children:"cloud-init"})," files can be included to perform custom operations during the live installation\nmedia boot time."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"custom-elemental-client-configuration-file",children:"Custom Elemental client configuration file"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/rancher/elemental-toolkit/blob/main/docs/elemental.md",children:"Elemental client"})," ",(0,t.jsx)(n.code,{children:"install"}),", ",(0,t.jsx)(n.code,{children:"upgrade"})," and ",(0,t.jsx)(n.code,{children:"reset"})," commands can be configured with a ",(0,t.jsx)(n.a,{href:"https://rancher.github.io/elemental-toolkit/docs/customizing/general_configuration/",children:"custom configuration file"})," located by default in ",(0,t.jsx)(n.code,{children:"/etc/elemental/config.yaml"}),".\nIf you have multiple yaml files, you need to add them in the ",(0,t.jsx)(n.code,{children:"/etc/elemental/config.d"})," directory."]}),"\n",(0,t.jsx)(n.p,{children:"A simple example to set hooks location could be:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"extra-partitions:\n - size: 10240\n fs: ext4\n label: EXTRA_PARTITION\n"})}),"\n",(0,t.jsx)(n.p,{children:"The above example sets an additional extra partition during the installation."}),"\n",(0,t.jsx)(n.h4,{id:"adding-additional-cloud-init-files-within-the-installed-os",children:"Adding additional cloud-init files within the installed OS"}),"\n",(0,t.jsxs)(n.p,{children:["In order to include additional cloud-init files during the installation they need\nto be added to the installation data into the MachineRegistration resource. More specific\nthe ",(0,t.jsx)(n.code,{children:"config-urls"})," field is used for this exact purpose. See ",(0,t.jsx)(n.a,{href:"/machineregistration-reference",children:"MachineRegistration reference"})," page."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"config-urls"})," is a list of string literals where each item is an HTTP URL or a local path pointing to a\ncloud-init file. The local path is evaluated during\nthe installation, hence it must exists within the installation media, commonly an ISO image."]}),"\n",(0,t.jsxs)(n.p,{children:["By default, Elemental Teal live systems mount the ISO root at ",(0,t.jsx)(n.code,{children:"/run/initramfs/live"})," which is also the default path set for ",(0,t.jsx)(n.code,{children:"config-url"})," in ",(0,t.jsx)(n.code,{children:"MachineRegistrations"}),":\nSee the example below:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n ...\n config:\n ...\n elemental:\n ...\n install:\n ...\n config-urls:\n - "/run/initramfs/live/oem/custom_config.yaml"\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Elemental Teal live ISOs, when booted, have the ISO root mounted at ",(0,t.jsx)(n.code,{children:"/run/initramfs/live"}),".\nAccording to that, the ISO for the example above is expected to include the ",(0,t.jsx)(n.code,{children:"/oem/custom_config.yaml"})," file."]}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"/run/initramfs/live"})," is a readonly mountpoint and it's not an appropriate path for dynamically generated content at ISO boot."]})}),"\n",(0,t.jsx)(n.h4,{id:"adding-installation-hooks-or-boot-stages-for-the-live-system",children:"Adding installation hooks or boot stages for the live system"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/rancher/elemental-cli",children:"Elemental client"})," ",(0,t.jsx)(n.code,{children:"install"}),", ",(0,t.jsx)(n.code,{children:"upgrade"})," and ",(0,t.jsx)(n.code,{children:"reset"})," procedures include four different hooks:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"before-install"}),": executed after all partition mountpoints are set."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"after-install-chroot"}),": executed after deploying the OS image and before unmounting the associated loop filesystem image. Runs chrooted to the OS image."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"after-install"}),": executed just after the after-install-chroot hook. It is not chrooted."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"post-install"}),": executed as the very last step before ending the installation, partitions are still mounted, the loop devices for the image is not."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Hooks are provided as ",(0,t.jsx)(n.code,{children:"cloud-init"})," stages. Equivalent hooks exist for ",(0,t.jsx)(n.code,{children:"reset"})," and ",(0,t.jsx)(n.code,{children:"upgrade"})," procedures.\nThey are loaded from the ",(0,t.jsx)(n.code,{children:"/iso-config"})," folder in ISO filesystem root. In fact, hooks are regular ",(0,t.jsx)(n.code,{children:"cloud-init"})," stages with the\nonly difference that Elemental client parses them during ",(0,t.jsx)(n.code,{children:"install"}),", ",(0,t.jsx)(n.code,{children:"upgrade"})," or ",(0,t.jsx)(n.code,{children:"reset"})," actions, rather than boot time.\nNote any boot stage included this way will be executed during the live installation media boot."]}),"\n",(0,t.jsxs)(n.p,{children:["Hooks are evaluated during ",(0,t.jsx)(n.code,{children:"install"}),",",(0,t.jsx)(n.code,{children:"reset"})," and ",(0,t.jsx)(n.code,{children:"upgrade"})," action from ",(0,t.jsx)(n.code,{children:"/oem"}),", ",(0,t.jsx)(n.code,{children:"/system/oem"})," and ",(0,t.jsx)(n.code,{children:"/usr/local/cloud-config"})," paths,\nhowever for the live ISOs there is an additional the path ",(0,t.jsx)(n.code,{children:"/run/initramfs/live/iso-config"})," included. Note the ",(0,t.jsx)(n.code,{children:"/run/initramfs/live"}),"\nprefix is the mount point of the ISO filesystem of the Elemental Live ISO once booted."]}),"\n",(0,t.jsx)(n.h3,{id:"adding-extra-driver-binaries-into-the-iso-example",children:"Adding extra driver binaries into the ISO example"}),"\n",(0,t.jsx)(n.p,{children:"This example is covering the case in which extra driver binaries are included into the ISO\nand during the installation they are installed over the OS image."}),"\n",(0,t.jsx)(n.p,{children:"For that use case the following files are required:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"additional binaries to install (they could be in the form of RPMs)"}),"\n",(0,t.jsx)(n.li,{children:"additional hooks file to copy binaries into the persistent storage and to install them"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Let's create an ",(0,t.jsx)(n.code,{children:"overlay"})," directory to create the directory tree that needs to be\nadded into the ISO root. In that case the ",(0,t.jsx)(n.code,{children:"overlay"})," directory could contain:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"overlay/\n data/\n extra_drivers/\n some_driver.rpm\n iso-config/\n install_hooks.yaml\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"overlay/iso-config/install_hooks.yaml"})," could be as:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'name: "Install extra drivers"\nstages:\n before-install:\n # Preload data to the persistent storage\n # During installation persistent partition is mounted at /run/cos/persistent\n - commands:\n - rsync -a /run/initramfs/live/data/ /run/cos/persistent\n after-install-chroot:\n # extra_drivers folder is at `/usr/local/extra_drivers` from the OS image chroot\n - commands:\n - rpm -iv /usr/local/extra_drivers/some_driver.rpm\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Note the installation hooks only cover installation procedures, for upgrades equivalent\n",(0,t.jsx)(n.code,{children:"before-upgrade"})," and/or ",(0,t.jsx)(n.code,{children:"after-upgrade-chroot"})," should be defined."]}),"\n",(0,t.jsx)(n.h3,{id:"adding-extra-lvm-volume-group-disks-during-the-installation",children:"Adding extra LVM volume group disks during the installation"}),"\n",(0,t.jsx)(n.p,{children:"This example is covering the setup of an host with multiple disks and some of them used\nas part of an LVM setup."}),"\n",(0,t.jsxs)(n.p,{children:["As an example, we have an host with three disks (",(0,t.jsx)(n.code,{children:"/dev/sda"}),", ",(0,t.jsx)(n.code,{children:"/dev/sdb"}),"\nand ",(0,t.jsx)(n.code,{children:"/dev/sdc"}),")."]}),"\n",(0,t.jsxs)(n.p,{children:["The first disk is used for a regular Elemental Teal installation\nand the other remaining two are used as part of a LVM group where arbitrary logical volumes\nare created, formatted and mounted at boot time via an extended ",(0,t.jsx)(n.code,{children:"fstab"})," file."]}),"\n",(0,t.jsx)(n.p,{children:"For this example, the following files are required:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["additional ",(0,t.jsx)(n.code,{children:"clout-init"})," files included in the installed system"]}),"\n",(0,t.jsx)(n.li,{children:"additional installation hooks to prepare the LVM volumes during the installation"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Let's create an ",(0,t.jsx)(n.code,{children:"overlay"})," directory to create the directory tree that needs to be\nadded into the ISO root. In that case the ",(0,t.jsx)(n.code,{children:"overlay"})," directory could contain:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"overlay/\n oem/\n lvm_volumes_in_fstab.yaml\n iso-config/\n lvm_volumes_hook.yaml\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The installation hook ",(0,t.jsx)(n.code,{children:"overlay/iso-config/lvm_volumes_hook.yaml"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'name: "Create LVM logic volumes over some physical disks"\nstages:\n post-install:\n - name: "Create physical volume, volume group and logical volumes"\n if: \'[ -e "/dev/sdb" ] && [ -e "/dev/sdc" ]\'\n commands:\n - | \n # Create the physical volume, volume group and logical volumes\n pvcreate /dev/sdb /dev/sdc\n vgcreate elementalLVM /dev/sdb /dev/sdc\n lvcreate -L 8G -n elementalVol1 elementalLVM\n lvcreate -l 100%FREE -n elementalVol2 elementalLVM\n\n # Trigger udev detection\n if [ ! -e "/dev/elementalLVM/elementalVol1" ] || [ ! -e "/dev/elementalLVM/elementalVol2" ]; then\n sleep 10\n udevadm settle\n fi\n\n # Ensure devices are already available\n [ -e "/dev/elementalLVM/elementalVol1" ] || exit 1\n [ -e "/dev/elementalLVM/elementalVol2" ] || exit 1\n\n # Format logical volumes with a known label for later use in fstab\n mkfs.xfs -L eVol1 /dev/elementalLVM/elementalVol1\n mkfs.xfs -L eVol2 /dev/elementalLVM/elementalVol2\n'})}),"\n",(0,t.jsx)(n.p,{children:"The LVM devices are created and formatted as desired. This is a good\nexample of an installation hook, as this setup is only needed once, at installation\ntime. As an alternative, the same action could be done on first boot, however it would\nrequire a more sophisticated logic to ensure it's only applied once at first boot."}),"\n",(0,t.jsxs)(n.p,{children:["Finally, the boot time ",(0,t.jsx)(n.code,{children:"cloud-init"})," files contain the mount points settings and trigger the\naction of mounting those mountpoints. The Elemental OS ",(0,t.jsx)(n.code,{children:"fstab"})," file is ephemeral and it's\ndynamically created at boot time. That's why it doesn't exist during the installation and\ncan't be used in an installation hook."]}),"\n",(0,t.jsxs)(n.p,{children:["Here's an example of ",(0,t.jsx)(n.code,{children:"overlay/oem/lvm_volumes_in_fstab.yaml"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'name: "Mount LVM volumes"\nstages:\n initramfs:\n - name: "Extend fstab to mount LVM logical volumes at boot"\n commands:\n - |\n echo "LABEL=eVol1 /usr/local/eVol1 xfs defaults 0 0" >> /etc/fstab\n echo "LABEL=eVol2 /usr/local/eVol2 xfs defaults 0 0" >> /etc/fstab\n'})}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"initramfs"})," stage is the last stage before switching to the actual root tree.\nAt this stage, the ",(0,t.jsx)(n.code,{children:"/etc/fstab"})," file already exists and can be adapted before\nswitching root. Once running in the final root tree, SystemD will handle the rest of the initialization and apply it."]})}),"\n",(0,t.jsxs)(n.p,{children:["This cloud-init file should be included into the ",(0,t.jsx)(n.code,{children:"/oem"})," directory on the installed\nsystem. ",(0,t.jsx)(n.code,{children:"/oem"})," is a mount point for the OEM partition. In order to include extra files,\nthey should be listed as ",(0,t.jsx)(n.code,{children:"config-urls"})," within the Registration CRD at the\nmanagement cluster."]}),"\n",(0,t.jsx)(n.h3,{id:"repacking-the-iso-image-with-extra-files",children:"Repacking the ISO image with extra files"}),"\n",(0,t.jsxs)(n.p,{children:["Assuming an ",(0,t.jsx)(n.code,{children:"overlay"})," folder was created in the current directory containing all\nadditional files to be appended, the following ",(0,t.jsx)(n.code,{children:"xorriso"})," command adds the extra files:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"xorriso -indev elemental-teal.x86_64.iso -outdev elemental-teal.custom.x86_64.iso -map overlay / -boot_image any replay\n"})}),"\n",(0,t.jsxs)(n.p,{children:["For that a ",(0,t.jsx)(n.code,{children:"xorriso"})," equal or higher than version 1.5 is required."]}),"\n",(0,t.jsx)(n.h2,{id:"remastering-a-custom-docker-image",children:"Remastering a custom docker image"}),"\n",(0,t.jsx)(n.p,{children:"Since Elemental Teal image is a Docker image it can also be used as a base image\nin a Dockerfile in order to create a new container image."}),"\n",(0,t.jsx)(n.p,{children:"Imagine some additional package from an extra repository is required, the following example\nshow case how this could be added:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-docker",metastring:"showLineNumbers",children:'# The version of Elemental to modify\nFROM registry.suse.com/rancher/elemental-teal/5.4:latest\n\n# Custom commands\nRUN rpm --import && \\\n zypper addrepo --refresh extra_repo && \\\n zypper install -y \n\n# IMPORTANT: /etc/os-release is used for versioning/upgrade. The\n# values here should reflect the tag of the image currently being built\nARG IMAGE_REPO=norepo\nARG IMAGE_TAG=latest\nRUN \\\n sed -i -e "s/^IMAGE_REPO=.*/IMAGE_REPO=\\"${IMAGE_REPO}\\"/g" /etc/os-release && \\\n sed -i -e "s/^IMAGE_TAG=.*/IMAGE_TAG=\\"${IMAGE_TAG}\\"/g" /etc/os-release && \\\n sed -i -e "s/^IMAGE=.*/IMAGE=\\"${IMAGE_REPO}:${IMAGE_TAG}\\"/g" /etc/os-release\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Where ",(0,t.jsx)(n.code,{children:"latest"})," is the base version we want to customize."]}),"\n",(0,t.jsx)(n.p,{children:"And then the following commands"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"docker build --build-arg IMAGE_REPO=myrepo/custom-build \\\n --build-arg IMAGE_TAG=v1.1.1 \\\n -t myrepo/custom-build:v1.1.1 .\ndocker push myrepo/custom-build:v1.1.1\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The new customized OS is available as the Docker image ",(0,t.jsx)(n.code,{children:"myrepo/custom-build:v1.1.1"})," and it can\nbe run and verified using docker with"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"docker run -it myrepo/custom-build:v1.1.1 bash\n"})}),"\n",(0,t.jsx)(n.h2,{id:"create-a-custom-bootable-installation-media",children:"Create a custom bootable installation media"}),"\n",(0,t.jsx)(n.p,{children:"Elemental Teal leverages container images to build its root filesystems; therefore, it is possible\nto use it in a multi-stage environment to create custom bootable media that bundles a custom container image."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-docker",metastring:"showLineNumbers",children:'FROM registry.suse.com/rancher/elemental-teal/5.4:latest as os\n\n# Check the section on remastering a custom docker image\n\nFROM registry.suse.com/rancher/elemental-builder-image/5.4:latest AS builder\n\nARG TARGETARCH\nWORKDIR /iso\nCOPY --from=os / rootfs\n\n# work around buildah issue: https://github.com/containers/buildah/issues/4242\nRUN rm rootfs/etc/resolv.conf\n\nRUN --mount=type=bind,source=./,target=/output,rw \\\n elemental build-iso \\\n dir:rootfs \\\n --bootloader-in-rootfs \\\n --squash-no-compression \\\n -o /output -n "elemental-teal-${TARGETARCH}"\n'})}),"\n",(0,t.jsx)(n.p,{children:"Modify the container image template and afterwards run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"buildah build --tag myrepo/custom-build:v1.1.1 \\\n --build-arg IMAGE_REPO=myrepo/custom-build \\\n --build-arg IMAGE_TAG=v1.1.1 \\\n .\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The new customized installation media can be found in ",(0,t.jsx)(n.code,{children:"elemental-teal-amd64.iso"}),"."]}),"\n",(0,t.jsx)(n.admonition,{title:"important",type:"caution",children:(0,t.jsxs)(n.p,{children:["You still need to ",(0,t.jsx)(n.a,{href:"quickstart-cli#preparing-the-installation-seed-image",children:"prepare the installation image"})," so it can be used to boot and provision the machine."]})})]})}function h(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>s,a:()=>l});var t=i(7294);const a={},o=t.createContext(a);function l(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:l(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1e6929a8.b476ea49.js b/assets/js/1e6929a8.b476ea49.js new file mode 100644 index 000000000..6afa92fec --- /dev/null +++ b/assets/js/1e6929a8.b476ea49.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8332],{7724:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});var i=t(5893),s=t(1151);const a={sidebar_label:"Machine Reset",title:"",version_badge:"1.3.0"},l=void 0,r={id:"reset",title:"",description:"Machine Reset",source:"@site/versioned_docs/version-1.3/reset.md",sourceDirName:".",slug:"/reset",permalink:"/reset",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Machine Reset",title:"",version_badge:"1.3.0"},sidebar:"docs",previous:{title:"Inventory Management",permalink:"/inventory-management"},next:{title:"Backup",permalink:"/backup"}},o={},c=[{value:"Machine Reset",id:"machine-reset",level:2},{value:"Reset workflow",id:"reset-workflow",level:3},{value:"Enable machine reset",id:"enable-machine-reset",level:3}];function d(e){const n={a:"a",br:"br",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,s.a)(),...e.components},{Head:a}=n;return a||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(a,{children:(0,i.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/reset"})}),"\n",(0,i.jsx)(n.h2,{id:"machine-reset",children:"Machine Reset"}),"\n",(0,i.jsx)(n.p,{children:"There are two ways to reset Elemental machines to their original state or decommission them:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"When deleting a Cluster, all associated machines will be reset"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Delete a Cluster to reset all machines",src:t(5882).Z+"",width:"1241",height:"359"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"When managing a Cluster, simply delete the Node that needs to be reset"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Delete a single node to reset it",src:t(8098).Z+"",width:"1241",height:"774"})}),"\n",(0,i.jsx)(n.h3,{id:"reset-workflow",children:"Reset workflow"}),"\n",(0,i.jsxs)(n.p,{children:["Once the related ",(0,i.jsx)(n.code,{children:"MachineInventory"})," is flagged for deletion, a reset plan will be executed by the ",(0,i.jsx)(n.code,{children:"elemental-system-agent"})," running on the machine."]}),"\n",(0,i.jsx)(n.p,{children:"If the machine is still running, this plan will:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Reboot the machine in recovery mode."}),"\n",(0,i.jsxs)(n.li,{children:["Execute ",(0,i.jsx)(n.code,{children:"systemctl start elemental-register-reset"}),".",(0,i.jsx)(n.br,{}),"\n","This will fetch the remote ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," and apply the ",(0,i.jsx)(n.code,{children:"spec.config.elemental.reset"})," options to reset the machine.",(0,i.jsx)(n.br,{}),"\n","A new ",(0,i.jsx)(n.code,{children:"MachineInventory"})," will be created and the ",(0,i.jsx)(n.code,{children:"spec.config.cloud-config"})," defined in the ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," will be applied again."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Note that the ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," reference will ",(0,i.jsx)(n.strong,{children:"not"})," change, the machine will ",(0,i.jsx)(n.strong,{children:"not"})," be reinstalled, the ",(0,i.jsx)(n.code,{children:"COS_PERSISTENT"})," and ",(0,i.jsx)(n.code,{children:"COS_OEM"})," partition will be cleared by default if reset is ",(0,i.jsx)(n.code,{children:"enabled"}),". For more information, you can consult the ",(0,i.jsx)(n.a,{href:"installation#deployed-elemental-teal-partition-table",children:"Partition Table"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Since the ",(0,i.jsx)(n.code,{children:"cloud-config"})," is re-applied during the reset workflow, you can reset a machine to apply updates from the ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," definition, for example to rotate ",(0,i.jsx)(n.code,{children:"users"})," credentials and authorized keys. It is strongly recommended to enable the ",(0,i.jsx)(n.code,{children:"reset-oem"})," option, to avoid conflicts with previously configured cloud-configs."]}),"\n",(0,i.jsxs)(n.p,{children:["If you need to bind a machine to a different ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," and trigger a new full installation, you need to reprovision it again using a new image."]}),"\n",(0,i.jsx)(n.h3,{id:"enable-machine-reset",children:"Enable machine reset"}),"\n",(0,i.jsxs)(n.p,{children:["In order to allow machines to be reset automatically, the ",(0,i.jsx)(n.code,{children:"spec.config.elemental.reset.enabled"})," flag of the ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," should be toggled.",(0,i.jsx)(n.br,{}),"\n","This is off by default, but once activated, all newly created ",(0,i.jsx)(n.code,{children:"MachineInventory"})," will inherit this setting automatically.",(0,i.jsx)(n.br,{}),"\n","For example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n elemental:\n reset:\n enabled: true\n reset-persistent: true\n reset-oem: true\n # These cloud-init configs will be created during reset and will persist on the system after\n config-urls: \n - "https://my.cloud.init/reset-plan-1.yaml"\n - "https://my.cloud.init/reset-plan-2.yaml"\n # You can select a different image to run the reset. \n # Note that this image will not be installed on the system.\n system-uri: "my.oci.registry/reset-image:latest"\n power-off: false\n reboot: true\n'})}),"\n",(0,i.jsxs)(n.p,{children:["It is also possible to enable reset at a ",(0,i.jsx)(n.code,{children:"MachineInventory"})," level, for example in scenarios where some machines are physical and will benefit from an automatic reset, and some others are virtual and can simply be destroyed and reprovisioned as needed.",(0,i.jsx)(n.br,{}),"\n","In order to flag a single ",(0,i.jsx)(n.code,{children:"MachineInventory"})," to allow reset, you can use the ",(0,i.jsx)(n.code,{children:"elemental.cattle.io/resettable: true"})," annotation.",(0,i.jsx)(n.br,{}),"\n","For example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventory\nmetadata:\n annotations:\n elemental.cattle.io/resettable: "true"\n'})})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},5882:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/reset-cluster-deletion-b98a4f075a3a0600df55a5c847733fe6.png"},8098:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/reset-single-node-deletion-09c47aa5a8f695cb4bfe5eacefbf2bcb.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>l});var i=t(7294);const s={},a=i.createContext(s);function l(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1e6929a8.bbd13471.js b/assets/js/1e6929a8.bbd13471.js deleted file mode 100644 index 01d8cd5d7..000000000 --- a/assets/js/1e6929a8.bbd13471.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8332],{7724:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});var i=t(5893),s=t(1151);const a={sidebar_label:"Machine Reset",title:"",version_badge:"1.3.0"},l=void 0,r={id:"reset",title:"",description:"Machine Reset",source:"@site/versioned_docs/version-1.3/reset.md",sourceDirName:".",slug:"/reset",permalink:"/reset",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Machine Reset",title:"",version_badge:"1.3.0"},sidebar:"docs",previous:{title:"Inventory Management",permalink:"/inventory-management"},next:{title:"Backup",permalink:"/backup"}},o={},c=[{value:"Machine Reset",id:"machine-reset",level:2},{value:"Reset workflow",id:"reset-workflow",level:3},{value:"Enable machine reset",id:"enable-machine-reset",level:3}];function d(e){const n={a:"a",br:"br",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"machine-reset",children:"Machine Reset"}),"\n",(0,i.jsx)(n.p,{children:"There are two ways to reset Elemental machines to their original state or decommission them:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"When deleting a Cluster, all associated machines will be reset"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Delete a Cluster to reset all machines",src:t(5882).Z+"",width:"1241",height:"359"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"When managing a Cluster, simply delete the Node that needs to be reset"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Delete a single node to reset it",src:t(8098).Z+"",width:"1241",height:"774"})}),"\n",(0,i.jsx)(n.h3,{id:"reset-workflow",children:"Reset workflow"}),"\n",(0,i.jsxs)(n.p,{children:["Once the related ",(0,i.jsx)(n.code,{children:"MachineInventory"})," is flagged for deletion, a reset plan will be executed by the ",(0,i.jsx)(n.code,{children:"elemental-system-agent"})," running on the machine."]}),"\n",(0,i.jsx)(n.p,{children:"If the machine is still running, this plan will:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Reboot the machine in recovery mode."}),"\n",(0,i.jsxs)(n.li,{children:["Execute ",(0,i.jsx)(n.code,{children:"systemctl start elemental-register-reset"}),".",(0,i.jsx)(n.br,{}),"\n","This will fetch the remote ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," and apply the ",(0,i.jsx)(n.code,{children:"spec.config.elemental.reset"})," options to reset the machine.",(0,i.jsx)(n.br,{}),"\n","A new ",(0,i.jsx)(n.code,{children:"MachineInventory"})," will be created and the ",(0,i.jsx)(n.code,{children:"spec.config.cloud-config"})," defined in the ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," will be applied again."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Note that the ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," reference will ",(0,i.jsx)(n.strong,{children:"not"})," change, the machine will ",(0,i.jsx)(n.strong,{children:"not"})," be reinstalled, the ",(0,i.jsx)(n.code,{children:"COS_PERSISTENT"})," and ",(0,i.jsx)(n.code,{children:"COS_OEM"})," partition will be cleared by default if reset is ",(0,i.jsx)(n.code,{children:"enabled"}),". For more information, you can consult the ",(0,i.jsx)(n.a,{href:"installation#deployed-elemental-teal-partition-table",children:"Partition Table"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Since the ",(0,i.jsx)(n.code,{children:"cloud-config"})," is re-applied during the reset workflow, you can reset a machine to apply updates from the ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," definition, for example to rotate ",(0,i.jsx)(n.code,{children:"users"})," credentials and authorized keys. It is strongly recommended to enable the ",(0,i.jsx)(n.code,{children:"reset-oem"})," option, to avoid conflicts with previously configured cloud-configs."]}),"\n",(0,i.jsxs)(n.p,{children:["If you need to bind a machine to a different ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," and trigger a new full installation, you need to reprovision it again using a new image."]}),"\n",(0,i.jsx)(n.h3,{id:"enable-machine-reset",children:"Enable machine reset"}),"\n",(0,i.jsxs)(n.p,{children:["In order to allow machines to be reset automatically, the ",(0,i.jsx)(n.code,{children:"spec.config.elemental.reset.enabled"})," flag of the ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," should be toggled.",(0,i.jsx)(n.br,{}),"\n","This is off by default, but once activated, all newly created ",(0,i.jsx)(n.code,{children:"MachineInventory"})," will inherit this setting automatically.",(0,i.jsx)(n.br,{}),"\n","For example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n elemental:\n reset:\n enabled: true\n reset-persistent: true\n reset-oem: true\n # These cloud-init configs will be created during reset and will persist on the system after\n config-urls: \n - "https://my.cloud.init/reset-plan-1.yaml"\n - "https://my.cloud.init/reset-plan-2.yaml"\n # You can select a different image to run the reset. \n # Note that this image will not be installed on the system.\n system-uri: "my.oci.registry/reset-image:latest"\n power-off: false\n reboot: true\n'})}),"\n",(0,i.jsxs)(n.p,{children:["It is also possible to enable reset at a ",(0,i.jsx)(n.code,{children:"MachineInventory"})," level, for example in scenarios where some machines are physical and will benefit from an automatic reset, and some others are virtual and can simply be destroyed and reprovisioned as needed.",(0,i.jsx)(n.br,{}),"\n","In order to flag a single ",(0,i.jsx)(n.code,{children:"MachineInventory"})," to allow reset, you can use the ",(0,i.jsx)(n.code,{children:"elemental.cattle.io/resettable: true"})," annotation.",(0,i.jsx)(n.br,{}),"\n","For example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventory\nmetadata:\n annotations:\n elemental.cattle.io/resettable: "true"\n'})})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},5882:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/reset-cluster-deletion-b98a4f075a3a0600df55a5c847733fe6.png"},8098:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/reset-single-node-deletion-09c47aa5a8f695cb4bfe5eacefbf2bcb.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>l});var i=t(7294);const s={},a=i.createContext(s);function l(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/26511e9d.33d49855.js b/assets/js/26511e9d.33d49855.js new file mode 100644 index 000000000..683b64b1c --- /dev/null +++ b/assets/js/26511e9d.33d49855.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7384],{4599:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>i,contentTitle:()=>o,default:()=>h,frontMatter:()=>c,metadata:()=>s,toc:()=>l});var a=n(5893),t=n(1151);const c={sidebar_label:"Backup",title:""},o="Backup",s={id:"backup",title:"",description:"Since Elemental runs as part of Rancher, the Elemental resources are bundled in the Rancher backup.",source:"@site/versioned_docs/version-1.2/backup.md",sourceDirName:".",slug:"/backup",permalink:"/1.2/backup",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Backup",title:""},sidebar:"docs",previous:{title:"Inventory Management",permalink:"/1.2/inventory-management"},next:{title:"Restore",permalink:"/1.2/restore"}},i={},l=[{value:"Install rancher-backup operator for Rancher",id:"install-rancher-backup-operator-for-rancher",level:2},{value:"Backup Elemental with rancher-backup operator",id:"backup-elemental-with-rancher-backup-operator",level:2}];function u(e){const r={a:"a",br:"br",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,t.a)(),...e.components},{Head:n}=r;return n||function(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n,{children:(0,a.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/backup"})}),"\n",(0,a.jsx)(r.h1,{id:"backup",children:"Backup"}),"\n",(0,a.jsxs)(r.p,{children:["Since Elemental runs as part of Rancher, the Elemental resources are bundled in the Rancher backup.",(0,a.jsx)(r.br,{}),"\n","For more details about Rancher backups, restore, and disaster recovery options, please follow the official ",(0,a.jsx)(r.a,{href:"https://ranchermanager.docs.rancher.com/pages-for-subheaders/backup-restore-configuration",children:"Rancher documentation"}),"."]}),"\n",(0,a.jsx)(r.h2,{id:"install-rancher-backup-operator-for-rancher",children:"Install rancher-backup operator for Rancher"}),"\n",(0,a.jsxs)(r.p,{children:["Follow the ",(0,a.jsx)(r.a,{href:"https://docs.ranchermanager.rancher.io/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-rancher",children:"Rancher backup guide"})," to learn how to install and configure the Rancher backup-operator."]}),"\n",(0,a.jsxs)(r.p,{children:["Note that for single node Rancher installations the backup workflow is different.",(0,a.jsx)(r.br,{}),"\n","You may follow the official ",(0,a.jsx)(r.a,{href:"https://ranchermanager.docs.rancher.com/v2.6/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-docker-installed-rancher",children:"documentation"})," to learn more."]}),"\n",(0,a.jsx)(r.h2,{id:"backup-elemental-with-rancher-backup-operator",children:"Backup Elemental with rancher-backup operator"}),"\n",(0,a.jsxs)(r.p,{children:["Create a ",(0,a.jsx)(r.code,{children:"backup object"})," (adapted to your needs) to backup Rancher running on a Kubernetes cluster."]}),"\n",(0,a.jsx)(r.pre,{children:(0,a.jsx)(r.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: resources.cattle.io/v1\nkind: Backup\nmetadata:\n name: rancher-backup\nspec:\n resourceSetName: rancher-resource-set\n schedule: "10 3 * * *"\n retentionCount: 10\n'})}),"\n",(0,a.jsxs)(r.p,{children:["The rancher-backup operator offers several options for schedule, encryption, and storage classes.",(0,a.jsx)(r.br,{}),"\n","You can explore all options by reading the ",(0,a.jsx)(r.a,{href:"https://ranchermanager.docs.rancher.com/reference-guides/backup-restore-configuration/backup-configuration",children:"official documentation"}),"."]}),"\n",(0,a.jsx)(r.p,{children:"Check logs from rancher-backup operator."}),"\n",(0,a.jsx)(r.pre,{children:(0,a.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl logs -n cattle-resources-system -l app.kubernetes.io/name=rancher-backup -f\n"})}),"\n",(0,a.jsx)(r.p,{children:"Verify if backup file was created on Persistent Volume."}),"\n",(0,a.jsx)(r.pre,{children:(0,a.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"...\nINFO[2022/10/17 07:45:04] Finding files starting with /var/lib/backups/rancher-backup-430169aa-edde-4a61-85e8-858f625a755b*.tar.gz \nINFO[2022/10/17 07:45:04] File rancher-backup-430169aa-edde-4a61-85e8-858f625a755b-2022-10-17T05-15-00Z.tar.gz was created at 2022-10-17 0\n...\n"})})]})}function h(e={}){const{wrapper:r}={...(0,t.a)(),...e.components};return r?(0,a.jsx)(r,{...e,children:(0,a.jsx)(u,{...e})}):u(e)}},1151:(e,r,n)=>{n.d(r,{Z:()=>s,a:()=>o});var a=n(7294);const t={},c=a.createContext(t);function o(e){const r=a.useContext(c);return a.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function s(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),a.createElement(c.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/26511e9d.80d13872.js b/assets/js/26511e9d.80d13872.js deleted file mode 100644 index 59172dc79..000000000 --- a/assets/js/26511e9d.80d13872.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7384],{4599:(e,r,a)=>{a.r(r),a.d(r,{assets:()=>i,contentTitle:()=>o,default:()=>h,frontMatter:()=>c,metadata:()=>s,toc:()=>l});var n=a(5893),t=a(1151);const c={sidebar_label:"Backup",title:""},o="Backup",s={id:"backup",title:"",description:"Since Elemental runs as part of Rancher, the Elemental resources are bundled in the Rancher backup.",source:"@site/versioned_docs/version-1.2/backup.md",sourceDirName:".",slug:"/backup",permalink:"/1.2/backup",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Backup",title:""},sidebar:"docs",previous:{title:"Inventory Management",permalink:"/1.2/inventory-management"},next:{title:"Restore",permalink:"/1.2/restore"}},i={},l=[{value:"Install rancher-backup operator for Rancher",id:"install-rancher-backup-operator-for-rancher",level:2},{value:"Backup Elemental with rancher-backup operator",id:"backup-elemental-with-rancher-backup-operator",level:2}];function u(e){const r={a:"a",br:"br",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(r.h1,{id:"backup",children:"Backup"}),"\n",(0,n.jsxs)(r.p,{children:["Since Elemental runs as part of Rancher, the Elemental resources are bundled in the Rancher backup.",(0,n.jsx)(r.br,{}),"\n","For more details about Rancher backups, restore, and disaster recovery options, please follow the official ",(0,n.jsx)(r.a,{href:"https://ranchermanager.docs.rancher.com/pages-for-subheaders/backup-restore-configuration",children:"Rancher documentation"}),"."]}),"\n",(0,n.jsx)(r.h2,{id:"install-rancher-backup-operator-for-rancher",children:"Install rancher-backup operator for Rancher"}),"\n",(0,n.jsxs)(r.p,{children:["Follow the ",(0,n.jsx)(r.a,{href:"https://docs.ranchermanager.rancher.io/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-rancher",children:"Rancher backup guide"})," to learn how to install and configure the Rancher backup-operator."]}),"\n",(0,n.jsxs)(r.p,{children:["Note that for single node Rancher installations the backup workflow is different.",(0,n.jsx)(r.br,{}),"\n","You may follow the official ",(0,n.jsx)(r.a,{href:"https://ranchermanager.docs.rancher.com/v2.6/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-docker-installed-rancher",children:"documentation"})," to learn more."]}),"\n",(0,n.jsx)(r.h2,{id:"backup-elemental-with-rancher-backup-operator",children:"Backup Elemental with rancher-backup operator"}),"\n",(0,n.jsxs)(r.p,{children:["Create a ",(0,n.jsx)(r.code,{children:"backup object"})," (adapted to your needs) to backup Rancher running on a Kubernetes cluster."]}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: resources.cattle.io/v1\nkind: Backup\nmetadata:\n name: rancher-backup\nspec:\n resourceSetName: rancher-resource-set\n schedule: "10 3 * * *"\n retentionCount: 10\n'})}),"\n",(0,n.jsxs)(r.p,{children:["The rancher-backup operator offers several options for schedule, encryption, and storage classes.",(0,n.jsx)(r.br,{}),"\n","You can explore all options by reading the ",(0,n.jsx)(r.a,{href:"https://ranchermanager.docs.rancher.com/reference-guides/backup-restore-configuration/backup-configuration",children:"official documentation"}),"."]}),"\n",(0,n.jsx)(r.p,{children:"Check logs from rancher-backup operator."}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl logs -n cattle-resources-system -l app.kubernetes.io/name=rancher-backup -f\n"})}),"\n",(0,n.jsx)(r.p,{children:"Verify if backup file was created on Persistent Volume."}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"...\nINFO[2022/10/17 07:45:04] Finding files starting with /var/lib/backups/rancher-backup-430169aa-edde-4a61-85e8-858f625a755b*.tar.gz \nINFO[2022/10/17 07:45:04] File rancher-backup-430169aa-edde-4a61-85e8-858f625a755b-2022-10-17T05-15-00Z.tar.gz was created at 2022-10-17 0\n...\n"})})]})}function h(e={}){const{wrapper:r}={...(0,t.a)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},1151:(e,r,a)=>{a.d(r,{Z:()=>s,a:()=>o});var n=a(7294);const t={},c=n.createContext(t);function o(e){const r=n.useContext(c);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function s(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),n.createElement(c.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2a824f8b.d3a263b3.js b/assets/js/2a824f8b.83c55e0a.js similarity index 81% rename from assets/js/2a824f8b.d3a263b3.js rename to assets/js/2a824f8b.83c55e0a.js index 00e29e5c8..949581cb4 100644 --- a/assets/js/2a824f8b.d3a263b3.js +++ b/assets/js/2a824f8b.83c55e0a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[652],{8462:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>s,toc:()=>h});var a=t(5893),i=t(1151);const l={sidebar_label:"Architecture",title:""},r="Architecture",s={id:"architecture",title:"",description:"The Elemental stack can be divided in two main parts: the Elemental OS, an immutable and customizable OS which comprises the tools and the steps needed to prepare the Cloud Native OS image and perform the actual OS installation on the host, and the , that allows central management of the Elemental OS via Rancher, the Kubernetes way.",source:"@site/versioned_docs/version-1.2/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/1.2/architecture",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Architecture",title:""},sidebar:"docs",previous:{title:"Elemental the command line way",permalink:"/1.2/quickstart-cli"},next:{title:"Installation",permalink:"/1.2/installation"}},o={},h=[{value:"Elemental Architecture",id:"elemental-architecture",level:2},{value:"Elemental OS",id:"elemental-os",level:2},{value:"Elemental OS image",id:"elemental-os-image",level:3},{value:"Elemental installation configuration",id:"elemental-installation-configuration",level:3},{value:"Elemental CLI",id:"elemental-cli",level:3},{value:"Elemental Operator",id:"elemental-operator",level:2},{value:"Elemental Operator Helm Chart",id:"elemental-operator-helm-chart",level:3},{value:"MachineRegistration",id:"machineregistration",level:4},{value:"MachineInventory",id:"machineinventory",level:4},{value:"MachineInventorySelector",id:"machineinventoryselector",level:4},{value:"MachineInventorySelectorTemplate",id:"machineinventoryselectortemplate",level:4},{value:"SeedImage",id:"seedimage",level:4},{value:"Elemental Register client",id:"elemental-register-client",level:3},{value:"Elemental Teal",id:"elemental-teal",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",hr:"hr",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.a)(),...e.components},{Vars:l}=n;return l||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Vars",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"architecture",children:"Architecture"}),"\n",(0,a.jsxs)(n.p,{children:["The Elemental stack can be divided in two main parts: the Elemental OS, an immutable and customizable OS which comprises the tools and the steps needed to prepare the Cloud Native OS image and perform the actual OS installation on the host, and the ",(0,a.jsx)(l,{name:"elemental_operator_name"}),", that allows central management of the Elemental OS via Rancher, the Kubernetes way."]}),"\n",(0,a.jsx)(n.h2,{id:"elemental-architecture",children:(0,a.jsx)(n.img,{alt:"Elemental Architecture",src:t(8482).Z+"",width:"1501",height:"1116"})}),"\n",(0,a.jsx)(n.h2,{id:"elemental-os",children:"Elemental OS"}),"\n",(0,a.jsx)(n.p,{children:"In order to deploy the Elemental OS we need:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"an Elemental base OS image"}),"\n",(0,a.jsx)(n.li,{children:"an Elemental installation configuration"}),"\n",(0,a.jsxs)(n.li,{children:["the ",(0,a.jsx)(l,{name:"elemental_cli_name"})," tool, which installs the Elemental OS image on the target host applying the Elemental installation configuration"]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-os-image",children:"Elemental OS image"}),"\n",(0,a.jsxs)(n.p,{children:["The Elemental OS image is an OCI container image containing all the files that will make up the OS of the target host. It will contain not only all the desired binaries and libraries, but also the kernel and the boot files required by a linux system.\nThe ",(0,a.jsx)(l,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})," is at the core of the Elemental OS, enabling to boot and upgrade an OS from container images. It also provides a framework that allows to combine different packages to bake custom OS container images. For more information check the ",(0,a.jsx)(l,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})," project page."]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-installation-configuration",children:"Elemental installation configuration"}),"\n",(0,a.jsxs)(n.p,{children:["In order to provision a machine with an Elemental OS image, installation configuration parameters are required: things such as the boot device, the root password, system configuration, users and custom files are things that should be provided aside from the Elemental OS image. All the data can be provided in a single .yaml file. More details can be found in the ",(0,a.jsx)(l,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})," documentation."]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-cli",children:"Elemental CLI"}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(l,{name:"elemental_cli_name"})," is the tool that allows to turn the Elemental OS image in a bootable and installed OS: it can generate an ",(0,a.jsx)(l,{name:"elemental_iso_name"})," image from the provided Elemental OS container image. The generated ",(0,a.jsx)(l,{name:"elemental_iso_name"})," image can be used to boot a virtual machine or a bare metal host and start the Elemental OS installation."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(l,{name:"elemental_cli_name"})," allows also to install the Elemental OS on the storage device of the live booted host, applying the provided Elemental installation configuration. For the list and syntax of the commands available in the ",(0,a.jsx)(l,{name:"elemental_cli_name"}),", check the ",(0,a.jsx)(l,{link:"elemental_cli_url",children:"online documentation"}),"."]}),"\n",(0,a.jsx)(n.h3,{id:"",children:(0,a.jsx)(l,{name:"elemental_iso_name"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(l,{name:"elemental_iso_name"})," is a live ISO based on the Elemental OS (an Elemental live ISO).\nIt includes all the tools needed to perform a full node provisioning, from the OS to Kubernetes, including the ",(0,a.jsx)(n.a,{href:"#elemental-cli",children:(0,a.jsx)(l,{name:"elemental_cli_name"})})," and the ",(0,a.jsx)(n.a,{href:"#elemental-register-client",children:(0,a.jsx)(l,{name:"elemental_register_name"})}),"."]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"elemental-operator",children:"Elemental Operator"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(l,{name:"elemental_operator_name"})," is responsible for managing OS upgrades and a secure device inventory to assist\nwith zero touch provisioning.\nIt provides an ",(0,a.jsx)(l,{name:"elemental_operator_name"})," Helm Chart and an ",(0,a.jsx)(l,{name:"elemental_register_name"}),"."]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-operator-helm-chart",children:"Elemental Operator Helm Chart"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(l,{name:"elemental_operator_name"})," Helm Chart must be installed on a Rancher Cluster. It enables new hosts to:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["register against the ",(0,a.jsx)(l,{name:"elemental_operator_name"}),"."]}),"\n",(0,a.jsx)(n.li,{children:"retrieve the Elemental installation configuration (which is stored in custom Kubernetes resources) to start the Elemental OS installation."}),"\n",(0,a.jsxs)(n.li,{children:["download and install the ",(0,a.jsx)(l,{name:"ranchersystemagent_name",link:"ranchersystemagent_url"}),", which enables Rancher to provision and manage K3s and RKE2 on the Elemental nodes."]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(l,{name:"elemental_operator_name"})," allows control of the Elemental Nodes by extending the Kubernetes APIs with a set of ",(0,a.jsx)(n.em,{children:"elemental.cattle.io"})," ",(0,a.jsx)(n.a,{href:"https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/",children:"Kubernetes CRDs"}),":"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"MachineRegistration"}),"\n",(0,a.jsx)(n.li,{children:"MachineInventory"}),"\n",(0,a.jsx)(n.li,{children:"MachineInventorySelector"}),"\n",(0,a.jsx)(n.li,{children:"MachineInventorySelectorTemplate"}),"\n",(0,a.jsx)(n.li,{children:"ManagedOSImage"}),"\n",(0,a.jsx)(n.li,{children:"ManagedOSVersion"}),"\n",(0,a.jsx)(n.li,{children:"ManagedOSVersionChannel"}),"\n",(0,a.jsx)(n.li,{children:"SeedImage"}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"machineregistration",children:"MachineRegistration"}),"\n",(0,a.jsxs)(n.p,{children:["The MachineRegistration includes the Elemental installation configuration (provided by the user) and a registration token (generated by the ",(0,a.jsx)(l,{name:"elemental_operator_name"}),"), from which a registration URL is derived."]}),"\n",(0,a.jsxs)(n.p,{children:["The registration URL is the way through which an host can access the ",(0,a.jsx)(l,{name:"elemental_operator_name"})," services, to kick off the Elemental provisioning process."]}),"\n",(0,a.jsxs)(n.p,{children:["The MachineRegistration has a ",(0,a.jsx)(n.code,{children:"Ready"})," condition which turns to true when the ",(0,a.jsx)(l,{name:"elemental_operator_name"})," has successfully generated the registration URL and an associated ServiceAccount. From this point on the target host can connect to the registration URL to kick off the provisioning process."]}),"\n",(0,a.jsxs)(n.p,{children:["An HTTP GET request against the registration URL returns the ",(0,a.jsx)(n.em,{children:"registration file"}),": a .yaml file containing the registration data (i.e., the ",(0,a.jsx)(n.em,{children:"spec:config:elemental:registration"})," section only from the just created MachineRegistration).\nThe registration file contains all the required data to allow the target host to perform self registration and start the Elemental provisioning. See the ",(0,a.jsxs)(n.a,{href:"#elemental-register-client",children:[(0,a.jsx)(l,{name:"elemental_register_name"})," section"]})," for more info on the registration process and the ",(0,a.jsxs)(n.a,{href:"/1.2/machineregistration-reference#configelementalregistration",children:["config:elemental",":registration"," section in the MachineRegistration reference"]})," for more details on the available registration options."]}),"\n",(0,a.jsx)(n.h4,{id:"machineinventory",children:"MachineInventory"}),"\n",(0,a.jsxs)(n.p,{children:["When a new host registers successfully, the ",(0,a.jsx)(l,{name:"elemental_operator_name"})," creates a MachineInventory resource representing that particular host.\nThe MachineInventory stores the TPM hash of the tracked host, retrieved during the registration process, and allows to execute arbitrary commands (plans) on the machine."]}),"\n",(0,a.jsx)(n.p,{children:"A MachineInventory has two conditions:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"AdoptionReady"}),", which indicates the machine has been adopted by a selector to be part of a cluster."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"Ready"}),", which indicates that the machine has been registered and provisioned with an Elemental OS."]}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"machineinventoryselector",children:"MachineInventorySelector"}),"\n",(0,a.jsx)(n.p,{children:"A MachineInventorySelector selects MachineInventories based on applied selectors (usually pattern matching on MachineInventory label values)."}),"\n",(0,a.jsx)(n.p,{children:"MachineInventorySelectors have two conditions:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"InventoryReady"}),", turns to true if the MachineInventorySelector has found a matching MachineInventory and has successfully set itself as the MachineInventory owner."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"Ready"}),", tracks if the selector already adopted a machine and started the kubernetes provisioning process (node bootstrap)."]}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"machineinventoryselectortemplate",children:"MachineInventorySelectorTemplate"}),"\n",(0,a.jsx)(n.p,{children:"The MachineInventorySelectorTemplate is a user defined resource that will be used as the blueprint to create the required MachineInventorySelectors: it includes the selector to identify the eligible MachineInventories."}),"\n",(0,a.jsx)(n.h4,{id:"seedimage",children:"SeedImage"}),"\n",(0,a.jsx)(n.p,{children:"A SeedImage is a resource to handle the installation media creation. Includes the reference to the base installation system and a reference to the machine registration. It is used to create and serve installation ISOs including\nthe MachineRegistration metadata required for the machine registration. The installation media is created and being served in a devoted Pod."}),"\n",(0,a.jsx)(n.p,{children:"SeedImage have two conditions:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"SeedImageReady"}),", tracks the status of the associated pod."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"Ready"}),", tracks if all the SeedImage child resources have been successfully created."]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-register-client",children:"Elemental Register client"}),"\n",(0,a.jsxs)(n.p,{children:["New hosts start the Elemental provisioning process through the ",(0,a.jsx)(l,{name:"elemental_register_name"}),": this tool requires a valid elemental-operator registration URL as input (see the ",(0,a.jsx)(n.a,{href:"#machineregistration",children:"MachineRegistration section"}),"), and performs the following steps:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"setups a websocket connection to the registration URL"}),"\n",(0,a.jsxs)(n.li,{children:["authenticates itself using the registration token and the onboard ",(0,a.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Trusted_Platform_Module",children:"TPM (Trusted Platform Module)"})]}),"\n",(0,a.jsxs)(n.li,{children:["sends ",(0,a.jsx)(n.a,{href:"/1.2/smbios",children:"SMBIOS data"})," to the ",(0,a.jsx)(l,{name:"elemental_operator_name"})]}),"\n",(0,a.jsx)(n.li,{children:"retrieves the Elemental installation configuration"}),"\n",(0,a.jsxs)(n.li,{children:["starts the ",(0,a.jsx)(n.a,{href:"#elemental-cli",children:(0,a.jsx)(l,{name:"elemental_cli_name"})})," and performs the Elemental OS installation"]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"Note"}),"\nif no TPM 2.0 is available on the host, TPM can be emulated by software: see the ",(0,a.jsx)(n.code,{children:"emulate-tpm"})," key in the ",(0,a.jsx)(n.a,{href:"/1.2/machineregistration-reference#configelementalregistration",children:"config.elemental.register reference document"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(l,{name:"elemental_operator_name"})," includes a Kubernetes operator installed in the management cluster and a client\nside installed in nodes, so they can self register into the management cluster. Once a node is\nregistered the ",(0,a.jsx)(l,{name:"elemental_operator_name"})," will kick-start the OS installation and schedule the Kubernetes\nprovisioning using the ",(0,a.jsx)(l,{name:"ranchersystemagent_name",link:"ranchersystemagent_url"}),".\nRancher System Agent is responsible for bootstrapping RKE2/k3s and Rancher from an OCI registry. This means\nan update of containerd, k3s, RKE2, or Rancher does not require an OS upgrade\nor node reboot."]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"elemental-teal",children:"Elemental Teal"}),"\n",(0,a.jsx)(n.p,{children:"Elemental Teal is Elemental OS built on top of SUSE Linux Enterprise (SLE) Micro for Rancher using the Elemental stack."})]})}function d(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},8482:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/elemental-arch-v1.3_nobg-cbe062db521c514fc332b92ff6e7f3d5.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>r});var a=t(7294);const i={},l=a.createContext(i);function r(e){const n=a.useContext(l);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[652],{8462:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>s,toc:()=>h});var a=t(5893),i=t(1151);const l={sidebar_label:"Architecture",title:""},r="Architecture",s={id:"architecture",title:"",description:"The Elemental stack can be divided in two main parts: the Elemental OS, an immutable and customizable OS which comprises the tools and the steps needed to prepare the Cloud Native OS image and perform the actual OS installation on the host, and the , that allows central management of the Elemental OS via Rancher, the Kubernetes way.",source:"@site/versioned_docs/version-1.2/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/1.2/architecture",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Architecture",title:""},sidebar:"docs",previous:{title:"Elemental the command line way",permalink:"/1.2/quickstart-cli"},next:{title:"Installation",permalink:"/1.2/installation"}},o={},h=[{value:"Elemental Architecture",id:"elemental-architecture",level:2},{value:"Elemental OS",id:"elemental-os",level:2},{value:"Elemental OS image",id:"elemental-os-image",level:3},{value:"Elemental installation configuration",id:"elemental-installation-configuration",level:3},{value:"Elemental CLI",id:"elemental-cli",level:3},{value:"Elemental Operator",id:"elemental-operator",level:2},{value:"Elemental Operator Helm Chart",id:"elemental-operator-helm-chart",level:3},{value:"MachineRegistration",id:"machineregistration",level:4},{value:"MachineInventory",id:"machineinventory",level:4},{value:"MachineInventorySelector",id:"machineinventoryselector",level:4},{value:"MachineInventorySelectorTemplate",id:"machineinventoryselectortemplate",level:4},{value:"SeedImage",id:"seedimage",level:4},{value:"Elemental Register client",id:"elemental-register-client",level:3},{value:"Elemental Teal",id:"elemental-teal",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",hr:"hr",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.a)(),...e.components},{Head:l,Vars:r}=n;return l||m("Head",!0),r||m("Vars",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(l,{children:(0,a.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/architecture"})}),"\n",(0,a.jsx)(n.h1,{id:"architecture",children:"Architecture"}),"\n",(0,a.jsxs)(n.p,{children:["The Elemental stack can be divided in two main parts: the Elemental OS, an immutable and customizable OS which comprises the tools and the steps needed to prepare the Cloud Native OS image and perform the actual OS installation on the host, and the ",(0,a.jsx)(r,{name:"elemental_operator_name"}),", that allows central management of the Elemental OS via Rancher, the Kubernetes way."]}),"\n",(0,a.jsx)(n.h2,{id:"elemental-architecture",children:(0,a.jsx)(n.img,{alt:"Elemental Architecture",src:t(8482).Z+"",width:"1501",height:"1116"})}),"\n",(0,a.jsx)(n.h2,{id:"elemental-os",children:"Elemental OS"}),"\n",(0,a.jsx)(n.p,{children:"In order to deploy the Elemental OS we need:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"an Elemental base OS image"}),"\n",(0,a.jsx)(n.li,{children:"an Elemental installation configuration"}),"\n",(0,a.jsxs)(n.li,{children:["the ",(0,a.jsx)(r,{name:"elemental_cli_name"})," tool, which installs the Elemental OS image on the target host applying the Elemental installation configuration"]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-os-image",children:"Elemental OS image"}),"\n",(0,a.jsxs)(n.p,{children:["The Elemental OS image is an OCI container image containing all the files that will make up the OS of the target host. It will contain not only all the desired binaries and libraries, but also the kernel and the boot files required by a linux system.\nThe ",(0,a.jsx)(r,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})," is at the core of the Elemental OS, enabling to boot and upgrade an OS from container images. It also provides a framework that allows to combine different packages to bake custom OS container images. For more information check the ",(0,a.jsx)(r,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})," project page."]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-installation-configuration",children:"Elemental installation configuration"}),"\n",(0,a.jsxs)(n.p,{children:["In order to provision a machine with an Elemental OS image, installation configuration parameters are required: things such as the boot device, the root password, system configuration, users and custom files are things that should be provided aside from the Elemental OS image. All the data can be provided in a single .yaml file. More details can be found in the ",(0,a.jsx)(r,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})," documentation."]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-cli",children:"Elemental CLI"}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(r,{name:"elemental_cli_name"})," is the tool that allows to turn the Elemental OS image in a bootable and installed OS: it can generate an ",(0,a.jsx)(r,{name:"elemental_iso_name"})," image from the provided Elemental OS container image. The generated ",(0,a.jsx)(r,{name:"elemental_iso_name"})," image can be used to boot a virtual machine or a bare metal host and start the Elemental OS installation."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(r,{name:"elemental_cli_name"})," allows also to install the Elemental OS on the storage device of the live booted host, applying the provided Elemental installation configuration. For the list and syntax of the commands available in the ",(0,a.jsx)(r,{name:"elemental_cli_name"}),", check the ",(0,a.jsx)(r,{link:"elemental_cli_url",children:"online documentation"}),"."]}),"\n",(0,a.jsx)(n.h3,{id:"",children:(0,a.jsx)(r,{name:"elemental_iso_name"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(r,{name:"elemental_iso_name"})," is a live ISO based on the Elemental OS (an Elemental live ISO).\nIt includes all the tools needed to perform a full node provisioning, from the OS to Kubernetes, including the ",(0,a.jsx)(n.a,{href:"#elemental-cli",children:(0,a.jsx)(r,{name:"elemental_cli_name"})})," and the ",(0,a.jsx)(n.a,{href:"#elemental-register-client",children:(0,a.jsx)(r,{name:"elemental_register_name"})}),"."]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"elemental-operator",children:"Elemental Operator"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(r,{name:"elemental_operator_name"})," is responsible for managing OS upgrades and a secure device inventory to assist\nwith zero touch provisioning.\nIt provides an ",(0,a.jsx)(r,{name:"elemental_operator_name"})," Helm Chart and an ",(0,a.jsx)(r,{name:"elemental_register_name"}),"."]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-operator-helm-chart",children:"Elemental Operator Helm Chart"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(r,{name:"elemental_operator_name"})," Helm Chart must be installed on a Rancher Cluster. It enables new hosts to:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["register against the ",(0,a.jsx)(r,{name:"elemental_operator_name"}),"."]}),"\n",(0,a.jsx)(n.li,{children:"retrieve the Elemental installation configuration (which is stored in custom Kubernetes resources) to start the Elemental OS installation."}),"\n",(0,a.jsxs)(n.li,{children:["download and install the ",(0,a.jsx)(r,{name:"ranchersystemagent_name",link:"ranchersystemagent_url"}),", which enables Rancher to provision and manage K3s and RKE2 on the Elemental nodes."]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(r,{name:"elemental_operator_name"})," allows control of the Elemental Nodes by extending the Kubernetes APIs with a set of ",(0,a.jsx)(n.em,{children:"elemental.cattle.io"})," ",(0,a.jsx)(n.a,{href:"https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/",children:"Kubernetes CRDs"}),":"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"MachineRegistration"}),"\n",(0,a.jsx)(n.li,{children:"MachineInventory"}),"\n",(0,a.jsx)(n.li,{children:"MachineInventorySelector"}),"\n",(0,a.jsx)(n.li,{children:"MachineInventorySelectorTemplate"}),"\n",(0,a.jsx)(n.li,{children:"ManagedOSImage"}),"\n",(0,a.jsx)(n.li,{children:"ManagedOSVersion"}),"\n",(0,a.jsx)(n.li,{children:"ManagedOSVersionChannel"}),"\n",(0,a.jsx)(n.li,{children:"SeedImage"}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"machineregistration",children:"MachineRegistration"}),"\n",(0,a.jsxs)(n.p,{children:["The MachineRegistration includes the Elemental installation configuration (provided by the user) and a registration token (generated by the ",(0,a.jsx)(r,{name:"elemental_operator_name"}),"), from which a registration URL is derived."]}),"\n",(0,a.jsxs)(n.p,{children:["The registration URL is the way through which an host can access the ",(0,a.jsx)(r,{name:"elemental_operator_name"})," services, to kick off the Elemental provisioning process."]}),"\n",(0,a.jsxs)(n.p,{children:["The MachineRegistration has a ",(0,a.jsx)(n.code,{children:"Ready"})," condition which turns to true when the ",(0,a.jsx)(r,{name:"elemental_operator_name"})," has successfully generated the registration URL and an associated ServiceAccount. From this point on the target host can connect to the registration URL to kick off the provisioning process."]}),"\n",(0,a.jsxs)(n.p,{children:["An HTTP GET request against the registration URL returns the ",(0,a.jsx)(n.em,{children:"registration file"}),": a .yaml file containing the registration data (i.e., the ",(0,a.jsx)(n.em,{children:"spec:config:elemental:registration"})," section only from the just created MachineRegistration).\nThe registration file contains all the required data to allow the target host to perform self registration and start the Elemental provisioning. See the ",(0,a.jsxs)(n.a,{href:"#elemental-register-client",children:[(0,a.jsx)(r,{name:"elemental_register_name"})," section"]})," for more info on the registration process and the ",(0,a.jsxs)(n.a,{href:"/1.2/machineregistration-reference#configelementalregistration",children:["config:elemental",":registration"," section in the MachineRegistration reference"]})," for more details on the available registration options."]}),"\n",(0,a.jsx)(n.h4,{id:"machineinventory",children:"MachineInventory"}),"\n",(0,a.jsxs)(n.p,{children:["When a new host registers successfully, the ",(0,a.jsx)(r,{name:"elemental_operator_name"})," creates a MachineInventory resource representing that particular host.\nThe MachineInventory stores the TPM hash of the tracked host, retrieved during the registration process, and allows to execute arbitrary commands (plans) on the machine."]}),"\n",(0,a.jsx)(n.p,{children:"A MachineInventory has two conditions:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"AdoptionReady"}),", which indicates the machine has been adopted by a selector to be part of a cluster."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"Ready"}),", which indicates that the machine has been registered and provisioned with an Elemental OS."]}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"machineinventoryselector",children:"MachineInventorySelector"}),"\n",(0,a.jsx)(n.p,{children:"A MachineInventorySelector selects MachineInventories based on applied selectors (usually pattern matching on MachineInventory label values)."}),"\n",(0,a.jsx)(n.p,{children:"MachineInventorySelectors have two conditions:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"InventoryReady"}),", turns to true if the MachineInventorySelector has found a matching MachineInventory and has successfully set itself as the MachineInventory owner."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"Ready"}),", tracks if the selector already adopted a machine and started the kubernetes provisioning process (node bootstrap)."]}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"machineinventoryselectortemplate",children:"MachineInventorySelectorTemplate"}),"\n",(0,a.jsx)(n.p,{children:"The MachineInventorySelectorTemplate is a user defined resource that will be used as the blueprint to create the required MachineInventorySelectors: it includes the selector to identify the eligible MachineInventories."}),"\n",(0,a.jsx)(n.h4,{id:"seedimage",children:"SeedImage"}),"\n",(0,a.jsx)(n.p,{children:"A SeedImage is a resource to handle the installation media creation. Includes the reference to the base installation system and a reference to the machine registration. It is used to create and serve installation ISOs including\nthe MachineRegistration metadata required for the machine registration. The installation media is created and being served in a devoted Pod."}),"\n",(0,a.jsx)(n.p,{children:"SeedImage have two conditions:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"SeedImageReady"}),", tracks the status of the associated pod."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"Ready"}),", tracks if all the SeedImage child resources have been successfully created."]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-register-client",children:"Elemental Register client"}),"\n",(0,a.jsxs)(n.p,{children:["New hosts start the Elemental provisioning process through the ",(0,a.jsx)(r,{name:"elemental_register_name"}),": this tool requires a valid elemental-operator registration URL as input (see the ",(0,a.jsx)(n.a,{href:"#machineregistration",children:"MachineRegistration section"}),"), and performs the following steps:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"setups a websocket connection to the registration URL"}),"\n",(0,a.jsxs)(n.li,{children:["authenticates itself using the registration token and the onboard ",(0,a.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Trusted_Platform_Module",children:"TPM (Trusted Platform Module)"})]}),"\n",(0,a.jsxs)(n.li,{children:["sends ",(0,a.jsx)(n.a,{href:"/1.2/smbios",children:"SMBIOS data"})," to the ",(0,a.jsx)(r,{name:"elemental_operator_name"})]}),"\n",(0,a.jsx)(n.li,{children:"retrieves the Elemental installation configuration"}),"\n",(0,a.jsxs)(n.li,{children:["starts the ",(0,a.jsx)(n.a,{href:"#elemental-cli",children:(0,a.jsx)(r,{name:"elemental_cli_name"})})," and performs the Elemental OS installation"]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"Note"}),"\nif no TPM 2.0 is available on the host, TPM can be emulated by software: see the ",(0,a.jsx)(n.code,{children:"emulate-tpm"})," key in the ",(0,a.jsx)(n.a,{href:"/1.2/machineregistration-reference#configelementalregistration",children:"config.elemental.register reference document"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(r,{name:"elemental_operator_name"})," includes a Kubernetes operator installed in the management cluster and a client\nside installed in nodes, so they can self register into the management cluster. Once a node is\nregistered the ",(0,a.jsx)(r,{name:"elemental_operator_name"})," will kick-start the OS installation and schedule the Kubernetes\nprovisioning using the ",(0,a.jsx)(r,{name:"ranchersystemagent_name",link:"ranchersystemagent_url"}),".\nRancher System Agent is responsible for bootstrapping RKE2/k3s and Rancher from an OCI registry. This means\nan update of containerd, k3s, RKE2, or Rancher does not require an OS upgrade\nor node reboot."]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"elemental-teal",children:"Elemental Teal"}),"\n",(0,a.jsx)(n.p,{children:"Elemental Teal is Elemental OS built on top of SUSE Linux Enterprise (SLE) Micro for Rancher using the Elemental stack."})]})}function d(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}function m(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},8482:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/elemental-arch-v1.3_nobg-cbe062db521c514fc332b92ff6e7f3d5.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>r});var a=t(7294);const i={},l=a.createContext(i);function r(e){const n=a.useContext(l);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/314a742e.138abbcd.js b/assets/js/314a742e.138abbcd.js deleted file mode 100644 index ca401686a..000000000 --- a/assets/js/314a742e.138abbcd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[5278],{7930:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var a=n(5893),i=n(1151),r=n(2957);const o={sidebar_label:"Trusted Platform Module (TPM)",title:""},d="Trusted Platform Module 2.0 (TPM)",s={id:"tpm",title:"",description:"Trusted Platform Module (TPM, also known as ISO/IEC 11889) is an international standard for a secure cryptoprocessor, a dedicated microcontroller designed to secure hardware through integrated cryptographic keys. The term can also refer to a chip conforming to the standard.",source:"@site/docs/tpm.md",sourceDirName:".",slug:"/tpm",permalink:"/next/tpm",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Trusted Platform Module (TPM)",title:""}},l={},c=[{value:"Add TPM module to virtual machine",id:"add-tpm-module-to-virtual-machine",level:2},{value:"Create Virtual Machine",id:"create-virtual-machine",level:3},{value:"Verify and edit hardware module list",id:"verify-and-edit-hardware-module-list",level:3},{value:"Add TPM module to VM",id:"add-tpm-module-to-vm",level:3},{value:"Finish VM configuration",id:"finish-vm-configuration",level:3},{value:"Add TPM emulation to bare metal machine",id:"add-tpm-emulation-to-bare-metal-machine",level:2}];function m(e){const t={admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",p:"p",strong:"strong",...(0,i.a)(),...e.components},{CodeBlock:o}=t;return o||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("CodeBlock",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h1,{id:"trusted-platform-module-20-tpm",children:"Trusted Platform Module 2.0 (TPM)"}),"\n",(0,a.jsx)(t.p,{children:"Trusted Platform Module (TPM, also known as ISO/IEC 11889) is an international standard for a secure cryptoprocessor, a dedicated microcontroller designed to secure hardware through integrated cryptographic keys. The term can also refer to a chip conforming to the standard."}),"\n",(0,a.jsx)(t.h2,{id:"add-tpm-module-to-virtual-machine",children:"Add TPM module to virtual machine"}),"\n",(0,a.jsx)(t.p,{children:"Easy way to add TPM to virtual machine is to use Libvirt with Virt-manager"}),"\n",(0,a.jsx)(t.h3,{id:"create-virtual-machine",children:"Create Virtual Machine"}),"\n",(0,a.jsx)(t.p,{children:"After starting virt-manager create new virtual machine"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create new VM",src:n(6533).Z+"",width:"786",height:"831"})}),"\n",(0,a.jsx)(t.h3,{id:"verify-and-edit-hardware-module-list",children:"Verify and edit hardware module list"}),"\n",(0,a.jsxs)(t.p,{children:["On the hardware configuration screen, verify list of modules and click ",(0,a.jsx)(t.em,{children:(0,a.jsx)(t.strong,{children:"Add Hardware"})})," button"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Devices list",src:n(983).Z+"",width:"1019",height:"845"})}),"\n",(0,a.jsx)(t.h3,{id:"add-tpm-module-to-vm",children:"Add TPM module to VM"}),"\n",(0,a.jsx)(t.p,{children:"From the list of emulated devices choose TPM module and add it to VM"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Add TPM module",src:n(7656).Z+"",width:"1017",height:"842"})}),"\n",(0,a.jsx)(t.h3,{id:"finish-vm-configuration",children:"Finish VM configuration"}),"\n",(0,a.jsx)(t.p,{children:"On the last screen verify once again if TPM module was added properly"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Verify TPM",src:n(2752).Z+"",width:"1018",height:"845"})}),"\n",(0,a.jsx)(t.h2,{id:"add-tpm-emulation-to-bare-metal-machine",children:"Add TPM emulation to bare metal machine"}),"\n",(0,a.jsxs)(t.p,{children:["During applying ",(0,a.jsx)(t.code,{children:"#!yaml MachineRegistration"})," add following key to the yaml ",(0,a.jsx)(t.code,{children:"config:elemental:registration:emulate-tpm: true"})]}),"\n",(0,a.jsx)(t.admonition,{type:"info",children:(0,a.jsxs)(t.p,{children:["If you plan to deploy more than 1 machine with TPM emulation, make sure to set ",(0,a.jsx)(t.code,{children:"config:elemental:registration:emulated-tpm-seed: -1"}),"\nso the seed used for the TPM emulation is randomized per machine. Otherwise, you will get the same TPM Hash for all deployed machines and only the last\none to be registered will be valid."]})}),"\n",(0,a.jsx)(o,{language:"yaml",title:"registration-tpm.yaml",showLineNumbers:!0,children:r.Z})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(m,{...e})}):m(e)}},2957:(e,t,n)=>{n.d(t,{Z:()=>a});const a="apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n registration:\n emulate-tpm: true\n"},6533:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm1-7a68f095e057c5834efe61309decb43a.png"},983:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm2-480a00b132fddce83ba3e85ac5c5969a.png"},7656:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm3-0a66311610b78cb9ad5c1e0a9506f18f.png"},2752:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm4-142e726b37fba5f4f9abb93cc957fb4a.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>o});var a=n(7294);const i={},r=a.createContext(i);function o(e){const t=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),a.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/314a742e.cd01912c.js b/assets/js/314a742e.cd01912c.js new file mode 100644 index 000000000..8e5dfa19b --- /dev/null +++ b/assets/js/314a742e.cd01912c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[5278],{7930:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>d,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var a=n(5893),i=n(1151),r=n(2957);const o={sidebar_label:"Trusted Platform Module (TPM)",title:""},d="Trusted Platform Module 2.0 (TPM)",l={id:"tpm",title:"",description:"Trusted Platform Module (TPM, also known as ISO/IEC 11889) is an international standard for a secure cryptoprocessor, a dedicated microcontroller designed to secure hardware through integrated cryptographic keys. The term can also refer to a chip conforming to the standard.",source:"@site/docs/tpm.md",sourceDirName:".",slug:"/tpm",permalink:"/next/tpm",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Trusted Platform Module (TPM)",title:""}},s={},c=[{value:"Add TPM module to virtual machine",id:"add-tpm-module-to-virtual-machine",level:2},{value:"Create Virtual Machine",id:"create-virtual-machine",level:3},{value:"Verify and edit hardware module list",id:"verify-and-edit-hardware-module-list",level:3},{value:"Add TPM module to VM",id:"add-tpm-module-to-vm",level:3},{value:"Finish VM configuration",id:"finish-vm-configuration",level:3},{value:"Add TPM emulation to bare metal machine",id:"add-tpm-emulation-to-bare-metal-machine",level:2}];function m(e){const t={admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",p:"p",strong:"strong",...(0,i.a)(),...e.components},{CodeBlock:o,Head:d}=t;return o||u("CodeBlock",!0),d||u("Head",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(d,{children:(0,a.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/tpm"})}),"\n","\n","\n",(0,a.jsx)(t.h1,{id:"trusted-platform-module-20-tpm",children:"Trusted Platform Module 2.0 (TPM)"}),"\n",(0,a.jsx)(t.p,{children:"Trusted Platform Module (TPM, also known as ISO/IEC 11889) is an international standard for a secure cryptoprocessor, a dedicated microcontroller designed to secure hardware through integrated cryptographic keys. The term can also refer to a chip conforming to the standard."}),"\n",(0,a.jsx)(t.h2,{id:"add-tpm-module-to-virtual-machine",children:"Add TPM module to virtual machine"}),"\n",(0,a.jsx)(t.p,{children:"Easy way to add TPM to virtual machine is to use Libvirt with Virt-manager"}),"\n",(0,a.jsx)(t.h3,{id:"create-virtual-machine",children:"Create Virtual Machine"}),"\n",(0,a.jsx)(t.p,{children:"After starting virt-manager create new virtual machine"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create new VM",src:n(6533).Z+"",width:"786",height:"831"})}),"\n",(0,a.jsx)(t.h3,{id:"verify-and-edit-hardware-module-list",children:"Verify and edit hardware module list"}),"\n",(0,a.jsxs)(t.p,{children:["On the hardware configuration screen, verify list of modules and click ",(0,a.jsx)(t.em,{children:(0,a.jsx)(t.strong,{children:"Add Hardware"})})," button"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Devices list",src:n(983).Z+"",width:"1019",height:"845"})}),"\n",(0,a.jsx)(t.h3,{id:"add-tpm-module-to-vm",children:"Add TPM module to VM"}),"\n",(0,a.jsx)(t.p,{children:"From the list of emulated devices choose TPM module and add it to VM"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Add TPM module",src:n(7656).Z+"",width:"1017",height:"842"})}),"\n",(0,a.jsx)(t.h3,{id:"finish-vm-configuration",children:"Finish VM configuration"}),"\n",(0,a.jsx)(t.p,{children:"On the last screen verify once again if TPM module was added properly"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Verify TPM",src:n(2752).Z+"",width:"1018",height:"845"})}),"\n",(0,a.jsx)(t.h2,{id:"add-tpm-emulation-to-bare-metal-machine",children:"Add TPM emulation to bare metal machine"}),"\n",(0,a.jsxs)(t.p,{children:["During applying ",(0,a.jsx)(t.code,{children:"#!yaml MachineRegistration"})," add following key to the yaml ",(0,a.jsx)(t.code,{children:"config:elemental:registration:emulate-tpm: true"})]}),"\n",(0,a.jsx)(t.admonition,{type:"info",children:(0,a.jsxs)(t.p,{children:["If you plan to deploy more than 1 machine with TPM emulation, make sure to set ",(0,a.jsx)(t.code,{children:"config:elemental:registration:emulated-tpm-seed: -1"}),"\nso the seed used for the TPM emulation is randomized per machine. Otherwise, you will get the same TPM Hash for all deployed machines and only the last\none to be registered will be valid."]})}),"\n",(0,a.jsx)(o,{language:"yaml",title:"registration-tpm.yaml",showLineNumbers:!0,children:r.Z})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(m,{...e})}):m(e)}function u(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},2957:(e,t,n)=>{n.d(t,{Z:()=>a});const a="apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n registration:\n emulate-tpm: true\n"},6533:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm1-7a68f095e057c5834efe61309decb43a.png"},983:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm2-480a00b132fddce83ba3e85ac5c5969a.png"},7656:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm3-0a66311610b78cb9ad5c1e0a9506f18f.png"},2752:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm4-142e726b37fba5f4f9abb93cc957fb4a.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>o});var a=n(7294);const i={},r=a.createContext(i);function o(e){const t=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),a.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3238e5ae.812bec08.js b/assets/js/3238e5ae.812bec08.js new file mode 100644 index 000000000..54696c40d --- /dev/null +++ b/assets/js/3238e5ae.812bec08.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[1888],{1768:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>s,contentTitle:()=>r,default:()=>h,frontMatter:()=>c,metadata:()=>a,toc:()=>l});var i=o(5893),t=o(1151);const c={sidebar_label:"Configure Wi-Fi",title:""},r=void 0,a={id:"wifi",title:"",description:"How to configure Wi-Fi",source:"@site/versioned_docs/version-1.2/wifi.md",sourceDirName:".",slug:"/wifi",permalink:"/1.2/wifi",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Configure Wi-Fi",title:""},sidebar:"docs",previous:{title:"Restore",permalink:"/1.2/restore"},next:{title:"Elemental behind proxy",permalink:"/1.2/elemental_behind_proxy"}},s={},l=[{value:"How to configure Wi-Fi",id:"how-to-configure-wi-fi",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h3:"h3",p:"p",pre:"pre",...(0,t.a)(),...e.components},{Head:o}=n;return o||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o,{children:(0,i.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/wifi"})}),"\n",(0,i.jsx)(n.h3,{id:"how-to-configure-wi-fi",children:"How to configure Wi-Fi"}),"\n",(0,i.jsxs)(n.admonition,{title:"important note",type:"caution",children:[(0,i.jsx)(n.p,{children:"This guide describes how to configure Wi-Fi on a freshly installed operating system.\nFor some reasons, like no wired network connection availabe, you may want to also use Wi-Fi when you boot from the ISO."}),(0,i.jsxs)(n.p,{children:["This is possible by using a cloud-config definition in the ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/seedimage-reference/",children:"SeedImage"})," resource.\nYou can refer to the same instructions as below on how to create it."]})]}),"\n",(0,i.jsx)(n.admonition,{title:"info",type:"info",children:(0,i.jsxs)(n.p,{children:["The information on this page is just a specific use case of using cloud-config. For more generic info on how to create arbitrary files check our ",(0,i.jsx)(n.a,{href:"/1.2/cloud-config-reference",children:"cloud-config"})," page"]})}),"\n",(0,i.jsxs)(n.p,{children:["Elemental Teal currently uses ",(0,i.jsx)(n.a,{href:"https://networkmanager.dev/",children:"NetworkManager"})," to manage network connections."]}),"\n",(0,i.jsxs)(n.p,{children:["In order to add Wi-Fi to your node, your registration should include a configuration in the ",(0,i.jsx)(n.a,{href:"/1.2/cloud-config-reference",children:"cloud-config"})," section to write a\n",(0,i.jsx)(n.code,{children:".connection"})," file so NetworkManager can connect to the Wi-Fi."]}),"\n",(0,i.jsxs)(n.p,{children:["A ",(0,i.jsx)(n.code,{children:".connection"})," file is a connection configuration file for NetworkManager.\nThe connection files are stored under ",(0,i.jsx)(n.code,{children:"/etc/NetworkManager/system-connections/"})," and can include ethernet, Wi-Fi, VPN and more."]}),"\n",(0,i.jsxs)(n.p,{children:["For example for a network with the SSID ",(0,i.jsx)(n.code,{children:"testSSID"})," and the WPA-PSK key ",(0,i.jsx)(n.code,{children:"123456789"})," and using the interface ",(0,i.jsx)(n.code,{children:"wlan0"})," you would write the following ",(0,i.jsx)(n.code,{children:".connection"})," file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[connection]\nid=testConnection\ntype=wifi\ninterface-name=wlan0\npermissions=\ntimestamp=1671549641\n\n[wifi]\nmac-address-blacklist=\nmode=infrastructure\nssid=testSSID\n\n[wifi-security]\nkey-mgmt=wpa-psk\npsk=123456789\n\n[ipv4]\ndns-search=\nmethod=auto\n\n[ipv6]\naddr-gen-mode=stable-privacy\ndns-search=\nmethod=auto\n\n[proxy]\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["To see all the configurations available for NetworkManager check ",(0,i.jsx)(n.a,{href:"https://networkmanager.dev/docs/api/latest/nm-settings-nmcli.html",children:"nm-settings"}),"\nwhich includes the format of the connection file and all the different options you can use."]})}),"\n",(0,i.jsxs)(n.p,{children:["Which we should encode to base64 and paste in the content in our ",(0,i.jsx)(n.a,{href:"/1.2/machineregistration-reference",children:"registration"})," cloud-config section as such:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="wifi cloud config" showLineNumbers',children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineName: name\n config:\n cloud-config:\n write_files:\n - encoding: b64\n content: W2Nvbm5lY3Rpb25dCmlkPXRlc3RDb25uZWN0aW9uCnR5cGU9d2lmaQppbnRlcmZhY2UtbmFtZT13bGFuMApwZXJtaXNzaW9ucz0KdGltZXN0YW1wPTE2NzE1NDk2NDEKClt3aWZpXQptYWMtYWRkcmVzcy1ibGFja2xpc3Q9Cm1vZGU9aW5mcmFzdHJ1Y3R1cmUKc3NpZD10ZXN0Cgpbd2lmaS1zZWN1cml0eV0Ka2V5LW1nbXQ9bm9uZQp3ZXAta2V5LXR5cGU9MQp3ZXAta2V5MD0xMjM0NTY3ODkxCgpbaXB2NF0KZG5zLXNlYXJjaD0KbWV0aG9kPWF1dG8KCltpcHY2XQphZGRyLWdlbi1tb2RlPXN0YWJsZS1wcml2YWN5CmRucy1zZWFyY2g9Cm1ldGhvZD1hdXRvCgpbcHJveHldCg==\n path: /etc/NetworkManager/system-connections/wifi1.connection\n"})}),"\n",(0,i.jsxs)(n.p,{children:["This would get the ",(0,i.jsx)(n.code,{children:"/etc/NetworkManager/system-connections/wifi1.connection"})," file deployed on the node during installation with the connection content and NetworkManager would\nread and enable the connection on boot."]})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,n,o)=>{o.d(n,{Z:()=>a,a:()=>r});var i=o(7294);const t={},c=i.createContext(t);function r(e){const n=i.useContext(c);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),i.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3238e5ae.9c6f1068.js b/assets/js/3238e5ae.9c6f1068.js deleted file mode 100644 index 7f7b507cd..000000000 --- a/assets/js/3238e5ae.9c6f1068.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[1888],{1768:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>s,contentTitle:()=>r,default:()=>h,frontMatter:()=>c,metadata:()=>a,toc:()=>l});var t=i(5893),o=i(1151);const c={sidebar_label:"Configure Wi-Fi",title:""},r=void 0,a={id:"wifi",title:"",description:"How to configure Wi-Fi",source:"@site/versioned_docs/version-1.2/wifi.md",sourceDirName:".",slug:"/wifi",permalink:"/1.2/wifi",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Configure Wi-Fi",title:""},sidebar:"docs",previous:{title:"Restore",permalink:"/1.2/restore"},next:{title:"Elemental behind proxy",permalink:"/1.2/elemental_behind_proxy"}},s={},l=[{value:"How to configure Wi-Fi",id:"how-to-configure-wi-fi",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h3:"h3",p:"p",pre:"pre",...(0,o.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h3,{id:"how-to-configure-wi-fi",children:"How to configure Wi-Fi"}),"\n",(0,t.jsxs)(n.admonition,{title:"important note",type:"caution",children:[(0,t.jsx)(n.p,{children:"This guide describes how to configure Wi-Fi on a freshly installed operating system.\nFor some reasons, like no wired network connection availabe, you may want to also use Wi-Fi when you boot from the ISO."}),(0,t.jsxs)(n.p,{children:["This is possible by using a cloud-config definition in the ",(0,t.jsx)(n.a,{href:"https://elemental.docs.rancher.com/seedimage-reference/",children:"SeedImage"})," resource.\nYou can refer to the same instructions as below on how to create it."]})]}),"\n",(0,t.jsx)(n.admonition,{title:"info",type:"info",children:(0,t.jsxs)(n.p,{children:["The information on this page is just a specific use case of using cloud-config. For more generic info on how to create arbitrary files check our ",(0,t.jsx)(n.a,{href:"/1.2/cloud-config-reference",children:"cloud-config"})," page"]})}),"\n",(0,t.jsxs)(n.p,{children:["Elemental Teal currently uses ",(0,t.jsx)(n.a,{href:"https://networkmanager.dev/",children:"NetworkManager"})," to manage network connections."]}),"\n",(0,t.jsxs)(n.p,{children:["In order to add Wi-Fi to your node, your registration should include a configuration in the ",(0,t.jsx)(n.a,{href:"/1.2/cloud-config-reference",children:"cloud-config"})," section to write a\n",(0,t.jsx)(n.code,{children:".connection"})," file so NetworkManager can connect to the Wi-Fi."]}),"\n",(0,t.jsxs)(n.p,{children:["A ",(0,t.jsx)(n.code,{children:".connection"})," file is a connection configuration file for NetworkManager.\nThe connection files are stored under ",(0,t.jsx)(n.code,{children:"/etc/NetworkManager/system-connections/"})," and can include ethernet, Wi-Fi, VPN and more."]}),"\n",(0,t.jsxs)(n.p,{children:["For example for a network with the SSID ",(0,t.jsx)(n.code,{children:"testSSID"})," and the WPA-PSK key ",(0,t.jsx)(n.code,{children:"123456789"})," and using the interface ",(0,t.jsx)(n.code,{children:"wlan0"})," you would write the following ",(0,t.jsx)(n.code,{children:".connection"})," file:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[connection]\nid=testConnection\ntype=wifi\ninterface-name=wlan0\npermissions=\ntimestamp=1671549641\n\n[wifi]\nmac-address-blacklist=\nmode=infrastructure\nssid=testSSID\n\n[wifi-security]\nkey-mgmt=wpa-psk\npsk=123456789\n\n[ipv4]\ndns-search=\nmethod=auto\n\n[ipv6]\naddr-gen-mode=stable-privacy\ndns-search=\nmethod=auto\n\n[proxy]\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["To see all the configurations available for NetworkManager check ",(0,t.jsx)(n.a,{href:"https://networkmanager.dev/docs/api/latest/nm-settings-nmcli.html",children:"nm-settings"}),"\nwhich includes the format of the connection file and all the different options you can use."]})}),"\n",(0,t.jsxs)(n.p,{children:["Which we should encode to base64 and paste in the content in our ",(0,t.jsx)(n.a,{href:"/1.2/machineregistration-reference",children:"registration"})," cloud-config section as such:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="wifi cloud config" showLineNumbers',children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineName: name\n config:\n cloud-config:\n write_files:\n - encoding: b64\n content: W2Nvbm5lY3Rpb25dCmlkPXRlc3RDb25uZWN0aW9uCnR5cGU9d2lmaQppbnRlcmZhY2UtbmFtZT13bGFuMApwZXJtaXNzaW9ucz0KdGltZXN0YW1wPTE2NzE1NDk2NDEKClt3aWZpXQptYWMtYWRkcmVzcy1ibGFja2xpc3Q9Cm1vZGU9aW5mcmFzdHJ1Y3R1cmUKc3NpZD10ZXN0Cgpbd2lmaS1zZWN1cml0eV0Ka2V5LW1nbXQ9bm9uZQp3ZXAta2V5LXR5cGU9MQp3ZXAta2V5MD0xMjM0NTY3ODkxCgpbaXB2NF0KZG5zLXNlYXJjaD0KbWV0aG9kPWF1dG8KCltpcHY2XQphZGRyLWdlbi1tb2RlPXN0YWJsZS1wcml2YWN5CmRucy1zZWFyY2g9Cm1ldGhvZD1hdXRvCgpbcHJveHldCg==\n path: /etc/NetworkManager/system-connections/wifi1.connection\n"})}),"\n",(0,t.jsxs)(n.p,{children:["This would get the ",(0,t.jsx)(n.code,{children:"/etc/NetworkManager/system-connections/wifi1.connection"})," file deployed on the node during installation with the connection content and NetworkManager would\nread and enable the connection on boot."]})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>a,a:()=>r});var t=i(7294);const o={},c=t.createContext(o);function r(e){const n=t.useContext(c);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),t.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/33b676a1.107946a2.js b/assets/js/33b676a1.107946a2.js deleted file mode 100644 index f75cafbf7..000000000 --- a/assets/js/33b676a1.107946a2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[2256],{2905:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>j,contentTitle:()=>x,default:()=>v,frontMatter:()=>g,metadata:()=>f,toc:()=>b});var r=t(5893),i=t(1151),a=t(9548),s=t(4713),l=t(8260),o=t(3367);function c(e){const n={a:"a",code:"code",h2:"h2",li:"li",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["A Rancher server (v2.7.0 or later) configured (server-url set)","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["To configure the Rancher ",(0,r.jsx)(n.code,{children:"server-url"})," please check the ",(0,r.jsx)(n.a,{href:"https://rancher.com/docs/rancher/v2.6/en/admin-settings/#first-log-in",children:"Rancher docs"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["A machine (bare metal or virtualized) with TPM 2.0","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Hint 1: Libvirt allows setting virtual TPMs for virtual machines ",(0,r.jsx)(n.a,{href:"tpm/#add-tpm-module-to-virtual-machine",children:"example here"})]}),"\n",(0,r.jsxs)(n.li,{children:["Hint 2: You can enable TPM emulation on bare metal machines missing the TPM 2.0 module ",(0,r.jsx)(n.a,{href:"tpm/#add-tpm-emulation-to-bare-metal-machine",children:"example here"})]}),"\n",(0,r.jsx)(n.li,{children:"Hint 3: Make sure you're using UEFI (not BIOS) on x86-64, or the ISO won't boot"}),"\n",(0,r.jsxs)(n.li,{children:["Hint 4: A minimum volume size of 25 GB is recommended. See the ",(0,r.jsx)(n.a,{href:"/next/installation#deployed-elemental-teal-partition-table",children:"Elemental Teal partition table"})," for more details"]}),"\n",(0,r.jsxs)(n.li,{children:["Hint 5: CPU and RAM requirements depend on the Kubernetes version installed, for example ",(0,r.jsx)(n.a,{href:"https://docs.k3s.io/installation/requirements#hardware",children:"K3s"})," or ",(0,r.jsx)(n.a,{href:"https://docs.rke2.io/install/requirements#hardware",children:"RKE2"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Helm Package Manager (",(0,r.jsx)(n.a,{href:"https://helm.sh/",children:"https://helm.sh/"}),")"]}),"\n",(0,r.jsxs)(n.li,{children:["For ARM (aarch64) - One SD-card (32 GB or more, must be ",(0,r.jsx)(n.strong,{children:"fast"})," - 40MB/s write speed is acceptable) and a USB-stick for installation"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components},{TabItem:t,Tabs:a}=n;return t||u("TabItem",!0),a||u("Tabs",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"install-elemental-operator",children:"Install Elemental Operator"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"elemental-operator"})," is the management endpoint, running the management\ncluster and taking care of creating inventories, registrations for machines and much more."]}),"\n",(0,r.jsx)(n.p,{children:"We will use the Helm package manager to install the elemental-operator chart into our cluster."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Now after a few seconds you should see the operator pod appear on the ",(0,r.jsx)(n.code,{children:"cattle-elemental-system"})," namespace:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl get pods -n cattle-elemental-system\nNAME READY STATUS RESTARTS AGE\nelemental-operator-64f88fc695-b8qhn 1/1 Running 0 16s\n"})}),"\n",(0,r.jsx)(n.admonition,{title:"Helm v3.8.0+ required",type:"info",children:(0,r.jsx)(n.p,{children:"The Elemental Operator chart is distributed via an OCI registry: Helm correctly supports OCI based registries starting from the v3.8.0 release."})}),"\n",(0,r.jsx)(n.admonition,{title:"Swap charts installation order when upgrading from elemental-operator release < 1.2.4",type:"warning",children:(0,r.jsx)(n.p,{children:"When upgrading from an elemental-operator release embedding the Elemental CRDs (version < 1.2.4) the elemental-operator-crds chart installation will fail.\nYou will need to upgrade the elemental-operator chart first, and only then install the elemental-operator-crds chart."})}),"\n",(0,r.jsx)(n.h3,{id:"non-stable-installations",children:"Non-stable installations"}),"\n",(0,r.jsxs)(n.p,{children:["Besides the Helm charts listed above, there are two other ",(0,r.jsx)(n.code,{children:"non-stable"}),"\nversions available."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Staging:"})," refers to the latest tagged release from Github. This is documented in the ",(0,r.jsx)(n.a,{href:"next/quickstart-ui",children:"Next"})," pages."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Development:"})," refers to the 'tip of HEAD' from Github. This is the ongoing development version and changes constantly."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(a,{children:[(0,r.jsx)(t,{value:"stagingOperator",label:"Staging version (x86-64, ARM64 (Raspberry Pi 4))",default:!0,children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.opensuse.org/isv/rancher/elemental/staging/charts/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.opensuse.org/isv/rancher/elemental/staging/charts/rancher/elemental-operator-chart\n"})})}),(0,r.jsxs)(t,{value:"develOperator",label:"Development version (x86-64, ARM64 (Raspberry Pi 4))",default:!0,children:[(0,r.jsx)(n.admonition,{title:"Reminder",type:"warning",children:(0,r.jsx)(n.p,{children:"The development version is not recommended for production environments. We welcome feedback via Slack or Github issues, but it could be unstable and contain experimental features that can be dropped without notice."})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.opensuse.org/isv/rancher/elemental/dev/charts/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install --set image.imagePullPolicy=Always elemental-operator oci://registry.opensuse.org/isv/rancher/elemental/dev/charts/rancher/elemental-operator-chart\n"})})]})]}),"\n",(0,r.jsx)(n.h3,{id:"installation-options",children:"Installation options"}),"\n",(0,r.jsxs)(n.p,{children:["There are a few options that can be set in the chart install but that is out of scope for this document. You can see all the values on the chart ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/elemental-operator/blob/main/charts/operator/values.yaml",children:"values.yaml"}),"."]})]})}function m(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}function u(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}var p=t(5974);const g={sidebar_label:"Elemental the command line way",title:""},x="Elemental the command line way",f={id:"quickstart-cli",title:"",description:"Follow this guide to have an auto-deployed cluster via rke2/k3s and managed by Rancher",source:"@site/docs/quickstart-cli.md",sourceDirName:".",slug:"/quickstart-cli",permalink:"/next/quickstart-cli",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Elemental the command line way",title:""},sidebar:"docs",previous:{title:"Elemental the visual way",permalink:"/next/quickstart-ui"},next:{title:"Architecture",permalink:"/next/architecture"}},j={},b=[{value:"Prepare your kubernetes resources",id:"prepare-your-kubernetes-resources",level:2},{value:"Preparing the installation (seed) image",id:"preparing-the-installation-seed-image",level:2},{value:"Retrieving the prebuilt seed image",id:"retrieving-the-prebuilt-seed-image",level:4},{value:"Verifying the download",id:"verifying-the-download",level:5},{value:"Injecting the registration information",id:"injecting-the-registration-information",level:4},{value:"Writing the seed image to a USB stick",id:"writing-the-seed-image-to-a-usb-stick",level:4},{value:"Booting the Raspberry Pi",id:"booting-the-raspberry-pi",level:4},{value:"Selecting the right machines to join a cluster",id:"selecting-the-right-machines-to-join-a-cluster",level:3},{value:"How can I choose the kubernetes version and deployer for the cluster?",id:"how-can-i-choose-the-kubernetes-version-and-deployer-for-the-cluster",level:2},{value:"How can I follow what is going on behind the scenes?",id:"how-can-i-follow-what-is-going-on-behind-the-scenes",level:2}];function y(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components},{CodeBlock:t,TabItem:c,Tabs:d}=n;return t||w("CodeBlock",!0),c||w("TabItem",!0),d||w("Tabs",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"elemental-the-command-line-way",children:"Elemental the command line way"}),"\n",(0,r.jsx)(n.p,{children:"Follow this guide to have an auto-deployed cluster via rke2/k3s and managed by Rancher\nwith the only help of an Elemental Teal ISO."}),"\n",(0,r.jsx)(h,{}),"\n",(0,r.jsx)(m,{}),"\n",(0,r.jsx)(n.h2,{id:"prepare-your-kubernetes-resources",children:"Prepare your kubernetes resources"}),"\n",(0,r.jsxs)(n.p,{children:["Node deployment starts with a ",(0,r.jsx)(n.code,{children:"MachineRegistration"}),", identifying a set of machines sharing the same configuration (disk drives, network, etc.)."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," is needed to perform the deployment of the Elemental OS on the target hosts. When booting up, each host registers to the Elemental Operator which tracks the new host with a ",(0,r.jsx)(n.code,{children:"MachineInventory"})," resource."]}),"\n",(0,r.jsxs)(n.p,{children:["Then it continues with having a Cluster resource that uses a ",(0,r.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," to know which machines are for that cluster."]}),"\n",(0,r.jsxs)(n.p,{children:["This selector is a simple matcher based on labels set in the ",(0,r.jsx)(n.code,{children:"MachineInventory"}),", so if your selector is matching on the label ",(0,r.jsx)(n.code,{children:"cluster-id"})," with a value ",(0,r.jsx)(n.code,{children:"cluster-id-val"}),"\nand your ",(0,r.jsx)(n.code,{children:"MachineInventory"})," has that same ",(0,r.jsx)(n.code,{children:"cluster-id"}),":",(0,r.jsx)(n.code,{children:"cluster-id-val"})," label, it will match and be bootstrapped as part of the cluster."]}),"\n",(0,r.jsxs)(n.p,{children:["In this quickstart we are going to deploy the resources to provision a cluster named ",(0,r.jsx)(n.em,{children:"volcano"})," that will match on ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s with the label ",(0,r.jsx)(n.em,{children:"element"}),":",(0,r.jsx)(n.em,{children:"fire"}),"."]}),"\n",(0,r.jsxs)(d,{children:[(0,r.jsxs)(c,{value:"manualYaml",label:"Manually creating the resource yamls",default:!0,children:[(0,r.jsx)(n.p,{children:"You will need to create the following files:"}),(0,r.jsx)(t,{language:"yaml",title:"selector.yaml",showLineNumbers:!0,children:o.Z}),(0,r.jsxs)(n.p,{children:["As you can see this is a very simple selector that looks for ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s having a label with the key ",(0,r.jsx)(n.code,{children:"element"})," and the value ",(0,r.jsx)(n.code,{children:"fire"}),"."]}),(0,r.jsx)(t,{language:"yaml",title:"cluster.yaml",showLineNumbers:!0,children:a.Z}),(0,r.jsxs)(n.p,{children:["As you can see the ",(0,r.jsx)(n.code,{children:"machineConfigRef"})," is of kind ",(0,r.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," with the name ",(0,r.jsx)(n.code,{children:"fire-machine-selector"}),": it matches the selector we created."]}),(0,r.jsxs)(n.p,{children:["You can get more information about cluster options like ",(0,r.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/reference-guides/cluster-configuration/rancher-server-configuration/rke2-cluster-configuration#machineglobalconfig",children:(0,r.jsx)(n.code,{children:"machineGlobalConfig"})})," or ",(0,r.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/reference-guides/cluster-configuration/rancher-server-configuration/rke2-cluster-configuration#machineselectorconfig",children:(0,r.jsx)(n.code,{children:"machineSelectorConfig"})})," directly in the ",(0,r.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com",children:"Rancher Manager documentation"}),"."]}),(0,r.jsxs)(d,{children:[(0,r.jsx)(c,{value:"normalRegistration",label:"Registration",default:!0,children:(0,r.jsx)(t,{language:"yaml",title:"registration.yaml",showLineNumbers:!0,children:s.Z})}),(0,r.jsxs)(c,{value:"rpiRegistration",label:"Registration for Raspberry Pi",default:!0,children:[(0,r.jsx)(t,{language:"yaml",title:"rpi-registration.yaml",showLineNumbers:!0,children:l.Z}),(0,r.jsxs)(n.p,{children:["For deployment on Raspberry Pi, you need to enable emulated TPM\n(except you have ",(0,r.jsx)(n.a,{href:"https://thepihut.com/products/letstrust-tpm-for-raspberry-pi",children:"a hardware TPM for Raspberry Pi"}),").\nYou also need to disable writing to the EFI store (since Raspberry Pi doesn't have one) via ",(0,r.jsx)(n.code,{children:"disable-boot-entry: true"}),"."]})]})]}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," defines the registration and installation configuration. Once created, the Elemental operator exposes a unique URL to be used with the ",(0,r.jsx)(n.code,{children:"elemental-register"})," binary to reach out to the management cluster and register the machine during installation: if the registration is successful, the operator creates a ",(0,r.jsx)(n.code,{children:"MachineInventory"})," tracking the machine, which can be used to provision the machine as a node of our cluster.\nWe define the label matching our selector here, although it can also be added later to the created ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s."]}),(0,r.jsxs)(n.admonition,{title:"warning",type:"warning",children:[(0,r.jsx)(n.p,{children:"Make sure to modify the registration.yaml above to set the proper install device to point to a valid device based on your node configuration (i.e. /dev/sda, /dev/vda, /dev/nvme0, etc...)."}),(0,r.jsxs)(n.p,{children:["The SD-card on a Raspberry Pi is usually ",(0,r.jsx)(n.code,{children:"/dev/mmcblk0"}),"."]})]}),(0,r.jsxs)(d,{children:[(0,r.jsxs)(c,{value:"seedImagex86",label:"Seed Image (x86_64)",default:!0,children:[(0,r.jsx)(t,{language:"yaml",title:"seedimage.yaml",showLineNumbers:!0,children:p.Z}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"SeedImage"})," is required to generate the ",(0,r.jsx)(n.em,{children:"seed image"})," (like a bootable ISO) that will boot and start the Elemental provisioning on the target machines."]}),(0,r.jsx)(n.p,{children:"Now that we have defined all the configuration files let's apply them to create the proper resources in Kubernetes:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f selector.yaml \nkubectl apply -f cluster.yaml \nkubectl apply -f registration.yaml\nkubectl apply -f seedimage.yaml\n"})})]}),(0,r.jsxs)(c,{value:"seedImagerpi",label:"Seed Image for Raspberry Pi",default:!0,children:[(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource, which automates the creation of an Elemental bootable image (the ",(0,r.jsx)(n.em,{children:"seed image"}),"), does not support Raspberry Pi yet.\nWe will generate a ",(0,r.jsx)(n.em,{children:"seed image"})," manually in the ",(0,r.jsx)(n.a,{href:"/next/quickstart-cli#preparing-the-installation-seed-image",children:"next section"}),"."]}),(0,r.jsx)(n.p,{children:"Now that we have defined all the configuration files let's apply them to create the proper resources in Kubernetes:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f selector.yaml \nkubectl apply -f cluster.yaml \nkubectl apply -f registration.yaml\n"})})]})]})]}),(0,r.jsxs)(c,{value:"repofiles",label:"Using quickstart files from Elemental docs repo directly",children:[(0,r.jsxs)(n.p,{children:["You can directly apply the quickstart example resource files from the ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/elemental-docs",children:"Elemental docs repository"}),"."]}),(0,r.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,r.jsxs)(n.p,{children:["The quickstart example resource files assume the default storage of the target host to be mapped to the ",(0,r.jsx)(n.code,{children:"/dev/sda"}),".\nIf your host storage device file is different, you have to change the registration.yaml file before applying it, changing the ",(0,r.jsx)(n.code,{children:"config.elemental.install.device"})," accordingly."]})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"kubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/selector.yaml\nkubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/cluster.yaml\nkubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/registration.yaml\nkubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/seedimage.yaml (not for aarch64 yet)\n"})})]})]}),"\n",(0,r.jsx)(n.h2,{id:"preparing-the-installation-seed-image",children:"Preparing the installation (seed) image"}),"\n",(0,r.jsx)(n.p,{children:"This is the last step: you need an Elemental Teal seed image that includes the initial registration config, so it can be auto registered, installed and fully deployed as part of your cluster."}),"\n",(0,r.jsxs)(n.admonition,{title:"note",type:"note",children:[(0,r.jsxs)(n.p,{children:["The initial registration config file is generated when you create a ",(0,r.jsx)(n.code,{children:"Machine Registration"}),"."]}),(0,r.jsx)(n.p,{children:"You can download it with:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:'wget --no-check-certificate `kubectl get machineregistration -n fleet-default fire-nodes -o jsonpath="{.status.registrationURL}"` -O initial-registration.yaml\n'})})]}),"\n",(0,r.jsx)(n.p,{children:"The contents of the registration config file are nothing more than the registration URL that the node needs to register, the proper server certificate and few options for the registration process."}),"\n",(0,r.jsx)(n.p,{children:"Once generated, a seed image can be used to provision any number of machines."}),"\n",(0,r.jsxs)(d,{children:[(0,r.jsxs)(c,{value:"download",label:"Downloading the quickstart ISO",children:[(0,r.jsxs)(n.p,{children:["The seed image created by the ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource above can be downloaded as an ISO via the following script:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:'kubectl wait --for=condition=ready pod -n fleet-default fire-img\nwget --no-check-certificate `kubectl get seedimage -n fleet-default fire-img -o jsonpath="{.status.downloadURL}"` -O elemental-teal.x86_64.iso\n'})}),(0,r.jsxs)(n.p,{children:["The first command waits for the ISO to be built and ready, the second one downloads it in the current directory with the name ",(0,r.jsx)(n.code,{children:"elemental-teal-x86_64.iso"}),"."]})]}),(0,r.jsxs)(c,{value:"manual_iso",label:"Preparing the seed image (x86_64) manually",children:[(0,r.jsxs)(n.p,{children:["If you created a ",(0,r.jsx)(n.a,{href:"customizing#create-a-custom-bootable-installation-media",children:"customized ISO"}),",\nyou can use the ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/elemental/blob/main/.github/elemental-iso-add-registration",children:(0,r.jsx)(n.code,{children:"elemental-iso-add-registration"})}),"\nscript to add the registration config file"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"elemental-iso-add-registration initial-registration.yaml my-customized.iso\n"})})]}),(0,r.jsxs)(c,{value:"manual_raw",label:"Preparing the seed image (aarch64) manually",children:[(0,r.jsx)(n.p,{children:"Elemental's support for Raspberry Pi is primarily for demonstration purposes at this point. Therefore the installation process is modelled similar to x86-64. You boot from a seed image (an USB stick in this case) and install to a storage medium (SD-card for Raspberry Pi)."}),(0,r.jsx)(n.h4,{id:"retrieving-the-prebuilt-seed-image",children:"Retrieving the prebuilt seed image"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable/containers/rpi.raw\n"})}),(0,r.jsx)(n.h5,{id:"verifying-the-download",children:"Verifying the download"}),(0,r.jsx)(n.p,{children:"In order to verify the integrity of the downloaded artifacts, you\nshould do a checksum verification:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable/containers/rpi.raw.sha256\nsha256sum -c rpi.raw.sha256\n"})}),(0,r.jsxs)(n.p,{children:["This should print ",(0,r.jsx)(n.code,{children:"rpi.raw: OK"})," as output."]}),(0,r.jsx)(n.h4,{id:"injecting-the-registration-information",children:"Injecting the registration information"}),(0,r.jsxs)(n.p,{children:["Adding the ",(0,r.jsx)(n.code,{children:"initial-registration.yaml"})," isn't scripted yet. This is still a manual process:"]}),(0,r.jsxs)(n.p,{children:["The written USB stick will have two partitions. ",(0,r.jsx)(n.code,{children:"RPI_BOOT"})," contains the boot loader files and ",(0,r.jsx)(n.code,{children:"COS_LIVE"})," the Elemental files.\nMount the ",(0,r.jsx)(n.code,{children:"COS_LIVE"})," partition and write ",(0,r.jsx)(n.code,{children:"initial-registration.yaml"})," as ",(0,r.jsx)(n.code,{children:"livecd-cloud-config.yaml"})," to this partition."]}),(0,r.jsx)(n.p,{children:"If you've mounted the USB stick with a file manager, this command should work to copy the registration information:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"sudo cp initial-registration.yaml /run/media/$USER/COS_LIVE/livecd-cloud-config.yaml\n"})}),(0,r.jsx)(n.p,{children:"If you prefer using some CLI tools:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"IMAGE=rpi.raw\nDEST=$(mktemp -d)\n\nSECTORSIZE=$(sfdisk -J ${IMAGE} | jq '.partitiontable.sectorsize')\nDATAPARTITIONSTART=$(sfdisk -J ${IMAGE} | jq '.partitiontable.partitions[1].start')\nsudo mount -o rw,loop,offset=$((${SECTORSIZE}*${DATAPARTITIONSTART})) ${IMAGE} ${DEST}\nsudo cp initial-registration.yaml ${DEST}/livecd-cloud-config.yaml\nsudo umount ${DEST}\nrmdir ${DEST}\n"})}),(0,r.jsx)(n.h4,{id:"writing-the-seed-image-to-a-usb-stick",children:"Writing the seed image to a USB stick"}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:".raw"})," image needs to be written to a USB stick to boot from. This can be done with ",(0,r.jsx)(n.code,{children:"dd"})," on the Linux command line if you're comfortable with this command.\n",(0,r.jsx)(n.a,{href:"https://www.opensuse.org",children:"openSUSE"})," has nice instructions on how to write an image to a storage medium for ",(0,r.jsx)(n.a,{href:"https://en.opensuse.org/SDB:Live_USB_stick",children:"Linux"}),",\n",(0,r.jsx)(n.a,{href:"https://en.opensuse.org/SDB:Create_a_Live_USB_stick_using_Windows",children:"Windows"}),", and ",(0,r.jsx)(n.a,{href:"https://en.opensuse.org/SDB:Create_a_Live_USB_stick_using_macOS",children:"OS X"}),"."]}),(0,r.jsx)(n.h4,{id:"booting-the-raspberry-pi",children:"Booting the Raspberry Pi"}),(0,r.jsx)(n.p,{children:"Now unmount the USB stick and plug it into your Raspberry Pi."}),(0,r.jsxs)(n.p,{children:["Plug a large (32 GB or more) and ",(0,r.jsx)(n.strong,{children:"fast"})," (!!) micro SD-card into the respective slot."]}),(0,r.jsx)(n.p,{children:"Connect the system to ethernet."}),(0,r.jsx)(n.p,{children:"A powercycle will reboot the Pi. Everything else is identical to x86-64."}),(0,r.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,r.jsx)(n.p,{children:"Make sure the micro SD-card is unpartitioned. Otherwise the Pi bootloader will try to boot from it and fail."})})]})]}),"\n",(0,r.jsx)(n.p,{children:"You can now boot your nodes with this image and they will:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Register with the registrationURL given and create a per-machine ",(0,r.jsx)(n.code,{children:"MachineInventory"})]}),"\n",(0,r.jsx)(n.li,{children:"Install Elemental Teal to the given device"}),"\n",(0,r.jsx)(n.li,{children:"Reboot"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"selecting-the-right-machines-to-join-a-cluster",children:"Selecting the right machines to join a cluster"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," selects the machines needed to provision the cluster from the ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s having the ",(0,r.jsxs)(n.em,{children:["element",":fire"]})," label.\nWe have added the ",(0,r.jsx)(n.em,{children:"element"}),":",(0,r.jsx)(n.em,{children:"fire"})," label in the ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," ",(0,r.jsx)(n.code,{children:"machineInventoryLabels"})," map, so all the ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s originated from it already have the label.\nOne could anyway skip the label from the ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," and add it later:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:'kubectl -n fleet-default label machineinventory $(kubectl get machineinventory -n fleet-default --no-headers -o custom-columns=":metadata.name") element=fire\n'})}),"\n",(0,r.jsxs)(n.p,{children:["As soon as ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s with the ",(0,r.jsx)(n.em,{children:"element"}),":",(0,r.jsx)(n.em,{children:"fire"})," are present, the corresponding machines auto-deploy the cluster via the chosen provider (k3s/rke)."]}),"\n",(0,r.jsx)(n.p,{children:"After a few minutes your new cluster will be fully provisioned!!"}),"\n",(0,r.jsx)(n.h2,{id:"how-can-i-choose-the-kubernetes-version-and-deployer-for-the-cluster",children:"How can I choose the kubernetes version and deployer for the cluster?"}),"\n",(0,r.jsxs)(n.p,{children:["In your cluster.yaml file there is a key in the ",(0,r.jsx)(n.code,{children:"Spec"})," called ",(0,r.jsx)(n.code,{children:"kubernetesVersion"}),". That sets the version and deployer that will be used for the cluster,\nfor example Kubernetes",(0,r.jsx)(n.code,{children:"v1.24.8"})," for rke2 would be ",(0,r.jsx)(n.code,{children:"v1.24.8+rke2r1"})," and for k3s ",(0,r.jsx)(n.code,{children:"v1.24.8+k3s1"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["To see all compatible versions check the ",(0,r.jsx)(n.a,{href:"https://www.suse.com/suse-rancher/support-matrix/all-supported-versions/",children:"Rancher Support Matrix"})," PDF for rke/rke2/k3s versions and their components."]}),"\n",(0,r.jsxs)(n.p,{children:["You can also check our ",(0,r.jsx)(n.a,{href:"/next/kubernetesversions",children:"Version doc"})," to know how to obtain those versions."]}),"\n",(0,r.jsxs)(n.p,{children:["Check our ",(0,r.jsx)(n.a,{href:"/next/cluster-reference",children:"Cluster Spec"})," page for more info about the ",(0,r.jsx)(n.code,{children:"Cluster"})," resource."]}),"\n",(0,r.jsx)(n.h2,{id:"how-can-i-follow-what-is-going-on-behind-the-scenes",children:"How can I follow what is going on behind the scenes?"}),"\n",(0,r.jsx)(n.p,{children:"You should be able to follow along what the machine is doing via:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["During ISO boot:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["ssh into the machine (user/pass: root/ros):","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -t elemental"})," shows you the progress of the registration (",(0,r.jsx)(n.em,{children:"elemental-register"}),") and the installation of Elemental (",(0,r.jsx)(n.em,{children:"elemental install"}),")."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Once the system is installed:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["On the Rancher UI -> ",(0,r.jsx)(n.code,{children:"Cluster Management"})," allows you to see your new cluster and the ",(0,r.jsx)(n.code,{children:"Provisioning Log"})," in the cluster details"]}),"\n",(0,r.jsxs)(n.li,{children:["ssh into the machine (user/pass: Whatever your configured on the registration.yaml under ",(0,r.jsx)(n.code,{children:"Spec.config.cloud-config.users"}),"):","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -u elemental-system-agent"})," shows the output of the initial elemental config and the installation of the ",(0,r.jsx)(n.code,{children:"rancher-system-agent"})]}),"\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -u rancher-system-agent"})," shows the output of the boostrap of cluster components like k3s"]}),"\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -u k3s"})," shows the logs of the k3s deployment"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]})]})}function v(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(y,{...e})}):y(e)}function w(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},9548:(e,n,t)=>{t.d(n,{Z:()=>r});const r="kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: volcano\n namespace: fleet-default\nspec:\n rkeConfig:\n machineGlobalConfig:\n etcd-expose-metrics: false\n profile: null\n machinePools:\n - controlPlaneRole: true\n etcdRole: true\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: fire-machine-selector\n name: fire-pool\n quantity: 1\n unhealthyNodeTimeout: 0s\n workerRole: true\n machineSelectorConfig:\n - config:\n protect-kernel-defaults: false\n registries: {}\n kubernetesVersion: v1.24.8+k3s1\n"},4713:(e,n,t)=>{t.d(n,{Z:()=>r});const r='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'},8260:(e,n,t)=>{t.d(n,{Z:()=>r});const r='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/mmcblk0\n debug: true\n disable-boot-entry: true\n registration:\n emulate-tpm: true\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'},5974:(e,n,t)=>{t.d(n,{Z:()=>r});const r="apiVersion: elemental.cattle.io/v1beta1\nkind: SeedImage\nmetadata:\n name: fire-img\n namespace: fleet-default\nspec:\n baseImage: registry.suse.com/rancher/elemental-teal-iso/5.4:1.2.2\n registrationRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineRegistration\n name: fire-nodes\n namespace: fleet-default\n"},3367:(e,n,t)=>{t.d(n,{Z:()=>r});const r="apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: fire-machine-selector\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n matchExpressions:\n - key: element\n operator: In\n values: [ 'fire' ]\n"},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>s});var r=t(7294);const i={},a=r.createContext(i);function s(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/33b676a1.e72c30e3.js b/assets/js/33b676a1.e72c30e3.js new file mode 100644 index 000000000..898e08881 --- /dev/null +++ b/assets/js/33b676a1.e72c30e3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[2256],{2905:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>j,contentTitle:()=>x,default:()=>v,frontMatter:()=>g,metadata:()=>f,toc:()=>b});var r=t(5893),i=t(1151),a=t(9548),s=t(4713),l=t(8260),o=t(3367);function c(e){const n={a:"a",code:"code",h2:"h2",li:"li",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["A Rancher server (v2.7.0 or later) configured (server-url set)","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["To configure the Rancher ",(0,r.jsx)(n.code,{children:"server-url"})," please check the ",(0,r.jsx)(n.a,{href:"https://rancher.com/docs/rancher/v2.6/en/admin-settings/#first-log-in",children:"Rancher docs"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["A machine (bare metal or virtualized) with TPM 2.0","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Hint 1: Libvirt allows setting virtual TPMs for virtual machines ",(0,r.jsx)(n.a,{href:"tpm/#add-tpm-module-to-virtual-machine",children:"example here"})]}),"\n",(0,r.jsxs)(n.li,{children:["Hint 2: You can enable TPM emulation on bare metal machines missing the TPM 2.0 module ",(0,r.jsx)(n.a,{href:"tpm/#add-tpm-emulation-to-bare-metal-machine",children:"example here"})]}),"\n",(0,r.jsx)(n.li,{children:"Hint 3: Make sure you're using UEFI (not BIOS) on x86-64, or the ISO won't boot"}),"\n",(0,r.jsxs)(n.li,{children:["Hint 4: A minimum volume size of 25 GB is recommended. See the ",(0,r.jsx)(n.a,{href:"/next/installation#deployed-elemental-teal-partition-table",children:"Elemental Teal partition table"})," for more details"]}),"\n",(0,r.jsxs)(n.li,{children:["Hint 5: CPU and RAM requirements depend on the Kubernetes version installed, for example ",(0,r.jsx)(n.a,{href:"https://docs.k3s.io/installation/requirements#hardware",children:"K3s"})," or ",(0,r.jsx)(n.a,{href:"https://docs.rke2.io/install/requirements#hardware",children:"RKE2"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Helm Package Manager (",(0,r.jsx)(n.a,{href:"https://helm.sh/",children:"https://helm.sh/"}),")"]}),"\n",(0,r.jsxs)(n.li,{children:["For ARM (aarch64) - One SD-card (32 GB or more, must be ",(0,r.jsx)(n.strong,{children:"fast"})," - 40MB/s write speed is acceptable) and a USB-stick for installation"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components},{TabItem:t,Tabs:a}=n;return t||u("TabItem",!0),a||u("Tabs",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"install-elemental-operator",children:"Install Elemental Operator"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"elemental-operator"})," is the management endpoint, running the management\ncluster and taking care of creating inventories, registrations for machines and much more."]}),"\n",(0,r.jsx)(n.p,{children:"We will use the Helm package manager to install the elemental-operator chart into our cluster."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Now after a few seconds you should see the operator pod appear on the ",(0,r.jsx)(n.code,{children:"cattle-elemental-system"})," namespace:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl get pods -n cattle-elemental-system\nNAME READY STATUS RESTARTS AGE\nelemental-operator-64f88fc695-b8qhn 1/1 Running 0 16s\n"})}),"\n",(0,r.jsx)(n.admonition,{title:"Helm v3.8.0+ required",type:"info",children:(0,r.jsx)(n.p,{children:"The Elemental Operator chart is distributed via an OCI registry: Helm correctly supports OCI based registries starting from the v3.8.0 release."})}),"\n",(0,r.jsx)(n.admonition,{title:"Swap charts installation order when upgrading from elemental-operator release < 1.2.4",type:"warning",children:(0,r.jsx)(n.p,{children:"When upgrading from an elemental-operator release embedding the Elemental CRDs (version < 1.2.4) the elemental-operator-crds chart installation will fail.\nYou will need to upgrade the elemental-operator chart first, and only then install the elemental-operator-crds chart."})}),"\n",(0,r.jsx)(n.h3,{id:"non-stable-installations",children:"Non-stable installations"}),"\n",(0,r.jsxs)(n.p,{children:["Besides the Helm charts listed above, there are two other ",(0,r.jsx)(n.code,{children:"non-stable"}),"\nversions available."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Staging:"})," refers to the latest tagged release from Github. This is documented in the ",(0,r.jsx)(n.a,{href:"next/quickstart-ui",children:"Next"})," pages."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Development:"})," refers to the 'tip of HEAD' from Github. This is the ongoing development version and changes constantly."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(a,{children:[(0,r.jsx)(t,{value:"stagingOperator",label:"Staging version (x86-64, ARM64 (Raspberry Pi 4))",default:!0,children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.opensuse.org/isv/rancher/elemental/staging/charts/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.opensuse.org/isv/rancher/elemental/staging/charts/rancher/elemental-operator-chart\n"})})}),(0,r.jsxs)(t,{value:"develOperator",label:"Development version (x86-64, ARM64 (Raspberry Pi 4))",default:!0,children:[(0,r.jsx)(n.admonition,{title:"Reminder",type:"warning",children:(0,r.jsx)(n.p,{children:"The development version is not recommended for production environments. We welcome feedback via Slack or Github issues, but it could be unstable and contain experimental features that can be dropped without notice."})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.opensuse.org/isv/rancher/elemental/dev/charts/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install --set image.imagePullPolicy=Always elemental-operator oci://registry.opensuse.org/isv/rancher/elemental/dev/charts/rancher/elemental-operator-chart\n"})})]})]}),"\n",(0,r.jsx)(n.h3,{id:"installation-options",children:"Installation options"}),"\n",(0,r.jsxs)(n.p,{children:["There are a few options that can be set in the chart install but that is out of scope for this document. You can see all the values on the chart ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/elemental-operator/blob/main/charts/operator/values.yaml",children:"values.yaml"}),"."]})]})}function m(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}function u(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}var p=t(5974);const g={sidebar_label:"Elemental the command line way",title:""},x="Elemental the command line way",f={id:"quickstart-cli",title:"",description:"Follow this guide to have an auto-deployed cluster via rke2/k3s and managed by Rancher",source:"@site/docs/quickstart-cli.md",sourceDirName:".",slug:"/quickstart-cli",permalink:"/next/quickstart-cli",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Elemental the command line way",title:""},sidebar:"docs",previous:{title:"Elemental the visual way",permalink:"/next/quickstart-ui"},next:{title:"Architecture",permalink:"/next/architecture"}},j={},b=[{value:"Prepare your kubernetes resources",id:"prepare-your-kubernetes-resources",level:2},{value:"Preparing the installation (seed) image",id:"preparing-the-installation-seed-image",level:2},{value:"Retrieving the prebuilt seed image",id:"retrieving-the-prebuilt-seed-image",level:4},{value:"Verifying the download",id:"verifying-the-download",level:5},{value:"Injecting the registration information",id:"injecting-the-registration-information",level:4},{value:"Writing the seed image to a USB stick",id:"writing-the-seed-image-to-a-usb-stick",level:4},{value:"Booting the Raspberry Pi",id:"booting-the-raspberry-pi",level:4},{value:"Selecting the right machines to join a cluster",id:"selecting-the-right-machines-to-join-a-cluster",level:3},{value:"How can I choose the kubernetes version and deployer for the cluster?",id:"how-can-i-choose-the-kubernetes-version-and-deployer-for-the-cluster",level:2},{value:"How can I follow what is going on behind the scenes?",id:"how-can-i-follow-what-is-going-on-behind-the-scenes",level:2}];function y(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components},{CodeBlock:t,Head:c,TabItem:d,Tabs:u}=n;return t||w("CodeBlock",!0),c||w("Head",!0),d||w("TabItem",!0),u||w("Tabs",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(c,{children:(0,r.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/quickstart-cli"})}),"\n","\n","\n",(0,r.jsx)(n.h1,{id:"elemental-the-command-line-way",children:"Elemental the command line way"}),"\n",(0,r.jsx)(n.p,{children:"Follow this guide to have an auto-deployed cluster via rke2/k3s and managed by Rancher\nwith the only help of an Elemental Teal ISO."}),"\n",(0,r.jsx)(h,{}),"\n",(0,r.jsx)(m,{}),"\n",(0,r.jsx)(n.h2,{id:"prepare-your-kubernetes-resources",children:"Prepare your kubernetes resources"}),"\n",(0,r.jsxs)(n.p,{children:["Node deployment starts with a ",(0,r.jsx)(n.code,{children:"MachineRegistration"}),", identifying a set of machines sharing the same configuration (disk drives, network, etc.)."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," is needed to perform the deployment of the Elemental OS on the target hosts. When booting up, each host registers to the Elemental Operator which tracks the new host with a ",(0,r.jsx)(n.code,{children:"MachineInventory"})," resource."]}),"\n",(0,r.jsxs)(n.p,{children:["Then it continues with having a Cluster resource that uses a ",(0,r.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," to know which machines are for that cluster."]}),"\n",(0,r.jsxs)(n.p,{children:["This selector is a simple matcher based on labels set in the ",(0,r.jsx)(n.code,{children:"MachineInventory"}),", so if your selector is matching on the label ",(0,r.jsx)(n.code,{children:"cluster-id"})," with a value ",(0,r.jsx)(n.code,{children:"cluster-id-val"}),"\nand your ",(0,r.jsx)(n.code,{children:"MachineInventory"})," has that same ",(0,r.jsx)(n.code,{children:"cluster-id"}),":",(0,r.jsx)(n.code,{children:"cluster-id-val"})," label, it will match and be bootstrapped as part of the cluster."]}),"\n",(0,r.jsxs)(n.p,{children:["In this quickstart we are going to deploy the resources to provision a cluster named ",(0,r.jsx)(n.em,{children:"volcano"})," that will match on ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s with the label ",(0,r.jsx)(n.em,{children:"element"}),":",(0,r.jsx)(n.em,{children:"fire"}),"."]}),"\n",(0,r.jsxs)(u,{children:[(0,r.jsxs)(d,{value:"manualYaml",label:"Manually creating the resource yamls",default:!0,children:[(0,r.jsx)(n.p,{children:"You will need to create the following files:"}),(0,r.jsx)(t,{language:"yaml",title:"selector.yaml",showLineNumbers:!0,children:o.Z}),(0,r.jsxs)(n.p,{children:["As you can see this is a very simple selector that looks for ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s having a label with the key ",(0,r.jsx)(n.code,{children:"element"})," and the value ",(0,r.jsx)(n.code,{children:"fire"}),"."]}),(0,r.jsx)(t,{language:"yaml",title:"cluster.yaml",showLineNumbers:!0,children:a.Z}),(0,r.jsxs)(n.p,{children:["As you can see the ",(0,r.jsx)(n.code,{children:"machineConfigRef"})," is of kind ",(0,r.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," with the name ",(0,r.jsx)(n.code,{children:"fire-machine-selector"}),": it matches the selector we created."]}),(0,r.jsxs)(n.p,{children:["You can get more information about cluster options like ",(0,r.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/reference-guides/cluster-configuration/rancher-server-configuration/rke2-cluster-configuration#machineglobalconfig",children:(0,r.jsx)(n.code,{children:"machineGlobalConfig"})})," or ",(0,r.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/reference-guides/cluster-configuration/rancher-server-configuration/rke2-cluster-configuration#machineselectorconfig",children:(0,r.jsx)(n.code,{children:"machineSelectorConfig"})})," directly in the ",(0,r.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com",children:"Rancher Manager documentation"}),"."]}),(0,r.jsxs)(u,{children:[(0,r.jsx)(d,{value:"normalRegistration",label:"Registration",default:!0,children:(0,r.jsx)(t,{language:"yaml",title:"registration.yaml",showLineNumbers:!0,children:s.Z})}),(0,r.jsxs)(d,{value:"rpiRegistration",label:"Registration for Raspberry Pi",default:!0,children:[(0,r.jsx)(t,{language:"yaml",title:"rpi-registration.yaml",showLineNumbers:!0,children:l.Z}),(0,r.jsxs)(n.p,{children:["For deployment on Raspberry Pi, you need to enable emulated TPM\n(except you have ",(0,r.jsx)(n.a,{href:"https://thepihut.com/products/letstrust-tpm-for-raspberry-pi",children:"a hardware TPM for Raspberry Pi"}),").\nYou also need to disable writing to the EFI store (since Raspberry Pi doesn't have one) via ",(0,r.jsx)(n.code,{children:"disable-boot-entry: true"}),"."]})]})]}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," defines the registration and installation configuration. Once created, the Elemental operator exposes a unique URL to be used with the ",(0,r.jsx)(n.code,{children:"elemental-register"})," binary to reach out to the management cluster and register the machine during installation: if the registration is successful, the operator creates a ",(0,r.jsx)(n.code,{children:"MachineInventory"})," tracking the machine, which can be used to provision the machine as a node of our cluster.\nWe define the label matching our selector here, although it can also be added later to the created ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s."]}),(0,r.jsxs)(n.admonition,{title:"warning",type:"warning",children:[(0,r.jsx)(n.p,{children:"Make sure to modify the registration.yaml above to set the proper install device to point to a valid device based on your node configuration (i.e. /dev/sda, /dev/vda, /dev/nvme0, etc...)."}),(0,r.jsxs)(n.p,{children:["The SD-card on a Raspberry Pi is usually ",(0,r.jsx)(n.code,{children:"/dev/mmcblk0"}),"."]})]}),(0,r.jsxs)(u,{children:[(0,r.jsxs)(d,{value:"seedImagex86",label:"Seed Image (x86_64)",default:!0,children:[(0,r.jsx)(t,{language:"yaml",title:"seedimage.yaml",showLineNumbers:!0,children:p.Z}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"SeedImage"})," is required to generate the ",(0,r.jsx)(n.em,{children:"seed image"})," (like a bootable ISO) that will boot and start the Elemental provisioning on the target machines."]}),(0,r.jsx)(n.p,{children:"Now that we have defined all the configuration files let's apply them to create the proper resources in Kubernetes:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f selector.yaml \nkubectl apply -f cluster.yaml \nkubectl apply -f registration.yaml\nkubectl apply -f seedimage.yaml\n"})})]}),(0,r.jsxs)(d,{value:"seedImagerpi",label:"Seed Image for Raspberry Pi",default:!0,children:[(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource, which automates the creation of an Elemental bootable image (the ",(0,r.jsx)(n.em,{children:"seed image"}),"), does not support Raspberry Pi yet.\nWe will generate a ",(0,r.jsx)(n.em,{children:"seed image"})," manually in the ",(0,r.jsx)(n.a,{href:"/next/quickstart-cli#preparing-the-installation-seed-image",children:"next section"}),"."]}),(0,r.jsx)(n.p,{children:"Now that we have defined all the configuration files let's apply them to create the proper resources in Kubernetes:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f selector.yaml \nkubectl apply -f cluster.yaml \nkubectl apply -f registration.yaml\n"})})]})]})]}),(0,r.jsxs)(d,{value:"repofiles",label:"Using quickstart files from Elemental docs repo directly",children:[(0,r.jsxs)(n.p,{children:["You can directly apply the quickstart example resource files from the ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/elemental-docs",children:"Elemental docs repository"}),"."]}),(0,r.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,r.jsxs)(n.p,{children:["The quickstart example resource files assume the default storage of the target host to be mapped to the ",(0,r.jsx)(n.code,{children:"/dev/sda"}),".\nIf your host storage device file is different, you have to change the registration.yaml file before applying it, changing the ",(0,r.jsx)(n.code,{children:"config.elemental.install.device"})," accordingly."]})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"kubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/selector.yaml\nkubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/cluster.yaml\nkubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/registration.yaml\nkubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/seedimage.yaml (not for aarch64 yet)\n"})})]})]}),"\n",(0,r.jsx)(n.h2,{id:"preparing-the-installation-seed-image",children:"Preparing the installation (seed) image"}),"\n",(0,r.jsx)(n.p,{children:"This is the last step: you need an Elemental Teal seed image that includes the initial registration config, so it can be auto registered, installed and fully deployed as part of your cluster."}),"\n",(0,r.jsxs)(n.admonition,{title:"note",type:"note",children:[(0,r.jsxs)(n.p,{children:["The initial registration config file is generated when you create a ",(0,r.jsx)(n.code,{children:"Machine Registration"}),"."]}),(0,r.jsx)(n.p,{children:"You can download it with:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:'wget --no-check-certificate `kubectl get machineregistration -n fleet-default fire-nodes -o jsonpath="{.status.registrationURL}"` -O initial-registration.yaml\n'})})]}),"\n",(0,r.jsx)(n.p,{children:"The contents of the registration config file are nothing more than the registration URL that the node needs to register, the proper server certificate and few options for the registration process."}),"\n",(0,r.jsx)(n.p,{children:"Once generated, a seed image can be used to provision any number of machines."}),"\n",(0,r.jsxs)(u,{children:[(0,r.jsxs)(d,{value:"download",label:"Downloading the quickstart ISO",children:[(0,r.jsxs)(n.p,{children:["The seed image created by the ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource above can be downloaded as an ISO via the following script:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:'kubectl wait --for=condition=ready pod -n fleet-default fire-img\nwget --no-check-certificate `kubectl get seedimage -n fleet-default fire-img -o jsonpath="{.status.downloadURL}"` -O elemental-teal.x86_64.iso\n'})}),(0,r.jsxs)(n.p,{children:["The first command waits for the ISO to be built and ready, the second one downloads it in the current directory with the name ",(0,r.jsx)(n.code,{children:"elemental-teal-x86_64.iso"}),"."]})]}),(0,r.jsxs)(d,{value:"manual_iso",label:"Preparing the seed image (x86_64) manually",children:[(0,r.jsxs)(n.p,{children:["If you created a ",(0,r.jsx)(n.a,{href:"customizing#create-a-custom-bootable-installation-media",children:"customized ISO"}),",\nyou can use the ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/elemental/blob/main/.github/elemental-iso-add-registration",children:(0,r.jsx)(n.code,{children:"elemental-iso-add-registration"})}),"\nscript to add the registration config file"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"elemental-iso-add-registration initial-registration.yaml my-customized.iso\n"})})]}),(0,r.jsxs)(d,{value:"manual_raw",label:"Preparing the seed image (aarch64) manually",children:[(0,r.jsx)(n.p,{children:"Elemental's support for Raspberry Pi is primarily for demonstration purposes at this point. Therefore the installation process is modelled similar to x86-64. You boot from a seed image (an USB stick in this case) and install to a storage medium (SD-card for Raspberry Pi)."}),(0,r.jsx)(n.h4,{id:"retrieving-the-prebuilt-seed-image",children:"Retrieving the prebuilt seed image"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable/containers/rpi.raw\n"})}),(0,r.jsx)(n.h5,{id:"verifying-the-download",children:"Verifying the download"}),(0,r.jsx)(n.p,{children:"In order to verify the integrity of the downloaded artifacts, you\nshould do a checksum verification:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable/containers/rpi.raw.sha256\nsha256sum -c rpi.raw.sha256\n"})}),(0,r.jsxs)(n.p,{children:["This should print ",(0,r.jsx)(n.code,{children:"rpi.raw: OK"})," as output."]}),(0,r.jsx)(n.h4,{id:"injecting-the-registration-information",children:"Injecting the registration information"}),(0,r.jsxs)(n.p,{children:["Adding the ",(0,r.jsx)(n.code,{children:"initial-registration.yaml"})," isn't scripted yet. This is still a manual process:"]}),(0,r.jsxs)(n.p,{children:["The written USB stick will have two partitions. ",(0,r.jsx)(n.code,{children:"RPI_BOOT"})," contains the boot loader files and ",(0,r.jsx)(n.code,{children:"COS_LIVE"})," the Elemental files.\nMount the ",(0,r.jsx)(n.code,{children:"COS_LIVE"})," partition and write ",(0,r.jsx)(n.code,{children:"initial-registration.yaml"})," as ",(0,r.jsx)(n.code,{children:"livecd-cloud-config.yaml"})," to this partition."]}),(0,r.jsx)(n.p,{children:"If you've mounted the USB stick with a file manager, this command should work to copy the registration information:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"sudo cp initial-registration.yaml /run/media/$USER/COS_LIVE/livecd-cloud-config.yaml\n"})}),(0,r.jsx)(n.p,{children:"If you prefer using some CLI tools:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"IMAGE=rpi.raw\nDEST=$(mktemp -d)\n\nSECTORSIZE=$(sfdisk -J ${IMAGE} | jq '.partitiontable.sectorsize')\nDATAPARTITIONSTART=$(sfdisk -J ${IMAGE} | jq '.partitiontable.partitions[1].start')\nsudo mount -o rw,loop,offset=$((${SECTORSIZE}*${DATAPARTITIONSTART})) ${IMAGE} ${DEST}\nsudo cp initial-registration.yaml ${DEST}/livecd-cloud-config.yaml\nsudo umount ${DEST}\nrmdir ${DEST}\n"})}),(0,r.jsx)(n.h4,{id:"writing-the-seed-image-to-a-usb-stick",children:"Writing the seed image to a USB stick"}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:".raw"})," image needs to be written to a USB stick to boot from. This can be done with ",(0,r.jsx)(n.code,{children:"dd"})," on the Linux command line if you're comfortable with this command.\n",(0,r.jsx)(n.a,{href:"https://www.opensuse.org",children:"openSUSE"})," has nice instructions on how to write an image to a storage medium for ",(0,r.jsx)(n.a,{href:"https://en.opensuse.org/SDB:Live_USB_stick",children:"Linux"}),",\n",(0,r.jsx)(n.a,{href:"https://en.opensuse.org/SDB:Create_a_Live_USB_stick_using_Windows",children:"Windows"}),", and ",(0,r.jsx)(n.a,{href:"https://en.opensuse.org/SDB:Create_a_Live_USB_stick_using_macOS",children:"OS X"}),"."]}),(0,r.jsx)(n.h4,{id:"booting-the-raspberry-pi",children:"Booting the Raspberry Pi"}),(0,r.jsx)(n.p,{children:"Now unmount the USB stick and plug it into your Raspberry Pi."}),(0,r.jsxs)(n.p,{children:["Plug a large (32 GB or more) and ",(0,r.jsx)(n.strong,{children:"fast"})," (!!) micro SD-card into the respective slot."]}),(0,r.jsx)(n.p,{children:"Connect the system to ethernet."}),(0,r.jsx)(n.p,{children:"A powercycle will reboot the Pi. Everything else is identical to x86-64."}),(0,r.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,r.jsx)(n.p,{children:"Make sure the micro SD-card is unpartitioned. Otherwise the Pi bootloader will try to boot from it and fail."})})]})]}),"\n",(0,r.jsx)(n.p,{children:"You can now boot your nodes with this image and they will:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Register with the registrationURL given and create a per-machine ",(0,r.jsx)(n.code,{children:"MachineInventory"})]}),"\n",(0,r.jsx)(n.li,{children:"Install Elemental Teal to the given device"}),"\n",(0,r.jsx)(n.li,{children:"Reboot"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"selecting-the-right-machines-to-join-a-cluster",children:"Selecting the right machines to join a cluster"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," selects the machines needed to provision the cluster from the ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s having the ",(0,r.jsxs)(n.em,{children:["element",":fire"]})," label.\nWe have added the ",(0,r.jsx)(n.em,{children:"element"}),":",(0,r.jsx)(n.em,{children:"fire"})," label in the ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," ",(0,r.jsx)(n.code,{children:"machineInventoryLabels"})," map, so all the ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s originated from it already have the label.\nOne could anyway skip the label from the ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," and add it later:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:'kubectl -n fleet-default label machineinventory $(kubectl get machineinventory -n fleet-default --no-headers -o custom-columns=":metadata.name") element=fire\n'})}),"\n",(0,r.jsxs)(n.p,{children:["As soon as ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s with the ",(0,r.jsx)(n.em,{children:"element"}),":",(0,r.jsx)(n.em,{children:"fire"})," are present, the corresponding machines auto-deploy the cluster via the chosen provider (k3s/rke)."]}),"\n",(0,r.jsx)(n.p,{children:"After a few minutes your new cluster will be fully provisioned!!"}),"\n",(0,r.jsx)(n.h2,{id:"how-can-i-choose-the-kubernetes-version-and-deployer-for-the-cluster",children:"How can I choose the kubernetes version and deployer for the cluster?"}),"\n",(0,r.jsxs)(n.p,{children:["In your cluster.yaml file there is a key in the ",(0,r.jsx)(n.code,{children:"Spec"})," called ",(0,r.jsx)(n.code,{children:"kubernetesVersion"}),". That sets the version and deployer that will be used for the cluster,\nfor example Kubernetes",(0,r.jsx)(n.code,{children:"v1.24.8"})," for rke2 would be ",(0,r.jsx)(n.code,{children:"v1.24.8+rke2r1"})," and for k3s ",(0,r.jsx)(n.code,{children:"v1.24.8+k3s1"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["To see all compatible versions check the ",(0,r.jsx)(n.a,{href:"https://www.suse.com/suse-rancher/support-matrix/all-supported-versions/",children:"Rancher Support Matrix"})," PDF for rke/rke2/k3s versions and their components."]}),"\n",(0,r.jsxs)(n.p,{children:["You can also check our ",(0,r.jsx)(n.a,{href:"/next/kubernetesversions",children:"Version doc"})," to know how to obtain those versions."]}),"\n",(0,r.jsxs)(n.p,{children:["Check our ",(0,r.jsx)(n.a,{href:"/next/cluster-reference",children:"Cluster Spec"})," page for more info about the ",(0,r.jsx)(n.code,{children:"Cluster"})," resource."]}),"\n",(0,r.jsx)(n.h2,{id:"how-can-i-follow-what-is-going-on-behind-the-scenes",children:"How can I follow what is going on behind the scenes?"}),"\n",(0,r.jsx)(n.p,{children:"You should be able to follow along what the machine is doing via:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["During ISO boot:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["ssh into the machine (user/pass: root/ros):","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -t elemental"})," shows you the progress of the registration (",(0,r.jsx)(n.em,{children:"elemental-register"}),") and the installation of Elemental (",(0,r.jsx)(n.em,{children:"elemental install"}),")."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Once the system is installed:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["On the Rancher UI -> ",(0,r.jsx)(n.code,{children:"Cluster Management"})," allows you to see your new cluster and the ",(0,r.jsx)(n.code,{children:"Provisioning Log"})," in the cluster details"]}),"\n",(0,r.jsxs)(n.li,{children:["ssh into the machine (user/pass: Whatever your configured on the registration.yaml under ",(0,r.jsx)(n.code,{children:"Spec.config.cloud-config.users"}),"):","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -u elemental-system-agent"})," shows the output of the initial elemental config and the installation of the ",(0,r.jsx)(n.code,{children:"rancher-system-agent"})]}),"\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -u rancher-system-agent"})," shows the output of the boostrap of cluster components like k3s"]}),"\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -u k3s"})," shows the logs of the k3s deployment"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]})]})}function v(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(y,{...e})}):y(e)}function w(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},9548:(e,n,t)=>{t.d(n,{Z:()=>r});const r="kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: volcano\n namespace: fleet-default\nspec:\n rkeConfig:\n machineGlobalConfig:\n etcd-expose-metrics: false\n profile: null\n machinePools:\n - controlPlaneRole: true\n etcdRole: true\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: fire-machine-selector\n name: fire-pool\n quantity: 1\n unhealthyNodeTimeout: 0s\n workerRole: true\n machineSelectorConfig:\n - config:\n protect-kernel-defaults: false\n registries: {}\n kubernetesVersion: v1.24.8+k3s1\n"},4713:(e,n,t)=>{t.d(n,{Z:()=>r});const r='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'},8260:(e,n,t)=>{t.d(n,{Z:()=>r});const r='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/mmcblk0\n debug: true\n disable-boot-entry: true\n registration:\n emulate-tpm: true\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'},5974:(e,n,t)=>{t.d(n,{Z:()=>r});const r="apiVersion: elemental.cattle.io/v1beta1\nkind: SeedImage\nmetadata:\n name: fire-img\n namespace: fleet-default\nspec:\n baseImage: registry.suse.com/rancher/elemental-teal-iso/5.4:1.2.2\n registrationRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineRegistration\n name: fire-nodes\n namespace: fleet-default\n"},3367:(e,n,t)=>{t.d(n,{Z:()=>r});const r="apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: fire-machine-selector\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n matchExpressions:\n - key: element\n operator: In\n values: [ 'fire' ]\n"},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>s});var r=t(7294);const i={},a=r.createContext(i);function s(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/34e5c9d0.30eab101.js b/assets/js/34e5c9d0.30eab101.js new file mode 100644 index 000000000..6b9abce40 --- /dev/null +++ b/assets/js/34e5c9d0.30eab101.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4223],{1639:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>l,default:()=>x,frontMatter:()=>i,metadata:()=>c,toc:()=>o});var s=n(5893),r=n(1151),d=n(1819);const i={sidebar_label:"Hardware Labels",title:""},l=void 0,c={id:"hardwarelabels",title:"",description:"Hardware Labels",source:"@site/versioned_docs/version-1.3/hardwarelabels.md",sourceDirName:".",slug:"/hardwarelabels",permalink:"/hardwarelabels",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Hardware Labels",title:""},sidebar:"docs",previous:{title:"Smbios",permalink:"/smbios"},next:{title:"Inventory Management",permalink:"/inventory-management"}},a={},o=[{value:"Hardware Labels",id:"hardware-labels",level:2},{value:"Block device drive types",id:"block-device-drive-types",level:3},{value:"Block device controller types",id:"block-device-controller-types",level:3},{value:"Example MachineRegistration",id:"example-machineregistration",level:3}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.a)(),...e.components},{CodeBlock:n,Head:i}=t;return n||j("CodeBlock",!0),i||j("Head",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i,{children:(0,s.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/hardwarelabels"})}),"\n","\n","\n",(0,s.jsx)(t.h2,{id:"hardware-labels",children:"Hardware Labels"}),"\n",(0,s.jsxs)(t.p,{children:["When a node is registered, hardware data is collected and made available to the MachineRegistration in the same way as ",(0,s.jsx)(t.a,{href:"/smbios",children:"SMBIOS data"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["This data can be used for easy identification and selection via a ",(0,s.jsx)(t.a,{href:"/machineinventoryselectortemplate-reference",children:"MachineSelector"}),"."]}),"\n",(0,s.jsx)(t.p,{children:"The following are available for templating:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Label"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Memory/Total Physical Bytes}"})}),(0,s.jsx)(t.td,{children:"The total RAM memory in the node, expressed in bytes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/CPU/Total Cores}"})}),(0,s.jsx)(t.td,{children:"Total CPU cores"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/CPU/Total Threads}"})}),(0,s.jsx)(t.td,{children:"Total CPU threads"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/CPU/Vendor}"})}),(0,s.jsx)(t.td,{children:"CPU vendor"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/CPU/Model}"})}),(0,s.jsx)(t.td,{children:"CPU model"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/GPU/Vendor}"})}),(0,s.jsx)(t.td,{children:"GPU vendor (Only available if the node has an identifiable GPU)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/GPU/Model}"})}),(0,s.jsx)(t.td,{children:"GPU model (Only available if the node has an identifiable GPU)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Network/Number Interfaces}"})}),(0,s.jsx)(t.td,{children:"Number of network interfaces in the system"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Network/{Iface name}/Name}"})}),(0,s.jsx)(t.td,{children:"Network interface name"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Network/{Iface name}/IsVirtual}"})}),(0,s.jsx)(t.td,{children:"Boolean indicating virtual network interface"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/Number Devices}"})}),(0,s.jsx)(t.td,{children:"Number of block devices in the system (includes DVD and USB drives)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Name}"})}),(0,s.jsx)(t.td,{children:"Device name of the block device (i.e. sda, sr0, vda, etc...)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Removable}"})}),(0,s.jsx)(t.td,{children:"Whether this block device is removable (i.e. DVD)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Size}"})}),(0,s.jsx)(t.td,{children:"Total space in this block device, expressed in bytes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Drive Type}"})}),(0,s.jsx)(t.td,{children:"Drive type of this block device, see table below"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Storage Controller}"})}),(0,s.jsx)(t.td,{children:"Controller type for this block device connection, see table below"})]})]})]}),"\n",(0,s.jsx)(t.admonition,{title:"info",type:"info",children:(0,s.jsxs)(t.p,{children:["On both ",(0,s.jsx)(t.code,{children:"Block Devices"})," and ",(0,s.jsx)(t.code,{children:"Network"})," the device name is used as a sub-block, as there could be more than one device."]})}),"\n",(0,s.jsx)(t.h3,{id:"block-device-drive-types",children:"Block device drive types"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Type"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"HDD"}),(0,s.jsx)(t.td,{children:"Hard disk drive"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"FDD"}),(0,s.jsx)(t.td,{children:"Floppy disk drive"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ODD"}),(0,s.jsx)(t.td,{children:"Optical disk drive"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SSD"}),(0,s.jsx)(t.td,{children:"Solid-state drive"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"virtual"}),(0,s.jsx)(t.td,{children:"virtual drive i.e. loop devices"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Unknown"}),(0,s.jsx)(t.td,{children:"unknown drive type"})]})]})]}),"\n",(0,s.jsx)(t.h3,{id:"block-device-controller-types",children:"Block device controller types"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Type"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"IDE"}),(0,s.jsx)(t.td,{children:"Integrated Drive Electronics"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SCSI"}),(0,s.jsx)(t.td,{children:"Small computer system interface"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"NVMe"}),(0,s.jsx)(t.td,{children:"Non-volatile Memory Express"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"MMC"}),(0,s.jsx)(t.td,{children:"Multi-media controller (used for mobile phone storage devices)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"virtio"}),(0,s.jsx)(t.td,{children:"Virtualized storage controller/driver"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"loop"}),(0,s.jsx)(t.td,{children:"loop device"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Unknown"}),(0,s.jsx)(t.td,{children:"unknown controller type"})]})]})]}),"\n",(0,s.jsx)(t.h3,{id:"example-machineregistration",children:"Example MachineRegistration"}),"\n",(0,s.jsx)(n,{language:"yaml",title:"registration example with smbios labels",showLineNumbers:!0,children:d.Z})]})}function x(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}function j(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1819:(e,t,n)=>{n.d(t,{Z:()=>s});const s='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineInventoryLabels:\n elemental.cattle.io/CpuTotalCores: "${System Data/CPU/Total Cores}"\n elemental.cattle.io/CpuTotalThreads: "${System Data/CPU/Total Threads}"\n elemental.cattle.io/TotalMemoryBytes: "${System Data/Memory/Total Physical Bytes}"\n elemental.cattle.io/NumberBlockDevices: "${System Data/Block Devices/Number Devices}"\n'},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>i});var s=n(7294);const r={},d=s.createContext(r);function i(e){const t=s.useContext(d);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),s.createElement(d.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/34e5c9d0.7676da55.js b/assets/js/34e5c9d0.7676da55.js deleted file mode 100644 index 35a9cf749..000000000 --- a/assets/js/34e5c9d0.7676da55.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4223],{1639:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>a,contentTitle:()=>l,default:()=>x,frontMatter:()=>i,metadata:()=>c,toc:()=>o});var n=s(5893),r=s(1151),d=s(1819);const i={sidebar_label:"Hardware Labels",title:""},l=void 0,c={id:"hardwarelabels",title:"",description:"Hardware Labels",source:"@site/versioned_docs/version-1.3/hardwarelabels.md",sourceDirName:".",slug:"/hardwarelabels",permalink:"/hardwarelabels",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Hardware Labels",title:""},sidebar:"docs",previous:{title:"Smbios",permalink:"/smbios"},next:{title:"Inventory Management",permalink:"/inventory-management"}},a={},o=[{value:"Hardware Labels",id:"hardware-labels",level:2},{value:"Block device drive types",id:"block-device-drive-types",level:3},{value:"Block device controller types",id:"block-device-controller-types",level:3},{value:"Example MachineRegistration",id:"example-machineregistration",level:3}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.a)(),...e.components},{CodeBlock:s}=t;return s||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("CodeBlock",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h2,{id:"hardware-labels",children:"Hardware Labels"}),"\n",(0,n.jsxs)(t.p,{children:["When a node is registered, hardware data is collected and made available to the MachineRegistration in the same way as ",(0,n.jsx)(t.a,{href:"/smbios",children:"SMBIOS data"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["This data can be used for easy identification and selection via a ",(0,n.jsx)(t.a,{href:"/machineinventoryselectortemplate-reference",children:"MachineSelector"}),"."]}),"\n",(0,n.jsx)(t.p,{children:"The following are available for templating:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Label"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/Memory/Total Physical Bytes}"})}),(0,n.jsx)(t.td,{children:"The total RAM memory in the node, expressed in bytes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/CPU/Total Cores}"})}),(0,n.jsx)(t.td,{children:"Total CPU cores"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/CPU/Total Threads}"})}),(0,n.jsx)(t.td,{children:"Total CPU threads"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/CPU/Vendor}"})}),(0,n.jsx)(t.td,{children:"CPU vendor"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/CPU/Model}"})}),(0,n.jsx)(t.td,{children:"CPU model"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/GPU/Vendor}"})}),(0,n.jsx)(t.td,{children:"GPU vendor (Only available if the node has an identifiable GPU)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/GPU/Model}"})}),(0,n.jsx)(t.td,{children:"GPU model (Only available if the node has an identifiable GPU)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/Network/Number Interfaces}"})}),(0,n.jsx)(t.td,{children:"Number of network interfaces in the system"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/Network/{Iface name}/Name}"})}),(0,n.jsx)(t.td,{children:"Network interface name"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/Network/{Iface name}/IsVirtual}"})}),(0,n.jsx)(t.td,{children:"Boolean indicating virtual network interface"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/Block Devices/Number Devices}"})}),(0,n.jsx)(t.td,{children:"Number of block devices in the system (includes DVD and USB drives)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Name}"})}),(0,n.jsx)(t.td,{children:"Device name of the block device (i.e. sda, sr0, vda, etc...)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Removable}"})}),(0,n.jsx)(t.td,{children:"Whether this block device is removable (i.e. DVD)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Size}"})}),(0,n.jsx)(t.td,{children:"Total space in this block device, expressed in bytes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Drive Type}"})}),(0,n.jsx)(t.td,{children:"Drive type of this block device, see table below"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Storage Controller}"})}),(0,n.jsx)(t.td,{children:"Controller type for this block device connection, see table below"})]})]})]}),"\n",(0,n.jsx)(t.admonition,{title:"info",type:"info",children:(0,n.jsxs)(t.p,{children:["On both ",(0,n.jsx)(t.code,{children:"Block Devices"})," and ",(0,n.jsx)(t.code,{children:"Network"})," the device name is used as a sub-block, as there could be more than one device."]})}),"\n",(0,n.jsx)(t.h3,{id:"block-device-drive-types",children:"Block device drive types"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Type"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"HDD"}),(0,n.jsx)(t.td,{children:"Hard disk drive"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"FDD"}),(0,n.jsx)(t.td,{children:"Floppy disk drive"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"ODD"}),(0,n.jsx)(t.td,{children:"Optical disk drive"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"SSD"}),(0,n.jsx)(t.td,{children:"Solid-state drive"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"virtual"}),(0,n.jsx)(t.td,{children:"virtual drive i.e. loop devices"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Unknown"}),(0,n.jsx)(t.td,{children:"unknown drive type"})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"block-device-controller-types",children:"Block device controller types"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Type"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"IDE"}),(0,n.jsx)(t.td,{children:"Integrated Drive Electronics"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"SCSI"}),(0,n.jsx)(t.td,{children:"Small computer system interface"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"NVMe"}),(0,n.jsx)(t.td,{children:"Non-volatile Memory Express"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"MMC"}),(0,n.jsx)(t.td,{children:"Multi-media controller (used for mobile phone storage devices)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"virtio"}),(0,n.jsx)(t.td,{children:"Virtualized storage controller/driver"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"loop"}),(0,n.jsx)(t.td,{children:"loop device"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Unknown"}),(0,n.jsx)(t.td,{children:"unknown controller type"})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"example-machineregistration",children:"Example MachineRegistration"}),"\n",(0,n.jsx)(s,{language:"yaml",title:"registration example with smbios labels",showLineNumbers:!0,children:d.Z})]})}function x(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},1819:(e,t,s)=>{s.d(t,{Z:()=>n});const n='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineInventoryLabels:\n elemental.cattle.io/CpuTotalCores: "${System Data/CPU/Total Cores}"\n elemental.cattle.io/CpuTotalThreads: "${System Data/CPU/Total Threads}"\n elemental.cattle.io/TotalMemoryBytes: "${System Data/Memory/Total Physical Bytes}"\n elemental.cattle.io/NumberBlockDevices: "${System Data/Block Devices/Number Devices}"\n'},1151:(e,t,s)=>{s.d(t,{Z:()=>l,a:()=>i});var n=s(7294);const r={},d=n.createContext(r);function i(e){const t=n.useContext(d);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(d.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3b8c55ea.2c8c5b1d.js b/assets/js/3b8c55ea.fe236857.js similarity index 92% rename from assets/js/3b8c55ea.2c8c5b1d.js rename to assets/js/3b8c55ea.fe236857.js index 116ccb2c4..5e2c985b4 100644 --- a/assets/js/3b8c55ea.2c8c5b1d.js +++ b/assets/js/3b8c55ea.fe236857.js @@ -1 +1 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[3217],{6995:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var i=n(5893),l=n(1151);const s={sidebar_label:"Installation",title:""},r="Installation",a={id:"installation",title:"",description:"Overview",source:"@site/docs/installation.md",sourceDirName:".",slug:"/installation",permalink:"/next/installation",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Installation",title:""},sidebar:"docs",previous:{title:"Architecture",permalink:"/next/architecture"},next:{title:"Upgrade",permalink:"/next/upgrade"}},d={},c=[{value:"Overview",id:"overview",level:2},{value:"Elemental Operator Installation",id:"elemental-operator-installation",level:2},{value:"Prepare Kubernetes Resources",id:"prepare-kubernetes-resources",level:2},{value:"Prepare Installation Media",id:"prepare-installation-media",level:2},{value:"Start Installation Process",id:"start-installation-process",level:2},{value:"Deployed Elemental Teal Partition Table",id:"deployed-elemental-teal-partition-table",level:2},{value:"Elemental Teal Immutable Root",id:"elemental-teal-immutable-root",level:2}];function o(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.a)(),...e.components},{Vars:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Vars",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsxs)(t.p,{children:["Elemental stack provides OS management using OCI containers and Kubernetes. The Elemental\nstack installation encompasses the installation of the ",(0,i.jsx)(n,{name:"elemental_operator_name"})," into the\nmanagement cluster and the creation and use of Elemental Teal installation media to\nprovide the OS into the Cluster Nodes. See ",(0,i.jsx)(t.a,{href:"/next/architecture",children:"Architecture"})," section to read about the\ninteraction of the components."]}),"\n",(0,i.jsxs)(t.p,{children:["The installation configuration is mostly applied and set as part of the registration process.\nThe registration process is done by the ",(0,i.jsx)(t.code,{children:"elemental-register"})," (the ",(0,i.jsx)(n,{name:"elemental_operator_name"})," client part)\nwho is the responsible to register nodes in a Rancher management cluster and fetch the installation configuration."]}),"\n",(0,i.jsxs)(t.p,{children:["Please refer to the ",(0,i.jsx)(t.a,{href:"/next/quickstart-cli",children:"Quick Start"})," guide for simple step by step deployment instructions."]}),"\n",(0,i.jsx)(t.h2,{id:"elemental-operator-installation",children:"Elemental Operator Installation"}),"\n",(0,i.jsxs)(t.p,{children:["The ",(0,i.jsx)(n,{name:"elemental_operator_name"})," is responsible for managing the Elemental versions and\nmaintaining a machine inventory to assist with edge or bare metal installations. ",(0,i.jsx)(n,{name:"elemental_operator_name"}),"\nrequires a cluster including the Rancher Manager and it can be installed with a helm chart."]}),"\n",(0,i.jsxs)(t.p,{children:["See ",(0,i.jsx)(n,{name:"elemental_operator_name"})," ",(0,i.jsx)(t.a,{href:"/next/elementaloperatorchart-reference",children:"helm chart reference"})," for install,\nuninstall, upgrade and configuration details."]}),"\n",(0,i.jsx)(t.h2,{id:"prepare-kubernetes-resources",children:"Prepare Kubernetes Resources"}),"\n",(0,i.jsxs)(t.p,{children:["Once the ",(0,i.jsx)(n,{name:"elemental_operator_name"})," is up and running within the management cluster a couple of kubernetes\nresources are required in order to prepare an Elemental based cluster deployment."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.a,{href:"/next/machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate"}),":\nThis resource identifies the criteria to match registered boxes (listed as part of the MachineInventory)\nagainst available Rancher 2.6 Clusters. As soon as there is a match the selected kubernetes cluster takes\nownership of the registered box."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.a,{href:"/next/machineregistration-reference",children:"MachineRegistration"}),":\nThis resource defines OS deployment details for any machine attempting to register. The machine\nregistration is the entrance for Elemental nodes as it handles the authentication (based on TPM),\nthe Elemental Teal deployment and the node inclusion into to the MachineInventory so it can be added\nto a cluster when there is a match based on a MachineInventorySelectorTemplate. The MachineRegistration\nobject includes the machine registration URL that nodes use to register against it."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["A Rancher Cluster resource is also required to deploy Elemental, it can be manually created as exemplified in\nthe ",(0,i.jsx)(t.a,{href:"/next/quickstart-cli",children:"Quick Start"})," guide or created from the Rancher 2.6 UI."]}),"\n",(0,i.jsx)(t.h2,{id:"prepare-installation-media",children:"Prepare Installation Media"}),"\n",(0,i.jsxs)(t.p,{children:["The installation media is the media that will be used to kick start an Elemental Teal deployment. Currently\nthe supported media is a live ISO. The live ISO must include the registration configuration yaml hence it must\ncrafted once the MachineRegistration is created. The installation\nmedia is created by using the ",(0,i.jsx)(t.a,{href:"https://github.com/rancher/elemental/blob/main/.github/elemental-iso-add-registration",children:(0,i.jsx)(t.code,{children:"elemental-iso-add-registration"})}),"\nhelper script (see ",(0,i.jsx)(t.a,{href:"/next/quickstart-cli#preparing-the-iso",children:"quick start"})," guide)\nor by using the ",(0,i.jsx)(t.code,{children:"elemental build-iso"})," command line utility included as part of the ",(0,i.jsx)(n,{name:"elemental_toolkit_name",link:"elemental_toolkit_url/docs/creating-derivatives/build_iso"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:["The live ISO supports PXE booting for direct integration with ",(0,i.jsx)(t.a,{href:"https://documentation.suse.com/suma/4.3/en/suse-manager/client-configuration/autoinst-distributions.html#based-on-iso-image",children:"SUSE Manager"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:["Within MachineRegistration only a subset of OS installation parameters can be configured, all available parameters are listed\nat ",(0,i.jsx)(t.a,{href:"/next/machineregistration-reference",children:"MachineRegistration"})," reference page."]}),"\n",(0,i.jsxs)(t.p,{children:["In order to configure the installation beyond the common options provided within the\n",(0,i.jsx)(t.a,{href:"/next/machineregistration-reference#configelementalinstall",children:(0,i.jsx)(t.code,{children:"elemental.install"})})," section a ",(0,i.jsx)(t.code,{children:"config.yaml"}),"\nconfiguration file can be included into the ISO (see ",(0,i.jsx)(t.a,{href:"/next/customizing#custom-elemental-client-configuration-file",children:"Custom Images"}),").\nNote any configuration applied as part of ",(0,i.jsx)(t.code,{children:"elemental.install"})," section of the MachineRegistration will be\napplied on top of the settings included in any custom ",(0,i.jsx)(t.code,{children:"config.yaml"})," file."]}),"\n",(0,i.jsxs)(t.p,{children:["Most likely the cloud-init configuration is enough to configure and set the deployed node at boot, however\nif for some reason firstboot actions or scripts are required it is possible to also include\nRancher System Agent plans into the installation media. Refer to the ",(0,i.jsx)(t.a,{href:"/next/elemental-plans",children:"Elemental Plans"})," section for details and\nsome example plans. The plans could be included into the squashed rootfs at ",(0,i.jsx)(t.code,{children:"/var/lib/elemental/agent/plans"}),"\nfolder and they would be seen by the system agent at firstboot."]}),"\n",(0,i.jsx)(t.h2,{id:"start-installation-process",children:"Start Installation Process"}),"\n",(0,i.jsxs)(t.p,{children:["The installation starts by booting the installation media on a node. Once the installation media has booted it will\nattempt to contact the management cluster and register to it by calling ",(0,i.jsx)(t.code,{children:"elemental-register"})," command.\nAs the registration yaml configuration is already included into the ISO ",(0,i.jsx)(t.code,{children:"elemental-register"})," knows the registration URL and\nany other required data for the registration."]}),"\n",(0,i.jsx)(t.p,{children:"On a succeeded registration the installation media will start the Elemental Teal installation into the host based\non the configuration already included in the media and the MachineRegistration parameters. As soon as the installation\nis done the node is ready to reboot. The deployed Elemental Teal includes a system agent plan to\nkick start a regular rancher provisioning process to install the selected kubernetes version, once booted, after\nsome minutes the node installation is finalized and the node is included into the cluster and visible through\nthe Rancher UI."}),"\n",(0,i.jsx)(t.h2,{id:"deployed-elemental-teal-partition-table",children:"Deployed Elemental Teal Partition Table"}),"\n",(0,i.jsx)(t.p,{children:"Once Elemental Teal is installed the OS partition table, according to default values, will look like"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Label"}),(0,i.jsx)(t.th,{children:"Default Size"}),(0,i.jsx)(t.th,{children:"Contains"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"COS_GRUB"}),(0,i.jsx)(t.td,{children:"64 MiB"}),(0,i.jsx)(t.td,{children:"UEFI Boot partition"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"COS_STATE"}),(0,i.jsx)(t.td,{children:"15 GiB"}),(0,i.jsx)(t.td,{children:"A/B bootable file system images constructed from OCI images"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"COS_OEM"}),(0,i.jsx)(t.td,{children:"64 MiB"}),(0,i.jsx)(t.td,{children:"OEM cloud-config files and other data"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"COS_RECOVERY"}),(0,i.jsx)(t.td,{children:"8 GiB"}),(0,i.jsx)(t.td,{children:"Recovery file system image if COS_STATE is destroyed"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"COS_PERSISTENT"}),(0,i.jsx)(t.td,{children:"Remaining space"}),(0,i.jsx)(t.td,{children:"All contents of the persistent folders"})]})]})]}),"\n",(0,i.jsxs)(t.p,{children:["Note this is the basic structure of any OS built by the ",(0,i.jsx)(n,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})]}),"\n",(0,i.jsx)(t.h2,{id:"elemental-teal-immutable-root",children:"Elemental Teal Immutable Root"}),"\n",(0,i.jsx)(t.p,{children:"One of the characteristics of Elemental OSes is the setup of an immutable root filesystem where some ephemeral or\npersistent locations are applied on top of it. Elemental Teal default folders structure is listed in the\nmatrix below."}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Path"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Read-Only"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Ephemeral"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Persistent"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc/cni"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc/iscsi"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc/rancher"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc/ssh"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc/systemd"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/srv"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/home"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/opt"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/root"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/usr/libexec"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/cni"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/kubelet"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/longhorn"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/rancher"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/elemetal"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/NetworkManager"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/calico"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/log"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]})]})]})]})}function h(e={}){const{wrapper:t}={...(0,l.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>r});var i=n(7294);const l={},s=i.createContext(l);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[3217],{6995:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var i=n(5893),l=n(1151);const s={sidebar_label:"Installation",title:""},r="Installation",a={id:"installation",title:"",description:"Overview",source:"@site/docs/installation.md",sourceDirName:".",slug:"/installation",permalink:"/next/installation",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Installation",title:""},sidebar:"docs",previous:{title:"Architecture",permalink:"/next/architecture"},next:{title:"Upgrade",permalink:"/next/upgrade"}},d={},c=[{value:"Overview",id:"overview",level:2},{value:"Elemental Operator Installation",id:"elemental-operator-installation",level:2},{value:"Prepare Kubernetes Resources",id:"prepare-kubernetes-resources",level:2},{value:"Prepare Installation Media",id:"prepare-installation-media",level:2},{value:"Start Installation Process",id:"start-installation-process",level:2},{value:"Deployed Elemental Teal Partition Table",id:"deployed-elemental-teal-partition-table",level:2},{value:"Elemental Teal Immutable Root",id:"elemental-teal-immutable-root",level:2}];function o(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.a)(),...e.components},{Head:n,Vars:s}=t;return n||x("Head",!0),s||x("Vars",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n,{children:(0,i.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/installation"})}),"\n",(0,i.jsx)(t.h1,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsxs)(t.p,{children:["Elemental stack provides OS management using OCI containers and Kubernetes. The Elemental\nstack installation encompasses the installation of the ",(0,i.jsx)(s,{name:"elemental_operator_name"})," into the\nmanagement cluster and the creation and use of Elemental Teal installation media to\nprovide the OS into the Cluster Nodes. See ",(0,i.jsx)(t.a,{href:"/next/architecture",children:"Architecture"})," section to read about the\ninteraction of the components."]}),"\n",(0,i.jsxs)(t.p,{children:["The installation configuration is mostly applied and set as part of the registration process.\nThe registration process is done by the ",(0,i.jsx)(t.code,{children:"elemental-register"})," (the ",(0,i.jsx)(s,{name:"elemental_operator_name"})," client part)\nwho is the responsible to register nodes in a Rancher management cluster and fetch the installation configuration."]}),"\n",(0,i.jsxs)(t.p,{children:["Please refer to the ",(0,i.jsx)(t.a,{href:"/next/quickstart-cli",children:"Quick Start"})," guide for simple step by step deployment instructions."]}),"\n",(0,i.jsx)(t.h2,{id:"elemental-operator-installation",children:"Elemental Operator Installation"}),"\n",(0,i.jsxs)(t.p,{children:["The ",(0,i.jsx)(s,{name:"elemental_operator_name"})," is responsible for managing the Elemental versions and\nmaintaining a machine inventory to assist with edge or bare metal installations. ",(0,i.jsx)(s,{name:"elemental_operator_name"}),"\nrequires a cluster including the Rancher Manager and it can be installed with a helm chart."]}),"\n",(0,i.jsxs)(t.p,{children:["See ",(0,i.jsx)(s,{name:"elemental_operator_name"})," ",(0,i.jsx)(t.a,{href:"/next/elementaloperatorchart-reference",children:"helm chart reference"})," for install,\nuninstall, upgrade and configuration details."]}),"\n",(0,i.jsx)(t.h2,{id:"prepare-kubernetes-resources",children:"Prepare Kubernetes Resources"}),"\n",(0,i.jsxs)(t.p,{children:["Once the ",(0,i.jsx)(s,{name:"elemental_operator_name"})," is up and running within the management cluster a couple of kubernetes\nresources are required in order to prepare an Elemental based cluster deployment."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.a,{href:"/next/machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate"}),":\nThis resource identifies the criteria to match registered boxes (listed as part of the MachineInventory)\nagainst available Rancher 2.6 Clusters. As soon as there is a match the selected kubernetes cluster takes\nownership of the registered box."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.a,{href:"/next/machineregistration-reference",children:"MachineRegistration"}),":\nThis resource defines OS deployment details for any machine attempting to register. The machine\nregistration is the entrance for Elemental nodes as it handles the authentication (based on TPM),\nthe Elemental Teal deployment and the node inclusion into to the MachineInventory so it can be added\nto a cluster when there is a match based on a MachineInventorySelectorTemplate. The MachineRegistration\nobject includes the machine registration URL that nodes use to register against it."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["A Rancher Cluster resource is also required to deploy Elemental, it can be manually created as exemplified in\nthe ",(0,i.jsx)(t.a,{href:"/next/quickstart-cli",children:"Quick Start"})," guide or created from the Rancher 2.6 UI."]}),"\n",(0,i.jsx)(t.h2,{id:"prepare-installation-media",children:"Prepare Installation Media"}),"\n",(0,i.jsxs)(t.p,{children:["The installation media is the media that will be used to kick start an Elemental Teal deployment. Currently\nthe supported media is a live ISO. The live ISO must include the registration configuration yaml hence it must\ncrafted once the MachineRegistration is created. The installation\nmedia is created by using the ",(0,i.jsx)(t.a,{href:"https://github.com/rancher/elemental/blob/main/.github/elemental-iso-add-registration",children:(0,i.jsx)(t.code,{children:"elemental-iso-add-registration"})}),"\nhelper script (see ",(0,i.jsx)(t.a,{href:"/next/quickstart-cli#preparing-the-iso",children:"quick start"})," guide)\nor by using the ",(0,i.jsx)(t.code,{children:"elemental build-iso"})," command line utility included as part of the ",(0,i.jsx)(s,{name:"elemental_toolkit_name",link:"elemental_toolkit_url/docs/creating-derivatives/build_iso"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:["The live ISO supports PXE booting for direct integration with ",(0,i.jsx)(t.a,{href:"https://documentation.suse.com/suma/4.3/en/suse-manager/client-configuration/autoinst-distributions.html#based-on-iso-image",children:"SUSE Manager"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:["Within MachineRegistration only a subset of OS installation parameters can be configured, all available parameters are listed\nat ",(0,i.jsx)(t.a,{href:"/next/machineregistration-reference",children:"MachineRegistration"})," reference page."]}),"\n",(0,i.jsxs)(t.p,{children:["In order to configure the installation beyond the common options provided within the\n",(0,i.jsx)(t.a,{href:"/next/machineregistration-reference#configelementalinstall",children:(0,i.jsx)(t.code,{children:"elemental.install"})})," section a ",(0,i.jsx)(t.code,{children:"config.yaml"}),"\nconfiguration file can be included into the ISO (see ",(0,i.jsx)(t.a,{href:"/next/customizing#custom-elemental-client-configuration-file",children:"Custom Images"}),").\nNote any configuration applied as part of ",(0,i.jsx)(t.code,{children:"elemental.install"})," section of the MachineRegistration will be\napplied on top of the settings included in any custom ",(0,i.jsx)(t.code,{children:"config.yaml"})," file."]}),"\n",(0,i.jsxs)(t.p,{children:["Most likely the cloud-init configuration is enough to configure and set the deployed node at boot, however\nif for some reason firstboot actions or scripts are required it is possible to also include\nRancher System Agent plans into the installation media. Refer to the ",(0,i.jsx)(t.a,{href:"/next/elemental-plans",children:"Elemental Plans"})," section for details and\nsome example plans. The plans could be included into the squashed rootfs at ",(0,i.jsx)(t.code,{children:"/var/lib/elemental/agent/plans"}),"\nfolder and they would be seen by the system agent at firstboot."]}),"\n",(0,i.jsx)(t.h2,{id:"start-installation-process",children:"Start Installation Process"}),"\n",(0,i.jsxs)(t.p,{children:["The installation starts by booting the installation media on a node. Once the installation media has booted it will\nattempt to contact the management cluster and register to it by calling ",(0,i.jsx)(t.code,{children:"elemental-register"})," command.\nAs the registration yaml configuration is already included into the ISO ",(0,i.jsx)(t.code,{children:"elemental-register"})," knows the registration URL and\nany other required data for the registration."]}),"\n",(0,i.jsx)(t.p,{children:"On a succeeded registration the installation media will start the Elemental Teal installation into the host based\non the configuration already included in the media and the MachineRegistration parameters. As soon as the installation\nis done the node is ready to reboot. The deployed Elemental Teal includes a system agent plan to\nkick start a regular rancher provisioning process to install the selected kubernetes version, once booted, after\nsome minutes the node installation is finalized and the node is included into the cluster and visible through\nthe Rancher UI."}),"\n",(0,i.jsx)(t.h2,{id:"deployed-elemental-teal-partition-table",children:"Deployed Elemental Teal Partition Table"}),"\n",(0,i.jsx)(t.p,{children:"Once Elemental Teal is installed the OS partition table, according to default values, will look like"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Label"}),(0,i.jsx)(t.th,{children:"Default Size"}),(0,i.jsx)(t.th,{children:"Contains"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"COS_GRUB"}),(0,i.jsx)(t.td,{children:"64 MiB"}),(0,i.jsx)(t.td,{children:"UEFI Boot partition"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"COS_STATE"}),(0,i.jsx)(t.td,{children:"15 GiB"}),(0,i.jsx)(t.td,{children:"A/B bootable file system images constructed from OCI images"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"COS_OEM"}),(0,i.jsx)(t.td,{children:"64 MiB"}),(0,i.jsx)(t.td,{children:"OEM cloud-config files and other data"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"COS_RECOVERY"}),(0,i.jsx)(t.td,{children:"8 GiB"}),(0,i.jsx)(t.td,{children:"Recovery file system image if COS_STATE is destroyed"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"COS_PERSISTENT"}),(0,i.jsx)(t.td,{children:"Remaining space"}),(0,i.jsx)(t.td,{children:"All contents of the persistent folders"})]})]})]}),"\n",(0,i.jsxs)(t.p,{children:["Note this is the basic structure of any OS built by the ",(0,i.jsx)(s,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})]}),"\n",(0,i.jsx)(t.h2,{id:"elemental-teal-immutable-root",children:"Elemental Teal Immutable Root"}),"\n",(0,i.jsx)(t.p,{children:"One of the characteristics of Elemental OSes is the setup of an immutable root filesystem where some ephemeral or\npersistent locations are applied on top of it. Elemental Teal default folders structure is listed in the\nmatrix below."}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Path"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Read-Only"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Ephemeral"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Persistent"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc/cni"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc/iscsi"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc/rancher"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc/ssh"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc/systemd"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/srv"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/home"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/opt"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/root"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/usr/libexec"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/cni"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/kubelet"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/longhorn"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/rancher"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/elemetal"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/NetworkManager"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/calico"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/log"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]})]})]})]})}function h(e={}){const{wrapper:t}={...(0,l.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}function x(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>r});var i=n(7294);const l={},s=i.createContext(l);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3cb329d3.7dd00817.js b/assets/js/3cb329d3.7dd00817.js deleted file mode 100644 index a0062329e..000000000 --- a/assets/js/3cb329d3.7dd00817.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6609],{8703:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>o});var i=t(5893),r=t(1151);const s={sidebar_label:"MachineRegistration reference",title:""},l="MachineRegistration reference",a={id:"machineregistration-reference",title:"",description:"The MachineRegistration resource is the responsible of defining a machine registration end point. Once created it generates a registration URL used by nodes to register so they are inventoried.",source:"@site/versioned_docs/version-1.3/machineregistration-reference.md",sourceDirName:".",slug:"/machineregistration-reference",permalink:"/machineregistration-reference",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"MachineRegistration reference",title:""},sidebar:"docs",previous:{title:"Cloud-config reference",permalink:"/cloud-config-reference"},next:{title:"MachineInventorySelectorTemplate reference",permalink:"/machineinventoryselectortemplate-reference"}},d={},o=[{value:"config.cloud-config",id:"configcloud-config",level:4},{value:"config.elemental.registration",id:"configelementalregistration",level:4},{value:"config.elemental.install",id:"configelementalinstall",level:4},{value:"config.elemental.reset",id:"configelementalreset",level:4},{value:"machineName",id:"machinename",level:4},{value:"machineInventoryLabels",id:"machineinventorylabels",level:4},{value:"machineInventoryAnnotations",id:"machineinventoryannotations",level:4}];function c(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",h1:"h1",h4:"h4",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.a)(),...e.components},{Details:t,Vars:s}=n;return t||m("Details",!0),s||m("Vars",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"machineregistration-reference",children:"MachineRegistration reference"}),"\n",(0,i.jsx)(n.p,{children:"The MachineRegistration resource is the responsible of defining a machine registration end point. Once created it generates a registration URL used by nodes to register so they are inventoried."}),"\n",(0,i.jsxs)(n.p,{children:["There are several keys that can be configured under a ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," resource spec."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="MachineRegistration" showLineNumbers',children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineName: name\n machineInventoryLabels:\n label: value\n machineInventoryAnnotations:\n annotation: value\n config:\n cloud-config:\n ...\n elemental:\n registration:\n ...\n install:\n ... \n"})}),"\n",(0,i.jsx)(n.h4,{id:"configcloud-config",children:"config.cloud-config"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the cloud-configuration to be injected in the node. See the ",(0,i.jsx)(n.a,{href:"/cloud-config-reference",children:"Cloud Config Reference"})," for full information."]}),"\n",(0,i.jsx)(n.h4,{id:"configelementalregistration",children:"config.elemental.registration"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the configuration used for the connection and the initial registration to the ",(0,i.jsx)(s,{name:"elemental_operator_name"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Supports the following values:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"url"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsxs)(n.td,{children:["URL to connect to the ",(0,i.jsx)(s,{name:"elemental_operator_name"})]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"ca-cert"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"CA to validate the certificate provided by the server at 'url' (required if the certificate is not signed by a public CA)"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"no-smbios"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsxs)(n.td,{children:["Whether SMBIOS data should be sent to the ",(0,i.jsx)(s,{name:"elemental_operator_name"})," (see the ",(0,i.jsx)(n.a,{href:"/smbios",children:"SMBIOS reference"})," for more information)"]})]})]})]}),"\n",(0,i.jsxs)(n.admonition,{type:"warning",children:[(0,i.jsx)(n.p,{children:"The following values are for development purposes only."}),(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"emulate-tpm"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"This will use software emulation of the TPM (required for hosts without TPM hardware)"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"emulated-tpm-seed"}),(0,i.jsx)(n.td,{children:"int64"}),(0,i.jsx)(n.td,{children:"1"}),(0,i.jsxs)(n.td,{children:["Fixed seed to use with 'emulate-tpm'. Set to -1 to get a random seed. See ",(0,i.jsx)(n.a,{href:"/tpm",children:"TPM"})," for more information"]})]})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"configelementalinstall",children:"config.elemental.install"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the installation configuration that would be applied via ",(0,i.jsx)(n.code,{children:"elemental-register --install"})," when booted from an ISO and passed to ",(0,i.jsx)(n.a,{href:"https://github.com/rancher/elemental-toolkit/blob/main/docs/elemental_install.md",children:(0,i.jsx)(n.code,{children:"elemental install"})})]}),"\n",(0,i.jsx)(n.p,{children:"Supports the following values:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"firmware"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"efi"}),(0,i.jsx)(n.td,{children:"Firmware to install ('efi' or 'bios')"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"device"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Device to install the system to"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"no-format"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Don\u2019t format disks. It is implied that COS_STATE, COS_RECOVERY, COS_PERSISTENT, COS_OEM partitions are already existing on the target disk"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"config-urls"}),(0,i.jsx)(n.td,{children:"list"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Cloud-init config files locations"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"iso"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Performs an installation from the ISO url instead of the running ISO"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"system-uri"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsxs)(n.td,{children:["Sets the system image source and its type (e.g. 'docker",":registry",".org/image",":tag","') instead of using the running ISO"]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"debug"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Enable debug output"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"tty"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Add named tty to grub"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"poweroff"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Shutdown the system after install"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"reboot"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Reboot the system after install"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"eject-cd"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Try to eject the cd on reboot"})]})]})]}),"\n",(0,i.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,i.jsxs)(n.p,{children:["In case of using both ",(0,i.jsx)(n.code,{children:"iso"})," and ",(0,i.jsx)(n.code,{children:"system-uri"})," the ",(0,i.jsx)(n.code,{children:"iso"})," value takes precedence"]})}),"\n",(0,i.jsxs)(n.p,{children:["The only required value for a successful installation is the ",(0,i.jsx)(n.code,{children:"device"})," key as we need a target disk to install to. The rest of the parameters are all optional."]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n elemental:\n install:\n device: /dev/sda\n debug: true\n reboot: true\n eject-cd: true\n system-uri: registry.suse.com/rancher/elemental-teal/5.4:latest\n"})})]}),"\n",(0,i.jsx)(n.h4,{id:"configelementalreset",children:"config.elemental.reset"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the reset configuration that would be applied via ",(0,i.jsx)(n.code,{children:"elemental-register --reset"}),", when booted from the recovery partition and passed to ",(0,i.jsx)(n.a,{href:"https://github.com/rancher/elemental-toolkit/blob/main/docs/elemental_reset.md",children:(0,i.jsx)(n.code,{children:"elemental reset"})})]}),"\n",(0,i.jsx)(n.p,{children:"Supports the following values:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"enabled"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"MachineInventories created from this MachineRegistration will have reset functionality enabled"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"reset-persistent"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"true"}),(0,i.jsx)(n.td,{children:"Format the COS_PERSISTENT partition"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"reset-oem"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"true"}),(0,i.jsx)(n.td,{children:"Format the COS_OEM partition"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"config-urls"}),(0,i.jsx)(n.td,{children:"list"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Cloud-init config files"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"system-uri"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsxs)(n.td,{children:["Sets the system image source and its type (e.g. 'docker",":registry",".org/image",":tag","') instead of using the running ISO"]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"debug"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Enable debug output"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"poweroff"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Shutdown the system after reset"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"reboot"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"true"}),(0,i.jsx)(n.td,{children:"Reboot the system after reset"})]})]})]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n elemental:\n reset:\n enabled: true\n debug: true\n reset-persistent: true\n reset-oem: true\n reboot: true\n system-uri: registry.opensuse.org/isv/rancher/elemental/stable/teal53/15.4/rancher/elemental-teal/5.3:latest\n"})})]}),"\n",(0,i.jsx)(n.h4,{id:"machinename",children:"machineName"}),"\n",(0,i.jsxs)(n.p,{children:["This refers to the name that will be set to the node and the kubernetes resources that require a hostname (rke2 deployed pods for example, they use the node hostname as part of the pod names)\n",(0,i.jsx)(n.code,{children:"String"})," type."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["When ",(0,i.jsx)(n.code,{children:"elemental:registration:no-smbios"})," is set to ",(0,i.jsx)(n.code,{children:"false"})," (default), machineName is interpolated with ",(0,i.jsx)(n.a,{href:"https://www.dmtf.org/standards/smbios",children:"SMBIOS"})," data which allows you to store hardware information.\nSee our ",(0,i.jsx)(n.a,{href:"/smbios",children:"SMBIOS docs"})," for more information.\nIf no ",(0,i.jsx)(n.code,{children:"machineName"})," is specified, a default one in the form ",(0,i.jsx)(n.code,{children:"m-$UUID"})," will be set.\nThe UUID will be retrieved from the SMBIOS data if available, otherwise a random UUID will be generated."]})}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineName: hostname-test-4\n"})})]}),"\n",(0,i.jsx)(n.h4,{id:"machineinventorylabels",children:"machineInventoryLabels"}),"\n",(0,i.jsxs)(n.p,{children:["Labels that will be set to the ",(0,i.jsx)(n.code,{children:"MachineInventory"})," that is created from this ",(0,i.jsx)(n.code,{children:"MachineRegistration"}),"\n",(0,i.jsx)(n.code,{children:"Key: value"})," type. These labels will be used to establish a selection criteria in ",(0,i.jsx)(n.a,{href:"/machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Elemental Teal nodes will run ",(0,i.jsx)(n.code,{children:"elemental-register"})," every 24 hours.",(0,i.jsx)(n.br,{}),"\n","It is possible to update the ",(0,i.jsx)(n.code,{children:"machineInventoryLabels"})," so that all registered nodes will apply the new labels on the next successfull registration update."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["When ",(0,i.jsx)(n.code,{children:"elemental:registration:no-smbios"})," is set to ",(0,i.jsx)(n.code,{children:"false"})," (default), Labels are interpolated with ",(0,i.jsx)(n.a,{href:"https://www.dmtf.org/standards/smbios",children:"SMBIOS"})," data. This allows to store hardware information in custom labels.\nSee our ",(0,i.jsx)(n.a,{href:"/smbios",children:"SMBIOS docs"})," for more information."]})}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineInventoryLabels:\n my.prefix.io/element: fire\n my.prefix.io/cpus: 32\n my.prefix.io/manufacturer: "${System Information/Manufacturer}"\n my.prefix.io/productName: "${System Information/Product Name}"\n my.prefix.io/serialNumber: "${System Information/Serial Number}"\n my.prefix.io/machineUUID: "${System Information/UUID}"\n'})})]}),"\n",(0,i.jsx)(n.h4,{id:"machineinventoryannotations",children:"machineInventoryAnnotations"}),"\n",(0,i.jsxs)(n.p,{children:["Annotations that will be set to the ",(0,i.jsx)(n.code,{children:"MachineInventory"})," that is created from this ",(0,i.jsx)(n.code,{children:"MachineRegistration"}),"\n",(0,i.jsx)(n.code,{children:"Key: value"})," type"]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineInventoryAnnotations:\n owner: bob\n version: 1.0.0\n"})})]})]})}function h(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}function m(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>l});var i=t(7294);const r={},s=i.createContext(r);function l(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3cb329d3.cad8a96d.js b/assets/js/3cb329d3.cad8a96d.js new file mode 100644 index 000000000..a08782302 --- /dev/null +++ b/assets/js/3cb329d3.cad8a96d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6609],{8703:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>o});var i=t(5893),r=t(1151);const s={sidebar_label:"MachineRegistration reference",title:""},l="MachineRegistration reference",a={id:"machineregistration-reference",title:"",description:"The MachineRegistration resource is the responsible of defining a machine registration end point. Once created it generates a registration URL used by nodes to register so they are inventoried.",source:"@site/versioned_docs/version-1.3/machineregistration-reference.md",sourceDirName:".",slug:"/machineregistration-reference",permalink:"/machineregistration-reference",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"MachineRegistration reference",title:""},sidebar:"docs",previous:{title:"Cloud-config reference",permalink:"/cloud-config-reference"},next:{title:"MachineInventorySelectorTemplate reference",permalink:"/machineinventoryselectortemplate-reference"}},d={},o=[{value:"config.cloud-config",id:"configcloud-config",level:4},{value:"config.elemental.registration",id:"configelementalregistration",level:4},{value:"config.elemental.install",id:"configelementalinstall",level:4},{value:"config.elemental.reset",id:"configelementalreset",level:4},{value:"machineName",id:"machinename",level:4},{value:"machineInventoryLabels",id:"machineinventorylabels",level:4},{value:"machineInventoryAnnotations",id:"machineinventoryannotations",level:4}];function c(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",h1:"h1",h4:"h4",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.a)(),...e.components},{Details:t,Head:s,Vars:l}=n;return t||m("Details",!0),s||m("Head",!0),l||m("Vars",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s,{children:(0,i.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/machineregistration-reference"})}),"\n",(0,i.jsx)(n.h1,{id:"machineregistration-reference",children:"MachineRegistration reference"}),"\n",(0,i.jsx)(n.p,{children:"The MachineRegistration resource is the responsible of defining a machine registration end point. Once created it generates a registration URL used by nodes to register so they are inventoried."}),"\n",(0,i.jsxs)(n.p,{children:["There are several keys that can be configured under a ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," resource spec."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="MachineRegistration" showLineNumbers',children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineName: name\n machineInventoryLabels:\n label: value\n machineInventoryAnnotations:\n annotation: value\n config:\n cloud-config:\n ...\n elemental:\n registration:\n ...\n install:\n ... \n"})}),"\n",(0,i.jsx)(n.h4,{id:"configcloud-config",children:"config.cloud-config"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the cloud-configuration to be injected in the node. See the ",(0,i.jsx)(n.a,{href:"/cloud-config-reference",children:"Cloud Config Reference"})," for full information."]}),"\n",(0,i.jsx)(n.h4,{id:"configelementalregistration",children:"config.elemental.registration"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the configuration used for the connection and the initial registration to the ",(0,i.jsx)(l,{name:"elemental_operator_name"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Supports the following values:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"url"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsxs)(n.td,{children:["URL to connect to the ",(0,i.jsx)(l,{name:"elemental_operator_name"})]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"ca-cert"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"CA to validate the certificate provided by the server at 'url' (required if the certificate is not signed by a public CA)"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"no-smbios"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsxs)(n.td,{children:["Whether SMBIOS data should be sent to the ",(0,i.jsx)(l,{name:"elemental_operator_name"})," (see the ",(0,i.jsx)(n.a,{href:"/smbios",children:"SMBIOS reference"})," for more information)"]})]})]})]}),"\n",(0,i.jsxs)(n.admonition,{type:"warning",children:[(0,i.jsx)(n.p,{children:"The following values are for development purposes only."}),(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"emulate-tpm"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"This will use software emulation of the TPM (required for hosts without TPM hardware)"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"emulated-tpm-seed"}),(0,i.jsx)(n.td,{children:"int64"}),(0,i.jsx)(n.td,{children:"1"}),(0,i.jsxs)(n.td,{children:["Fixed seed to use with 'emulate-tpm'. Set to -1 to get a random seed. See ",(0,i.jsx)(n.a,{href:"/tpm",children:"TPM"})," for more information"]})]})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"configelementalinstall",children:"config.elemental.install"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the installation configuration that would be applied via ",(0,i.jsx)(n.code,{children:"elemental-register --install"})," when booted from an ISO and passed to ",(0,i.jsx)(n.a,{href:"https://github.com/rancher/elemental-toolkit/blob/main/docs/elemental_install.md",children:(0,i.jsx)(n.code,{children:"elemental install"})})]}),"\n",(0,i.jsx)(n.p,{children:"Supports the following values:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"firmware"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"efi"}),(0,i.jsx)(n.td,{children:"Firmware to install ('efi' or 'bios')"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"device"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Device to install the system to"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"no-format"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Don\u2019t format disks. It is implied that COS_STATE, COS_RECOVERY, COS_PERSISTENT, COS_OEM partitions are already existing on the target disk"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"config-urls"}),(0,i.jsx)(n.td,{children:"list"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Cloud-init config files locations"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"iso"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Performs an installation from the ISO url instead of the running ISO"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"system-uri"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsxs)(n.td,{children:["Sets the system image source and its type (e.g. 'docker",":registry",".org/image",":tag","') instead of using the running ISO"]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"debug"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Enable debug output"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"tty"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Add named tty to grub"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"poweroff"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Shutdown the system after install"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"reboot"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Reboot the system after install"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"eject-cd"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Try to eject the cd on reboot"})]})]})]}),"\n",(0,i.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,i.jsxs)(n.p,{children:["In case of using both ",(0,i.jsx)(n.code,{children:"iso"})," and ",(0,i.jsx)(n.code,{children:"system-uri"})," the ",(0,i.jsx)(n.code,{children:"iso"})," value takes precedence"]})}),"\n",(0,i.jsxs)(n.p,{children:["The only required value for a successful installation is the ",(0,i.jsx)(n.code,{children:"device"})," key as we need a target disk to install to. The rest of the parameters are all optional."]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n elemental:\n install:\n device: /dev/sda\n debug: true\n reboot: true\n eject-cd: true\n system-uri: registry.suse.com/rancher/elemental-teal/5.4:latest\n"})})]}),"\n",(0,i.jsx)(n.h4,{id:"configelementalreset",children:"config.elemental.reset"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the reset configuration that would be applied via ",(0,i.jsx)(n.code,{children:"elemental-register --reset"}),", when booted from the recovery partition and passed to ",(0,i.jsx)(n.a,{href:"https://github.com/rancher/elemental-toolkit/blob/main/docs/elemental_reset.md",children:(0,i.jsx)(n.code,{children:"elemental reset"})})]}),"\n",(0,i.jsx)(n.p,{children:"Supports the following values:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"enabled"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"MachineInventories created from this MachineRegistration will have reset functionality enabled"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"reset-persistent"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"true"}),(0,i.jsx)(n.td,{children:"Format the COS_PERSISTENT partition"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"reset-oem"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"true"}),(0,i.jsx)(n.td,{children:"Format the COS_OEM partition"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"config-urls"}),(0,i.jsx)(n.td,{children:"list"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Cloud-init config files"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"system-uri"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsxs)(n.td,{children:["Sets the system image source and its type (e.g. 'docker",":registry",".org/image",":tag","') instead of using the running ISO"]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"debug"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Enable debug output"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"poweroff"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Shutdown the system after reset"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"reboot"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"true"}),(0,i.jsx)(n.td,{children:"Reboot the system after reset"})]})]})]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n elemental:\n reset:\n enabled: true\n debug: true\n reset-persistent: true\n reset-oem: true\n reboot: true\n system-uri: registry.opensuse.org/isv/rancher/elemental/stable/teal53/15.4/rancher/elemental-teal/5.3:latest\n"})})]}),"\n",(0,i.jsx)(n.h4,{id:"machinename",children:"machineName"}),"\n",(0,i.jsxs)(n.p,{children:["This refers to the name that will be set to the node and the kubernetes resources that require a hostname (rke2 deployed pods for example, they use the node hostname as part of the pod names)\n",(0,i.jsx)(n.code,{children:"String"})," type."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["When ",(0,i.jsx)(n.code,{children:"elemental:registration:no-smbios"})," is set to ",(0,i.jsx)(n.code,{children:"false"})," (default), machineName is interpolated with ",(0,i.jsx)(n.a,{href:"https://www.dmtf.org/standards/smbios",children:"SMBIOS"})," data which allows you to store hardware information.\nSee our ",(0,i.jsx)(n.a,{href:"/smbios",children:"SMBIOS docs"})," for more information.\nIf no ",(0,i.jsx)(n.code,{children:"machineName"})," is specified, a default one in the form ",(0,i.jsx)(n.code,{children:"m-$UUID"})," will be set.\nThe UUID will be retrieved from the SMBIOS data if available, otherwise a random UUID will be generated."]})}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineName: hostname-test-4\n"})})]}),"\n",(0,i.jsx)(n.h4,{id:"machineinventorylabels",children:"machineInventoryLabels"}),"\n",(0,i.jsxs)(n.p,{children:["Labels that will be set to the ",(0,i.jsx)(n.code,{children:"MachineInventory"})," that is created from this ",(0,i.jsx)(n.code,{children:"MachineRegistration"}),"\n",(0,i.jsx)(n.code,{children:"Key: value"})," type. These labels will be used to establish a selection criteria in ",(0,i.jsx)(n.a,{href:"/machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Elemental Teal nodes will run ",(0,i.jsx)(n.code,{children:"elemental-register"})," every 24 hours.",(0,i.jsx)(n.br,{}),"\n","It is possible to update the ",(0,i.jsx)(n.code,{children:"machineInventoryLabels"})," so that all registered nodes will apply the new labels on the next successfull registration update."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["When ",(0,i.jsx)(n.code,{children:"elemental:registration:no-smbios"})," is set to ",(0,i.jsx)(n.code,{children:"false"})," (default), Labels are interpolated with ",(0,i.jsx)(n.a,{href:"https://www.dmtf.org/standards/smbios",children:"SMBIOS"})," data. This allows to store hardware information in custom labels.\nSee our ",(0,i.jsx)(n.a,{href:"/smbios",children:"SMBIOS docs"})," for more information."]})}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineInventoryLabels:\n my.prefix.io/element: fire\n my.prefix.io/cpus: 32\n my.prefix.io/manufacturer: "${System Information/Manufacturer}"\n my.prefix.io/productName: "${System Information/Product Name}"\n my.prefix.io/serialNumber: "${System Information/Serial Number}"\n my.prefix.io/machineUUID: "${System Information/UUID}"\n'})})]}),"\n",(0,i.jsx)(n.h4,{id:"machineinventoryannotations",children:"machineInventoryAnnotations"}),"\n",(0,i.jsxs)(n.p,{children:["Annotations that will be set to the ",(0,i.jsx)(n.code,{children:"MachineInventory"})," that is created from this ",(0,i.jsx)(n.code,{children:"MachineRegistration"}),"\n",(0,i.jsx)(n.code,{children:"Key: value"})," type"]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineInventoryAnnotations:\n owner: bob\n version: 1.0.0\n"})})]})]})}function h(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}function m(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>l});var i=t(7294);const r={},s=i.createContext(r);function l(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3d72abfc.db76b006.js b/assets/js/3d72abfc.1d97420d.js similarity index 92% rename from assets/js/3d72abfc.db76b006.js rename to assets/js/3d72abfc.1d97420d.js index b211baae6..14d7eedec 100644 --- a/assets/js/3d72abfc.db76b006.js +++ b/assets/js/3d72abfc.1d97420d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[3594],{9774:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var i=n(5893),l=n(1151);const s={sidebar_label:"Installation",title:""},r="Installation",a={id:"installation",title:"",description:"Overview",source:"@site/versioned_docs/version-1.3/installation.md",sourceDirName:".",slug:"/installation",permalink:"/installation",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Installation",title:""},sidebar:"docs",previous:{title:"Architecture",permalink:"/architecture"},next:{title:"Upgrade",permalink:"/upgrade"}},d={},c=[{value:"Overview",id:"overview",level:2},{value:"Elemental Operator Installation",id:"elemental-operator-installation",level:2},{value:"Prepare Kubernetes Resources",id:"prepare-kubernetes-resources",level:2},{value:"Prepare Installation Media",id:"prepare-installation-media",level:2},{value:"Start Installation Process",id:"start-installation-process",level:2},{value:"Deployed Elemental Teal Partition Table",id:"deployed-elemental-teal-partition-table",level:2},{value:"Elemental Teal Immutable Root",id:"elemental-teal-immutable-root",level:2}];function o(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.a)(),...e.components},{Vars:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Vars",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsxs)(t.p,{children:["Elemental stack provides OS management using OCI containers and Kubernetes. The Elemental\nstack installation encompasses the installation of the ",(0,i.jsx)(n,{name:"elemental_operator_name"})," into the\nmanagement cluster and the creation and use of Elemental Teal installation media to\nprovide the OS into the Cluster Nodes. See ",(0,i.jsx)(t.a,{href:"/architecture",children:"Architecture"})," section to read about the\ninteraction of the components."]}),"\n",(0,i.jsxs)(t.p,{children:["The installation configuration is mostly applied and set as part of the registration process.\nThe registration process is done by the ",(0,i.jsx)(t.code,{children:"elemental-register"})," (the ",(0,i.jsx)(n,{name:"elemental_operator_name"})," client part)\nwho is the responsible to register nodes in a Rancher management cluster and fetch the installation configuration."]}),"\n",(0,i.jsxs)(t.p,{children:["Please refer to the ",(0,i.jsx)(t.a,{href:"/quickstart-cli",children:"Quick Start"})," guide for simple step by step deployment instructions."]}),"\n",(0,i.jsx)(t.h2,{id:"elemental-operator-installation",children:"Elemental Operator Installation"}),"\n",(0,i.jsxs)(t.p,{children:["The ",(0,i.jsx)(n,{name:"elemental_operator_name"})," is responsible for managing the Elemental versions and\nmaintaining a machine inventory to assist with edge or bare metal installations. ",(0,i.jsx)(n,{name:"elemental_operator_name"}),"\nrequires a cluster including the Rancher Manager and it can be installed with a helm chart."]}),"\n",(0,i.jsxs)(t.p,{children:["See ",(0,i.jsx)(n,{name:"elemental_operator_name"})," ",(0,i.jsx)(t.a,{href:"/elementaloperatorchart-reference",children:"helm chart reference"})," for install,\nuninstall, upgrade and configuration details."]}),"\n",(0,i.jsx)(t.h2,{id:"prepare-kubernetes-resources",children:"Prepare Kubernetes Resources"}),"\n",(0,i.jsxs)(t.p,{children:["Once the ",(0,i.jsx)(n,{name:"elemental_operator_name"})," is up and running within the management cluster a couple of kubernetes\nresources are required in order to prepare an Elemental based cluster deployment."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.a,{href:"/machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate"}),":\nThis resource identifies the criteria to match registered boxes (listed as part of the MachineInventory)\nagainst available Rancher 2.6 Clusters. As soon as there is a match the selected kubernetes cluster takes\nownership of the registered box."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.a,{href:"/machineregistration-reference",children:"MachineRegistration"}),":\nThis resource defines OS deployment details for any machine attempting to register. The machine\nregistration is the entrance for Elemental nodes as it handles the authentication (based on TPM),\nthe Elemental Teal deployment and the node inclusion into to the MachineInventory so it can be added\nto a cluster when there is a match based on a MachineInventorySelectorTemplate. The MachineRegistration\nobject includes the machine registration URL that nodes use to register against it."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["A Rancher Cluster resource is also required to deploy Elemental, it can be manually created as exemplified in\nthe ",(0,i.jsx)(t.a,{href:"/quickstart-cli",children:"Quick Start"})," guide or created from the Rancher 2.6 UI."]}),"\n",(0,i.jsx)(t.h2,{id:"prepare-installation-media",children:"Prepare Installation Media"}),"\n",(0,i.jsxs)(t.p,{children:["The installation media is the media that will be used to kick start an Elemental Teal deployment. Currently\nthe supported media is a live ISO. The live ISO must include the registration configuration yaml hence it must\ncrafted once the MachineRegistration is created. The installation\nmedia is created by using the ",(0,i.jsx)(t.a,{href:"https://github.com/rancher/elemental/blob/main/.github/elemental-iso-add-registration",children:(0,i.jsx)(t.code,{children:"elemental-iso-add-registration"})}),"\nhelper script (see ",(0,i.jsx)(t.a,{href:"/quickstart-cli#preparing-the-iso",children:"quick start"})," guide)\nor by using the ",(0,i.jsx)(t.code,{children:"elemental build-iso"})," command line utility included as part of the ",(0,i.jsx)(n,{name:"elemental_toolkit_name",link:"elemental_toolkit_url/docs/creating-derivatives/build_iso"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:["The live ISO supports PXE booting for direct integration with ",(0,i.jsx)(t.a,{href:"https://documentation.suse.com/suma/4.3/en/suse-manager/client-configuration/autoinst-distributions.html#based-on-iso-image",children:"SUSE Manager"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:["Within MachineRegistration only a subset of OS installation parameters can be configured, all available parameters are listed\nat ",(0,i.jsx)(t.a,{href:"/machineregistration-reference",children:"MachineRegistration"})," reference page."]}),"\n",(0,i.jsxs)(t.p,{children:["In order to configure the installation beyond the common options provided within the\n",(0,i.jsx)(t.a,{href:"/machineregistration-reference#configelementalinstall",children:(0,i.jsx)(t.code,{children:"elemental.install"})})," section a ",(0,i.jsx)(t.code,{children:"config.yaml"}),"\nconfiguration file can be included into the ISO (see ",(0,i.jsx)(t.a,{href:"/customizing#custom-elemental-client-configuration-file",children:"Custom Images"}),").\nNote any configuration applied as part of ",(0,i.jsx)(t.code,{children:"elemental.install"})," section of the MachineRegistration will be\napplied on top of the settings included in any custom ",(0,i.jsx)(t.code,{children:"config.yaml"})," file."]}),"\n",(0,i.jsxs)(t.p,{children:["Most likely the cloud-init configuration is enough to configure and set the deployed node at boot, however\nif for some reason firstboot actions or scripts are required it is possible to also include\nRancher System Agent plans into the installation media. Refer to the ",(0,i.jsx)(t.a,{href:"/elemental-plans",children:"Elemental Plans"})," section for details and\nsome example plans. The plans could be included into the squashed rootfs at ",(0,i.jsx)(t.code,{children:"/var/lib/elemental/agent/plans"}),"\nfolder and they would be seen by the system agent at firstboot."]}),"\n",(0,i.jsx)(t.h2,{id:"start-installation-process",children:"Start Installation Process"}),"\n",(0,i.jsxs)(t.p,{children:["The installation starts by booting the installation media on a node. Once the installation media has booted it will\nattempt to contact the management cluster and register to it by calling ",(0,i.jsx)(t.code,{children:"elemental-register"})," command.\nAs the registration yaml configuration is already included into the ISO ",(0,i.jsx)(t.code,{children:"elemental-register"})," knows the registration URL and\nany other required data for the registration."]}),"\n",(0,i.jsx)(t.p,{children:"On a succeeded registration the installation media will start the Elemental Teal installation into the host based\non the configuration already included in the media and the MachineRegistration parameters. As soon as the installation\nis done the node is ready to reboot. The deployed Elemental Teal includes a system agent plan to\nkick start a regular rancher provisioning process to install the selected kubernetes version, once booted, after\nsome minutes the node installation is finalized and the node is included into the cluster and visible through\nthe Rancher UI."}),"\n",(0,i.jsx)(t.h2,{id:"deployed-elemental-teal-partition-table",children:"Deployed Elemental Teal Partition Table"}),"\n",(0,i.jsx)(t.p,{children:"Once Elemental Teal is installed the OS partition table, according to default values, will look like"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Label"}),(0,i.jsx)(t.th,{children:"Default Size"}),(0,i.jsx)(t.th,{children:"Contains"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"COS_GRUB"}),(0,i.jsx)(t.td,{children:"64 MiB"}),(0,i.jsx)(t.td,{children:"UEFI Boot partition"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"COS_STATE"}),(0,i.jsx)(t.td,{children:"15 GiB"}),(0,i.jsx)(t.td,{children:"A/B bootable file system images constructed from OCI images"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"COS_OEM"}),(0,i.jsx)(t.td,{children:"64 MiB"}),(0,i.jsx)(t.td,{children:"OEM cloud-config files and other data"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"COS_RECOVERY"}),(0,i.jsx)(t.td,{children:"8 GiB"}),(0,i.jsx)(t.td,{children:"Recovery file system image if COS_STATE is destroyed"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"COS_PERSISTENT"}),(0,i.jsx)(t.td,{children:"Remaining space"}),(0,i.jsx)(t.td,{children:"All contents of the persistent folders"})]})]})]}),"\n",(0,i.jsxs)(t.p,{children:["Note this is the basic structure of any OS built by the ",(0,i.jsx)(n,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})]}),"\n",(0,i.jsx)(t.h2,{id:"elemental-teal-immutable-root",children:"Elemental Teal Immutable Root"}),"\n",(0,i.jsx)(t.p,{children:"One of the characteristics of Elemental OSes is the setup of an immutable root filesystem where some ephemeral or\npersistent locations are applied on top of it. Elemental Teal default folders structure is listed in the\nmatrix below."}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Path"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Read-Only"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Ephemeral"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Persistent"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc/cni"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc/iscsi"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc/rancher"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc/ssh"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc/systemd"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/srv"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/home"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/opt"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/root"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/usr/libexec"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/cni"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/kubelet"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/longhorn"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/rancher"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/elemetal"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/NetworkManager"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/calico"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/log"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]})]})]})]})}function h(e={}){const{wrapper:t}={...(0,l.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>r});var i=n(7294);const l={},s=i.createContext(l);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[3594],{9774:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var i=n(5893),l=n(1151);const s={sidebar_label:"Installation",title:""},r="Installation",a={id:"installation",title:"",description:"Overview",source:"@site/versioned_docs/version-1.3/installation.md",sourceDirName:".",slug:"/installation",permalink:"/installation",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Installation",title:""},sidebar:"docs",previous:{title:"Architecture",permalink:"/architecture"},next:{title:"Upgrade",permalink:"/upgrade"}},d={},c=[{value:"Overview",id:"overview",level:2},{value:"Elemental Operator Installation",id:"elemental-operator-installation",level:2},{value:"Prepare Kubernetes Resources",id:"prepare-kubernetes-resources",level:2},{value:"Prepare Installation Media",id:"prepare-installation-media",level:2},{value:"Start Installation Process",id:"start-installation-process",level:2},{value:"Deployed Elemental Teal Partition Table",id:"deployed-elemental-teal-partition-table",level:2},{value:"Elemental Teal Immutable Root",id:"elemental-teal-immutable-root",level:2}];function o(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.a)(),...e.components},{Head:n,Vars:s}=t;return n||x("Head",!0),s||x("Vars",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n,{children:(0,i.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/installation"})}),"\n",(0,i.jsx)(t.h1,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsxs)(t.p,{children:["Elemental stack provides OS management using OCI containers and Kubernetes. The Elemental\nstack installation encompasses the installation of the ",(0,i.jsx)(s,{name:"elemental_operator_name"})," into the\nmanagement cluster and the creation and use of Elemental Teal installation media to\nprovide the OS into the Cluster Nodes. See ",(0,i.jsx)(t.a,{href:"/architecture",children:"Architecture"})," section to read about the\ninteraction of the components."]}),"\n",(0,i.jsxs)(t.p,{children:["The installation configuration is mostly applied and set as part of the registration process.\nThe registration process is done by the ",(0,i.jsx)(t.code,{children:"elemental-register"})," (the ",(0,i.jsx)(s,{name:"elemental_operator_name"})," client part)\nwho is the responsible to register nodes in a Rancher management cluster and fetch the installation configuration."]}),"\n",(0,i.jsxs)(t.p,{children:["Please refer to the ",(0,i.jsx)(t.a,{href:"/quickstart-cli",children:"Quick Start"})," guide for simple step by step deployment instructions."]}),"\n",(0,i.jsx)(t.h2,{id:"elemental-operator-installation",children:"Elemental Operator Installation"}),"\n",(0,i.jsxs)(t.p,{children:["The ",(0,i.jsx)(s,{name:"elemental_operator_name"})," is responsible for managing the Elemental versions and\nmaintaining a machine inventory to assist with edge or bare metal installations. ",(0,i.jsx)(s,{name:"elemental_operator_name"}),"\nrequires a cluster including the Rancher Manager and it can be installed with a helm chart."]}),"\n",(0,i.jsxs)(t.p,{children:["See ",(0,i.jsx)(s,{name:"elemental_operator_name"})," ",(0,i.jsx)(t.a,{href:"/elementaloperatorchart-reference",children:"helm chart reference"})," for install,\nuninstall, upgrade and configuration details."]}),"\n",(0,i.jsx)(t.h2,{id:"prepare-kubernetes-resources",children:"Prepare Kubernetes Resources"}),"\n",(0,i.jsxs)(t.p,{children:["Once the ",(0,i.jsx)(s,{name:"elemental_operator_name"})," is up and running within the management cluster a couple of kubernetes\nresources are required in order to prepare an Elemental based cluster deployment."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.a,{href:"/machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate"}),":\nThis resource identifies the criteria to match registered boxes (listed as part of the MachineInventory)\nagainst available Rancher 2.6 Clusters. As soon as there is a match the selected kubernetes cluster takes\nownership of the registered box."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.a,{href:"/machineregistration-reference",children:"MachineRegistration"}),":\nThis resource defines OS deployment details for any machine attempting to register. The machine\nregistration is the entrance for Elemental nodes as it handles the authentication (based on TPM),\nthe Elemental Teal deployment and the node inclusion into to the MachineInventory so it can be added\nto a cluster when there is a match based on a MachineInventorySelectorTemplate. The MachineRegistration\nobject includes the machine registration URL that nodes use to register against it."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["A Rancher Cluster resource is also required to deploy Elemental, it can be manually created as exemplified in\nthe ",(0,i.jsx)(t.a,{href:"/quickstart-cli",children:"Quick Start"})," guide or created from the Rancher 2.6 UI."]}),"\n",(0,i.jsx)(t.h2,{id:"prepare-installation-media",children:"Prepare Installation Media"}),"\n",(0,i.jsxs)(t.p,{children:["The installation media is the media that will be used to kick start an Elemental Teal deployment. Currently\nthe supported media is a live ISO. The live ISO must include the registration configuration yaml hence it must\ncrafted once the MachineRegistration is created. The installation\nmedia is created by using the ",(0,i.jsx)(t.a,{href:"https://github.com/rancher/elemental/blob/main/.github/elemental-iso-add-registration",children:(0,i.jsx)(t.code,{children:"elemental-iso-add-registration"})}),"\nhelper script (see ",(0,i.jsx)(t.a,{href:"/quickstart-cli#preparing-the-iso",children:"quick start"})," guide)\nor by using the ",(0,i.jsx)(t.code,{children:"elemental build-iso"})," command line utility included as part of the ",(0,i.jsx)(s,{name:"elemental_toolkit_name",link:"elemental_toolkit_url/docs/creating-derivatives/build_iso"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:["The live ISO supports PXE booting for direct integration with ",(0,i.jsx)(t.a,{href:"https://documentation.suse.com/suma/4.3/en/suse-manager/client-configuration/autoinst-distributions.html#based-on-iso-image",children:"SUSE Manager"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:["Within MachineRegistration only a subset of OS installation parameters can be configured, all available parameters are listed\nat ",(0,i.jsx)(t.a,{href:"/machineregistration-reference",children:"MachineRegistration"})," reference page."]}),"\n",(0,i.jsxs)(t.p,{children:["In order to configure the installation beyond the common options provided within the\n",(0,i.jsx)(t.a,{href:"/machineregistration-reference#configelementalinstall",children:(0,i.jsx)(t.code,{children:"elemental.install"})})," section a ",(0,i.jsx)(t.code,{children:"config.yaml"}),"\nconfiguration file can be included into the ISO (see ",(0,i.jsx)(t.a,{href:"/customizing#custom-elemental-client-configuration-file",children:"Custom Images"}),").\nNote any configuration applied as part of ",(0,i.jsx)(t.code,{children:"elemental.install"})," section of the MachineRegistration will be\napplied on top of the settings included in any custom ",(0,i.jsx)(t.code,{children:"config.yaml"})," file."]}),"\n",(0,i.jsxs)(t.p,{children:["Most likely the cloud-init configuration is enough to configure and set the deployed node at boot, however\nif for some reason firstboot actions or scripts are required it is possible to also include\nRancher System Agent plans into the installation media. Refer to the ",(0,i.jsx)(t.a,{href:"/elemental-plans",children:"Elemental Plans"})," section for details and\nsome example plans. The plans could be included into the squashed rootfs at ",(0,i.jsx)(t.code,{children:"/var/lib/elemental/agent/plans"}),"\nfolder and they would be seen by the system agent at firstboot."]}),"\n",(0,i.jsx)(t.h2,{id:"start-installation-process",children:"Start Installation Process"}),"\n",(0,i.jsxs)(t.p,{children:["The installation starts by booting the installation media on a node. Once the installation media has booted it will\nattempt to contact the management cluster and register to it by calling ",(0,i.jsx)(t.code,{children:"elemental-register"})," command.\nAs the registration yaml configuration is already included into the ISO ",(0,i.jsx)(t.code,{children:"elemental-register"})," knows the registration URL and\nany other required data for the registration."]}),"\n",(0,i.jsx)(t.p,{children:"On a succeeded registration the installation media will start the Elemental Teal installation into the host based\non the configuration already included in the media and the MachineRegistration parameters. As soon as the installation\nis done the node is ready to reboot. The deployed Elemental Teal includes a system agent plan to\nkick start a regular rancher provisioning process to install the selected kubernetes version, once booted, after\nsome minutes the node installation is finalized and the node is included into the cluster and visible through\nthe Rancher UI."}),"\n",(0,i.jsx)(t.h2,{id:"deployed-elemental-teal-partition-table",children:"Deployed Elemental Teal Partition Table"}),"\n",(0,i.jsx)(t.p,{children:"Once Elemental Teal is installed the OS partition table, according to default values, will look like"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Label"}),(0,i.jsx)(t.th,{children:"Default Size"}),(0,i.jsx)(t.th,{children:"Contains"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"COS_GRUB"}),(0,i.jsx)(t.td,{children:"64 MiB"}),(0,i.jsx)(t.td,{children:"UEFI Boot partition"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"COS_STATE"}),(0,i.jsx)(t.td,{children:"15 GiB"}),(0,i.jsx)(t.td,{children:"A/B bootable file system images constructed from OCI images"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"COS_OEM"}),(0,i.jsx)(t.td,{children:"64 MiB"}),(0,i.jsx)(t.td,{children:"OEM cloud-config files and other data"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"COS_RECOVERY"}),(0,i.jsx)(t.td,{children:"8 GiB"}),(0,i.jsx)(t.td,{children:"Recovery file system image if COS_STATE is destroyed"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"COS_PERSISTENT"}),(0,i.jsx)(t.td,{children:"Remaining space"}),(0,i.jsx)(t.td,{children:"All contents of the persistent folders"})]})]})]}),"\n",(0,i.jsxs)(t.p,{children:["Note this is the basic structure of any OS built by the ",(0,i.jsx)(s,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})]}),"\n",(0,i.jsx)(t.h2,{id:"elemental-teal-immutable-root",children:"Elemental Teal Immutable Root"}),"\n",(0,i.jsx)(t.p,{children:"One of the characteristics of Elemental OSes is the setup of an immutable root filesystem where some ephemeral or\npersistent locations are applied on top of it. Elemental Teal default folders structure is listed in the\nmatrix below."}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Path"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Read-Only"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Ephemeral"}),(0,i.jsx)(t.th,{style:{textAlign:"center"},children:"Persistent"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/"}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc/cni"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc/iscsi"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc/rancher"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc/ssh"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/etc/systemd"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/srv"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/home"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/opt"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/root"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/usr/libexec"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/cni"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/kubelet"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/longhorn"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/rancher"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/elemetal"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/NetworkManager"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/lib/calico"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"/var/log"}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"}}),(0,i.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]})]})]})]})}function h(e={}){const{wrapper:t}={...(0,l.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}function x(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>r});var i=n(7294);const l={},s=i.createContext(l);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3f318b85.7d4d1836.js b/assets/js/3f318b85.7d4d1836.js deleted file mode 100644 index 89804e2fc..000000000 --- a/assets/js/3f318b85.7d4d1836.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[2846],{333:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>p,contentTitle:()=>m,default:()=>v,frontMatter:()=>u,metadata:()=>g,toc:()=>j});var t=a(5893),s=a(1151),r=a(4298),l=a(1230),i=a(2361),o=a(5130),d=a(9992),c=a(8139),h=a(460);const u={sidebar_label:"Upgrade",title:""},m="Upgrade",g={id:"upgrade",title:"",description:"All components in Elemental are managed using Kubernetes. Below is how",source:"@site/versioned_docs/version-1.3/upgrade.md",sourceDirName:".",slug:"/upgrade",permalink:"/upgrade",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Upgrade",title:""},sidebar:"docs",previous:{title:"Installation",permalink:"/installation"},next:{title:"Customize Elemental Install",permalink:"/customizing"}},p={},j=[{value:"Elemental Teal node upgrade",id:"elemental-teal-node-upgrade",level:2},{value:"Upgrade via command line interface",id:"upgrade-via-command-line-interface",level:2},{value:"Selecting source for upgrade",id:"selecting-source-for-upgrade",level:3},{value:"Managing available versions",id:"managing-available-versions",level:3},{value:"Upgrade via user interface",id:"upgrade-via-user-interface",level:2}];function x(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components},{CodeBlock:u,TabItem:m,Tabs:g,Vars:p}=n;return u||b("CodeBlock",!0),m||b("TabItem",!0),g||b("Tabs",!0),p||b("Vars",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"upgrade",children:"Upgrade"}),"\n",(0,t.jsx)(n.p,{children:"All components in Elemental are managed using Kubernetes. Below is how\nto use Kubernetes approaches to upgrade the components."}),"\n",(0,t.jsx)(n.h2,{id:"elemental-teal-node-upgrade",children:"Elemental Teal node upgrade"}),"\n",(0,t.jsxs)(n.p,{children:["Elemental Teal is upgraded with the ",(0,t.jsx)(p,{name:"elemental_operator_name"}),". Refer to the\n",(0,t.jsx)(n.a,{href:"/elementaloperatorchart-reference",children:(0,t.jsx)(p,{name:"elemental_operator_name"})})," documentation for complete information."]}),"\n",(0,t.jsx)(n.p,{children:"Upgrade can be achieve either with CLI or UI:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#upgrade-via-command-line-interface",children:"Command Line Interface"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#upgrade-via-user-interface",children:"User Interface"})}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"upgrade-via-command-line-interface",children:"Upgrade via command line interface"}),"\n",(0,t.jsx)(n.p,{children:"There are two ways of selecting nodes for upgrading. Via a cluster target, which will match ALL nodes in a cluster that matches our\nselector or via node selector, which will match nodes based on the node labels. Node selector allows us to be more targeted with the upgrade\nwhile cluster selector just selects all the nodes in a matched cluster."}),"\n",(0,t.jsxs)(g,{children:[(0,t.jsxs)(m,{value:"clusterTarget",label:"With 'clusterTarget'",default:!0,children:[(0,t.jsxs)(n.p,{children:["You can target nodes for an upgrade via a ",(0,t.jsx)(n.code,{children:"clusterTarget"})," by setting it to the cluster name that you want to upgrade.\nAll nodes in a cluster that matches that name will match and be upgraded."]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-cluster-target.yaml",showLineNumbers:!0,children:r.Z})]}),(0,t.jsxs)(m,{value:"nodeSelector",label:"With nodeSelector",children:[(0,t.jsxs)(n.p,{children:["You can target nodes for an upgrade via a ",(0,t.jsx)(n.code,{children:"nodeSelector"})," by setting it to the label and value that you want to match.\nAny nodes containing that key with the value will match and be upgraded."]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-node-selector.yaml",showLineNumbers:!0,children:l.Z})]}),(0,t.jsxs)(m,{value:"forceUpgrade",label:"With FORCE flag",children:[(0,t.jsx)(n.p,{children:"When upgrading to an older version or the same version that is already running the upgrade-procedure will be skipped."}),(0,t.jsx)(n.p,{children:"It is possible to force upgrades to older versions by setting the FORCE environment variable as shown below."}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-force.yaml",showLineNumbers:!0,children:i.Z})]})]}),"\n",(0,t.jsx)(n.h3,{id:"selecting-source-for-upgrade",children:"Selecting source for upgrade"}),"\n",(0,t.jsxs)(g,{children:[(0,t.jsxs)(m,{value:"osImage",label:"Via 'osImage'",children:[(0,t.jsxs)(n.p,{children:["Just specify an OCI image on the ",(0,t.jsx)(n.code,{children:"osImage"})," field"]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-cluster-target.yaml",showLineNumbers:!0,children:r.Z})]}),(0,t.jsxs)(m,{value:"managedOSVersion",label:"Via 'ManagedOSVersion'",children:[(0,t.jsxs)(n.p,{children:["In this case we use the auto populated ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," resources to set the wanted ",(0,t.jsx)(n.code,{children:"managedOSVersionName"})," field.\nSee section ",(0,t.jsx)(n.a,{href:"#managing-available-versions",children:"Managing available versions"})," to understand how the ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," are managed."]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-managedos-version.yaml",showLineNumbers:!0,children:o.Z})]})]}),"\n",(0,t.jsx)(n.admonition,{title:"Warning",type:"warning",children:(0,t.jsxs)(n.p,{children:["If both ",(0,t.jsx)(n.code,{children:"osImage"})," and ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," are defined in the same ",(0,t.jsx)(n.code,{children:"ManagedOSImage"})," be aware that ",(0,t.jsx)(n.code,{children:"osImage"})," takes precedence."]})}),"\n",(0,t.jsx)(n.h3,{id:"managing-available-versions",children:"Managing available versions"}),"\n",(0,t.jsxs)(n.p,{children:["An ",(0,t.jsx)(n.code,{children:"ManagedOSVersionChannel"})," resource can be created in a Kubernetes cluster where the Elemental operator is installed to synchronize available versions for upgrades."]}),"\n",(0,t.jsxs)(n.p,{children:["It has a syncer in order to generate ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," automatically. Currently, we provide a json syncer and a custom one."]}),"\n",(0,t.jsxs)(g,{children:[(0,t.jsxs)(m,{value:"jsonSyncer",label:"Json syncer",children:[(0,t.jsxs)(n.p,{children:["This syncer will fetch a json from url and parse it into valid ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," resources."]}),(0,t.jsx)(u,{language:"yaml",title:"managed-os-version-json",showLineNumbers:!0,children:d.Z})]}),(0,t.jsxs)(m,{value:"customSyncer",label:"Custom syncer",children:[(0,t.jsxs)(n.p,{children:["A custom syncer allows more flexibility on how to gather ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," by allowing custom commands with custom images."]}),(0,t.jsxs)(n.p,{children:["This type of syncer allows to run a given command with arguments and env vars in a custom image and output a json file to ",(0,t.jsx)(n.code,{children:"/data/output"}),".\nThe generated data is then automounted by the syncer and then parsed so it can gather create the proper versions."]}),(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["The only requirement to make your own custom syncer is to make it output a json file to ",(0,t.jsx)(n.code,{children:"/data/output"})," and keep the correct json structure."]})}),(0,t.jsxs)(n.p,{children:["Elemental project provides an Elemental Teal channel to list all ",(0,t.jsx)(n.code,{children:"ManagedOSVersions"})," released as a custom syncer.\nSee the Elemental Teal channel resource definition below:"]}),(0,t.jsx)(u,{language:"yaml",title:"managed-os-version-channel-json.yaml",showLineNumbers:!0,children:c.Z})]})]}),"\n",(0,t.jsx)(n.p,{children:"In both cases the file that the operator expects to parse is a json file with the versions on it as follows"}),"\n",(0,t.jsx)(u,{language:"json",title:"versions.json",showLineNumbers:!0,children:h.Z}),"\n",(0,t.jsx)(n.h2,{id:"upgrade-via-user-interface",children:"Upgrade via user interface"}),"\n",(0,t.jsxs)(n.p,{children:["To upgrade via the UI, you have to go in the Elemental Advanced menu, then click on ",(0,t.jsx)(n.code,{children:"Update Groups"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Choose a name, select clusters to target and choose between the two upgrade ways:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Elemental Upgrade Menu",src:a(6416).Z+"",width:"901",height:"745"})}),"\n",(0,t.jsxs)(g,{children:[(0,t.jsxs)(m,{value:"managedOSVersion",label:"Via Managed OS Version",children:[(0,t.jsxs)(n.p,{children:["In this case, a ",(0,t.jsx)(n.code,{children:"OS Version Channels"})," is used to auto populated ",(0,t.jsx)(n.code,{children:"OS Versions"})," resources."]}),(0,t.jsx)(n.p,{children:"The channel bellow is provide by us but you can bring your own channel as well."}),(0,t.jsxs)(n.p,{children:["See section ",(0,t.jsx)(n.a,{href:"#managing-available-versions",children:"Managing available versions"})," to understand how the ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," are managed."]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Create OS Version Channel",src:a(295).Z+"",width:"792",height:"535"})}),(0,t.jsxs)(n.p,{children:["After a short syncing time, you will see your ",(0,t.jsx)(n.code,{children:"OS Versions"})," appears in the ",(0,t.jsx)(n.code,{children:"OS Versions"})," menu."]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Elemental OS Version menu",src:a(2530).Z+"",width:"993",height:"438"})}),(0,t.jsxs)(n.p,{children:["Finally, you can select the ",(0,t.jsx)(n.code,{children:"OS Versions"})," when you create your ",(0,t.jsx)(n.code,{children:"Upgrade Group"})," according to the following screenshot:"]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Select OS Version in Upgrade Group",src:a(1495).Z+"",width:"788",height:"802"})})]}),(0,t.jsxs)(m,{value:"imageFromRegistry",label:"Via Image from registry",children:[(0,t.jsxs)(n.p,{children:["Just specify an OCI image on the ",(0,t.jsx)(n.code,{children:"Image path"})," field to upgrade to:"]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Upgrade via Image Registry",src:a(5855).Z+"",width:"765",height:"557"})})]})]}),"\n",(0,t.jsxs)(n.p,{children:["Click on the ",(0,t.jsx)(n.code,{children:"Create"})," button to start the upgrade process, if you have multiple nodes, the upgrade will be done sequentially node by node."]})]})}function v(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}function b(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},8139:(e,n,a)=>{a.d(n,{Z:()=>t});const t="apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSVersionChannel\nmetadata:\n name: elemental-teal-channel\n namespace: fleet-default\nspec:\n options:\n image: registry.suse.com/rancher/elemental-teal-channel/5.3:latest\n type: custom\n"},9992:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSVersionChannel\nmetadata:\n name: elemental-versions\n namespace: fleet-default\nspec:\n options:\n URI: "https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/upgrade/versions.json"\n Timeout: "1m"\n type: json'},4298:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to or track the latest tag\n osImage: "registry.suse.com/rancher/elemental-teal/5.3:latest"\n clusterTargets:\n - clusterName: my-cluster\n'},2361:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to\n osImage: "registry.suse.com/rancher/elemental-teal/5.3:latest"\n clusterTargets:\n - clusterName: my-cluster\n upgradeContainer:\n envs:\n - name: FORCE\n value: "true"\n'},5130:(e,n,a)=>{a.d(n,{Z:()=>t});const t="apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new ManagedOSVersion you would like to upgrade to\n managedOSVersionName: v0.1.0-alpha22-amd64\n clusterTargets:\n - clusterName: my-cluster"},1230:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to\n osImage: "registry.suse.com/rancher/elemental-teal/5.3:latest"\n clusterTargets:\n - clusterName: my-cluster\n nodeSelector:\n matchLabels:\n kubernetes.io/hostname: my-machine\n'},460:(e,n,a)=>{a.d(n,{Z:()=>t});const t='[\n {\n "metadata": {\n "name": "v0.1.0"\n },\n "spec": {\n "version": "v0.1.0",\n "type": "container",\n "metadata": {\n "upgradeImage": "foo/bar:v0.1.0"\n }\n }\n },\n {\n "metadata": {\n "name": "v0.2.0"\n },\n "spec": {\n "version": "v0.2.0",\n "type": "container",\n "metadata": {\n "upgradeImage": "foo/bar:v0.2.0"\n }\n }\n }\n]'},5855:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-image-registry-2f404c81df7747f4d2800ca9899dc657.png"},6416:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-menu-93b767af21b0dbe3e2b60d07897488ca.png"},2530:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-os-version-0dbbe5e7b5f9a4c0ba6801227541b900.png"},1495:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-upgrade-group-channel-6f58b8b4ab7ad99803bd22cdaf983a16.png"},295:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-version-channel-8189dd091df520bafb6593f492d511c8.png"},1151:(e,n,a)=>{a.d(n,{Z:()=>i,a:()=>l});var t=a(7294);const s={},r=t.createContext(s);function l(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3f318b85.a0aef04d.js b/assets/js/3f318b85.a0aef04d.js new file mode 100644 index 000000000..489fcee0f --- /dev/null +++ b/assets/js/3f318b85.a0aef04d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[2846],{333:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>p,contentTitle:()=>m,default:()=>v,frontMatter:()=>u,metadata:()=>g,toc:()=>j});var t=a(5893),s=a(1151),r=a(4298),l=a(1230),i=a(2361),o=a(5130),d=a(9992),c=a(8139),h=a(460);const u={sidebar_label:"Upgrade",title:""},m="Upgrade",g={id:"upgrade",title:"",description:"All components in Elemental are managed using Kubernetes. Below is how",source:"@site/versioned_docs/version-1.3/upgrade.md",sourceDirName:".",slug:"/upgrade",permalink:"/upgrade",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Upgrade",title:""},sidebar:"docs",previous:{title:"Installation",permalink:"/installation"},next:{title:"Customize Elemental Install",permalink:"/customizing"}},p={},j=[{value:"Elemental Teal node upgrade",id:"elemental-teal-node-upgrade",level:2},{value:"Upgrade via command line interface",id:"upgrade-via-command-line-interface",level:2},{value:"Selecting source for upgrade",id:"selecting-source-for-upgrade",level:3},{value:"Managing available versions",id:"managing-available-versions",level:3},{value:"Upgrade via user interface",id:"upgrade-via-user-interface",level:2}];function x(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components},{CodeBlock:u,Head:m,TabItem:g,Tabs:p,Vars:j}=n;return u||b("CodeBlock",!0),m||b("Head",!0),g||b("TabItem",!0),p||b("Tabs",!0),j||b("Vars",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(m,{children:(0,t.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/upgrade"})}),"\n","\n","\n",(0,t.jsx)(n.h1,{id:"upgrade",children:"Upgrade"}),"\n",(0,t.jsx)(n.p,{children:"All components in Elemental are managed using Kubernetes. Below is how\nto use Kubernetes approaches to upgrade the components."}),"\n",(0,t.jsx)(n.h2,{id:"elemental-teal-node-upgrade",children:"Elemental Teal node upgrade"}),"\n",(0,t.jsxs)(n.p,{children:["Elemental Teal is upgraded with the ",(0,t.jsx)(j,{name:"elemental_operator_name"}),". Refer to the\n",(0,t.jsx)(n.a,{href:"/elementaloperatorchart-reference",children:(0,t.jsx)(j,{name:"elemental_operator_name"})})," documentation for complete information."]}),"\n",(0,t.jsx)(n.p,{children:"Upgrade can be achieve either with CLI or UI:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#upgrade-via-command-line-interface",children:"Command Line Interface"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#upgrade-via-user-interface",children:"User Interface"})}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"upgrade-via-command-line-interface",children:"Upgrade via command line interface"}),"\n",(0,t.jsx)(n.p,{children:"There are two ways of selecting nodes for upgrading. Via a cluster target, which will match ALL nodes in a cluster that matches our\nselector or via node selector, which will match nodes based on the node labels. Node selector allows us to be more targeted with the upgrade\nwhile cluster selector just selects all the nodes in a matched cluster."}),"\n",(0,t.jsxs)(p,{children:[(0,t.jsxs)(g,{value:"clusterTarget",label:"With 'clusterTarget'",default:!0,children:[(0,t.jsxs)(n.p,{children:["You can target nodes for an upgrade via a ",(0,t.jsx)(n.code,{children:"clusterTarget"})," by setting it to the cluster name that you want to upgrade.\nAll nodes in a cluster that matches that name will match and be upgraded."]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-cluster-target.yaml",showLineNumbers:!0,children:r.Z})]}),(0,t.jsxs)(g,{value:"nodeSelector",label:"With nodeSelector",children:[(0,t.jsxs)(n.p,{children:["You can target nodes for an upgrade via a ",(0,t.jsx)(n.code,{children:"nodeSelector"})," by setting it to the label and value that you want to match.\nAny nodes containing that key with the value will match and be upgraded."]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-node-selector.yaml",showLineNumbers:!0,children:l.Z})]}),(0,t.jsxs)(g,{value:"forceUpgrade",label:"With FORCE flag",children:[(0,t.jsx)(n.p,{children:"When upgrading to an older version or the same version that is already running the upgrade-procedure will be skipped."}),(0,t.jsx)(n.p,{children:"It is possible to force upgrades to older versions by setting the FORCE environment variable as shown below."}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-force.yaml",showLineNumbers:!0,children:i.Z})]})]}),"\n",(0,t.jsx)(n.h3,{id:"selecting-source-for-upgrade",children:"Selecting source for upgrade"}),"\n",(0,t.jsxs)(p,{children:[(0,t.jsxs)(g,{value:"osImage",label:"Via 'osImage'",children:[(0,t.jsxs)(n.p,{children:["Just specify an OCI image on the ",(0,t.jsx)(n.code,{children:"osImage"})," field"]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-cluster-target.yaml",showLineNumbers:!0,children:r.Z})]}),(0,t.jsxs)(g,{value:"managedOSVersion",label:"Via 'ManagedOSVersion'",children:[(0,t.jsxs)(n.p,{children:["In this case we use the auto populated ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," resources to set the wanted ",(0,t.jsx)(n.code,{children:"managedOSVersionName"})," field.\nSee section ",(0,t.jsx)(n.a,{href:"#managing-available-versions",children:"Managing available versions"})," to understand how the ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," are managed."]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-managedos-version.yaml",showLineNumbers:!0,children:o.Z})]})]}),"\n",(0,t.jsx)(n.admonition,{title:"Warning",type:"warning",children:(0,t.jsxs)(n.p,{children:["If both ",(0,t.jsx)(n.code,{children:"osImage"})," and ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," are defined in the same ",(0,t.jsx)(n.code,{children:"ManagedOSImage"})," be aware that ",(0,t.jsx)(n.code,{children:"osImage"})," takes precedence."]})}),"\n",(0,t.jsx)(n.h3,{id:"managing-available-versions",children:"Managing available versions"}),"\n",(0,t.jsxs)(n.p,{children:["An ",(0,t.jsx)(n.code,{children:"ManagedOSVersionChannel"})," resource can be created in a Kubernetes cluster where the Elemental operator is installed to synchronize available versions for upgrades."]}),"\n",(0,t.jsxs)(n.p,{children:["It has a syncer in order to generate ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," automatically. Currently, we provide a json syncer and a custom one."]}),"\n",(0,t.jsxs)(p,{children:[(0,t.jsxs)(g,{value:"jsonSyncer",label:"Json syncer",children:[(0,t.jsxs)(n.p,{children:["This syncer will fetch a json from url and parse it into valid ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," resources."]}),(0,t.jsx)(u,{language:"yaml",title:"managed-os-version-json",showLineNumbers:!0,children:d.Z})]}),(0,t.jsxs)(g,{value:"customSyncer",label:"Custom syncer",children:[(0,t.jsxs)(n.p,{children:["A custom syncer allows more flexibility on how to gather ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," by allowing custom commands with custom images."]}),(0,t.jsxs)(n.p,{children:["This type of syncer allows to run a given command with arguments and env vars in a custom image and output a json file to ",(0,t.jsx)(n.code,{children:"/data/output"}),".\nThe generated data is then automounted by the syncer and then parsed so it can gather create the proper versions."]}),(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["The only requirement to make your own custom syncer is to make it output a json file to ",(0,t.jsx)(n.code,{children:"/data/output"})," and keep the correct json structure."]})}),(0,t.jsxs)(n.p,{children:["Elemental project provides an Elemental Teal channel to list all ",(0,t.jsx)(n.code,{children:"ManagedOSVersions"})," released as a custom syncer.\nSee the Elemental Teal channel resource definition below:"]}),(0,t.jsx)(u,{language:"yaml",title:"managed-os-version-channel-json.yaml",showLineNumbers:!0,children:c.Z})]})]}),"\n",(0,t.jsx)(n.p,{children:"In both cases the file that the operator expects to parse is a json file with the versions on it as follows"}),"\n",(0,t.jsx)(u,{language:"json",title:"versions.json",showLineNumbers:!0,children:h.Z}),"\n",(0,t.jsx)(n.h2,{id:"upgrade-via-user-interface",children:"Upgrade via user interface"}),"\n",(0,t.jsxs)(n.p,{children:["To upgrade via the UI, you have to go in the Elemental Advanced menu, then click on ",(0,t.jsx)(n.code,{children:"Update Groups"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Choose a name, select clusters to target and choose between the two upgrade ways:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Elemental Upgrade Menu",src:a(6416).Z+"",width:"901",height:"745"})}),"\n",(0,t.jsxs)(p,{children:[(0,t.jsxs)(g,{value:"managedOSVersion",label:"Via Managed OS Version",children:[(0,t.jsxs)(n.p,{children:["In this case, a ",(0,t.jsx)(n.code,{children:"OS Version Channels"})," is used to auto populated ",(0,t.jsx)(n.code,{children:"OS Versions"})," resources."]}),(0,t.jsx)(n.p,{children:"The channel bellow is provide by us but you can bring your own channel as well."}),(0,t.jsxs)(n.p,{children:["See section ",(0,t.jsx)(n.a,{href:"#managing-available-versions",children:"Managing available versions"})," to understand how the ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," are managed."]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Create OS Version Channel",src:a(295).Z+"",width:"792",height:"535"})}),(0,t.jsxs)(n.p,{children:["After a short syncing time, you will see your ",(0,t.jsx)(n.code,{children:"OS Versions"})," appears in the ",(0,t.jsx)(n.code,{children:"OS Versions"})," menu."]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Elemental OS Version menu",src:a(2530).Z+"",width:"993",height:"438"})}),(0,t.jsxs)(n.p,{children:["Finally, you can select the ",(0,t.jsx)(n.code,{children:"OS Versions"})," when you create your ",(0,t.jsx)(n.code,{children:"Upgrade Group"})," according to the following screenshot:"]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Select OS Version in Upgrade Group",src:a(1495).Z+"",width:"788",height:"802"})})]}),(0,t.jsxs)(g,{value:"imageFromRegistry",label:"Via Image from registry",children:[(0,t.jsxs)(n.p,{children:["Just specify an OCI image on the ",(0,t.jsx)(n.code,{children:"Image path"})," field to upgrade to:"]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Upgrade via Image Registry",src:a(5855).Z+"",width:"765",height:"557"})})]})]}),"\n",(0,t.jsxs)(n.p,{children:["Click on the ",(0,t.jsx)(n.code,{children:"Create"})," button to start the upgrade process, if you have multiple nodes, the upgrade will be done sequentially node by node."]})]})}function v(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}function b(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},8139:(e,n,a)=>{a.d(n,{Z:()=>t});const t="apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSVersionChannel\nmetadata:\n name: elemental-teal-channel\n namespace: fleet-default\nspec:\n options:\n image: registry.suse.com/rancher/elemental-teal-channel/5.3:latest\n type: custom\n"},9992:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSVersionChannel\nmetadata:\n name: elemental-versions\n namespace: fleet-default\nspec:\n options:\n URI: "https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/upgrade/versions.json"\n Timeout: "1m"\n type: json'},4298:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to or track the latest tag\n osImage: "registry.suse.com/rancher/elemental-teal/5.3:latest"\n clusterTargets:\n - clusterName: my-cluster\n'},2361:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to\n osImage: "registry.suse.com/rancher/elemental-teal/5.3:latest"\n clusterTargets:\n - clusterName: my-cluster\n upgradeContainer:\n envs:\n - name: FORCE\n value: "true"\n'},5130:(e,n,a)=>{a.d(n,{Z:()=>t});const t="apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new ManagedOSVersion you would like to upgrade to\n managedOSVersionName: v0.1.0-alpha22-amd64\n clusterTargets:\n - clusterName: my-cluster"},1230:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to\n osImage: "registry.suse.com/rancher/elemental-teal/5.3:latest"\n clusterTargets:\n - clusterName: my-cluster\n nodeSelector:\n matchLabels:\n kubernetes.io/hostname: my-machine\n'},460:(e,n,a)=>{a.d(n,{Z:()=>t});const t='[\n {\n "metadata": {\n "name": "v0.1.0"\n },\n "spec": {\n "version": "v0.1.0",\n "type": "container",\n "metadata": {\n "upgradeImage": "foo/bar:v0.1.0"\n }\n }\n },\n {\n "metadata": {\n "name": "v0.2.0"\n },\n "spec": {\n "version": "v0.2.0",\n "type": "container",\n "metadata": {\n "upgradeImage": "foo/bar:v0.2.0"\n }\n }\n }\n]'},5855:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-image-registry-2f404c81df7747f4d2800ca9899dc657.png"},6416:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-menu-93b767af21b0dbe3e2b60d07897488ca.png"},2530:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-os-version-0dbbe5e7b5f9a4c0ba6801227541b900.png"},1495:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-upgrade-group-channel-6f58b8b4ab7ad99803bd22cdaf983a16.png"},295:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-version-channel-8189dd091df520bafb6593f492d511c8.png"},1151:(e,n,a)=>{a.d(n,{Z:()=>i,a:()=>l});var t=a(7294);const s={},r=t.createContext(s);function l(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/410f4fd3.0a373c7d.js b/assets/js/410f4fd3.0a373c7d.js new file mode 100644 index 000000000..fb4ac03de --- /dev/null +++ b/assets/js/410f4fd3.0a373c7d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6836],{6175:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>r,default:()=>h,frontMatter:()=>c,metadata:()=>a,toc:()=>l});var o=t(5893),i=t(1151);const c={sidebar_label:"Configure Wi-Fi",title:""},r=void 0,a={id:"wifi",title:"",description:"How to configure Wi-Fi",source:"@site/docs/wifi.md",sourceDirName:".",slug:"/wifi",permalink:"/next/wifi",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Configure Wi-Fi",title:""},sidebar:"docs",previous:{title:"Restore",permalink:"/next/restore"},next:{title:"Elemental behind proxy",permalink:"/next/elemental_behind_proxy"}},s={},l=[{value:"How to configure Wi-Fi",id:"how-to-configure-wi-fi",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h3:"h3",p:"p",pre:"pre",...(0,i.a)(),...e.components},{Head:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t,{children:(0,o.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/wifi"})}),"\n",(0,o.jsx)(n.h3,{id:"how-to-configure-wi-fi",children:"How to configure Wi-Fi"}),"\n",(0,o.jsxs)(n.admonition,{title:"important note",type:"caution",children:[(0,o.jsx)(n.p,{children:"This guide describes how to configure Wi-Fi on a freshly installed operating system.\nFor some reasons, like no wired network connection availabe, you may want to also use Wi-Fi when you boot from the ISO."}),(0,o.jsxs)(n.p,{children:["This is possible by using a cloud-config definition in the ",(0,o.jsx)(n.a,{href:"https://elemental.docs.rancher.com/seedimage-reference/",children:"SeedImage"})," resource.\nYou can refer to the same instructions as below on how to create it."]})]}),"\n",(0,o.jsx)(n.admonition,{title:"info",type:"info",children:(0,o.jsxs)(n.p,{children:["The information on this page is just a specific use case of using cloud-config. For more generic info on how to create arbitrary files check our ",(0,o.jsx)(n.a,{href:"/next/cloud-config-reference",children:"cloud-config"})," page"]})}),"\n",(0,o.jsxs)(n.p,{children:["Elemental Teal currently uses ",(0,o.jsx)(n.a,{href:"https://networkmanager.dev/",children:"NetworkManager"})," to manage network connections."]}),"\n",(0,o.jsxs)(n.p,{children:["In order to add Wi-Fi to your node, your registration should include a configuration in the ",(0,o.jsx)(n.a,{href:"/next/cloud-config-reference",children:"cloud-config"})," section to write a\n",(0,o.jsx)(n.code,{children:".connection"})," file so NetworkManager can connect to the Wi-Fi."]}),"\n",(0,o.jsxs)(n.p,{children:["A ",(0,o.jsx)(n.code,{children:".connection"})," file is a connection configuration file for NetworkManager.\nThe connection files are stored under ",(0,o.jsx)(n.code,{children:"/etc/NetworkManager/system-connections/"})," and can include ethernet, Wi-Fi, VPN and more."]}),"\n",(0,o.jsxs)(n.p,{children:["For example for a network with the SSID ",(0,o.jsx)(n.code,{children:"testSSID"})," and the WPA-PSK key ",(0,o.jsx)(n.code,{children:"123456789"})," and using the interface ",(0,o.jsx)(n.code,{children:"wlan0"})," you would write the following ",(0,o.jsx)(n.code,{children:".connection"})," file:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"[connection]\nid=testConnection\ntype=wifi\ninterface-name=wlan0\npermissions=\ntimestamp=1671549641\n\n[wifi]\nmac-address-blacklist=\nmode=infrastructure\nssid=testSSID\n\n[wifi-security]\nkey-mgmt=wpa-psk\npsk=123456789\n\n[ipv4]\ndns-search=\nmethod=auto\n\n[ipv6]\naddr-gen-mode=stable-privacy\ndns-search=\nmethod=auto\n\n[proxy]\n"})}),"\n",(0,o.jsx)(n.admonition,{type:"info",children:(0,o.jsxs)(n.p,{children:["To see all the configurations available for NetworkManager check ",(0,o.jsx)(n.a,{href:"https://networkmanager.dev/docs/api/latest/nm-settings-nmcli.html",children:"nm-settings"}),"\nwhich includes the format of the connection file and all the different options you can use."]})}),"\n",(0,o.jsxs)(n.p,{children:["Which we should encode to base64 and paste in the content in our ",(0,o.jsx)(n.a,{href:"/next/machineregistration-reference",children:"registration"})," cloud-config section as such:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:'title="wifi cloud config" showLineNumbers',children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineName: name\n config:\n cloud-config:\n write_files:\n - encoding: b64\n content: W2Nvbm5lY3Rpb25dCmlkPXRlc3RDb25uZWN0aW9uCnR5cGU9d2lmaQppbnRlcmZhY2UtbmFtZT13bGFuMApwZXJtaXNzaW9ucz0KdGltZXN0YW1wPTE2NzE1NDk2NDEKClt3aWZpXQptYWMtYWRkcmVzcy1ibGFja2xpc3Q9Cm1vZGU9aW5mcmFzdHJ1Y3R1cmUKc3NpZD10ZXN0Cgpbd2lmaS1zZWN1cml0eV0Ka2V5LW1nbXQ9bm9uZQp3ZXAta2V5LXR5cGU9MQp3ZXAta2V5MD0xMjM0NTY3ODkxCgpbaXB2NF0KZG5zLXNlYXJjaD0KbWV0aG9kPWF1dG8KCltpcHY2XQphZGRyLWdlbi1tb2RlPXN0YWJsZS1wcml2YWN5CmRucy1zZWFyY2g9Cm1ldGhvZD1hdXRvCgpbcHJveHldCg==\n path: /etc/NetworkManager/system-connections/wifi1.connection\n"})}),"\n",(0,o.jsxs)(n.p,{children:["This would get the ",(0,o.jsx)(n.code,{children:"/etc/NetworkManager/system-connections/wifi1.connection"})," file deployed on the node during installation with the connection content and NetworkManager would\nread and enable the connection on boot."]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>r});var o=t(7294);const i={},c=o.createContext(i);function r(e){const n=o.useContext(c);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/410f4fd3.d472f304.js b/assets/js/410f4fd3.d472f304.js deleted file mode 100644 index ced682141..000000000 --- a/assets/js/410f4fd3.d472f304.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6836],{6175:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>r,default:()=>h,frontMatter:()=>c,metadata:()=>a,toc:()=>l});var i=t(5893),o=t(1151);const c={sidebar_label:"Configure Wi-Fi",title:""},r=void 0,a={id:"wifi",title:"",description:"How to configure Wi-Fi",source:"@site/docs/wifi.md",sourceDirName:".",slug:"/wifi",permalink:"/next/wifi",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Configure Wi-Fi",title:""},sidebar:"docs",previous:{title:"Restore",permalink:"/next/restore"},next:{title:"Elemental behind proxy",permalink:"/next/elemental_behind_proxy"}},s={},l=[{value:"How to configure Wi-Fi",id:"how-to-configure-wi-fi",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h3:"h3",p:"p",pre:"pre",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h3,{id:"how-to-configure-wi-fi",children:"How to configure Wi-Fi"}),"\n",(0,i.jsxs)(n.admonition,{title:"important note",type:"caution",children:[(0,i.jsx)(n.p,{children:"This guide describes how to configure Wi-Fi on a freshly installed operating system.\nFor some reasons, like no wired network connection availabe, you may want to also use Wi-Fi when you boot from the ISO."}),(0,i.jsxs)(n.p,{children:["This is possible by using a cloud-config definition in the ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/seedimage-reference/",children:"SeedImage"})," resource.\nYou can refer to the same instructions as below on how to create it."]})]}),"\n",(0,i.jsx)(n.admonition,{title:"info",type:"info",children:(0,i.jsxs)(n.p,{children:["The information on this page is just a specific use case of using cloud-config. For more generic info on how to create arbitrary files check our ",(0,i.jsx)(n.a,{href:"/next/cloud-config-reference",children:"cloud-config"})," page"]})}),"\n",(0,i.jsxs)(n.p,{children:["Elemental Teal currently uses ",(0,i.jsx)(n.a,{href:"https://networkmanager.dev/",children:"NetworkManager"})," to manage network connections."]}),"\n",(0,i.jsxs)(n.p,{children:["In order to add Wi-Fi to your node, your registration should include a configuration in the ",(0,i.jsx)(n.a,{href:"/next/cloud-config-reference",children:"cloud-config"})," section to write a\n",(0,i.jsx)(n.code,{children:".connection"})," file so NetworkManager can connect to the Wi-Fi."]}),"\n",(0,i.jsxs)(n.p,{children:["A ",(0,i.jsx)(n.code,{children:".connection"})," file is a connection configuration file for NetworkManager.\nThe connection files are stored under ",(0,i.jsx)(n.code,{children:"/etc/NetworkManager/system-connections/"})," and can include ethernet, Wi-Fi, VPN and more."]}),"\n",(0,i.jsxs)(n.p,{children:["For example for a network with the SSID ",(0,i.jsx)(n.code,{children:"testSSID"})," and the WPA-PSK key ",(0,i.jsx)(n.code,{children:"123456789"})," and using the interface ",(0,i.jsx)(n.code,{children:"wlan0"})," you would write the following ",(0,i.jsx)(n.code,{children:".connection"})," file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[connection]\nid=testConnection\ntype=wifi\ninterface-name=wlan0\npermissions=\ntimestamp=1671549641\n\n[wifi]\nmac-address-blacklist=\nmode=infrastructure\nssid=testSSID\n\n[wifi-security]\nkey-mgmt=wpa-psk\npsk=123456789\n\n[ipv4]\ndns-search=\nmethod=auto\n\n[ipv6]\naddr-gen-mode=stable-privacy\ndns-search=\nmethod=auto\n\n[proxy]\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["To see all the configurations available for NetworkManager check ",(0,i.jsx)(n.a,{href:"https://networkmanager.dev/docs/api/latest/nm-settings-nmcli.html",children:"nm-settings"}),"\nwhich includes the format of the connection file and all the different options you can use."]})}),"\n",(0,i.jsxs)(n.p,{children:["Which we should encode to base64 and paste in the content in our ",(0,i.jsx)(n.a,{href:"/next/machineregistration-reference",children:"registration"})," cloud-config section as such:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="wifi cloud config" showLineNumbers',children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineName: name\n config:\n cloud-config:\n write_files:\n - encoding: b64\n content: W2Nvbm5lY3Rpb25dCmlkPXRlc3RDb25uZWN0aW9uCnR5cGU9d2lmaQppbnRlcmZhY2UtbmFtZT13bGFuMApwZXJtaXNzaW9ucz0KdGltZXN0YW1wPTE2NzE1NDk2NDEKClt3aWZpXQptYWMtYWRkcmVzcy1ibGFja2xpc3Q9Cm1vZGU9aW5mcmFzdHJ1Y3R1cmUKc3NpZD10ZXN0Cgpbd2lmaS1zZWN1cml0eV0Ka2V5LW1nbXQ9bm9uZQp3ZXAta2V5LXR5cGU9MQp3ZXAta2V5MD0xMjM0NTY3ODkxCgpbaXB2NF0KZG5zLXNlYXJjaD0KbWV0aG9kPWF1dG8KCltpcHY2XQphZGRyLWdlbi1tb2RlPXN0YWJsZS1wcml2YWN5CmRucy1zZWFyY2g9Cm1ldGhvZD1hdXRvCgpbcHJveHldCg==\n path: /etc/NetworkManager/system-connections/wifi1.connection\n"})}),"\n",(0,i.jsxs)(n.p,{children:["This would get the ",(0,i.jsx)(n.code,{children:"/etc/NetworkManager/system-connections/wifi1.connection"})," file deployed on the node during installation with the connection content and NetworkManager would\nread and enable the connection on boot."]})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>r});var i=t(7294);const o={},c=i.createContext(o);function r(e){const n=i.useContext(c);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/41a53309.20b7ee18.js b/assets/js/41a53309.20b7ee18.js deleted file mode 100644 index fcc16cdff..000000000 --- a/assets/js/41a53309.20b7ee18.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6261],{4694:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>u,frontMatter:()=>c,metadata:()=>s,toc:()=>d});var o=i(5893),t=i(1151);const c={sidebar_label:"Include cloud-config from removable devices",title:""},l=void 0,s={id:"removable-device-cloudconfig",title:"",description:"How to include cloud-config files from removable devices",source:"@site/docs/removable-device-cloudconfig.md",sourceDirName:".",slug:"/removable-device-cloudconfig",permalink:"/next/removable-device-cloudconfig",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Include cloud-config from removable devices",title:""},sidebar:"docs",previous:{title:"How to use Elemental with Rancher and VMware",permalink:"/next/rancher-vmware"},next:{title:"Add a custom certificate",permalink:"/next/custom-certificate"}},a={},d=[{value:"How to include cloud-config files from removable devices",id:"how-to-include-cloud-config-files-from-removable-devices",level:3},{value:"Include non cloud-config data",id:"include-non-cloud-config-data",level:4}];function r(e){const n={a:"a",code:"code",em:"em",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h3,{id:"how-to-include-cloud-config-files-from-removable-devices",children:"How to include cloud-config files from removable devices"}),"\n",(0,o.jsxs)(n.p,{children:["Elemental Teal supports loading ",(0,o.jsx)(n.a,{href:"/next/cloud-config-reference",children:"cloud-config"})," files from specific block devices.\nIn particular supports loading cloud-config files from an ISO having ",(0,o.jsx)(n.code,{children:"CIDATA"})," as the volume ID or any vFAT formatted\ndevice labeled with ",(0,o.jsx)(n.code,{children:"CIDATA"}),". If a device matching this criteria is found on early boot the Elemental client will\nread it and look for a ",(0,o.jsx)(n.code,{children:"user-data"})," file in its root."]}),"\n",(0,o.jsx)(n.p,{children:"As an example an ISO including a cloud-config file can be created on a Linux host with the procedure below."}),"\n",(0,o.jsxs)(n.p,{children:["Create a ",(0,o.jsx)(n.code,{children:"user-data"})," file with the cloud-config data in it. In the example below we just set a\nproxy:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:'title="user-data" showLineNumbers',children:'#cloud-config\nwrite_files:\n- path: /etc/sysconfig/proxy\n append: true\n content: |\n PROXY_ENABLED="yes"\n HTTP_PROXY=http://some.domain.org:8080\n HTTPS_PROXY=https://some.domain.org:8080\n NO_PROXY="localhost, 127.0.0.1"\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Once the ",(0,o.jsx)(n.code,{children:"user-data"})," file exists create an ISO including only this file by using the ",(0,o.jsx)(n.code,{children:"mkisofs"})," Linux utility:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"mkisof -o cidata.iso -V CIDATA -J -r user-data\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The result is an ISO labeled with ",(0,o.jsx)(n.code,{children:"CIDATA"})," including the ",(0,o.jsx)(n.code,{children:"user-data"})," file."]}),"\n",(0,o.jsxs)(n.p,{children:["At boot the ",(0,o.jsx)(n.code,{children:"user-data"})," file will be copied as is to ",(0,o.jsx)(n.code,{children:"/oem/user-data"})," and in case it contains cloud-config data\nan extra copy will be added as ",(0,o.jsx)(n.code,{children:"/oem/user-data.yaml"}),". The file ",(0,o.jsx)(n.code,{children:"/oem/user-data.yaml"})," will be parsed\non any later cloud-init stage."]}),"\n",(0,o.jsxs)(n.p,{children:["Since the data is copied to ",(0,o.jsx)(n.code,{children:"/oem"})," it will be persistent, hence on follow up reboots the removable device is\nnot required to be present any more. If still present on follow up reboots, it just overwrites any\naleady pre-existing data."]}),"\n",(0,o.jsx)(n.h4,{id:"include-non-cloud-config-data",children:"Include non cloud-config data"}),"\n",(0,o.jsxs)(n.p,{children:["If the ",(0,o.jsx)(n.code,{children:"user-data"})," is not containing cloud-config data the Elemental client will just copy it as\nis to ",(0,o.jsx)(n.code,{children:"/oem/user-data"}),". Only ",(0,o.jsx)(n.code,{children:"*.yaml"})," files are parsed when executing cloud-init stages, so in that\ncase the file will be ignored by cloud-init services."]}),"\n",(0,o.jsxs)(n.p,{children:["If the ",(0,o.jsx)(n.code,{children:"user-data"})," contains a script the Elemental client will, in addition, try to execute it. The way\nElemental client determines if ",(0,o.jsx)(n.code,{children:"user-data"})," is a script or not is by the presence of a ",(0,o.jsx)(n.em,{children:"Shebang"})," in the\nfirst line. For example, the previous ",(0,o.jsx)(n.code,{children:"user-data"})," file could be rewritten as:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="user-data" showLineNumbers',children:'#!/bin/bash\n\ncat <> /etc/sysconfig/proxy\nPROXY_ENABLED="yes"\nHTTP_PROXY=http://some.domain.org:8080\nHTTPS_PROXY=https://some.domain.org:8080\nNO_PROXY="localhost, 127.0.0.1"\nEOF\n'})})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(r,{...e})}):r(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>s,a:()=>l});var o=i(7294);const t={},c=o.createContext(t);function l(e){const n=o.useContext(c);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),o.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/41a53309.38b3ecaa.js b/assets/js/41a53309.38b3ecaa.js new file mode 100644 index 000000000..7b68c5025 --- /dev/null +++ b/assets/js/41a53309.38b3ecaa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6261],{4694:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>u,frontMatter:()=>c,metadata:()=>s,toc:()=>d});var i=o(5893),t=o(1151);const c={sidebar_label:"Include cloud-config from removable devices",title:""},l=void 0,s={id:"removable-device-cloudconfig",title:"",description:"How to include cloud-config files from removable devices",source:"@site/docs/removable-device-cloudconfig.md",sourceDirName:".",slug:"/removable-device-cloudconfig",permalink:"/next/removable-device-cloudconfig",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Include cloud-config from removable devices",title:""},sidebar:"docs",previous:{title:"How to use Elemental with Rancher and VMware",permalink:"/next/rancher-vmware"},next:{title:"Add a custom certificate",permalink:"/next/custom-certificate"}},a={},d=[{value:"How to include cloud-config files from removable devices",id:"how-to-include-cloud-config-files-from-removable-devices",level:3},{value:"Include non cloud-config data",id:"include-non-cloud-config-data",level:4}];function r(e){const n={a:"a",code:"code",em:"em",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,t.a)(),...e.components},{Head:o}=n;return o||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o,{children:(0,i.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/removable-device-cloudconfig"})}),"\n",(0,i.jsx)(n.h3,{id:"how-to-include-cloud-config-files-from-removable-devices",children:"How to include cloud-config files from removable devices"}),"\n",(0,i.jsxs)(n.p,{children:["Elemental Teal supports loading ",(0,i.jsx)(n.a,{href:"/next/cloud-config-reference",children:"cloud-config"})," files from specific block devices.\nIn particular supports loading cloud-config files from an ISO having ",(0,i.jsx)(n.code,{children:"CIDATA"})," as the volume ID or any vFAT formatted\ndevice labeled with ",(0,i.jsx)(n.code,{children:"CIDATA"}),". If a device matching this criteria is found on early boot the Elemental client will\nread it and look for a ",(0,i.jsx)(n.code,{children:"user-data"})," file in its root."]}),"\n",(0,i.jsx)(n.p,{children:"As an example an ISO including a cloud-config file can be created on a Linux host with the procedure below."}),"\n",(0,i.jsxs)(n.p,{children:["Create a ",(0,i.jsx)(n.code,{children:"user-data"})," file with the cloud-config data in it. In the example below we just set a\nproxy:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="user-data" showLineNumbers',children:'#cloud-config\nwrite_files:\n- path: /etc/sysconfig/proxy\n append: true\n content: |\n PROXY_ENABLED="yes"\n HTTP_PROXY=http://some.domain.org:8080\n HTTPS_PROXY=https://some.domain.org:8080\n NO_PROXY="localhost, 127.0.0.1"\n'})}),"\n",(0,i.jsxs)(n.p,{children:["Once the ",(0,i.jsx)(n.code,{children:"user-data"})," file exists create an ISO including only this file by using the ",(0,i.jsx)(n.code,{children:"mkisofs"})," Linux utility:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"mkisof -o cidata.iso -V CIDATA -J -r user-data\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The result is an ISO labeled with ",(0,i.jsx)(n.code,{children:"CIDATA"})," including the ",(0,i.jsx)(n.code,{children:"user-data"})," file."]}),"\n",(0,i.jsxs)(n.p,{children:["At boot the ",(0,i.jsx)(n.code,{children:"user-data"})," file will be copied as is to ",(0,i.jsx)(n.code,{children:"/oem/user-data"})," and in case it contains cloud-config data\nan extra copy will be added as ",(0,i.jsx)(n.code,{children:"/oem/user-data.yaml"}),". The file ",(0,i.jsx)(n.code,{children:"/oem/user-data.yaml"})," will be parsed\non any later cloud-init stage."]}),"\n",(0,i.jsxs)(n.p,{children:["Since the data is copied to ",(0,i.jsx)(n.code,{children:"/oem"})," it will be persistent, hence on follow up reboots the removable device is\nnot required to be present any more. If still present on follow up reboots, it just overwrites any\naleady pre-existing data."]}),"\n",(0,i.jsx)(n.h4,{id:"include-non-cloud-config-data",children:"Include non cloud-config data"}),"\n",(0,i.jsxs)(n.p,{children:["If the ",(0,i.jsx)(n.code,{children:"user-data"})," is not containing cloud-config data the Elemental client will just copy it as\nis to ",(0,i.jsx)(n.code,{children:"/oem/user-data"}),". Only ",(0,i.jsx)(n.code,{children:"*.yaml"})," files are parsed when executing cloud-init stages, so in that\ncase the file will be ignored by cloud-init services."]}),"\n",(0,i.jsxs)(n.p,{children:["If the ",(0,i.jsx)(n.code,{children:"user-data"})," contains a script the Elemental client will, in addition, try to execute it. The way\nElemental client determines if ",(0,i.jsx)(n.code,{children:"user-data"})," is a script or not is by the presence of a ",(0,i.jsx)(n.em,{children:"Shebang"})," in the\nfirst line. For example, the previous ",(0,i.jsx)(n.code,{children:"user-data"})," file could be rewritten as:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="user-data" showLineNumbers',children:'#!/bin/bash\n\ncat <> /etc/sysconfig/proxy\nPROXY_ENABLED="yes"\nHTTP_PROXY=http://some.domain.org:8080\nHTTPS_PROXY=https://some.domain.org:8080\nNO_PROXY="localhost, 127.0.0.1"\nEOF\n'})})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(r,{...e})}):r(e)}},1151:(e,n,o)=>{o.d(n,{Z:()=>s,a:()=>l});var i=o(7294);const t={},c=i.createContext(t);function l(e){const n=i.useContext(c);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),i.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/426e6027.d7be71b0.js b/assets/js/426e6027.d7be71b0.js deleted file mode 100644 index 9b8d7d084..000000000 --- a/assets/js/426e6027.d7be71b0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7353],{2224:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var r=t(5893),s=t(1151);const o={sidebar_label:"SeedImage reference",title:""},a="SeedImage reference",i={id:"seedimage-reference",title:"",description:"A SeedImage resource allows to build an ISO that can be used to install Elemental onto a node.",source:"@site/versioned_docs/version-1.2/seedimage-reference.md",sourceDirName:".",slug:"/seedimage-reference",permalink:"/1.2/seedimage-reference",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"SeedImage reference",title:""},sidebar:"docs",previous:{title:"Cluster reference",permalink:"/1.2/cluster-reference"},next:{title:"Elemental Operator Helm Chart",permalink:"/1.2/elementaloperatorchart-reference"}},c={},d=[];function l(e){const n={admonition:"admonition",br:"br",code:"code",em:"em",h1:"h1",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components},{Details:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"seedimage-reference",children:"SeedImage reference"}),"\n",(0,r.jsxs)(n.p,{children:["A ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource allows to build an ISO that can be used to install Elemental onto a node.",(0,r.jsx)(n.br,{}),"\n","It requires a ",(0,r.jsx)(n.code,{children:"baseImage"}),", i.e., a URL to an Elemental installation ISO, and a ",(0,r.jsx)(n.code,{children:"registrationRef"})," reference to a ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," resource, from which the registration part of the Elemental configuration is extracted and injected in the ISO to produce the final ",(0,r.jsx)(n.em,{children:"seed image"}),".",(0,r.jsx)(n.br,{}),"\n","It is also possible to inject ISO customizations in the ",(0,r.jsx)(n.code,{children:"cloud-config"})," field."]}),"\n",(0,r.jsxs)(n.p,{children:["Once the seed image is ready, the download URL is shared in the ",(0,r.jsx)(n.code,{children:".status.downloadURL"})," field.\nIt stays available for download for ",(0,r.jsx)(n.code,{children:"cleanupAfterMinutes"})," minutes (default is ",(0,r.jsx)(n.code,{children:"60"}),", 1 hour), after which it is deleted.",(0,r.jsx)(n.br,{}),"\n","Setting ",(0,r.jsx)(n.code,{children:"retriggerBuild"})," to ",(0,r.jsx)(n.code,{children:"true"})," retriggers the seed image build process while setting ",(0,r.jsx)(n.code,{children:"cleanupAfterMinutes"})," to ",(0,r.jsx)(n.code,{children:"0"})," keeps the seed image around till the ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource is deleted."]}),"\n",(0,r.jsx)(n.admonition,{title:"seed images may fill up local storage",type:"warning",children:(0,r.jsxs)(n.p,{children:["The seed images are kept on the node's local storage: pay attention to the number of ",(0,r.jsx)(n.code,{children:"SeedImage"})," resources you start concurrently and to the ones you may leave around with the auto-cleanup feature disabled (",(0,r.jsx)(n.code,{children:"cleanupAfterMinutes"})," = ",(0,r.jsx)(n.code,{children:"0"}),") as you may exhaust the storage on your cluster nodes."]})}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource tracks the seed image build process through two status conditions:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Ready"}),": tracks the creation of all the required child resources that perform the actual build process."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"SeedImageReady"}),": tracks the status of the build process in the child resources."]}),"\n"]}),"\n",(0,r.jsxs)(t,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: SeedImage\nmetadata:\n name: ...\n namespace: ...\nspec:\n baseImage: ...\n cloud-config: ...\n registrationRef:\n name: ...\n namespace: ...\n cleanupAfterMinutes: ...\n retriggerBuild: ...\n"})})]})]})}function u(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>i,a:()=>a});var r=t(7294);const s={},o=r.createContext(s);function a(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/426e6027.fdfd164c.js b/assets/js/426e6027.fdfd164c.js new file mode 100644 index 000000000..9de37c3db --- /dev/null +++ b/assets/js/426e6027.fdfd164c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7353],{2224:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>d});var r=t(5893),s=t(1151);const a={sidebar_label:"SeedImage reference",title:""},o="SeedImage reference",i={id:"seedimage-reference",title:"",description:"A SeedImage resource allows to build an ISO that can be used to install Elemental onto a node.",source:"@site/versioned_docs/version-1.2/seedimage-reference.md",sourceDirName:".",slug:"/seedimage-reference",permalink:"/1.2/seedimage-reference",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"SeedImage reference",title:""},sidebar:"docs",previous:{title:"Cluster reference",permalink:"/1.2/cluster-reference"},next:{title:"Elemental Operator Helm Chart",permalink:"/1.2/elementaloperatorchart-reference"}},c={},d=[];function l(e){const n={admonition:"admonition",br:"br",code:"code",em:"em",h1:"h1",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components},{Details:t,Head:a}=n;return t||u("Details",!0),a||u("Head",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(a,{children:(0,r.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/seedimage-reference"})}),"\n",(0,r.jsx)(n.h1,{id:"seedimage-reference",children:"SeedImage reference"}),"\n",(0,r.jsxs)(n.p,{children:["A ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource allows to build an ISO that can be used to install Elemental onto a node.",(0,r.jsx)(n.br,{}),"\n","It requires a ",(0,r.jsx)(n.code,{children:"baseImage"}),", i.e., a URL to an Elemental installation ISO, and a ",(0,r.jsx)(n.code,{children:"registrationRef"})," reference to a ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," resource, from which the registration part of the Elemental configuration is extracted and injected in the ISO to produce the final ",(0,r.jsx)(n.em,{children:"seed image"}),".",(0,r.jsx)(n.br,{}),"\n","It is also possible to inject ISO customizations in the ",(0,r.jsx)(n.code,{children:"cloud-config"})," field."]}),"\n",(0,r.jsxs)(n.p,{children:["Once the seed image is ready, the download URL is shared in the ",(0,r.jsx)(n.code,{children:".status.downloadURL"})," field.\nIt stays available for download for ",(0,r.jsx)(n.code,{children:"cleanupAfterMinutes"})," minutes (default is ",(0,r.jsx)(n.code,{children:"60"}),", 1 hour), after which it is deleted.",(0,r.jsx)(n.br,{}),"\n","Setting ",(0,r.jsx)(n.code,{children:"retriggerBuild"})," to ",(0,r.jsx)(n.code,{children:"true"})," retriggers the seed image build process while setting ",(0,r.jsx)(n.code,{children:"cleanupAfterMinutes"})," to ",(0,r.jsx)(n.code,{children:"0"})," keeps the seed image around till the ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource is deleted."]}),"\n",(0,r.jsx)(n.admonition,{title:"seed images may fill up local storage",type:"warning",children:(0,r.jsxs)(n.p,{children:["The seed images are kept on the node's local storage: pay attention to the number of ",(0,r.jsx)(n.code,{children:"SeedImage"})," resources you start concurrently and to the ones you may leave around with the auto-cleanup feature disabled (",(0,r.jsx)(n.code,{children:"cleanupAfterMinutes"})," = ",(0,r.jsx)(n.code,{children:"0"}),") as you may exhaust the storage on your cluster nodes."]})}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource tracks the seed image build process through two status conditions:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Ready"}),": tracks the creation of all the required child resources that perform the actual build process."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"SeedImageReady"}),": tracks the status of the build process in the child resources."]}),"\n"]}),"\n",(0,r.jsxs)(t,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: SeedImage\nmetadata:\n name: ...\n namespace: ...\nspec:\n baseImage: ...\n cloud-config: ...\n registrationRef:\n name: ...\n namespace: ...\n cleanupAfterMinutes: ...\n retriggerBuild: ...\n"})})]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}function u(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,n,t)=>{t.d(n,{Z:()=>i,a:()=>o});var r=t(7294);const s={},a=r.createContext(s);function o(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/43c9fc1f.7230944f.js b/assets/js/43c9fc1f.7230944f.js deleted file mode 100644 index cf0067941..000000000 --- a/assets/js/43c9fc1f.7230944f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4020],{3472:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>l,metadata:()=>a,toc:()=>d});var n=t(5893),s=t(1151);const l={sidebar_label:"Elemental Operator Helm Chart",title:""},i="Elemental Operator Helm Chart",a={id:"elementaloperatorchart-reference",title:"",description:"The is responsible for managing the Elemental versions and maintaining a machine inventory to assist with edge or bare metal installations.",source:"@site/versioned_docs/version-1.3/elementaloperatorchart-reference.md",sourceDirName:".",slug:"/elementaloperatorchart-reference",permalink:"/elementaloperatorchart-reference",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Elemental Operator Helm Chart",title:""},sidebar:"docs",previous:{title:"SeedImage reference",permalink:"/seedimage-reference"},next:{title:"Kubernetes versions",permalink:"/kubernetesversions"}},c={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Get Helm chart info",id:"get-helm-chart-info",level:2},{value:"Install Chart",id:"install-chart",level:2},{value:"Uninstall Chart",id:"uninstall-chart",level:2},{value:"Upgrading Chart",id:"upgrading-chart",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Values",id:"values",level:2}];function o(e){const r={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components},{Vars:t}=r;return t||function(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Vars",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(r.h1,{id:"elemental-operator-helm-chart",children:"Elemental Operator Helm Chart"}),"\n",(0,n.jsxs)(r.p,{children:["The ",(0,n.jsx)(t,{name:"elemental_operator_name",link:"elemental_operator_url"})," is responsible for managing the Elemental versions and maintaining a machine inventory to assist with edge or bare metal installations."]}),"\n",(0,n.jsxs)(r.p,{children:["The associated chart bootstraps an elemental-operator deployment on the ",(0,n.jsx)(r.a,{href:"https://rancher.com/docs/rancher/v2.6/",children:"Rancher Manager v2.6"})," cluster using the ",(0,n.jsx)(r.a,{href:"https://helm.sh",children:"Helm"})," package manager."]}),"\n",(0,n.jsx)(r.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsx)(r.li,{children:"Rancher Manager version v2.6"}),"\n",(0,n.jsx)(r.li,{children:"Helm client version v3.8.0+"}),"\n"]}),"\n",(0,n.jsx)(r.h2,{id:"get-helm-chart-info",children:"Get Helm chart info"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm pull oci://registry.suse.com/rancher/elemental-operator-chart\nhelm show all oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,n.jsx)(r.h2,{id:"install-chart",children:"Install Chart"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm install --create-namespace -n cattle-elemental-system elemental-operator-crds \\\n oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm install --create-namespace -n cattle-elemental-system elemental-operator \\\n oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,n.jsx)(r.p,{children:"The command deploys elemental-operator on the Kubernetes cluster in the default configuration."}),"\n",(0,n.jsx)(r.p,{children:(0,n.jsxs)(r.em,{children:["See ",(0,n.jsx)(r.a,{href:"#configuration",children:"configuration"})," below."]})}),"\n",(0,n.jsx)(r.p,{children:(0,n.jsxs)(r.em,{children:["See ",(0,n.jsx)(r.a,{href:"https://helm.sh/docs/helm/helm_install/",children:"helm install"})," for command documentation."]})}),"\n",(0,n.jsx)(r.h2,{id:"uninstall-chart",children:"Uninstall Chart"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm uninstall -n cattle-elemental-system elemental-operator\n"})}),"\n",(0,n.jsx)(r.p,{children:"This removes all the Kubernetes components associated with the chart and deletes the release."}),"\n",(0,n.jsx)(r.p,{children:(0,n.jsxs)(r.em,{children:["See ",(0,n.jsx)(r.a,{href:"https://helm.sh/docs/helm/helm_uninstall/",children:"helm uninstall"})," for command documentation."]})}),"\n",(0,n.jsx)(r.h2,{id:"upgrading-chart",children:"Upgrading Chart"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm upgrade -n cattle-elemental-system \\\n --install elemental-operator \\\n oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,n.jsx)(r.p,{children:(0,n.jsxs)(r.em,{children:["See ",(0,n.jsx)(r.a,{href:"https://helm.sh/docs/helm/helm_upgrade/",children:"helm upgrade"})," for command documentation."]})}),"\n",(0,n.jsx)(r.h2,{id:"configuration",children:"Configuration"}),"\n",(0,n.jsxs)(r.p,{children:["See ",(0,n.jsx)(r.a,{href:"https://helm.sh/docs/intro/using_helm/#customizing-the-chart-before-installing",children:"Customizing the Chart Before Installing"}),". To see all configurable options with detailed comments, visit the chart's ",(0,n.jsx)(r.a,{href:"#values",children:"values"}),", or run these configuration commands:"]}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm show values oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,n.jsx)(r.h2,{id:"values",children:"Values"}),"\n",(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Key"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Default"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"image.empty"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"rancher/pause:3.1"})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"image.repository"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"registry.suse.com/rancher/elemental-operator-chart"})}),(0,n.jsx)(r.td,{children:"Source image for elemental-operator with repository name"})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"image.tag"}),(0,n.jsx)(r.td,{children:"tag"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:'""'})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"image.imagePullPolicy"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"IfNotPresent"})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"noProxy"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:'`127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local"'}),(0,n.jsx)(r.td,{children:"Comma separated list of domains or ip addresses that will not use the proxy"})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"global.cattle.systemDefaultRegistry"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:'""'})}),(0,n.jsx)(r.td,{children:"Default container registry name"})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"sync_interval"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:'"60m"'})}),(0,n.jsx)(r.td,{children:"Default sync interval for upgrade channel"})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"sync_namespaces"}),(0,n.jsx)(r.td,{children:"list"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"[]"})}),(0,n.jsx)(r.td,{children:"Namespace the operator will watch for, leave empty for all"})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"debug"}),(0,n.jsx)(r.td,{children:"bool"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"false"})}),(0,n.jsx)(r.td,{children:"Enable debug output for operator"})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"nodeSelector.kubernetes.io/os"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"linux"})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"tolerations"}),(0,n.jsx)(r.td,{children:"object"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"{}"})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"tolerations.key"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"cattle.io/os"})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"tolerations.operator"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:'"Equal"'})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"tolerations.value"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:'"linux"'})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"tolerations.effect"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"NoSchedule"})}),(0,n.jsx)(r.td,{})]})]})]})]})}function h(e={}){const{wrapper:r}={...(0,s.a)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(o,{...e})}):o(e)}},1151:(e,r,t)=>{t.d(r,{Z:()=>a,a:()=>i});var n=t(7294);const s={},l=n.createContext(s);function i(e){const r=n.useContext(l);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(l.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/43c9fc1f.9b61099e.js b/assets/js/43c9fc1f.9b61099e.js new file mode 100644 index 000000000..8b829a54d --- /dev/null +++ b/assets/js/43c9fc1f.9b61099e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4020],{3472:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>l,metadata:()=>a,toc:()=>d});var t=n(5893),s=n(1151);const l={sidebar_label:"Elemental Operator Helm Chart",title:""},i="Elemental Operator Helm Chart",a={id:"elementaloperatorchart-reference",title:"",description:"The is responsible for managing the Elemental versions and maintaining a machine inventory to assist with edge or bare metal installations.",source:"@site/versioned_docs/version-1.3/elementaloperatorchart-reference.md",sourceDirName:".",slug:"/elementaloperatorchart-reference",permalink:"/elementaloperatorchart-reference",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Elemental Operator Helm Chart",title:""},sidebar:"docs",previous:{title:"SeedImage reference",permalink:"/seedimage-reference"},next:{title:"Kubernetes versions",permalink:"/kubernetesversions"}},c={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Get Helm chart info",id:"get-helm-chart-info",level:2},{value:"Install Chart",id:"install-chart",level:2},{value:"Uninstall Chart",id:"uninstall-chart",level:2},{value:"Upgrading Chart",id:"upgrading-chart",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Values",id:"values",level:2}];function o(e){const r={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components},{Head:n,Vars:l}=r;return n||m("Head",!0),l||m("Vars",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n,{children:(0,t.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/elementaloperatorchart-reference"})}),"\n",(0,t.jsx)(r.h1,{id:"elemental-operator-helm-chart",children:"Elemental Operator Helm Chart"}),"\n",(0,t.jsxs)(r.p,{children:["The ",(0,t.jsx)(l,{name:"elemental_operator_name",link:"elemental_operator_url"})," is responsible for managing the Elemental versions and maintaining a machine inventory to assist with edge or bare metal installations."]}),"\n",(0,t.jsxs)(r.p,{children:["The associated chart bootstraps an elemental-operator deployment on the ",(0,t.jsx)(r.a,{href:"https://rancher.com/docs/rancher/v2.6/",children:"Rancher Manager v2.6"})," cluster using the ",(0,t.jsx)(r.a,{href:"https://helm.sh",children:"Helm"})," package manager."]}),"\n",(0,t.jsx)(r.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsx)(r.li,{children:"Rancher Manager version v2.6"}),"\n",(0,t.jsx)(r.li,{children:"Helm client version v3.8.0+"}),"\n"]}),"\n",(0,t.jsx)(r.h2,{id:"get-helm-chart-info",children:"Get Helm chart info"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm pull oci://registry.suse.com/rancher/elemental-operator-chart\nhelm show all oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,t.jsx)(r.h2,{id:"install-chart",children:"Install Chart"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm install --create-namespace -n cattle-elemental-system elemental-operator-crds \\\n oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm install --create-namespace -n cattle-elemental-system elemental-operator \\\n oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,t.jsx)(r.p,{children:"The command deploys elemental-operator on the Kubernetes cluster in the default configuration."}),"\n",(0,t.jsx)(r.p,{children:(0,t.jsxs)(r.em,{children:["See ",(0,t.jsx)(r.a,{href:"#configuration",children:"configuration"})," below."]})}),"\n",(0,t.jsx)(r.p,{children:(0,t.jsxs)(r.em,{children:["See ",(0,t.jsx)(r.a,{href:"https://helm.sh/docs/helm/helm_install/",children:"helm install"})," for command documentation."]})}),"\n",(0,t.jsx)(r.h2,{id:"uninstall-chart",children:"Uninstall Chart"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm uninstall -n cattle-elemental-system elemental-operator\n"})}),"\n",(0,t.jsx)(r.p,{children:"This removes all the Kubernetes components associated with the chart and deletes the release."}),"\n",(0,t.jsx)(r.p,{children:(0,t.jsxs)(r.em,{children:["See ",(0,t.jsx)(r.a,{href:"https://helm.sh/docs/helm/helm_uninstall/",children:"helm uninstall"})," for command documentation."]})}),"\n",(0,t.jsx)(r.h2,{id:"upgrading-chart",children:"Upgrading Chart"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm upgrade -n cattle-elemental-system \\\n --install elemental-operator \\\n oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,t.jsx)(r.p,{children:(0,t.jsxs)(r.em,{children:["See ",(0,t.jsx)(r.a,{href:"https://helm.sh/docs/helm/helm_upgrade/",children:"helm upgrade"})," for command documentation."]})}),"\n",(0,t.jsx)(r.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsxs)(r.p,{children:["See ",(0,t.jsx)(r.a,{href:"https://helm.sh/docs/intro/using_helm/#customizing-the-chart-before-installing",children:"Customizing the Chart Before Installing"}),". To see all configurable options with detailed comments, visit the chart's ",(0,t.jsx)(r.a,{href:"#values",children:"values"}),", or run these configuration commands:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm show values oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,t.jsx)(r.h2,{id:"values",children:"Values"}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Key"}),(0,t.jsx)(r.th,{children:"Type"}),(0,t.jsx)(r.th,{children:"Default"}),(0,t.jsx)(r.th,{children:"Description"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"image.empty"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"rancher/pause:3.1"})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"image.repository"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"registry.suse.com/rancher/elemental-operator-chart"})}),(0,t.jsx)(r.td,{children:"Source image for elemental-operator with repository name"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"image.tag"}),(0,t.jsx)(r.td,{children:"tag"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:'""'})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"image.imagePullPolicy"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"IfNotPresent"})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"noProxy"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:'`127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local"'}),(0,t.jsx)(r.td,{children:"Comma separated list of domains or ip addresses that will not use the proxy"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"global.cattle.systemDefaultRegistry"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:'""'})}),(0,t.jsx)(r.td,{children:"Default container registry name"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"sync_interval"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:'"60m"'})}),(0,t.jsx)(r.td,{children:"Default sync interval for upgrade channel"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"sync_namespaces"}),(0,t.jsx)(r.td,{children:"list"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"[]"})}),(0,t.jsx)(r.td,{children:"Namespace the operator will watch for, leave empty for all"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"debug"}),(0,t.jsx)(r.td,{children:"bool"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"false"})}),(0,t.jsx)(r.td,{children:"Enable debug output for operator"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"nodeSelector.kubernetes.io/os"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"linux"})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"tolerations"}),(0,t.jsx)(r.td,{children:"object"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"{}"})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"tolerations.key"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"cattle.io/os"})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"tolerations.operator"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:'"Equal"'})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"tolerations.value"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:'"linux"'})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"tolerations.effect"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"NoSchedule"})}),(0,t.jsx)(r.td,{})]})]})]})]})}function h(e={}){const{wrapper:r}={...(0,s.a)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(o,{...e})}):o(e)}function m(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,r,n)=>{n.d(r,{Z:()=>a,a:()=>i});var t=n(7294);const s={},l=t.createContext(s);function i(e){const r=t.useContext(l);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),t.createElement(l.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/44234b90.b9123fb8.js b/assets/js/44234b90.b9123fb8.js new file mode 100644 index 000000000..acbf1498a --- /dev/null +++ b/assets/js/44234b90.b9123fb8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7012],{5532:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>p,contentTitle:()=>m,default:()=>v,frontMatter:()=>u,metadata:()=>g,toc:()=>j});var t=a(5893),s=a(1151),r=a(4298),l=a(1230),i=a(2361),o=a(5130),d=a(9992),c=a(8139),h=a(460);const u={sidebar_label:"Upgrade",title:""},m="Upgrade",g={id:"upgrade",title:"",description:"All components in Elemental are managed using Kubernetes. Below is how",source:"@site/docs/upgrade.md",sourceDirName:".",slug:"/upgrade",permalink:"/next/upgrade",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Upgrade",title:""},sidebar:"docs",previous:{title:"Installation",permalink:"/next/installation"},next:{title:"Customize Elemental Install",permalink:"/next/customizing"}},p={},j=[{value:"Elemental Teal node upgrade",id:"elemental-teal-node-upgrade",level:2},{value:"Upgrade via command line interface",id:"upgrade-via-command-line-interface",level:2},{value:"Selecting source for upgrade",id:"selecting-source-for-upgrade",level:3},{value:"Managing available versions",id:"managing-available-versions",level:3},{value:"Upgrade via user interface",id:"upgrade-via-user-interface",level:2}];function x(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components},{CodeBlock:u,Head:m,TabItem:g,Tabs:p,Vars:j}=n;return u||b("CodeBlock",!0),m||b("Head",!0),g||b("TabItem",!0),p||b("Tabs",!0),j||b("Vars",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(m,{children:(0,t.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/upgrade"})}),"\n","\n","\n",(0,t.jsx)(n.h1,{id:"upgrade",children:"Upgrade"}),"\n",(0,t.jsx)(n.p,{children:"All components in Elemental are managed using Kubernetes. Below is how\nto use Kubernetes approaches to upgrade the components."}),"\n",(0,t.jsx)(n.h2,{id:"elemental-teal-node-upgrade",children:"Elemental Teal node upgrade"}),"\n",(0,t.jsxs)(n.p,{children:["Elemental Teal is upgraded with the ",(0,t.jsx)(j,{name:"elemental_operator_name"}),". Refer to the\n",(0,t.jsx)(n.a,{href:"/next/elementaloperatorchart-reference",children:(0,t.jsx)(j,{name:"elemental_operator_name"})})," documentation for complete information."]}),"\n",(0,t.jsx)(n.p,{children:"Upgrade can be achieve either with CLI or UI:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#upgrade-via-command-line-interface",children:"Command Line Interface"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#upgrade-via-user-interface",children:"User Interface"})}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"upgrade-via-command-line-interface",children:"Upgrade via command line interface"}),"\n",(0,t.jsx)(n.p,{children:"There are two ways of selecting nodes for upgrading. Via a cluster target, which will match ALL nodes in a cluster that matches our\nselector or via node selector, which will match nodes based on the node labels. Node selector allows us to be more targeted with the upgrade\nwhile cluster selector just selects all the nodes in a matched cluster."}),"\n",(0,t.jsxs)(p,{children:[(0,t.jsxs)(g,{value:"clusterTarget",label:"With 'clusterTarget'",default:!0,children:[(0,t.jsxs)(n.p,{children:["You can target nodes for an upgrade via a ",(0,t.jsx)(n.code,{children:"clusterTarget"})," by setting it to the cluster name that you want to upgrade.\nAll nodes in a cluster that matches that name will match and be upgraded."]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-cluster-target.yaml",showLineNumbers:!0,children:r.Z})]}),(0,t.jsxs)(g,{value:"nodeSelector",label:"With nodeSelector",children:[(0,t.jsxs)(n.p,{children:["You can target nodes for an upgrade via a ",(0,t.jsx)(n.code,{children:"nodeSelector"})," by setting it to the label and value that you want to match.\nAny nodes containing that key with the value will match and be upgraded."]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-node-selector.yaml",showLineNumbers:!0,children:l.Z})]}),(0,t.jsxs)(g,{value:"forceUpgrade",label:"With FORCE flag",children:[(0,t.jsx)(n.p,{children:"When upgrading to an older version or the same version that is already running the upgrade-procedure will be skipped."}),(0,t.jsx)(n.p,{children:"It is possible to force upgrades to older versions by setting the FORCE environment variable as shown below."}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-force.yaml",showLineNumbers:!0,children:i.Z})]})]}),"\n",(0,t.jsx)(n.h3,{id:"selecting-source-for-upgrade",children:"Selecting source for upgrade"}),"\n",(0,t.jsxs)(p,{children:[(0,t.jsxs)(g,{value:"osImage",label:"Via 'osImage'",children:[(0,t.jsxs)(n.p,{children:["Just specify an OCI image on the ",(0,t.jsx)(n.code,{children:"osImage"})," field"]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-cluster-target.yaml",showLineNumbers:!0,children:r.Z})]}),(0,t.jsxs)(g,{value:"managedOSVersion",label:"Via 'ManagedOSVersion'",children:[(0,t.jsxs)(n.p,{children:["In this case we use the auto populated ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," resources to set the wanted ",(0,t.jsx)(n.code,{children:"managedOSVersionName"})," field.\nSee section ",(0,t.jsx)(n.a,{href:"#managing-available-versions",children:"Managing available versions"})," to understand how the ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," are managed."]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-managedos-version.yaml",showLineNumbers:!0,children:o.Z})]})]}),"\n",(0,t.jsx)(n.admonition,{title:"Warning",type:"warning",children:(0,t.jsxs)(n.p,{children:["If both ",(0,t.jsx)(n.code,{children:"osImage"})," and ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," are defined in the same ",(0,t.jsx)(n.code,{children:"ManagedOSImage"})," be aware that ",(0,t.jsx)(n.code,{children:"osImage"})," takes precedence."]})}),"\n",(0,t.jsx)(n.h3,{id:"managing-available-versions",children:"Managing available versions"}),"\n",(0,t.jsxs)(n.p,{children:["An ",(0,t.jsx)(n.code,{children:"ManagedOSVersionChannel"})," resource can be created in a Kubernetes cluster where the Elemental operator is installed to synchronize available versions for upgrades."]}),"\n",(0,t.jsxs)(n.p,{children:["It has a syncer in order to generate ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," automatically. Currently, we provide a json syncer and a custom one."]}),"\n",(0,t.jsxs)(p,{children:[(0,t.jsxs)(g,{value:"jsonSyncer",label:"Json syncer",children:[(0,t.jsxs)(n.p,{children:["This syncer will fetch a json from url and parse it into valid ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," resources."]}),(0,t.jsx)(u,{language:"yaml",title:"managed-os-version-json",showLineNumbers:!0,children:d.Z})]}),(0,t.jsxs)(g,{value:"customSyncer",label:"Custom syncer",children:[(0,t.jsxs)(n.p,{children:["A custom syncer allows more flexibility on how to gather ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," by allowing custom commands with custom images."]}),(0,t.jsxs)(n.p,{children:["This type of syncer allows to run a given command with arguments and env vars in a custom image and output a json file to ",(0,t.jsx)(n.code,{children:"/data/output"}),".\nThe generated data is then automounted by the syncer and then parsed so it can gather create the proper versions."]}),(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["The only requirement to make your own custom syncer is to make it output a json file to ",(0,t.jsx)(n.code,{children:"/data/output"})," and keep the correct json structure."]})}),(0,t.jsxs)(n.p,{children:["Elemental project provides an Elemental Teal channel to list all ",(0,t.jsx)(n.code,{children:"ManagedOSVersions"})," released as a custom syncer.\nSee the Elemental Teal channel resource definition below:"]}),(0,t.jsx)(u,{language:"yaml",title:"managed-os-version-channel-json.yaml",showLineNumbers:!0,children:c.Z})]})]}),"\n",(0,t.jsx)(n.p,{children:"In both cases the file that the operator expects to parse is a json file with the versions on it as follows"}),"\n",(0,t.jsx)(u,{language:"json",title:"versions.json",showLineNumbers:!0,children:h.Z}),"\n",(0,t.jsx)(n.h2,{id:"upgrade-via-user-interface",children:"Upgrade via user interface"}),"\n",(0,t.jsxs)(n.p,{children:["To upgrade via the UI, you have to go in the Elemental Advanced menu, then click on ",(0,t.jsx)(n.code,{children:"Update Groups"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Choose a name, select clusters to target and choose between the two upgrade ways:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Elemental Upgrade Menu",src:a(8041).Z+"",width:"901",height:"745"})}),"\n",(0,t.jsxs)(p,{children:[(0,t.jsxs)(g,{value:"managedOSVersion",label:"Via Managed OS Version",children:[(0,t.jsxs)(n.p,{children:["In this case, a ",(0,t.jsx)(n.code,{children:"OS Version Channels"})," is used to auto populated ",(0,t.jsx)(n.code,{children:"OS Versions"})," resources."]}),(0,t.jsx)(n.p,{children:"The channel bellow is provide by us but you can bring your own channel as well."}),(0,t.jsxs)(n.p,{children:["See section ",(0,t.jsx)(n.a,{href:"#managing-available-versions",children:"Managing available versions"})," to understand how the ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," are managed."]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Create OS Version Channel",src:a(188).Z+"",width:"792",height:"535"})}),(0,t.jsxs)(n.p,{children:["After a short syncing time, you will see your ",(0,t.jsx)(n.code,{children:"OS Versions"})," appears in the ",(0,t.jsx)(n.code,{children:"OS Versions"})," menu."]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Elemental OS Version menu",src:a(4830).Z+"",width:"993",height:"438"})}),(0,t.jsxs)(n.p,{children:["Finally, you can select the ",(0,t.jsx)(n.code,{children:"OS Versions"})," when you create your ",(0,t.jsx)(n.code,{children:"Upgrade Group"})," according to the following screenshot:"]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Select OS Version in Upgrade Group",src:a(3908).Z+"",width:"788",height:"802"})})]}),(0,t.jsxs)(g,{value:"imageFromRegistry",label:"Via Image from registry",children:[(0,t.jsxs)(n.p,{children:["Just specify an OCI image on the ",(0,t.jsx)(n.code,{children:"Image path"})," field to upgrade to:"]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Upgrade via Image Registry",src:a(5156).Z+"",width:"765",height:"557"})})]})]}),"\n",(0,t.jsxs)(n.p,{children:["Click on the ",(0,t.jsx)(n.code,{children:"Create"})," button to start the upgrade process, if you have multiple nodes, the upgrade will be done sequentially node by node."]})]})}function v(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}function b(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},8139:(e,n,a)=>{a.d(n,{Z:()=>t});const t="apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSVersionChannel\nmetadata:\n name: elemental-teal-channel\n namespace: fleet-default\nspec:\n options:\n image: registry.suse.com/rancher/elemental-teal-channel/5.3:latest\n type: custom\n"},9992:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSVersionChannel\nmetadata:\n name: elemental-versions\n namespace: fleet-default\nspec:\n options:\n URI: "https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/upgrade/versions.json"\n Timeout: "1m"\n type: json'},4298:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to or track the latest tag\n osImage: "registry.suse.com/rancher/elemental-teal/5.3:latest"\n clusterTargets:\n - clusterName: my-cluster\n'},2361:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to\n osImage: "registry.suse.com/rancher/elemental-teal/5.3:latest"\n clusterTargets:\n - clusterName: my-cluster\n upgradeContainer:\n envs:\n - name: FORCE\n value: "true"\n'},5130:(e,n,a)=>{a.d(n,{Z:()=>t});const t="apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new ManagedOSVersion you would like to upgrade to\n managedOSVersionName: v0.1.0-alpha22-amd64\n clusterTargets:\n - clusterName: my-cluster"},1230:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to\n osImage: "registry.suse.com/rancher/elemental-teal/5.3:latest"\n clusterTargets:\n - clusterName: my-cluster\n nodeSelector:\n matchLabels:\n kubernetes.io/hostname: my-machine\n'},460:(e,n,a)=>{a.d(n,{Z:()=>t});const t='[\n {\n "metadata": {\n "name": "v0.1.0"\n },\n "spec": {\n "version": "v0.1.0",\n "type": "container",\n "metadata": {\n "upgradeImage": "foo/bar:v0.1.0"\n }\n }\n },\n {\n "metadata": {\n "name": "v0.2.0"\n },\n "spec": {\n "version": "v0.2.0",\n "type": "container",\n "metadata": {\n "upgradeImage": "foo/bar:v0.2.0"\n }\n }\n }\n]'},5156:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-image-registry-2f404c81df7747f4d2800ca9899dc657.png"},8041:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-menu-93b767af21b0dbe3e2b60d07897488ca.png"},4830:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-os-version-0dbbe5e7b5f9a4c0ba6801227541b900.png"},3908:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-upgrade-group-channel-6f58b8b4ab7ad99803bd22cdaf983a16.png"},188:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-version-channel-8189dd091df520bafb6593f492d511c8.png"},1151:(e,n,a)=>{a.d(n,{Z:()=>i,a:()=>l});var t=a(7294);const s={},r=t.createContext(s);function l(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/44234b90.e22542ac.js b/assets/js/44234b90.e22542ac.js deleted file mode 100644 index 01e56fa18..000000000 --- a/assets/js/44234b90.e22542ac.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7012],{5532:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>p,contentTitle:()=>m,default:()=>v,frontMatter:()=>u,metadata:()=>g,toc:()=>j});var t=a(5893),s=a(1151),r=a(4298),l=a(1230),i=a(2361),o=a(5130),d=a(9992),c=a(8139),h=a(460);const u={sidebar_label:"Upgrade",title:""},m="Upgrade",g={id:"upgrade",title:"",description:"All components in Elemental are managed using Kubernetes. Below is how",source:"@site/docs/upgrade.md",sourceDirName:".",slug:"/upgrade",permalink:"/next/upgrade",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Upgrade",title:""},sidebar:"docs",previous:{title:"Installation",permalink:"/next/installation"},next:{title:"Customize Elemental Install",permalink:"/next/customizing"}},p={},j=[{value:"Elemental Teal node upgrade",id:"elemental-teal-node-upgrade",level:2},{value:"Upgrade via command line interface",id:"upgrade-via-command-line-interface",level:2},{value:"Selecting source for upgrade",id:"selecting-source-for-upgrade",level:3},{value:"Managing available versions",id:"managing-available-versions",level:3},{value:"Upgrade via user interface",id:"upgrade-via-user-interface",level:2}];function x(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components},{CodeBlock:u,TabItem:m,Tabs:g,Vars:p}=n;return u||b("CodeBlock",!0),m||b("TabItem",!0),g||b("Tabs",!0),p||b("Vars",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"upgrade",children:"Upgrade"}),"\n",(0,t.jsx)(n.p,{children:"All components in Elemental are managed using Kubernetes. Below is how\nto use Kubernetes approaches to upgrade the components."}),"\n",(0,t.jsx)(n.h2,{id:"elemental-teal-node-upgrade",children:"Elemental Teal node upgrade"}),"\n",(0,t.jsxs)(n.p,{children:["Elemental Teal is upgraded with the ",(0,t.jsx)(p,{name:"elemental_operator_name"}),". Refer to the\n",(0,t.jsx)(n.a,{href:"/next/elementaloperatorchart-reference",children:(0,t.jsx)(p,{name:"elemental_operator_name"})})," documentation for complete information."]}),"\n",(0,t.jsx)(n.p,{children:"Upgrade can be achieve either with CLI or UI:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#upgrade-via-command-line-interface",children:"Command Line Interface"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#upgrade-via-user-interface",children:"User Interface"})}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"upgrade-via-command-line-interface",children:"Upgrade via command line interface"}),"\n",(0,t.jsx)(n.p,{children:"There are two ways of selecting nodes for upgrading. Via a cluster target, which will match ALL nodes in a cluster that matches our\nselector or via node selector, which will match nodes based on the node labels. Node selector allows us to be more targeted with the upgrade\nwhile cluster selector just selects all the nodes in a matched cluster."}),"\n",(0,t.jsxs)(g,{children:[(0,t.jsxs)(m,{value:"clusterTarget",label:"With 'clusterTarget'",default:!0,children:[(0,t.jsxs)(n.p,{children:["You can target nodes for an upgrade via a ",(0,t.jsx)(n.code,{children:"clusterTarget"})," by setting it to the cluster name that you want to upgrade.\nAll nodes in a cluster that matches that name will match and be upgraded."]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-cluster-target.yaml",showLineNumbers:!0,children:r.Z})]}),(0,t.jsxs)(m,{value:"nodeSelector",label:"With nodeSelector",children:[(0,t.jsxs)(n.p,{children:["You can target nodes for an upgrade via a ",(0,t.jsx)(n.code,{children:"nodeSelector"})," by setting it to the label and value that you want to match.\nAny nodes containing that key with the value will match and be upgraded."]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-node-selector.yaml",showLineNumbers:!0,children:l.Z})]}),(0,t.jsxs)(m,{value:"forceUpgrade",label:"With FORCE flag",children:[(0,t.jsx)(n.p,{children:"When upgrading to an older version or the same version that is already running the upgrade-procedure will be skipped."}),(0,t.jsx)(n.p,{children:"It is possible to force upgrades to older versions by setting the FORCE environment variable as shown below."}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-force.yaml",showLineNumbers:!0,children:i.Z})]})]}),"\n",(0,t.jsx)(n.h3,{id:"selecting-source-for-upgrade",children:"Selecting source for upgrade"}),"\n",(0,t.jsxs)(g,{children:[(0,t.jsxs)(m,{value:"osImage",label:"Via 'osImage'",children:[(0,t.jsxs)(n.p,{children:["Just specify an OCI image on the ",(0,t.jsx)(n.code,{children:"osImage"})," field"]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-cluster-target.yaml",showLineNumbers:!0,children:r.Z})]}),(0,t.jsxs)(m,{value:"managedOSVersion",label:"Via 'ManagedOSVersion'",children:[(0,t.jsxs)(n.p,{children:["In this case we use the auto populated ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," resources to set the wanted ",(0,t.jsx)(n.code,{children:"managedOSVersionName"})," field.\nSee section ",(0,t.jsx)(n.a,{href:"#managing-available-versions",children:"Managing available versions"})," to understand how the ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," are managed."]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-managedos-version.yaml",showLineNumbers:!0,children:o.Z})]})]}),"\n",(0,t.jsx)(n.admonition,{title:"Warning",type:"warning",children:(0,t.jsxs)(n.p,{children:["If both ",(0,t.jsx)(n.code,{children:"osImage"})," and ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," are defined in the same ",(0,t.jsx)(n.code,{children:"ManagedOSImage"})," be aware that ",(0,t.jsx)(n.code,{children:"osImage"})," takes precedence."]})}),"\n",(0,t.jsx)(n.h3,{id:"managing-available-versions",children:"Managing available versions"}),"\n",(0,t.jsxs)(n.p,{children:["An ",(0,t.jsx)(n.code,{children:"ManagedOSVersionChannel"})," resource can be created in a Kubernetes cluster where the Elemental operator is installed to synchronize available versions for upgrades."]}),"\n",(0,t.jsxs)(n.p,{children:["It has a syncer in order to generate ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," automatically. Currently, we provide a json syncer and a custom one."]}),"\n",(0,t.jsxs)(g,{children:[(0,t.jsxs)(m,{value:"jsonSyncer",label:"Json syncer",children:[(0,t.jsxs)(n.p,{children:["This syncer will fetch a json from url and parse it into valid ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," resources."]}),(0,t.jsx)(u,{language:"yaml",title:"managed-os-version-json",showLineNumbers:!0,children:d.Z})]}),(0,t.jsxs)(m,{value:"customSyncer",label:"Custom syncer",children:[(0,t.jsxs)(n.p,{children:["A custom syncer allows more flexibility on how to gather ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," by allowing custom commands with custom images."]}),(0,t.jsxs)(n.p,{children:["This type of syncer allows to run a given command with arguments and env vars in a custom image and output a json file to ",(0,t.jsx)(n.code,{children:"/data/output"}),".\nThe generated data is then automounted by the syncer and then parsed so it can gather create the proper versions."]}),(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["The only requirement to make your own custom syncer is to make it output a json file to ",(0,t.jsx)(n.code,{children:"/data/output"})," and keep the correct json structure."]})}),(0,t.jsxs)(n.p,{children:["Elemental project provides an Elemental Teal channel to list all ",(0,t.jsx)(n.code,{children:"ManagedOSVersions"})," released as a custom syncer.\nSee the Elemental Teal channel resource definition below:"]}),(0,t.jsx)(u,{language:"yaml",title:"managed-os-version-channel-json.yaml",showLineNumbers:!0,children:c.Z})]})]}),"\n",(0,t.jsx)(n.p,{children:"In both cases the file that the operator expects to parse is a json file with the versions on it as follows"}),"\n",(0,t.jsx)(u,{language:"json",title:"versions.json",showLineNumbers:!0,children:h.Z}),"\n",(0,t.jsx)(n.h2,{id:"upgrade-via-user-interface",children:"Upgrade via user interface"}),"\n",(0,t.jsxs)(n.p,{children:["To upgrade via the UI, you have to go in the Elemental Advanced menu, then click on ",(0,t.jsx)(n.code,{children:"Update Groups"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Choose a name, select clusters to target and choose between the two upgrade ways:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Elemental Upgrade Menu",src:a(8041).Z+"",width:"901",height:"745"})}),"\n",(0,t.jsxs)(g,{children:[(0,t.jsxs)(m,{value:"managedOSVersion",label:"Via Managed OS Version",children:[(0,t.jsxs)(n.p,{children:["In this case, a ",(0,t.jsx)(n.code,{children:"OS Version Channels"})," is used to auto populated ",(0,t.jsx)(n.code,{children:"OS Versions"})," resources."]}),(0,t.jsx)(n.p,{children:"The channel bellow is provide by us but you can bring your own channel as well."}),(0,t.jsxs)(n.p,{children:["See section ",(0,t.jsx)(n.a,{href:"#managing-available-versions",children:"Managing available versions"})," to understand how the ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," are managed."]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Create OS Version Channel",src:a(188).Z+"",width:"792",height:"535"})}),(0,t.jsxs)(n.p,{children:["After a short syncing time, you will see your ",(0,t.jsx)(n.code,{children:"OS Versions"})," appears in the ",(0,t.jsx)(n.code,{children:"OS Versions"})," menu."]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Elemental OS Version menu",src:a(4830).Z+"",width:"993",height:"438"})}),(0,t.jsxs)(n.p,{children:["Finally, you can select the ",(0,t.jsx)(n.code,{children:"OS Versions"})," when you create your ",(0,t.jsx)(n.code,{children:"Upgrade Group"})," according to the following screenshot:"]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Select OS Version in Upgrade Group",src:a(3908).Z+"",width:"788",height:"802"})})]}),(0,t.jsxs)(m,{value:"imageFromRegistry",label:"Via Image from registry",children:[(0,t.jsxs)(n.p,{children:["Just specify an OCI image on the ",(0,t.jsx)(n.code,{children:"Image path"})," field to upgrade to:"]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Upgrade via Image Registry",src:a(5156).Z+"",width:"765",height:"557"})})]})]}),"\n",(0,t.jsxs)(n.p,{children:["Click on the ",(0,t.jsx)(n.code,{children:"Create"})," button to start the upgrade process, if you have multiple nodes, the upgrade will be done sequentially node by node."]})]})}function v(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}function b(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},8139:(e,n,a)=>{a.d(n,{Z:()=>t});const t="apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSVersionChannel\nmetadata:\n name: elemental-teal-channel\n namespace: fleet-default\nspec:\n options:\n image: registry.suse.com/rancher/elemental-teal-channel/5.3:latest\n type: custom\n"},9992:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSVersionChannel\nmetadata:\n name: elemental-versions\n namespace: fleet-default\nspec:\n options:\n URI: "https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/upgrade/versions.json"\n Timeout: "1m"\n type: json'},4298:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to or track the latest tag\n osImage: "registry.suse.com/rancher/elemental-teal/5.3:latest"\n clusterTargets:\n - clusterName: my-cluster\n'},2361:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to\n osImage: "registry.suse.com/rancher/elemental-teal/5.3:latest"\n clusterTargets:\n - clusterName: my-cluster\n upgradeContainer:\n envs:\n - name: FORCE\n value: "true"\n'},5130:(e,n,a)=>{a.d(n,{Z:()=>t});const t="apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new ManagedOSVersion you would like to upgrade to\n managedOSVersionName: v0.1.0-alpha22-amd64\n clusterTargets:\n - clusterName: my-cluster"},1230:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to\n osImage: "registry.suse.com/rancher/elemental-teal/5.3:latest"\n clusterTargets:\n - clusterName: my-cluster\n nodeSelector:\n matchLabels:\n kubernetes.io/hostname: my-machine\n'},460:(e,n,a)=>{a.d(n,{Z:()=>t});const t='[\n {\n "metadata": {\n "name": "v0.1.0"\n },\n "spec": {\n "version": "v0.1.0",\n "type": "container",\n "metadata": {\n "upgradeImage": "foo/bar:v0.1.0"\n }\n }\n },\n {\n "metadata": {\n "name": "v0.2.0"\n },\n "spec": {\n "version": "v0.2.0",\n "type": "container",\n "metadata": {\n "upgradeImage": "foo/bar:v0.2.0"\n }\n }\n }\n]'},5156:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-image-registry-2f404c81df7747f4d2800ca9899dc657.png"},8041:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-menu-93b767af21b0dbe3e2b60d07897488ca.png"},4830:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-os-version-0dbbe5e7b5f9a4c0ba6801227541b900.png"},3908:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-upgrade-group-channel-6f58b8b4ab7ad99803bd22cdaf983a16.png"},188:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-version-channel-8189dd091df520bafb6593f492d511c8.png"},1151:(e,n,a)=>{a.d(n,{Z:()=>i,a:()=>l});var t=a(7294);const s={},r=t.createContext(s);function l(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4601e8b1.cacc4273.js b/assets/js/4601e8b1.cacc4273.js new file mode 100644 index 000000000..686da74c0 --- /dev/null +++ b/assets/js/4601e8b1.cacc4273.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[939],{3632:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});var i=t(5893),s=t(1151);const a={sidebar_label:"Machine Reset",title:"",version_badge:"1.3.0"},l=void 0,r={id:"reset",title:"",description:"Machine Reset",source:"@site/docs/reset.md",sourceDirName:".",slug:"/reset",permalink:"/next/reset",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Machine Reset",title:"",version_badge:"1.3.0"},sidebar:"docs",previous:{title:"Inventory Management",permalink:"/next/inventory-management"},next:{title:"Backup",permalink:"/next/backup"}},o={},c=[{value:"Machine Reset",id:"machine-reset",level:2},{value:"Reset workflow",id:"reset-workflow",level:3},{value:"Enable machine reset",id:"enable-machine-reset",level:3}];function d(e){const n={a:"a",br:"br",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,s.a)(),...e.components},{Head:a}=n;return a||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(a,{children:(0,i.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/reset"})}),"\n",(0,i.jsx)(n.h2,{id:"machine-reset",children:"Machine Reset"}),"\n",(0,i.jsx)(n.p,{children:"There are two ways to reset Elemental machines to their original state or decommission them:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"When deleting a Cluster, all associated machines will be reset"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Delete a Cluster to reset all machines",src:t(2783).Z+"",width:"1241",height:"359"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"When managing a Cluster, simply delete the Node that needs to be reset"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Delete a single node to reset it",src:t(9911).Z+"",width:"1241",height:"774"})}),"\n",(0,i.jsx)(n.h3,{id:"reset-workflow",children:"Reset workflow"}),"\n",(0,i.jsxs)(n.p,{children:["Once the related ",(0,i.jsx)(n.code,{children:"MachineInventory"})," is flagged for deletion, a reset plan will be executed by the ",(0,i.jsx)(n.code,{children:"elemental-system-agent"})," running on the machine."]}),"\n",(0,i.jsx)(n.p,{children:"If the machine is still running, this plan will:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Reboot the machine in recovery mode."}),"\n",(0,i.jsxs)(n.li,{children:["Execute ",(0,i.jsx)(n.code,{children:"systemctl start elemental-register-reset"}),".",(0,i.jsx)(n.br,{}),"\n","This will fetch the remote ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," and apply the ",(0,i.jsx)(n.code,{children:"spec.config.elemental.reset"})," options to reset the machine.",(0,i.jsx)(n.br,{}),"\n","A new ",(0,i.jsx)(n.code,{children:"MachineInventory"})," will be created and the ",(0,i.jsx)(n.code,{children:"spec.config.cloud-config"})," defined in the ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," will be applied again."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Note that the ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," reference will ",(0,i.jsx)(n.strong,{children:"not"})," change, the machine will ",(0,i.jsx)(n.strong,{children:"not"})," be reinstalled, the ",(0,i.jsx)(n.code,{children:"COS_PERSISTENT"})," and ",(0,i.jsx)(n.code,{children:"COS_OEM"})," partition will be cleared by default if reset is ",(0,i.jsx)(n.code,{children:"enabled"}),". For more information, you can consult the ",(0,i.jsx)(n.a,{href:"installation#deployed-elemental-teal-partition-table",children:"Partition Table"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Since the ",(0,i.jsx)(n.code,{children:"cloud-config"})," is re-applied during the reset workflow, you can reset a machine to apply updates from the ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," definition, for example to rotate ",(0,i.jsx)(n.code,{children:"users"})," credentials and authorized keys. It is strongly recommended to enable the ",(0,i.jsx)(n.code,{children:"reset-oem"})," option, to avoid conflicts with previously configured cloud-configs."]}),"\n",(0,i.jsxs)(n.p,{children:["If you need to bind a machine to a different ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," and trigger a new full installation, you need to reprovision it again using a new image."]}),"\n",(0,i.jsx)(n.h3,{id:"enable-machine-reset",children:"Enable machine reset"}),"\n",(0,i.jsxs)(n.p,{children:["In order to allow machines to be reset automatically, the ",(0,i.jsx)(n.code,{children:"spec.config.elemental.reset.enabled"})," flag of the ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," should be toggled.",(0,i.jsx)(n.br,{}),"\n","This is off by default, but once activated, all newly created ",(0,i.jsx)(n.code,{children:"MachineInventory"})," will inherit this setting automatically.",(0,i.jsx)(n.br,{}),"\n","For example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n elemental:\n reset:\n enabled: true\n reset-persistent: true\n reset-oem: true\n # These cloud-init configs will be created during reset and will persist on the system after\n config-urls: \n - "https://my.cloud.init/reset-plan-1.yaml"\n - "https://my.cloud.init/reset-plan-2.yaml"\n # You can select a different image to run the reset. \n # Note that this image will not be installed on the system.\n system-uri: "my.oci.registry/reset-image:latest"\n power-off: false\n reboot: true\n'})}),"\n",(0,i.jsxs)(n.p,{children:["It is also possible to enable reset at a ",(0,i.jsx)(n.code,{children:"MachineInventory"})," level, for example in scenarios where some machines are physical and will benefit from an automatic reset, and some others are virtual and can simply be destroyed and reprovisioned as needed.",(0,i.jsx)(n.br,{}),"\n","In order to flag a single ",(0,i.jsx)(n.code,{children:"MachineInventory"})," to allow reset, you can use the ",(0,i.jsx)(n.code,{children:"elemental.cattle.io/resettable: true"})," annotation.",(0,i.jsx)(n.br,{}),"\n","For example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventory\nmetadata:\n annotations:\n elemental.cattle.io/resettable: "true"\n'})})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},2783:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/reset-cluster-deletion-b98a4f075a3a0600df55a5c847733fe6.png"},9911:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/reset-single-node-deletion-09c47aa5a8f695cb4bfe5eacefbf2bcb.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>l});var i=t(7294);const s={},a=i.createContext(s);function l(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4601e8b1.d6bdb742.js b/assets/js/4601e8b1.d6bdb742.js deleted file mode 100644 index caccdd87a..000000000 --- a/assets/js/4601e8b1.d6bdb742.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[939],{3632:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});var i=t(5893),s=t(1151);const a={sidebar_label:"Machine Reset",title:"",version_badge:"1.3.0"},l=void 0,r={id:"reset",title:"",description:"Machine Reset",source:"@site/docs/reset.md",sourceDirName:".",slug:"/reset",permalink:"/next/reset",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Machine Reset",title:"",version_badge:"1.3.0"},sidebar:"docs",previous:{title:"Inventory Management",permalink:"/next/inventory-management"},next:{title:"Backup",permalink:"/next/backup"}},o={},c=[{value:"Machine Reset",id:"machine-reset",level:2},{value:"Reset workflow",id:"reset-workflow",level:3},{value:"Enable machine reset",id:"enable-machine-reset",level:3}];function d(e){const n={a:"a",br:"br",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"machine-reset",children:"Machine Reset"}),"\n",(0,i.jsx)(n.p,{children:"There are two ways to reset Elemental machines to their original state or decommission them:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"When deleting a Cluster, all associated machines will be reset"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Delete a Cluster to reset all machines",src:t(2783).Z+"",width:"1241",height:"359"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"When managing a Cluster, simply delete the Node that needs to be reset"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Delete a single node to reset it",src:t(9911).Z+"",width:"1241",height:"774"})}),"\n",(0,i.jsx)(n.h3,{id:"reset-workflow",children:"Reset workflow"}),"\n",(0,i.jsxs)(n.p,{children:["Once the related ",(0,i.jsx)(n.code,{children:"MachineInventory"})," is flagged for deletion, a reset plan will be executed by the ",(0,i.jsx)(n.code,{children:"elemental-system-agent"})," running on the machine."]}),"\n",(0,i.jsx)(n.p,{children:"If the machine is still running, this plan will:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Reboot the machine in recovery mode."}),"\n",(0,i.jsxs)(n.li,{children:["Execute ",(0,i.jsx)(n.code,{children:"systemctl start elemental-register-reset"}),".",(0,i.jsx)(n.br,{}),"\n","This will fetch the remote ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," and apply the ",(0,i.jsx)(n.code,{children:"spec.config.elemental.reset"})," options to reset the machine.",(0,i.jsx)(n.br,{}),"\n","A new ",(0,i.jsx)(n.code,{children:"MachineInventory"})," will be created and the ",(0,i.jsx)(n.code,{children:"spec.config.cloud-config"})," defined in the ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," will be applied again."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Note that the ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," reference will ",(0,i.jsx)(n.strong,{children:"not"})," change, the machine will ",(0,i.jsx)(n.strong,{children:"not"})," be reinstalled, the ",(0,i.jsx)(n.code,{children:"COS_PERSISTENT"})," and ",(0,i.jsx)(n.code,{children:"COS_OEM"})," partition will be cleared by default if reset is ",(0,i.jsx)(n.code,{children:"enabled"}),". For more information, you can consult the ",(0,i.jsx)(n.a,{href:"installation#deployed-elemental-teal-partition-table",children:"Partition Table"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Since the ",(0,i.jsx)(n.code,{children:"cloud-config"})," is re-applied during the reset workflow, you can reset a machine to apply updates from the ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," definition, for example to rotate ",(0,i.jsx)(n.code,{children:"users"})," credentials and authorized keys. It is strongly recommended to enable the ",(0,i.jsx)(n.code,{children:"reset-oem"})," option, to avoid conflicts with previously configured cloud-configs."]}),"\n",(0,i.jsxs)(n.p,{children:["If you need to bind a machine to a different ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," and trigger a new full installation, you need to reprovision it again using a new image."]}),"\n",(0,i.jsx)(n.h3,{id:"enable-machine-reset",children:"Enable machine reset"}),"\n",(0,i.jsxs)(n.p,{children:["In order to allow machines to be reset automatically, the ",(0,i.jsx)(n.code,{children:"spec.config.elemental.reset.enabled"})," flag of the ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," should be toggled.",(0,i.jsx)(n.br,{}),"\n","This is off by default, but once activated, all newly created ",(0,i.jsx)(n.code,{children:"MachineInventory"})," will inherit this setting automatically.",(0,i.jsx)(n.br,{}),"\n","For example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n elemental:\n reset:\n enabled: true\n reset-persistent: true\n reset-oem: true\n # These cloud-init configs will be created during reset and will persist on the system after\n config-urls: \n - "https://my.cloud.init/reset-plan-1.yaml"\n - "https://my.cloud.init/reset-plan-2.yaml"\n # You can select a different image to run the reset. \n # Note that this image will not be installed on the system.\n system-uri: "my.oci.registry/reset-image:latest"\n power-off: false\n reboot: true\n'})}),"\n",(0,i.jsxs)(n.p,{children:["It is also possible to enable reset at a ",(0,i.jsx)(n.code,{children:"MachineInventory"})," level, for example in scenarios where some machines are physical and will benefit from an automatic reset, and some others are virtual and can simply be destroyed and reprovisioned as needed.",(0,i.jsx)(n.br,{}),"\n","In order to flag a single ",(0,i.jsx)(n.code,{children:"MachineInventory"})," to allow reset, you can use the ",(0,i.jsx)(n.code,{children:"elemental.cattle.io/resettable: true"})," annotation.",(0,i.jsx)(n.br,{}),"\n","For example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventory\nmetadata:\n annotations:\n elemental.cattle.io/resettable: "true"\n'})})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},2783:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/reset-cluster-deletion-b98a4f075a3a0600df55a5c847733fe6.png"},9911:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/reset-single-node-deletion-09c47aa5a8f695cb4bfe5eacefbf2bcb.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>l});var i=t(7294);const s={},a=i.createContext(s);function l(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/475573de.93ee040e.js b/assets/js/475573de.93ee040e.js deleted file mode 100644 index 4724b870b..000000000 --- a/assets/js/475573de.93ee040e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6292],{5555:(e,r,a)=>{a.r(r),a.d(r,{assets:()=>i,contentTitle:()=>s,default:()=>h,frontMatter:()=>c,metadata:()=>o,toc:()=>l});var n=a(5893),t=a(1151);const c={sidebar_label:"Backup",title:""},s="Backup",o={id:"backup",title:"",description:"Since Elemental runs as part of Rancher, the Elemental resources are bundled in the Rancher backup.",source:"@site/versioned_docs/version-1.3/backup.md",sourceDirName:".",slug:"/backup",permalink:"/backup",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Backup",title:""},sidebar:"docs",previous:{title:"Machine Reset",permalink:"/reset"},next:{title:"Restore",permalink:"/restore"}},i={},l=[{value:"Install rancher-backup operator for Rancher",id:"install-rancher-backup-operator-for-rancher",level:2},{value:"Backup Elemental with rancher-backup operator",id:"backup-elemental-with-rancher-backup-operator",level:2}];function u(e){const r={a:"a",br:"br",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(r.h1,{id:"backup",children:"Backup"}),"\n",(0,n.jsxs)(r.p,{children:["Since Elemental runs as part of Rancher, the Elemental resources are bundled in the Rancher backup.",(0,n.jsx)(r.br,{}),"\n","For more details about Rancher backups, restore, and disaster recovery options, please follow the official ",(0,n.jsx)(r.a,{href:"https://ranchermanager.docs.rancher.com/pages-for-subheaders/backup-restore-configuration",children:"Rancher documentation"}),"."]}),"\n",(0,n.jsx)(r.h2,{id:"install-rancher-backup-operator-for-rancher",children:"Install rancher-backup operator for Rancher"}),"\n",(0,n.jsxs)(r.p,{children:["Follow the ",(0,n.jsx)(r.a,{href:"https://docs.ranchermanager.rancher.io/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-rancher",children:"Rancher backup guide"})," to learn how to install and configure the Rancher backup-operator."]}),"\n",(0,n.jsxs)(r.p,{children:["Note that for single node Rancher installations the backup workflow is different.",(0,n.jsx)(r.br,{}),"\n","You may follow the official ",(0,n.jsx)(r.a,{href:"https://ranchermanager.docs.rancher.com/v2.6/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-docker-installed-rancher",children:"documentation"})," to learn more."]}),"\n",(0,n.jsx)(r.h2,{id:"backup-elemental-with-rancher-backup-operator",children:"Backup Elemental with rancher-backup operator"}),"\n",(0,n.jsxs)(r.p,{children:["Create a ",(0,n.jsx)(r.code,{children:"backup object"})," (adapted to your needs) to backup Rancher running on a Kubernetes cluster."]}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: resources.cattle.io/v1\nkind: Backup\nmetadata:\n name: rancher-backup\nspec:\n resourceSetName: rancher-resource-set\n schedule: "10 3 * * *"\n retentionCount: 10\n'})}),"\n",(0,n.jsxs)(r.p,{children:["The rancher-backup operator offers several options for schedule, encryption, and storage classes.",(0,n.jsx)(r.br,{}),"\n","You can explore all options by reading the ",(0,n.jsx)(r.a,{href:"https://ranchermanager.docs.rancher.com/reference-guides/backup-restore-configuration/backup-configuration",children:"official documentation"}),"."]}),"\n",(0,n.jsx)(r.p,{children:"Check logs from rancher-backup operator."}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl logs -n cattle-resources-system -l app.kubernetes.io/name=rancher-backup -f\n"})}),"\n",(0,n.jsx)(r.p,{children:"Verify if backup file was created on Persistent Volume."}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"...\nINFO[2022/10/17 07:45:04] Finding files starting with /var/lib/backups/rancher-backup-430169aa-edde-4a61-85e8-858f625a755b*.tar.gz \nINFO[2022/10/17 07:45:04] File rancher-backup-430169aa-edde-4a61-85e8-858f625a755b-2022-10-17T05-15-00Z.tar.gz was created at 2022-10-17 0\n...\n"})})]})}function h(e={}){const{wrapper:r}={...(0,t.a)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},1151:(e,r,a)=>{a.d(r,{Z:()=>o,a:()=>s});var n=a(7294);const t={},c=n.createContext(t);function s(e){const r=n.useContext(c);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),n.createElement(c.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/475573de.fbef9d21.js b/assets/js/475573de.fbef9d21.js new file mode 100644 index 000000000..18c6a909c --- /dev/null +++ b/assets/js/475573de.fbef9d21.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6292],{5555:(e,r,a)=>{a.r(r),a.d(r,{assets:()=>i,contentTitle:()=>o,default:()=>h,frontMatter:()=>c,metadata:()=>s,toc:()=>l});var n=a(5893),t=a(1151);const c={sidebar_label:"Backup",title:""},o="Backup",s={id:"backup",title:"",description:"Since Elemental runs as part of Rancher, the Elemental resources are bundled in the Rancher backup.",source:"@site/versioned_docs/version-1.3/backup.md",sourceDirName:".",slug:"/backup",permalink:"/backup",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Backup",title:""},sidebar:"docs",previous:{title:"Machine Reset",permalink:"/reset"},next:{title:"Restore",permalink:"/restore"}},i={},l=[{value:"Install rancher-backup operator for Rancher",id:"install-rancher-backup-operator-for-rancher",level:2},{value:"Backup Elemental with rancher-backup operator",id:"backup-elemental-with-rancher-backup-operator",level:2}];function u(e){const r={a:"a",br:"br",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,t.a)(),...e.components},{Head:a}=r;return a||function(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a,{children:(0,n.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/backup"})}),"\n",(0,n.jsx)(r.h1,{id:"backup",children:"Backup"}),"\n",(0,n.jsxs)(r.p,{children:["Since Elemental runs as part of Rancher, the Elemental resources are bundled in the Rancher backup.",(0,n.jsx)(r.br,{}),"\n","For more details about Rancher backups, restore, and disaster recovery options, please follow the official ",(0,n.jsx)(r.a,{href:"https://ranchermanager.docs.rancher.com/pages-for-subheaders/backup-restore-configuration",children:"Rancher documentation"}),"."]}),"\n",(0,n.jsx)(r.h2,{id:"install-rancher-backup-operator-for-rancher",children:"Install rancher-backup operator for Rancher"}),"\n",(0,n.jsxs)(r.p,{children:["Follow the ",(0,n.jsx)(r.a,{href:"https://docs.ranchermanager.rancher.io/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-rancher",children:"Rancher backup guide"})," to learn how to install and configure the Rancher backup-operator."]}),"\n",(0,n.jsxs)(r.p,{children:["Note that for single node Rancher installations the backup workflow is different.",(0,n.jsx)(r.br,{}),"\n","You may follow the official ",(0,n.jsx)(r.a,{href:"https://ranchermanager.docs.rancher.com/v2.6/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-docker-installed-rancher",children:"documentation"})," to learn more."]}),"\n",(0,n.jsx)(r.h2,{id:"backup-elemental-with-rancher-backup-operator",children:"Backup Elemental with rancher-backup operator"}),"\n",(0,n.jsxs)(r.p,{children:["Create a ",(0,n.jsx)(r.code,{children:"backup object"})," (adapted to your needs) to backup Rancher running on a Kubernetes cluster."]}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: resources.cattle.io/v1\nkind: Backup\nmetadata:\n name: rancher-backup\nspec:\n resourceSetName: rancher-resource-set\n schedule: "10 3 * * *"\n retentionCount: 10\n'})}),"\n",(0,n.jsxs)(r.p,{children:["The rancher-backup operator offers several options for schedule, encryption, and storage classes.",(0,n.jsx)(r.br,{}),"\n","You can explore all options by reading the ",(0,n.jsx)(r.a,{href:"https://ranchermanager.docs.rancher.com/reference-guides/backup-restore-configuration/backup-configuration",children:"official documentation"}),"."]}),"\n",(0,n.jsx)(r.p,{children:"Check logs from rancher-backup operator."}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl logs -n cattle-resources-system -l app.kubernetes.io/name=rancher-backup -f\n"})}),"\n",(0,n.jsx)(r.p,{children:"Verify if backup file was created on Persistent Volume."}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"...\nINFO[2022/10/17 07:45:04] Finding files starting with /var/lib/backups/rancher-backup-430169aa-edde-4a61-85e8-858f625a755b*.tar.gz \nINFO[2022/10/17 07:45:04] File rancher-backup-430169aa-edde-4a61-85e8-858f625a755b-2022-10-17T05-15-00Z.tar.gz was created at 2022-10-17 0\n...\n"})})]})}function h(e={}){const{wrapper:r}={...(0,t.a)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},1151:(e,r,a)=>{a.d(r,{Z:()=>s,a:()=>o});var n=a(7294);const t={},c=n.createContext(t);function o(e){const r=n.useContext(c);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function s(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),n.createElement(c.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/515d27de.243480e3.js b/assets/js/515d27de.243480e3.js new file mode 100644 index 000000000..1c86b2aa4 --- /dev/null +++ b/assets/js/515d27de.243480e3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7023],{9602:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>s,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>c});var a=t(5893),l=t(1151);const r={slug:"/",sidebar_label:"Overview",title:""},s="Overview",i={id:"index",title:"",description:"Elemental is a software stack enabling centralized, full cloud-native OS management with Kubernetes.",source:"@site/versioned_docs/version-1.3/index.md",sourceDirName:".",slug:"/",permalink:"/",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{slug:"/",sidebar_label:"Overview",title:""},sidebar:"docs",next:{title:"Elemental the visual way",permalink:"/quickstart-ui"}},o={},c=[{value:"What is Elemental Teal ?",id:"what-is-elemental-teal-",level:2},{value:"Elemental on x86-64 hardware",id:"elemental-on-x86-64-hardware",level:3},{value:"Elemental on ARM hardware",id:"elemental-on-arm-hardware",level:3},{value:"Elemental on other hardware",id:"elemental-on-other-hardware",level:3},{value:"Ready to give it a try?",id:"ready-to-give-it-a-try",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.a)(),...e.components},{Head:t,Vars:r}=n;return t||m("Head",!0),r||m("Vars",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t,{children:(0,a.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com"})}),"\n",(0,a.jsx)(n.h1,{id:"overview",children:"Overview"}),"\n",(0,a.jsx)(n.p,{children:"Elemental is a software stack enabling centralized, full cloud-native OS management with Kubernetes."}),"\n",(0,a.jsx)(n.p,{children:"The Elemental Stack consists of a handful of packages on top of SLE Micro for Rancher:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-toolkit"})," - Includes a set of OS utilities to enable OS management via containers. Includes dracut modules, bootloader configuration, cloud-init style configuration services, etc."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-operator"})," - Connects to Rancher Manager and handles MachineRegistration and MachineInventory CRDs."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-register"})," - Registers machines via machineRegistrations and installs them via elemental-cli."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-cli"})," - Installs any elemental-toolkit based derivative. Basically an installer based on our A/B install and upgrade system."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"rancher-system-agent"}),' - Runs on the installed system and gets instructions ("Plans") from Rancher Manager what to install and run on the system.']}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["Cluster Node OSes are built and maintained via container images through the ",(0,a.jsx)(r,{name:"elemental_cli_name"})," and they can be installed on new hosts using the ",(0,a.jsx)(r,{link:"elemental_ui_url",name:"elemental_ui_name"})," for ",(0,a.jsx)(n.a,{href:"https://www.rancher.com/products/rancher",children:"Rancher Manager"})," or the ",(0,a.jsx)(r,{link:"elemental_cli_url",name:"elemental_cli_name"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(r,{link:"elemental_operator_url",name:"elemental_operator_name"})," and the ",(0,a.jsx)(r,{link:"ranchersystemagent_url",name:"ranchersystemagent_name"})," enable Rancher Manager to fully control Elemental clusters, from the installation and management of the OS on the Nodes to the provisioning of new K3s or RKE2 clusters in a centralized way."]}),"\n",(0,a.jsx)(n.h2,{id:"what-is-elemental-teal-",children:"What is Elemental Teal ?"}),"\n",(0,a.jsx)(n.p,{children:'Elemental Teal is a combination of "SLE Micro for Rancher" with the Rancher Elemental stack.'}),"\n",(0,a.jsx)(n.p,{children:'SLE Micro for Rancher is a containerized and "stripped to the bones" OS layer. At its core, it only requires grub2, dracut, a kernel, and systemd.'}),"\n",(0,a.jsx)(n.p,{children:"It's sole purpose is to run Kubernetes (k3s or RKE2), with everything controlled through Rancher Manager."}),"\n",(0,a.jsxs)(n.p,{children:["Elemental Teal is built in the ",(0,a.jsx)(n.a,{href:"https://build.opensuse.org/package/show/isv:Rancher:Elemental:Stable:Teal53/node-image",children:"openSUSE Build Service"}),"\nand available through the ",(0,a.jsx)(n.a,{href:"https://registry.suse.com",children:"SUSE Registry"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["You can check latest versions available with ",(0,a.jsx)(n.a,{href:"https://github.com/containers/skopeo",children:"skopeo"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-console",metastring:"showLineNumbers",children:"skopeo list-tags docker://registry.suse.com/rancher/elemental-teal/5.3\n"})}),"\n",(0,a.jsx)(n.h3,{id:"elemental-on-x86-64-hardware",children:"Elemental on x86-64 hardware"}),"\n",(0,a.jsx)(n.p,{children:"Elemental Teal is production ready and fully supported on x86-64 starting with Rancher v2.7.0."}),"\n",(0,a.jsx)(n.h3,{id:"elemental-on-arm-hardware",children:"Elemental on ARM hardware"}),"\n",(0,a.jsx)(n.p,{children:"ARM (aarch64) is functional in the development stage. ARM is currently only tested on Raspberry Pi 4 Model B with k3s 1.24.8 (or later). Feedback is welcome."}),"\n",(0,a.jsx)(n.h3,{id:"elemental-on-other-hardware",children:"Elemental on other hardware"}),"\n",(0,a.jsx)(n.p,{children:"Elemental is currently targeting 'edge' scenarios and does therefore not support other hardware. We will re-assess this as the market evolves."}),"\n",(0,a.jsx)(n.h2,{id:"ready-to-give-it-a-try",children:"Ready to give it a try?"}),"\n",(0,a.jsx)(n.p,{children:"Get an Elemental Cluster up and running with your preferred method"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["With Rancher manager ",(0,a.jsx)(n.a,{href:"/quickstart-ui",children:"Elemental plugin"})]}),"\n",(0,a.jsxs)(n.li,{children:["With the ",(0,a.jsx)(n.a,{href:"/quickstart-cli",children:"Elemental CLI"})]}),"\n"]}),"\n",(0,a.jsx)(n.admonition,{title:"What's next?",type:"note",children:(0,a.jsxs)(n.p,{children:["Want more details? Take a look at the ",(0,a.jsx)(n.a,{href:"/architecture",children:"Architecture"})," section or reach out to the ",(0,a.jsx)(r,{link:"elemental_slack_url",name:"elemental_slack_name"})," Slack channel."]})})]})}function d(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}function m(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,n,t)=>{t.d(n,{Z:()=>i,a:()=>s});var a=t(7294);const l={},r=a.createContext(l);function s(e){const n=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:s(e.components),a.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/515d27de.cfaeb529.js b/assets/js/515d27de.cfaeb529.js deleted file mode 100644 index 9874f2302..000000000 --- a/assets/js/515d27de.cfaeb529.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7023],{9602:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>s,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>c});var a=t(5893),l=t(1151);const r={slug:"/",sidebar_label:"Overview",title:""},s="Overview",i={id:"index",title:"",description:"Elemental is a software stack enabling centralized, full cloud-native OS management with Kubernetes.",source:"@site/versioned_docs/version-1.3/index.md",sourceDirName:".",slug:"/",permalink:"/",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{slug:"/",sidebar_label:"Overview",title:""},sidebar:"docs",next:{title:"Elemental the visual way",permalink:"/quickstart-ui"}},o={},c=[{value:"What is Elemental Teal ?",id:"what-is-elemental-teal-",level:2},{value:"Elemental on x86-64 hardware",id:"elemental-on-x86-64-hardware",level:3},{value:"Elemental on ARM hardware",id:"elemental-on-arm-hardware",level:3},{value:"Elemental on other hardware",id:"elemental-on-other-hardware",level:3},{value:"Ready to give it a try?",id:"ready-to-give-it-a-try",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.a)(),...e.components},{Vars:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Vars",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"overview",children:"Overview"}),"\n",(0,a.jsx)(n.p,{children:"Elemental is a software stack enabling centralized, full cloud-native OS management with Kubernetes."}),"\n",(0,a.jsx)(n.p,{children:"The Elemental Stack consists of a handful of packages on top of SLE Micro for Rancher:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-toolkit"})," - Includes a set of OS utilities to enable OS management via containers. Includes dracut modules, bootloader configuration, cloud-init style configuration services, etc."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-operator"})," - Connects to Rancher Manager and handles MachineRegistration and MachineInventory CRDs."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-register"})," - Registers machines via machineRegistrations and installs them via elemental-cli."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-cli"})," - Installs any elemental-toolkit based derivative. Basically an installer based on our A/B install and upgrade system."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"rancher-system-agent"}),' - Runs on the installed system and gets instructions ("Plans") from Rancher Manager what to install and run on the system.']}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["Cluster Node OSes are built and maintained via container images through the ",(0,a.jsx)(t,{name:"elemental_cli_name"})," and they can be installed on new hosts using the ",(0,a.jsx)(t,{link:"elemental_ui_url",name:"elemental_ui_name"})," for ",(0,a.jsx)(n.a,{href:"https://www.rancher.com/products/rancher",children:"Rancher Manager"})," or the ",(0,a.jsx)(t,{link:"elemental_cli_url",name:"elemental_cli_name"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(t,{link:"elemental_operator_url",name:"elemental_operator_name"})," and the ",(0,a.jsx)(t,{link:"ranchersystemagent_url",name:"ranchersystemagent_name"})," enable Rancher Manager to fully control Elemental clusters, from the installation and management of the OS on the Nodes to the provisioning of new K3s or RKE2 clusters in a centralized way."]}),"\n",(0,a.jsx)(n.h2,{id:"what-is-elemental-teal-",children:"What is Elemental Teal ?"}),"\n",(0,a.jsx)(n.p,{children:'Elemental Teal is a combination of "SLE Micro for Rancher" with the Rancher Elemental stack.'}),"\n",(0,a.jsx)(n.p,{children:'SLE Micro for Rancher is a containerized and "stripped to the bones" OS layer. At its core, it only requires grub2, dracut, a kernel, and systemd.'}),"\n",(0,a.jsx)(n.p,{children:"It's sole purpose is to run Kubernetes (k3s or RKE2), with everything controlled through Rancher Manager."}),"\n",(0,a.jsxs)(n.p,{children:["Elemental Teal is built in the ",(0,a.jsx)(n.a,{href:"https://build.opensuse.org/package/show/isv:Rancher:Elemental:Stable:Teal53/node-image",children:"openSUSE Build Service"}),"\nand available through the ",(0,a.jsx)(n.a,{href:"https://registry.suse.com",children:"SUSE Registry"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["You can check latest versions available with ",(0,a.jsx)(n.a,{href:"https://github.com/containers/skopeo",children:"skopeo"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-console",metastring:"showLineNumbers",children:"skopeo list-tags docker://registry.suse.com/rancher/elemental-teal/5.3\n"})}),"\n",(0,a.jsx)(n.h3,{id:"elemental-on-x86-64-hardware",children:"Elemental on x86-64 hardware"}),"\n",(0,a.jsx)(n.p,{children:"Elemental Teal is production ready and fully supported on x86-64 starting with Rancher v2.7.0."}),"\n",(0,a.jsx)(n.h3,{id:"elemental-on-arm-hardware",children:"Elemental on ARM hardware"}),"\n",(0,a.jsx)(n.p,{children:"ARM (aarch64) is functional in the development stage. ARM is currently only tested on Raspberry Pi 4 Model B with k3s 1.24.8 (or later). Feedback is welcome."}),"\n",(0,a.jsx)(n.h3,{id:"elemental-on-other-hardware",children:"Elemental on other hardware"}),"\n",(0,a.jsx)(n.p,{children:"Elemental is currently targeting 'edge' scenarios and does therefore not support other hardware. We will re-assess this as the market evolves."}),"\n",(0,a.jsx)(n.h2,{id:"ready-to-give-it-a-try",children:"Ready to give it a try?"}),"\n",(0,a.jsx)(n.p,{children:"Get an Elemental Cluster up and running with your preferred method"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["With Rancher manager ",(0,a.jsx)(n.a,{href:"/quickstart-ui",children:"Elemental plugin"})]}),"\n",(0,a.jsxs)(n.li,{children:["With the ",(0,a.jsx)(n.a,{href:"/quickstart-cli",children:"Elemental CLI"})]}),"\n"]}),"\n",(0,a.jsx)(n.admonition,{title:"What's next?",type:"note",children:(0,a.jsxs)(n.p,{children:["Want more details? Take a look at the ",(0,a.jsx)(n.a,{href:"/architecture",children:"Architecture"})," section or reach out to the ",(0,a.jsx)(t,{link:"elemental_slack_url",name:"elemental_slack_name"})," Slack channel."]})})]})}function d(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>i,a:()=>s});var a=t(7294);const l={},r=a.createContext(l);function s(e){const n=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:s(e.components),a.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5281b7a2.6e0ce740.js b/assets/js/5281b7a2.82cee175.js similarity index 81% rename from assets/js/5281b7a2.6e0ce740.js rename to assets/js/5281b7a2.82cee175.js index 4d9d2122d..c5e822d97 100644 --- a/assets/js/5281b7a2.6e0ce740.js +++ b/assets/js/5281b7a2.82cee175.js @@ -1 +1 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[5927],{2589:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>s,toc:()=>h});var a=t(5893),i=t(1151);const l={sidebar_label:"Architecture",title:""},r="Architecture",s={id:"architecture",title:"",description:"The Elemental stack can be divided in two main parts: the Elemental OS, an immutable and customizable OS which comprises the tools and the steps needed to prepare the Cloud Native OS image and perform the actual OS installation on the host, and the , that allows central management of the Elemental OS via Rancher, the Kubernetes way.",source:"@site/docs/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/next/architecture",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Architecture",title:""},sidebar:"docs",previous:{title:"Elemental the command line way",permalink:"/next/quickstart-cli"},next:{title:"Installation",permalink:"/next/installation"}},o={},h=[{value:"Elemental Architecture",id:"elemental-architecture",level:2},{value:"Elemental OS",id:"elemental-os",level:2},{value:"Elemental OS image",id:"elemental-os-image",level:3},{value:"Elemental installation configuration",id:"elemental-installation-configuration",level:3},{value:"Elemental CLI",id:"elemental-cli",level:3},{value:"Elemental Operator",id:"elemental-operator",level:2},{value:"Elemental Operator Helm Chart",id:"elemental-operator-helm-chart",level:3},{value:"MachineRegistration",id:"machineregistration",level:4},{value:"MachineInventory",id:"machineinventory",level:4},{value:"MachineInventorySelector",id:"machineinventoryselector",level:4},{value:"MachineInventorySelectorTemplate",id:"machineinventoryselectortemplate",level:4},{value:"SeedImage",id:"seedimage",level:4},{value:"Elemental Register client",id:"elemental-register-client",level:3},{value:"Elemental Teal",id:"elemental-teal",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",hr:"hr",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.a)(),...e.components},{Vars:l}=n;return l||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Vars",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"architecture",children:"Architecture"}),"\n",(0,a.jsxs)(n.p,{children:["The Elemental stack can be divided in two main parts: the Elemental OS, an immutable and customizable OS which comprises the tools and the steps needed to prepare the Cloud Native OS image and perform the actual OS installation on the host, and the ",(0,a.jsx)(l,{name:"elemental_operator_name"}),", that allows central management of the Elemental OS via Rancher, the Kubernetes way."]}),"\n",(0,a.jsx)(n.h2,{id:"elemental-architecture",children:(0,a.jsx)(n.img,{alt:"Elemental Architecture",src:t(2643).Z+"",width:"1501",height:"1116"})}),"\n",(0,a.jsx)(n.h2,{id:"elemental-os",children:"Elemental OS"}),"\n",(0,a.jsx)(n.p,{children:"In order to deploy the Elemental OS we need:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"an Elemental base OS image"}),"\n",(0,a.jsx)(n.li,{children:"an Elemental installation configuration"}),"\n",(0,a.jsxs)(n.li,{children:["the ",(0,a.jsx)(l,{name:"elemental_cli_name"})," tool, which installs the Elemental OS image on the target host applying the Elemental installation configuration"]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-os-image",children:"Elemental OS image"}),"\n",(0,a.jsxs)(n.p,{children:["The Elemental OS image is an OCI container image containing all the files that will make up the OS of the target host. It will contain not only all the desired binaries and libraries, but also the kernel and the boot files required by a linux system.\nThe ",(0,a.jsx)(l,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})," is at the core of the Elemental OS, enabling to boot and upgrade an OS from container images. It also provides a framework that allows to combine different packages to bake custom OS container images. For more information check the ",(0,a.jsx)(l,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})," project page."]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-installation-configuration",children:"Elemental installation configuration"}),"\n",(0,a.jsxs)(n.p,{children:["In order to provision a machine with an Elemental OS image, installation configuration parameters are required: things such as the boot device, the root password, system configuration, users and custom files are things that should be provided aside from the Elemental OS image. All the data can be provided in a single .yaml file. More details can be found in the ",(0,a.jsx)(l,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})," documentation."]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-cli",children:"Elemental CLI"}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(l,{name:"elemental_cli_name"})," is the tool that allows to turn the Elemental OS image in a bootable and installed OS: it can generate an ",(0,a.jsx)(l,{name:"elemental_iso_name"})," image from the provided Elemental OS container image. The generated ",(0,a.jsx)(l,{name:"elemental_iso_name"})," image can be used to boot a virtual machine or a bare metal host and start the Elemental OS installation."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(l,{name:"elemental_cli_name"})," allows also to install the Elemental OS on the storage device of the live booted host, applying the provided Elemental installation configuration. For the list and syntax of the commands available in the ",(0,a.jsx)(l,{name:"elemental_cli_name"}),", check the ",(0,a.jsx)(l,{link:"elemental_cli_url",children:"online documentation"}),"."]}),"\n",(0,a.jsx)(n.h3,{id:"",children:(0,a.jsx)(l,{name:"elemental_iso_name"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(l,{name:"elemental_iso_name"})," is a live ISO based on the Elemental OS (an Elemental live ISO).\nIt includes all the tools needed to perform a full node provisioning, from the OS to Kubernetes, including the ",(0,a.jsx)(n.a,{href:"#elemental-cli",children:(0,a.jsx)(l,{name:"elemental_cli_name"})})," and the ",(0,a.jsx)(n.a,{href:"#elemental-register-client",children:(0,a.jsx)(l,{name:"elemental_register_name"})}),"."]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"elemental-operator",children:"Elemental Operator"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(l,{name:"elemental_operator_name"})," is responsible for managing OS upgrades and a secure device inventory to assist\nwith zero touch provisioning.\nIt provides an ",(0,a.jsx)(l,{name:"elemental_operator_name"})," Helm Chart and an ",(0,a.jsx)(l,{name:"elemental_register_name"}),"."]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-operator-helm-chart",children:"Elemental Operator Helm Chart"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(l,{name:"elemental_operator_name"})," Helm Chart must be installed on a Rancher Cluster. It enables new hosts to:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["register against the ",(0,a.jsx)(l,{name:"elemental_operator_name"}),"."]}),"\n",(0,a.jsx)(n.li,{children:"retrieve the Elemental installation configuration (which is stored in custom Kubernetes resources) to start the Elemental OS installation."}),"\n",(0,a.jsxs)(n.li,{children:["download and install the ",(0,a.jsx)(l,{name:"ranchersystemagent_name",link:"ranchersystemagent_url"}),", which enables Rancher to provision and manage K3s and RKE2 on the Elemental nodes."]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(l,{name:"elemental_operator_name"})," allows control of the Elemental Nodes by extending the Kubernetes APIs with a set of ",(0,a.jsx)(n.em,{children:"elemental.cattle.io"})," ",(0,a.jsx)(n.a,{href:"https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/",children:"Kubernetes CRDs"}),":"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"MachineRegistration"}),"\n",(0,a.jsx)(n.li,{children:"MachineInventory"}),"\n",(0,a.jsx)(n.li,{children:"MachineInventorySelector"}),"\n",(0,a.jsx)(n.li,{children:"MachineInventorySelectorTemplate"}),"\n",(0,a.jsx)(n.li,{children:"ManagedOSImage"}),"\n",(0,a.jsx)(n.li,{children:"ManagedOSVersion"}),"\n",(0,a.jsx)(n.li,{children:"ManagedOSVersionChannel"}),"\n",(0,a.jsx)(n.li,{children:"SeedImage"}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"machineregistration",children:"MachineRegistration"}),"\n",(0,a.jsxs)(n.p,{children:["The MachineRegistration includes the Elemental installation configuration (provided by the user) and a registration token (generated by the ",(0,a.jsx)(l,{name:"elemental_operator_name"}),"), from which a registration URL is derived."]}),"\n",(0,a.jsxs)(n.p,{children:["The registration URL is the way through which an host can access the ",(0,a.jsx)(l,{name:"elemental_operator_name"})," services, to kick off the Elemental provisioning process."]}),"\n",(0,a.jsxs)(n.p,{children:["The MachineRegistration has a ",(0,a.jsx)(n.code,{children:"Ready"})," condition which turns to true when the ",(0,a.jsx)(l,{name:"elemental_operator_name"})," has successfully generated the registration URL and an associated ServiceAccount. From this point on the target host can connect to the registration URL to kick off the provisioning process."]}),"\n",(0,a.jsxs)(n.p,{children:["An HTTP GET request against the registration URL returns the ",(0,a.jsx)(n.em,{children:"registration file"}),": a .yaml file containing the registration data (i.e., the ",(0,a.jsx)(n.em,{children:"spec:config:elemental:registration"})," section only from the just created MachineRegistration).\nThe registration file contains all the required data to allow the target host to perform self registration and start the Elemental provisioning. See the ",(0,a.jsxs)(n.a,{href:"#elemental-register-client",children:[(0,a.jsx)(l,{name:"elemental_register_name"})," section"]})," for more info on the registration process and the ",(0,a.jsxs)(n.a,{href:"/next/machineregistration-reference#configelementalregistration",children:["config:elemental",":registration"," section in the MachineRegistration reference"]})," for more details on the available registration options."]}),"\n",(0,a.jsx)(n.h4,{id:"machineinventory",children:"MachineInventory"}),"\n",(0,a.jsxs)(n.p,{children:["When a new host registers successfully, the ",(0,a.jsx)(l,{name:"elemental_operator_name"})," creates a MachineInventory resource representing that particular host.\nThe MachineInventory stores the TPM hash of the tracked host, retrieved during the registration process, and allows to execute arbitrary commands (plans) on the machine."]}),"\n",(0,a.jsx)(n.p,{children:"A MachineInventory has two conditions:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"AdoptionReady"}),", which indicates the machine has been adopted by a selector to be part of a cluster."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"Ready"}),", which indicates that the machine has been registered and provisioned with an Elemental OS."]}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"machineinventoryselector",children:"MachineInventorySelector"}),"\n",(0,a.jsx)(n.p,{children:"A MachineInventorySelector selects MachineInventories based on applied selectors (usually pattern matching on MachineInventory label values)."}),"\n",(0,a.jsx)(n.p,{children:"MachineInventorySelectors have two conditions:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"InventoryReady"}),", turns to true if the MachineInventorySelector has found a matching MachineInventory and has successfully set itself as the MachineInventory owner."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"Ready"}),", tracks if the selector already adopted a machine and started the kubernetes provisioning process (node bootstrap)."]}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"machineinventoryselectortemplate",children:"MachineInventorySelectorTemplate"}),"\n",(0,a.jsx)(n.p,{children:"The MachineInventorySelectorTemplate is a user defined resource that will be used as the blueprint to create the required MachineInventorySelectors: it includes the selector to identify the eligible MachineInventories."}),"\n",(0,a.jsx)(n.h4,{id:"seedimage",children:"SeedImage"}),"\n",(0,a.jsx)(n.p,{children:"A SeedImage is a resource to handle the installation media creation. Includes the reference to the base installation system and a reference to the machine registration. It is used to create and serve installation ISOs including\nthe MachineRegistration metadata required for the machine registration. The installation media is created and being served in a devoted Pod."}),"\n",(0,a.jsx)(n.p,{children:"SeedImage have two conditions:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"SeedImageReady"}),", tracks the status of the associated pod."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"Ready"}),", tracks if all the SeedImage child resources have been successfully created."]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-register-client",children:"Elemental Register client"}),"\n",(0,a.jsxs)(n.p,{children:["New hosts start the Elemental provisioning process through the ",(0,a.jsx)(l,{name:"elemental_register_name"}),": this tool requires a valid elemental-operator registration URL as input (see the ",(0,a.jsx)(n.a,{href:"#machineregistration",children:"MachineRegistration section"}),"), and performs the following steps:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"setups a websocket connection to the registration URL"}),"\n",(0,a.jsxs)(n.li,{children:["authenticates itself using the registration token and the onboard ",(0,a.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Trusted_Platform_Module",children:"TPM (Trusted Platform Module)"})]}),"\n",(0,a.jsxs)(n.li,{children:["sends ",(0,a.jsx)(n.a,{href:"/next/smbios",children:"SMBIOS data"})," to the ",(0,a.jsx)(l,{name:"elemental_operator_name"})]}),"\n",(0,a.jsx)(n.li,{children:"retrieves the Elemental installation configuration"}),"\n",(0,a.jsxs)(n.li,{children:["starts the ",(0,a.jsx)(n.a,{href:"#elemental-cli",children:(0,a.jsx)(l,{name:"elemental_cli_name"})})," and performs the Elemental OS installation"]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"Note"}),"\nif no TPM 2.0 is available on the host, TPM can be emulated by software: see the ",(0,a.jsx)(n.code,{children:"emulate-tpm"})," key in the ",(0,a.jsx)(n.a,{href:"/next/machineregistration-reference#configelementalregistration",children:"config.elemental.register reference document"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(l,{name:"elemental_operator_name"})," includes a Kubernetes operator installed in the management cluster and a client\nside installed in nodes, so they can self register into the management cluster. Once a node is\nregistered the ",(0,a.jsx)(l,{name:"elemental_operator_name"})," will kick-start the OS installation and schedule the Kubernetes\nprovisioning using the ",(0,a.jsx)(l,{name:"ranchersystemagent_name",link:"ranchersystemagent_url"}),".\nRancher System Agent is responsible for bootstrapping RKE2/k3s and Rancher from an OCI registry. This means\nan update of containerd, k3s, RKE2, or Rancher does not require an OS upgrade\nor node reboot."]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"elemental-teal",children:"Elemental Teal"}),"\n",(0,a.jsx)(n.p,{children:"Elemental Teal is Elemental OS built on top of SUSE Linux Enterprise (SLE) Micro for Rancher using the Elemental stack."})]})}function d(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},2643:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/elemental-arch-v1.3_nobg-cbe062db521c514fc332b92ff6e7f3d5.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>r});var a=t(7294);const i={},l=a.createContext(i);function r(e){const n=a.useContext(l);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[5927],{2589:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>s,toc:()=>h});var a=t(5893),i=t(1151);const l={sidebar_label:"Architecture",title:""},r="Architecture",s={id:"architecture",title:"",description:"The Elemental stack can be divided in two main parts: the Elemental OS, an immutable and customizable OS which comprises the tools and the steps needed to prepare the Cloud Native OS image and perform the actual OS installation on the host, and the , that allows central management of the Elemental OS via Rancher, the Kubernetes way.",source:"@site/docs/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/next/architecture",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Architecture",title:""},sidebar:"docs",previous:{title:"Elemental the command line way",permalink:"/next/quickstart-cli"},next:{title:"Installation",permalink:"/next/installation"}},o={},h=[{value:"Elemental Architecture",id:"elemental-architecture",level:2},{value:"Elemental OS",id:"elemental-os",level:2},{value:"Elemental OS image",id:"elemental-os-image",level:3},{value:"Elemental installation configuration",id:"elemental-installation-configuration",level:3},{value:"Elemental CLI",id:"elemental-cli",level:3},{value:"Elemental Operator",id:"elemental-operator",level:2},{value:"Elemental Operator Helm Chart",id:"elemental-operator-helm-chart",level:3},{value:"MachineRegistration",id:"machineregistration",level:4},{value:"MachineInventory",id:"machineinventory",level:4},{value:"MachineInventorySelector",id:"machineinventoryselector",level:4},{value:"MachineInventorySelectorTemplate",id:"machineinventoryselectortemplate",level:4},{value:"SeedImage",id:"seedimage",level:4},{value:"Elemental Register client",id:"elemental-register-client",level:3},{value:"Elemental Teal",id:"elemental-teal",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",hr:"hr",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.a)(),...e.components},{Head:l,Vars:r}=n;return l||m("Head",!0),r||m("Vars",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(l,{children:(0,a.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/architecture"})}),"\n",(0,a.jsx)(n.h1,{id:"architecture",children:"Architecture"}),"\n",(0,a.jsxs)(n.p,{children:["The Elemental stack can be divided in two main parts: the Elemental OS, an immutable and customizable OS which comprises the tools and the steps needed to prepare the Cloud Native OS image and perform the actual OS installation on the host, and the ",(0,a.jsx)(r,{name:"elemental_operator_name"}),", that allows central management of the Elemental OS via Rancher, the Kubernetes way."]}),"\n",(0,a.jsx)(n.h2,{id:"elemental-architecture",children:(0,a.jsx)(n.img,{alt:"Elemental Architecture",src:t(2643).Z+"",width:"1501",height:"1116"})}),"\n",(0,a.jsx)(n.h2,{id:"elemental-os",children:"Elemental OS"}),"\n",(0,a.jsx)(n.p,{children:"In order to deploy the Elemental OS we need:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"an Elemental base OS image"}),"\n",(0,a.jsx)(n.li,{children:"an Elemental installation configuration"}),"\n",(0,a.jsxs)(n.li,{children:["the ",(0,a.jsx)(r,{name:"elemental_cli_name"})," tool, which installs the Elemental OS image on the target host applying the Elemental installation configuration"]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-os-image",children:"Elemental OS image"}),"\n",(0,a.jsxs)(n.p,{children:["The Elemental OS image is an OCI container image containing all the files that will make up the OS of the target host. It will contain not only all the desired binaries and libraries, but also the kernel and the boot files required by a linux system.\nThe ",(0,a.jsx)(r,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})," is at the core of the Elemental OS, enabling to boot and upgrade an OS from container images. It also provides a framework that allows to combine different packages to bake custom OS container images. For more information check the ",(0,a.jsx)(r,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})," project page."]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-installation-configuration",children:"Elemental installation configuration"}),"\n",(0,a.jsxs)(n.p,{children:["In order to provision a machine with an Elemental OS image, installation configuration parameters are required: things such as the boot device, the root password, system configuration, users and custom files are things that should be provided aside from the Elemental OS image. All the data can be provided in a single .yaml file. More details can be found in the ",(0,a.jsx)(r,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})," documentation."]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-cli",children:"Elemental CLI"}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(r,{name:"elemental_cli_name"})," is the tool that allows to turn the Elemental OS image in a bootable and installed OS: it can generate an ",(0,a.jsx)(r,{name:"elemental_iso_name"})," image from the provided Elemental OS container image. The generated ",(0,a.jsx)(r,{name:"elemental_iso_name"})," image can be used to boot a virtual machine or a bare metal host and start the Elemental OS installation."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(r,{name:"elemental_cli_name"})," allows also to install the Elemental OS on the storage device of the live booted host, applying the provided Elemental installation configuration. For the list and syntax of the commands available in the ",(0,a.jsx)(r,{name:"elemental_cli_name"}),", check the ",(0,a.jsx)(r,{link:"elemental_cli_url",children:"online documentation"}),"."]}),"\n",(0,a.jsx)(n.h3,{id:"",children:(0,a.jsx)(r,{name:"elemental_iso_name"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(r,{name:"elemental_iso_name"})," is a live ISO based on the Elemental OS (an Elemental live ISO).\nIt includes all the tools needed to perform a full node provisioning, from the OS to Kubernetes, including the ",(0,a.jsx)(n.a,{href:"#elemental-cli",children:(0,a.jsx)(r,{name:"elemental_cli_name"})})," and the ",(0,a.jsx)(n.a,{href:"#elemental-register-client",children:(0,a.jsx)(r,{name:"elemental_register_name"})}),"."]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"elemental-operator",children:"Elemental Operator"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(r,{name:"elemental_operator_name"})," is responsible for managing OS upgrades and a secure device inventory to assist\nwith zero touch provisioning.\nIt provides an ",(0,a.jsx)(r,{name:"elemental_operator_name"})," Helm Chart and an ",(0,a.jsx)(r,{name:"elemental_register_name"}),"."]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-operator-helm-chart",children:"Elemental Operator Helm Chart"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(r,{name:"elemental_operator_name"})," Helm Chart must be installed on a Rancher Cluster. It enables new hosts to:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["register against the ",(0,a.jsx)(r,{name:"elemental_operator_name"}),"."]}),"\n",(0,a.jsx)(n.li,{children:"retrieve the Elemental installation configuration (which is stored in custom Kubernetes resources) to start the Elemental OS installation."}),"\n",(0,a.jsxs)(n.li,{children:["download and install the ",(0,a.jsx)(r,{name:"ranchersystemagent_name",link:"ranchersystemagent_url"}),", which enables Rancher to provision and manage K3s and RKE2 on the Elemental nodes."]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(r,{name:"elemental_operator_name"})," allows control of the Elemental Nodes by extending the Kubernetes APIs with a set of ",(0,a.jsx)(n.em,{children:"elemental.cattle.io"})," ",(0,a.jsx)(n.a,{href:"https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/",children:"Kubernetes CRDs"}),":"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"MachineRegistration"}),"\n",(0,a.jsx)(n.li,{children:"MachineInventory"}),"\n",(0,a.jsx)(n.li,{children:"MachineInventorySelector"}),"\n",(0,a.jsx)(n.li,{children:"MachineInventorySelectorTemplate"}),"\n",(0,a.jsx)(n.li,{children:"ManagedOSImage"}),"\n",(0,a.jsx)(n.li,{children:"ManagedOSVersion"}),"\n",(0,a.jsx)(n.li,{children:"ManagedOSVersionChannel"}),"\n",(0,a.jsx)(n.li,{children:"SeedImage"}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"machineregistration",children:"MachineRegistration"}),"\n",(0,a.jsxs)(n.p,{children:["The MachineRegistration includes the Elemental installation configuration (provided by the user) and a registration token (generated by the ",(0,a.jsx)(r,{name:"elemental_operator_name"}),"), from which a registration URL is derived."]}),"\n",(0,a.jsxs)(n.p,{children:["The registration URL is the way through which an host can access the ",(0,a.jsx)(r,{name:"elemental_operator_name"})," services, to kick off the Elemental provisioning process."]}),"\n",(0,a.jsxs)(n.p,{children:["The MachineRegistration has a ",(0,a.jsx)(n.code,{children:"Ready"})," condition which turns to true when the ",(0,a.jsx)(r,{name:"elemental_operator_name"})," has successfully generated the registration URL and an associated ServiceAccount. From this point on the target host can connect to the registration URL to kick off the provisioning process."]}),"\n",(0,a.jsxs)(n.p,{children:["An HTTP GET request against the registration URL returns the ",(0,a.jsx)(n.em,{children:"registration file"}),": a .yaml file containing the registration data (i.e., the ",(0,a.jsx)(n.em,{children:"spec:config:elemental:registration"})," section only from the just created MachineRegistration).\nThe registration file contains all the required data to allow the target host to perform self registration and start the Elemental provisioning. See the ",(0,a.jsxs)(n.a,{href:"#elemental-register-client",children:[(0,a.jsx)(r,{name:"elemental_register_name"})," section"]})," for more info on the registration process and the ",(0,a.jsxs)(n.a,{href:"/next/machineregistration-reference#configelementalregistration",children:["config:elemental",":registration"," section in the MachineRegistration reference"]})," for more details on the available registration options."]}),"\n",(0,a.jsx)(n.h4,{id:"machineinventory",children:"MachineInventory"}),"\n",(0,a.jsxs)(n.p,{children:["When a new host registers successfully, the ",(0,a.jsx)(r,{name:"elemental_operator_name"})," creates a MachineInventory resource representing that particular host.\nThe MachineInventory stores the TPM hash of the tracked host, retrieved during the registration process, and allows to execute arbitrary commands (plans) on the machine."]}),"\n",(0,a.jsx)(n.p,{children:"A MachineInventory has two conditions:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"AdoptionReady"}),", which indicates the machine has been adopted by a selector to be part of a cluster."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"Ready"}),", which indicates that the machine has been registered and provisioned with an Elemental OS."]}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"machineinventoryselector",children:"MachineInventorySelector"}),"\n",(0,a.jsx)(n.p,{children:"A MachineInventorySelector selects MachineInventories based on applied selectors (usually pattern matching on MachineInventory label values)."}),"\n",(0,a.jsx)(n.p,{children:"MachineInventorySelectors have two conditions:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"InventoryReady"}),", turns to true if the MachineInventorySelector has found a matching MachineInventory and has successfully set itself as the MachineInventory owner."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"Ready"}),", tracks if the selector already adopted a machine and started the kubernetes provisioning process (node bootstrap)."]}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"machineinventoryselectortemplate",children:"MachineInventorySelectorTemplate"}),"\n",(0,a.jsx)(n.p,{children:"The MachineInventorySelectorTemplate is a user defined resource that will be used as the blueprint to create the required MachineInventorySelectors: it includes the selector to identify the eligible MachineInventories."}),"\n",(0,a.jsx)(n.h4,{id:"seedimage",children:"SeedImage"}),"\n",(0,a.jsx)(n.p,{children:"A SeedImage is a resource to handle the installation media creation. Includes the reference to the base installation system and a reference to the machine registration. It is used to create and serve installation ISOs including\nthe MachineRegistration metadata required for the machine registration. The installation media is created and being served in a devoted Pod."}),"\n",(0,a.jsx)(n.p,{children:"SeedImage have two conditions:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"SeedImageReady"}),", tracks the status of the associated pod."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"Ready"}),", tracks if all the SeedImage child resources have been successfully created."]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-register-client",children:"Elemental Register client"}),"\n",(0,a.jsxs)(n.p,{children:["New hosts start the Elemental provisioning process through the ",(0,a.jsx)(r,{name:"elemental_register_name"}),": this tool requires a valid elemental-operator registration URL as input (see the ",(0,a.jsx)(n.a,{href:"#machineregistration",children:"MachineRegistration section"}),"), and performs the following steps:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"setups a websocket connection to the registration URL"}),"\n",(0,a.jsxs)(n.li,{children:["authenticates itself using the registration token and the onboard ",(0,a.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Trusted_Platform_Module",children:"TPM (Trusted Platform Module)"})]}),"\n",(0,a.jsxs)(n.li,{children:["sends ",(0,a.jsx)(n.a,{href:"/next/smbios",children:"SMBIOS data"})," to the ",(0,a.jsx)(r,{name:"elemental_operator_name"})]}),"\n",(0,a.jsx)(n.li,{children:"retrieves the Elemental installation configuration"}),"\n",(0,a.jsxs)(n.li,{children:["starts the ",(0,a.jsx)(n.a,{href:"#elemental-cli",children:(0,a.jsx)(r,{name:"elemental_cli_name"})})," and performs the Elemental OS installation"]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"Note"}),"\nif no TPM 2.0 is available on the host, TPM can be emulated by software: see the ",(0,a.jsx)(n.code,{children:"emulate-tpm"})," key in the ",(0,a.jsx)(n.a,{href:"/next/machineregistration-reference#configelementalregistration",children:"config.elemental.register reference document"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(r,{name:"elemental_operator_name"})," includes a Kubernetes operator installed in the management cluster and a client\nside installed in nodes, so they can self register into the management cluster. Once a node is\nregistered the ",(0,a.jsx)(r,{name:"elemental_operator_name"})," will kick-start the OS installation and schedule the Kubernetes\nprovisioning using the ",(0,a.jsx)(r,{name:"ranchersystemagent_name",link:"ranchersystemagent_url"}),".\nRancher System Agent is responsible for bootstrapping RKE2/k3s and Rancher from an OCI registry. This means\nan update of containerd, k3s, RKE2, or Rancher does not require an OS upgrade\nor node reboot."]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"elemental-teal",children:"Elemental Teal"}),"\n",(0,a.jsx)(n.p,{children:"Elemental Teal is Elemental OS built on top of SUSE Linux Enterprise (SLE) Micro for Rancher using the Elemental stack."})]})}function d(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}function m(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},2643:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/elemental-arch-v1.3_nobg-cbe062db521c514fc332b92ff6e7f3d5.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>r});var a=t(7294);const i={},l=a.createContext(i);function r(e){const n=a.useContext(l);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/54dca98f.39c023f6.js b/assets/js/54dca98f.39c023f6.js deleted file mode 100644 index 887412f86..000000000 --- a/assets/js/54dca98f.39c023f6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4619],{2961:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>i,default:()=>m,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var s=t(5893),l=t(1151);const a={sidebar_label:"Elemental plans",title:""},i=void 0,o={id:"elemental-plans",title:"",description:"Introduction",source:"@site/docs/elemental-plans.md",sourceDirName:".",slug:"/elemental-plans",permalink:"/next/elemental-plans",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Elemental plans",title:""},sidebar:"docs",previous:{title:"Customize Elemental Install",permalink:"/next/customizing"},next:{title:"Cloud-config reference",permalink:"/next/cloud-config-reference"}},r={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Types of Plans",id:"types-of-plans",level:2},{value:"Adding local plans on Elemental",id:"adding-local-plans-on-elemental",level:2},{value:"Plan examples",id:"plan-examples",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.a)(),...e.components},{TabItem:t,Tabs:a}=n;return t||p("TabItem",!0),a||p("Tabs",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsxs)(n.p,{children:["Elemental uses the ",(0,s.jsx)(n.a,{href:"https://github.com/rancher/system-agent",children:"Rancher System Agent"}),", renamed to Elemental System Agent, to initially bootstrap the node with a simple plan."]}),"\n",(0,s.jsx)(n.p,{children:"The plan will apply the following configurations:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Set some labels for the node"}),"\n",(0,s.jsxs)(n.li,{children:["Set the proper hostname according to the ",(0,s.jsx)(n.code,{children:"MachineInventory"})," value"]}),"\n",(0,s.jsx)(n.li,{children:"Install the default Rancher System Agent from Rancher Server, and install the proper Kubernetes components"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The bootstrap service also accepts local plans stored under ",(0,s.jsx)(n.code,{children:"/var/lib/elemental/agent/plans"}),". Any plan written\nin there will also be applied during the initial node start after the installation is completed."]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["The local plans run only during the initial Elemental bootstrap ",(0,s.jsx)(n.strong,{children:"before"})," Kubernetes is installed on the node."]})}),"\n",(0,s.jsx)(n.h2,{id:"types-of-plans",children:"Types of Plans"}),"\n",(0,s.jsx)(n.p,{children:"The type of plans that Elemental can use are:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"One time instructions: Only run once"}),"\n",(0,s.jsx)(n.li,{children:"Periodic instructions: They run periodically"}),"\n",(0,s.jsx)(n.li,{children:"Files: Creates files"}),"\n",(0,s.jsx)(n.li,{children:"Probes: http probes"}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsx)(n.p,{children:"Both one time instructions and periodic instructions can run either a direct command or a docker image."})}),"\n",(0,s.jsx)(n.h2,{id:"adding-local-plans-on-elemental",children:"Adding local plans on Elemental"}),"\n",(0,s.jsxs)(n.p,{children:["You can add local plans to Elemental as part of the ",(0,s.jsx)(n.code,{children:"MachineRegistration"})," CRD, in the ",(0,s.jsx)(n.code,{children:"cloud-config"})," section as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n write_files:\n - path: /var/lib/elemental/agent/plans/mycustomplan.plan\n permissions: "0600"\n content: |\n {"instructions":\n [\n {\n "name":"set hostname",\n "command":"hostnamectl",\n "args": ["set-hostname", "myHostname"]\n },\n {\n "name":"stop sshd service",\n "command":"systemctl",\n "args": ["stop", "sshd"]\n }\n ]\n }\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineName: my-machine\n machineInventoryLabels:\n element: fire\n'})}),"\n",(0,s.jsx)(n.h2,{id:"plan-examples",children:"Plan examples"}),"\n",(0,s.jsxs)(n.p,{children:["The following plans are provided as a quick reference and are not guaranteed to work in your environment. To learn more about plans please check ",(0,s.jsx)(n.a,{href:"https://github.com/rancher/system-agent",children:"Rancher System Agent"}),"."]}),"\n",(0,s.jsxs)(a,{children:[(0,s.jsx)(t,{value:"example1",label:"Example 1: one time instructions",default:!0,children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"instructions":\n [\n {\n "name":"set hostname",\n "command":"hostnamectl",\n "args": ["set-hostname", "myHostname"]\n },\n {\n "name":"stop sshd service",\n "command":"systemctl",\n "args": ["stop", "sshd"]\n }\n ]\n}\n'})})}),(0,s.jsx)(t,{value:"example2",label:"Example 2: periodic instructions",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"periodicInstructions":\n [\n {\n "name":"set hostname",\n "image":"ghcr.io/rancher-sandbox/elemental-example-plan:main"\n "command": "run.sh"\n }\n ]\n}\n'})})}),(0,s.jsx)(t,{value:"example3",label:"Example 3: files",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"files":\n [\n {\n "content":"Welcome to the system",\n "path":"/etc/motd",\n "permissions": "0644"\n }\n ]\n}\n'})})}),(0,s.jsx)(t,{value:"example4",label:"Example 4: probes",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"probes":\n "probe1": {\n "name": "Service Up",\n "httpGet": {\n "url": "http://10.0.0.1/healthz",\n "insecure": "false",\n "clientCert": "....",\n "clientKey": "....",\n "caCert": "....."\n } \n }\n}\n'})})})]})]})}function m(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}function p(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>i});var s=t(7294);const l={},a=s.createContext(l);function i(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/54dca98f.86d3ed35.js b/assets/js/54dca98f.86d3ed35.js new file mode 100644 index 000000000..e25944c96 --- /dev/null +++ b/assets/js/54dca98f.86d3ed35.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4619],{2961:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>i,default:()=>m,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var l=t(5893),s=t(1151);const a={sidebar_label:"Elemental plans",title:""},i=void 0,o={id:"elemental-plans",title:"",description:"Introduction",source:"@site/docs/elemental-plans.md",sourceDirName:".",slug:"/elemental-plans",permalink:"/next/elemental-plans",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Elemental plans",title:""},sidebar:"docs",previous:{title:"Customize Elemental Install",permalink:"/next/customizing"},next:{title:"Cloud-config reference",permalink:"/next/cloud-config-reference"}},r={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Types of Plans",id:"types-of-plans",level:2},{value:"Adding local plans on Elemental",id:"adding-local-plans-on-elemental",level:2},{value:"Plan examples",id:"plan-examples",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components},{Head:t,TabItem:a,Tabs:i}=n;return t||p("Head",!0),a||p("TabItem",!0),i||p("Tabs",!0),(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(t,{children:(0,l.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/elemental-plans"})}),"\n",(0,l.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,l.jsxs)(n.p,{children:["Elemental uses the ",(0,l.jsx)(n.a,{href:"https://github.com/rancher/system-agent",children:"Rancher System Agent"}),", renamed to Elemental System Agent, to initially bootstrap the node with a simple plan."]}),"\n",(0,l.jsx)(n.p,{children:"The plan will apply the following configurations:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"Set some labels for the node"}),"\n",(0,l.jsxs)(n.li,{children:["Set the proper hostname according to the ",(0,l.jsx)(n.code,{children:"MachineInventory"})," value"]}),"\n",(0,l.jsx)(n.li,{children:"Install the default Rancher System Agent from Rancher Server, and install the proper Kubernetes components"}),"\n"]}),"\n",(0,l.jsxs)(n.p,{children:["The bootstrap service also accepts local plans stored under ",(0,l.jsx)(n.code,{children:"/var/lib/elemental/agent/plans"}),". Any plan written\nin there will also be applied during the initial node start after the installation is completed."]}),"\n",(0,l.jsx)(n.admonition,{type:"tip",children:(0,l.jsxs)(n.p,{children:["The local plans run only during the initial Elemental bootstrap ",(0,l.jsx)(n.strong,{children:"before"})," Kubernetes is installed on the node."]})}),"\n",(0,l.jsx)(n.h2,{id:"types-of-plans",children:"Types of Plans"}),"\n",(0,l.jsx)(n.p,{children:"The type of plans that Elemental can use are:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"One time instructions: Only run once"}),"\n",(0,l.jsx)(n.li,{children:"Periodic instructions: They run periodically"}),"\n",(0,l.jsx)(n.li,{children:"Files: Creates files"}),"\n",(0,l.jsx)(n.li,{children:"Probes: http probes"}),"\n"]}),"\n",(0,l.jsx)(n.admonition,{type:"tip",children:(0,l.jsx)(n.p,{children:"Both one time instructions and periodic instructions can run either a direct command or a docker image."})}),"\n",(0,l.jsx)(n.h2,{id:"adding-local-plans-on-elemental",children:"Adding local plans on Elemental"}),"\n",(0,l.jsxs)(n.p,{children:["You can add local plans to Elemental as part of the ",(0,l.jsx)(n.code,{children:"MachineRegistration"})," CRD, in the ",(0,l.jsx)(n.code,{children:"cloud-config"})," section as follows:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n write_files:\n - path: /var/lib/elemental/agent/plans/mycustomplan.plan\n permissions: "0600"\n content: |\n {"instructions":\n [\n {\n "name":"set hostname",\n "command":"hostnamectl",\n "args": ["set-hostname", "myHostname"]\n },\n {\n "name":"stop sshd service",\n "command":"systemctl",\n "args": ["stop", "sshd"]\n }\n ]\n }\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineName: my-machine\n machineInventoryLabels:\n element: fire\n'})}),"\n",(0,l.jsx)(n.h2,{id:"plan-examples",children:"Plan examples"}),"\n",(0,l.jsxs)(n.p,{children:["The following plans are provided as a quick reference and are not guaranteed to work in your environment. To learn more about plans please check ",(0,l.jsx)(n.a,{href:"https://github.com/rancher/system-agent",children:"Rancher System Agent"}),"."]}),"\n",(0,l.jsxs)(i,{children:[(0,l.jsx)(a,{value:"example1",label:"Example 1: one time instructions",default:!0,children:(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"instructions":\n [\n {\n "name":"set hostname",\n "command":"hostnamectl",\n "args": ["set-hostname", "myHostname"]\n },\n {\n "name":"stop sshd service",\n "command":"systemctl",\n "args": ["stop", "sshd"]\n }\n ]\n}\n'})})}),(0,l.jsx)(a,{value:"example2",label:"Example 2: periodic instructions",children:(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"periodicInstructions":\n [\n {\n "name":"set hostname",\n "image":"ghcr.io/rancher-sandbox/elemental-example-plan:main"\n "command": "run.sh"\n }\n ]\n}\n'})})}),(0,l.jsx)(a,{value:"example3",label:"Example 3: files",children:(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"files":\n [\n {\n "content":"Welcome to the system",\n "path":"/etc/motd",\n "permissions": "0644"\n }\n ]\n}\n'})})}),(0,l.jsx)(a,{value:"example4",label:"Example 4: probes",children:(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"probes":\n "probe1": {\n "name": "Service Up",\n "httpGet": {\n "url": "http://10.0.0.1/healthz",\n "insecure": "false",\n "clientCert": "....",\n "clientKey": "....",\n "caCert": "....."\n } \n }\n}\n'})})})]})]})}function m(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(d,{...e})}):d(e)}function p(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>i});var l=t(7294);const s={},a=l.createContext(s);function i(e){const n=l.useContext(a);return l.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),l.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/578c0857.2b190e0d.js b/assets/js/578c0857.2b190e0d.js new file mode 100644 index 000000000..04baf497b --- /dev/null +++ b/assets/js/578c0857.2b190e0d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[1019],{3137:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>a});var t=o(5893),r=o(1151);const i={sidebar_label:"Cloud-config reference",title:""},s="Cloud-config Reference",c={id:"cloud-config-reference",title:"",description:"All custom configuration applied on top of a fresh deployment should come",source:"@site/versioned_docs/version-1.3/cloud-config-reference.md",sourceDirName:".",slug:"/cloud-config-reference",permalink:"/cloud-config-reference",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Cloud-config reference",title:""},sidebar:"docs",previous:{title:"Elemental plans",permalink:"/elemental-plans"},next:{title:"MachineRegistration reference",permalink:"/machineregistration-reference"}},l={},a=[];function d(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",...(0,r.a)(),...e.components},{Details:o,Head:i}=n;return o||h("Details",!0),i||h("Head",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i,{children:(0,t.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/cloud-config-reference"})}),"\n",(0,t.jsx)(n.h1,{id:"cloud-config-reference",children:"Cloud-config Reference"}),"\n",(0,t.jsxs)(n.p,{children:["All custom configuration applied on top of a fresh deployment should come\nfrom the ",(0,t.jsx)(n.code,{children:"cloud-config"})," section in a ",(0,t.jsx)(n.code,{children:"MachineRegistration"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["This will get run by ",(0,t.jsx)(n.a,{href:"https://github.com/rancher/elemental-cli/blob/main/docs/elemental_run-stage.md",children:(0,t.jsx)(n.code,{children:"elemental-cli run-stage"})})," during the ",(0,t.jsx)(n.code,{children:"boot"})," stage, and\nit will be stored in the node under the ",(0,t.jsx)(n.code,{children:"/oem"})," dir."]}),"\n",(0,t.jsxs)(n.p,{children:["Elemental uses ",(0,t.jsx)(n.a,{href:"https://github.com/mudler/yip",children:"yip"})," to run these cloud-config files, so we support the ",(0,t.jsx)(n.a,{href:"https://github.com/mudler/yip#compatibility-with-cloud-init-format",children:"yip subset cloud-config implementation"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Below is an example of the supported configuration on a ",(0,t.jsx)(n.code,{children:"MachineRegistration"})," resource."]}),"\n",(0,t.jsxs)(o,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: "bar"\n passwd: "foo"\n groups: "users"\n homedir: "/home/foo"\n shell: "/bin/bash"\n ssh_authorized_keys:\n - faaapploo\n # Assigns these keys to the first user in users or root if there\n # is none\n ssh_authorized_keys:\n - asdd\n # Run these commands once the system has fully booted\n runcmd:\n - foo\n # Write arbitrary files\n write_files:\n - encoding: b64\n content: CiMgVGhpcyBmaWxlIGNvbnRyb2xzIHRoZSBzdGF0ZSBvZiBTRUxpbnV4\n path: /foo/bar\n permissions: "0644"\n owner: "bar"\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineName: my-machine\n machineInventoryLabels:\n element: fire\n'})})]})]})}function u(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}function h(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,n,o)=>{o.d(n,{Z:()=>c,a:()=>s});var t=o(7294);const r={},i=t.createContext(r);function s(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/578c0857.399a357b.js b/assets/js/578c0857.399a357b.js deleted file mode 100644 index 55457e93b..000000000 --- a/assets/js/578c0857.399a357b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[1019],{3137:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var t=o(5893),i=o(1151);const r={sidebar_label:"Cloud-config reference",title:""},s="Cloud-config Reference",c={id:"cloud-config-reference",title:"",description:"All custom configuration applied on top of a fresh deployment should come",source:"@site/versioned_docs/version-1.3/cloud-config-reference.md",sourceDirName:".",slug:"/cloud-config-reference",permalink:"/cloud-config-reference",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Cloud-config reference",title:""},sidebar:"docs",previous:{title:"Elemental plans",permalink:"/elemental-plans"},next:{title:"MachineRegistration reference",permalink:"/machineregistration-reference"}},l={},a=[];function d(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",...(0,i.a)(),...e.components},{Details:o}=n;return o||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"cloud-config-reference",children:"Cloud-config Reference"}),"\n",(0,t.jsxs)(n.p,{children:["All custom configuration applied on top of a fresh deployment should come\nfrom the ",(0,t.jsx)(n.code,{children:"cloud-config"})," section in a ",(0,t.jsx)(n.code,{children:"MachineRegistration"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["This will get run by ",(0,t.jsx)(n.a,{href:"https://github.com/rancher/elemental-cli/blob/main/docs/elemental_run-stage.md",children:(0,t.jsx)(n.code,{children:"elemental-cli run-stage"})})," during the ",(0,t.jsx)(n.code,{children:"boot"})," stage, and\nit will be stored in the node under the ",(0,t.jsx)(n.code,{children:"/oem"})," dir."]}),"\n",(0,t.jsxs)(n.p,{children:["Elemental uses ",(0,t.jsx)(n.a,{href:"https://github.com/mudler/yip",children:"yip"})," to run these cloud-config files, so we support the ",(0,t.jsx)(n.a,{href:"https://github.com/mudler/yip#compatibility-with-cloud-init-format",children:"yip subset cloud-config implementation"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Below is an example of the supported configuration on a ",(0,t.jsx)(n.code,{children:"MachineRegistration"})," resource."]}),"\n",(0,t.jsxs)(o,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: "bar"\n passwd: "foo"\n groups: "users"\n homedir: "/home/foo"\n shell: "/bin/bash"\n ssh_authorized_keys:\n - faaapploo\n # Assigns these keys to the first user in users or root if there\n # is none\n ssh_authorized_keys:\n - asdd\n # Run these commands once the system has fully booted\n runcmd:\n - foo\n # Write arbitrary files\n write_files:\n - encoding: b64\n content: CiMgVGhpcyBmaWxlIGNvbnRyb2xzIHRoZSBzdGF0ZSBvZiBTRUxpbnV4\n path: /foo/bar\n permissions: "0644"\n owner: "bar"\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineName: my-machine\n machineInventoryLabels:\n element: fire\n'})})]})]})}function u(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,o)=>{o.d(n,{Z:()=>c,a:()=>s});var t=o(7294);const i={},r=t.createContext(i);function s(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5792c77d.c1638897.js b/assets/js/5792c77d.be7b3b80.js similarity index 81% rename from assets/js/5792c77d.c1638897.js rename to assets/js/5792c77d.be7b3b80.js index 00f3f0293..d18d46d82 100644 --- a/assets/js/5792c77d.c1638897.js +++ b/assets/js/5792c77d.be7b3b80.js @@ -1 +1 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7269],{6802:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>s,toc:()=>h});var a=t(5893),i=t(1151);const l={sidebar_label:"Architecture",title:""},r="Architecture",s={id:"architecture",title:"",description:"The Elemental stack can be divided in two main parts: the Elemental OS, an immutable and customizable OS which comprises the tools and the steps needed to prepare the Cloud Native OS image and perform the actual OS installation on the host, and the , that allows central management of the Elemental OS via Rancher, the Kubernetes way.",source:"@site/versioned_docs/version-1.3/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/architecture",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Architecture",title:""},sidebar:"docs",previous:{title:"Elemental the command line way",permalink:"/quickstart-cli"},next:{title:"Installation",permalink:"/installation"}},o={},h=[{value:"Elemental Architecture",id:"elemental-architecture",level:2},{value:"Elemental OS",id:"elemental-os",level:2},{value:"Elemental OS image",id:"elemental-os-image",level:3},{value:"Elemental installation configuration",id:"elemental-installation-configuration",level:3},{value:"Elemental CLI",id:"elemental-cli",level:3},{value:"Elemental Operator",id:"elemental-operator",level:2},{value:"Elemental Operator Helm Chart",id:"elemental-operator-helm-chart",level:3},{value:"MachineRegistration",id:"machineregistration",level:4},{value:"MachineInventory",id:"machineinventory",level:4},{value:"MachineInventorySelector",id:"machineinventoryselector",level:4},{value:"MachineInventorySelectorTemplate",id:"machineinventoryselectortemplate",level:4},{value:"SeedImage",id:"seedimage",level:4},{value:"Elemental Register client",id:"elemental-register-client",level:3},{value:"Elemental Teal",id:"elemental-teal",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",hr:"hr",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.a)(),...e.components},{Vars:l}=n;return l||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Vars",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"architecture",children:"Architecture"}),"\n",(0,a.jsxs)(n.p,{children:["The Elemental stack can be divided in two main parts: the Elemental OS, an immutable and customizable OS which comprises the tools and the steps needed to prepare the Cloud Native OS image and perform the actual OS installation on the host, and the ",(0,a.jsx)(l,{name:"elemental_operator_name"}),", that allows central management of the Elemental OS via Rancher, the Kubernetes way."]}),"\n",(0,a.jsx)(n.h2,{id:"elemental-architecture",children:(0,a.jsx)(n.img,{alt:"Elemental Architecture",src:t(8466).Z+"",width:"1501",height:"1116"})}),"\n",(0,a.jsx)(n.h2,{id:"elemental-os",children:"Elemental OS"}),"\n",(0,a.jsx)(n.p,{children:"In order to deploy the Elemental OS we need:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"an Elemental base OS image"}),"\n",(0,a.jsx)(n.li,{children:"an Elemental installation configuration"}),"\n",(0,a.jsxs)(n.li,{children:["the ",(0,a.jsx)(l,{name:"elemental_cli_name"})," tool, which installs the Elemental OS image on the target host applying the Elemental installation configuration"]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-os-image",children:"Elemental OS image"}),"\n",(0,a.jsxs)(n.p,{children:["The Elemental OS image is an OCI container image containing all the files that will make up the OS of the target host. It will contain not only all the desired binaries and libraries, but also the kernel and the boot files required by a linux system.\nThe ",(0,a.jsx)(l,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})," is at the core of the Elemental OS, enabling to boot and upgrade an OS from container images. It also provides a framework that allows to combine different packages to bake custom OS container images. For more information check the ",(0,a.jsx)(l,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})," project page."]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-installation-configuration",children:"Elemental installation configuration"}),"\n",(0,a.jsxs)(n.p,{children:["In order to provision a machine with an Elemental OS image, installation configuration parameters are required: things such as the boot device, the root password, system configuration, users and custom files are things that should be provided aside from the Elemental OS image. All the data can be provided in a single .yaml file. More details can be found in the ",(0,a.jsx)(l,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})," documentation."]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-cli",children:"Elemental CLI"}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(l,{name:"elemental_cli_name"})," is the tool that allows to turn the Elemental OS image in a bootable and installed OS: it can generate an ",(0,a.jsx)(l,{name:"elemental_iso_name"})," image from the provided Elemental OS container image. The generated ",(0,a.jsx)(l,{name:"elemental_iso_name"})," image can be used to boot a virtual machine or a bare metal host and start the Elemental OS installation."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(l,{name:"elemental_cli_name"})," allows also to install the Elemental OS on the storage device of the live booted host, applying the provided Elemental installation configuration. For the list and syntax of the commands available in the ",(0,a.jsx)(l,{name:"elemental_cli_name"}),", check the ",(0,a.jsx)(l,{link:"elemental_cli_url",children:"online documentation"}),"."]}),"\n",(0,a.jsx)(n.h3,{id:"",children:(0,a.jsx)(l,{name:"elemental_iso_name"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(l,{name:"elemental_iso_name"})," is a live ISO based on the Elemental OS (an Elemental live ISO).\nIt includes all the tools needed to perform a full node provisioning, from the OS to Kubernetes, including the ",(0,a.jsx)(n.a,{href:"#elemental-cli",children:(0,a.jsx)(l,{name:"elemental_cli_name"})})," and the ",(0,a.jsx)(n.a,{href:"#elemental-register-client",children:(0,a.jsx)(l,{name:"elemental_register_name"})}),"."]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"elemental-operator",children:"Elemental Operator"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(l,{name:"elemental_operator_name"})," is responsible for managing OS upgrades and a secure device inventory to assist\nwith zero touch provisioning.\nIt provides an ",(0,a.jsx)(l,{name:"elemental_operator_name"})," Helm Chart and an ",(0,a.jsx)(l,{name:"elemental_register_name"}),"."]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-operator-helm-chart",children:"Elemental Operator Helm Chart"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(l,{name:"elemental_operator_name"})," Helm Chart must be installed on a Rancher Cluster. It enables new hosts to:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["register against the ",(0,a.jsx)(l,{name:"elemental_operator_name"}),"."]}),"\n",(0,a.jsx)(n.li,{children:"retrieve the Elemental installation configuration (which is stored in custom Kubernetes resources) to start the Elemental OS installation."}),"\n",(0,a.jsxs)(n.li,{children:["download and install the ",(0,a.jsx)(l,{name:"ranchersystemagent_name",link:"ranchersystemagent_url"}),", which enables Rancher to provision and manage K3s and RKE2 on the Elemental nodes."]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(l,{name:"elemental_operator_name"})," allows control of the Elemental Nodes by extending the Kubernetes APIs with a set of ",(0,a.jsx)(n.em,{children:"elemental.cattle.io"})," ",(0,a.jsx)(n.a,{href:"https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/",children:"Kubernetes CRDs"}),":"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"MachineRegistration"}),"\n",(0,a.jsx)(n.li,{children:"MachineInventory"}),"\n",(0,a.jsx)(n.li,{children:"MachineInventorySelector"}),"\n",(0,a.jsx)(n.li,{children:"MachineInventorySelectorTemplate"}),"\n",(0,a.jsx)(n.li,{children:"ManagedOSImage"}),"\n",(0,a.jsx)(n.li,{children:"ManagedOSVersion"}),"\n",(0,a.jsx)(n.li,{children:"ManagedOSVersionChannel"}),"\n",(0,a.jsx)(n.li,{children:"SeedImage"}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"machineregistration",children:"MachineRegistration"}),"\n",(0,a.jsxs)(n.p,{children:["The MachineRegistration includes the Elemental installation configuration (provided by the user) and a registration token (generated by the ",(0,a.jsx)(l,{name:"elemental_operator_name"}),"), from which a registration URL is derived."]}),"\n",(0,a.jsxs)(n.p,{children:["The registration URL is the way through which an host can access the ",(0,a.jsx)(l,{name:"elemental_operator_name"})," services, to kick off the Elemental provisioning process."]}),"\n",(0,a.jsxs)(n.p,{children:["The MachineRegistration has a ",(0,a.jsx)(n.code,{children:"Ready"})," condition which turns to true when the ",(0,a.jsx)(l,{name:"elemental_operator_name"})," has successfully generated the registration URL and an associated ServiceAccount. From this point on the target host can connect to the registration URL to kick off the provisioning process."]}),"\n",(0,a.jsxs)(n.p,{children:["An HTTP GET request against the registration URL returns the ",(0,a.jsx)(n.em,{children:"registration file"}),": a .yaml file containing the registration data (i.e., the ",(0,a.jsx)(n.em,{children:"spec:config:elemental:registration"})," section only from the just created MachineRegistration).\nThe registration file contains all the required data to allow the target host to perform self registration and start the Elemental provisioning. See the ",(0,a.jsxs)(n.a,{href:"#elemental-register-client",children:[(0,a.jsx)(l,{name:"elemental_register_name"})," section"]})," for more info on the registration process and the ",(0,a.jsxs)(n.a,{href:"/machineregistration-reference#configelementalregistration",children:["config:elemental",":registration"," section in the MachineRegistration reference"]})," for more details on the available registration options."]}),"\n",(0,a.jsx)(n.h4,{id:"machineinventory",children:"MachineInventory"}),"\n",(0,a.jsxs)(n.p,{children:["When a new host registers successfully, the ",(0,a.jsx)(l,{name:"elemental_operator_name"})," creates a MachineInventory resource representing that particular host.\nThe MachineInventory stores the TPM hash of the tracked host, retrieved during the registration process, and allows to execute arbitrary commands (plans) on the machine."]}),"\n",(0,a.jsx)(n.p,{children:"A MachineInventory has two conditions:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"AdoptionReady"}),", which indicates the machine has been adopted by a selector to be part of a cluster."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"Ready"}),", which indicates that the machine has been registered and provisioned with an Elemental OS."]}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"machineinventoryselector",children:"MachineInventorySelector"}),"\n",(0,a.jsx)(n.p,{children:"A MachineInventorySelector selects MachineInventories based on applied selectors (usually pattern matching on MachineInventory label values)."}),"\n",(0,a.jsx)(n.p,{children:"MachineInventorySelectors have two conditions:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"InventoryReady"}),", turns to true if the MachineInventorySelector has found a matching MachineInventory and has successfully set itself as the MachineInventory owner."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"Ready"}),", tracks if the selector already adopted a machine and started the kubernetes provisioning process (node bootstrap)."]}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"machineinventoryselectortemplate",children:"MachineInventorySelectorTemplate"}),"\n",(0,a.jsx)(n.p,{children:"The MachineInventorySelectorTemplate is a user defined resource that will be used as the blueprint to create the required MachineInventorySelectors: it includes the selector to identify the eligible MachineInventories."}),"\n",(0,a.jsx)(n.h4,{id:"seedimage",children:"SeedImage"}),"\n",(0,a.jsx)(n.p,{children:"A SeedImage is a resource to handle the installation media creation. Includes the reference to the base installation system and a reference to the machine registration. It is used to create and serve installation ISOs including\nthe MachineRegistration metadata required for the machine registration. The installation media is created and being served in a devoted Pod."}),"\n",(0,a.jsx)(n.p,{children:"SeedImage have two conditions:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"SeedImageReady"}),", tracks the status of the associated pod."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"Ready"}),", tracks if all the SeedImage child resources have been successfully created."]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-register-client",children:"Elemental Register client"}),"\n",(0,a.jsxs)(n.p,{children:["New hosts start the Elemental provisioning process through the ",(0,a.jsx)(l,{name:"elemental_register_name"}),": this tool requires a valid elemental-operator registration URL as input (see the ",(0,a.jsx)(n.a,{href:"#machineregistration",children:"MachineRegistration section"}),"), and performs the following steps:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"setups a websocket connection to the registration URL"}),"\n",(0,a.jsxs)(n.li,{children:["authenticates itself using the registration token and the onboard ",(0,a.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Trusted_Platform_Module",children:"TPM (Trusted Platform Module)"})]}),"\n",(0,a.jsxs)(n.li,{children:["sends ",(0,a.jsx)(n.a,{href:"/smbios",children:"SMBIOS data"})," to the ",(0,a.jsx)(l,{name:"elemental_operator_name"})]}),"\n",(0,a.jsx)(n.li,{children:"retrieves the Elemental installation configuration"}),"\n",(0,a.jsxs)(n.li,{children:["starts the ",(0,a.jsx)(n.a,{href:"#elemental-cli",children:(0,a.jsx)(l,{name:"elemental_cli_name"})})," and performs the Elemental OS installation"]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"Note"}),"\nif no TPM 2.0 is available on the host, TPM can be emulated by software: see the ",(0,a.jsx)(n.code,{children:"emulate-tpm"})," key in the ",(0,a.jsx)(n.a,{href:"/machineregistration-reference#configelementalregistration",children:"config.elemental.register reference document"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(l,{name:"elemental_operator_name"})," includes a Kubernetes operator installed in the management cluster and a client\nside installed in nodes, so they can self register into the management cluster. Once a node is\nregistered the ",(0,a.jsx)(l,{name:"elemental_operator_name"})," will kick-start the OS installation and schedule the Kubernetes\nprovisioning using the ",(0,a.jsx)(l,{name:"ranchersystemagent_name",link:"ranchersystemagent_url"}),".\nRancher System Agent is responsible for bootstrapping RKE2/k3s and Rancher from an OCI registry. This means\nan update of containerd, k3s, RKE2, or Rancher does not require an OS upgrade\nor node reboot."]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"elemental-teal",children:"Elemental Teal"}),"\n",(0,a.jsx)(n.p,{children:"Elemental Teal is Elemental OS built on top of SUSE Linux Enterprise (SLE) Micro for Rancher using the Elemental stack."})]})}function d(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},8466:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/elemental-arch-v1.3_nobg-cbe062db521c514fc332b92ff6e7f3d5.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>r});var a=t(7294);const i={},l=a.createContext(i);function r(e){const n=a.useContext(l);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7269],{6802:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>s,toc:()=>h});var a=t(5893),i=t(1151);const l={sidebar_label:"Architecture",title:""},r="Architecture",s={id:"architecture",title:"",description:"The Elemental stack can be divided in two main parts: the Elemental OS, an immutable and customizable OS which comprises the tools and the steps needed to prepare the Cloud Native OS image and perform the actual OS installation on the host, and the , that allows central management of the Elemental OS via Rancher, the Kubernetes way.",source:"@site/versioned_docs/version-1.3/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/architecture",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Architecture",title:""},sidebar:"docs",previous:{title:"Elemental the command line way",permalink:"/quickstart-cli"},next:{title:"Installation",permalink:"/installation"}},o={},h=[{value:"Elemental Architecture",id:"elemental-architecture",level:2},{value:"Elemental OS",id:"elemental-os",level:2},{value:"Elemental OS image",id:"elemental-os-image",level:3},{value:"Elemental installation configuration",id:"elemental-installation-configuration",level:3},{value:"Elemental CLI",id:"elemental-cli",level:3},{value:"Elemental Operator",id:"elemental-operator",level:2},{value:"Elemental Operator Helm Chart",id:"elemental-operator-helm-chart",level:3},{value:"MachineRegistration",id:"machineregistration",level:4},{value:"MachineInventory",id:"machineinventory",level:4},{value:"MachineInventorySelector",id:"machineinventoryselector",level:4},{value:"MachineInventorySelectorTemplate",id:"machineinventoryselectortemplate",level:4},{value:"SeedImage",id:"seedimage",level:4},{value:"Elemental Register client",id:"elemental-register-client",level:3},{value:"Elemental Teal",id:"elemental-teal",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",hr:"hr",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.a)(),...e.components},{Head:l,Vars:r}=n;return l||m("Head",!0),r||m("Vars",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(l,{children:(0,a.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/architecture"})}),"\n",(0,a.jsx)(n.h1,{id:"architecture",children:"Architecture"}),"\n",(0,a.jsxs)(n.p,{children:["The Elemental stack can be divided in two main parts: the Elemental OS, an immutable and customizable OS which comprises the tools and the steps needed to prepare the Cloud Native OS image and perform the actual OS installation on the host, and the ",(0,a.jsx)(r,{name:"elemental_operator_name"}),", that allows central management of the Elemental OS via Rancher, the Kubernetes way."]}),"\n",(0,a.jsx)(n.h2,{id:"elemental-architecture",children:(0,a.jsx)(n.img,{alt:"Elemental Architecture",src:t(8466).Z+"",width:"1501",height:"1116"})}),"\n",(0,a.jsx)(n.h2,{id:"elemental-os",children:"Elemental OS"}),"\n",(0,a.jsx)(n.p,{children:"In order to deploy the Elemental OS we need:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"an Elemental base OS image"}),"\n",(0,a.jsx)(n.li,{children:"an Elemental installation configuration"}),"\n",(0,a.jsxs)(n.li,{children:["the ",(0,a.jsx)(r,{name:"elemental_cli_name"})," tool, which installs the Elemental OS image on the target host applying the Elemental installation configuration"]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-os-image",children:"Elemental OS image"}),"\n",(0,a.jsxs)(n.p,{children:["The Elemental OS image is an OCI container image containing all the files that will make up the OS of the target host. It will contain not only all the desired binaries and libraries, but also the kernel and the boot files required by a linux system.\nThe ",(0,a.jsx)(r,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})," is at the core of the Elemental OS, enabling to boot and upgrade an OS from container images. It also provides a framework that allows to combine different packages to bake custom OS container images. For more information check the ",(0,a.jsx)(r,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})," project page."]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-installation-configuration",children:"Elemental installation configuration"}),"\n",(0,a.jsxs)(n.p,{children:["In order to provision a machine with an Elemental OS image, installation configuration parameters are required: things such as the boot device, the root password, system configuration, users and custom files are things that should be provided aside from the Elemental OS image. All the data can be provided in a single .yaml file. More details can be found in the ",(0,a.jsx)(r,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})," documentation."]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-cli",children:"Elemental CLI"}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(r,{name:"elemental_cli_name"})," is the tool that allows to turn the Elemental OS image in a bootable and installed OS: it can generate an ",(0,a.jsx)(r,{name:"elemental_iso_name"})," image from the provided Elemental OS container image. The generated ",(0,a.jsx)(r,{name:"elemental_iso_name"})," image can be used to boot a virtual machine or a bare metal host and start the Elemental OS installation."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(r,{name:"elemental_cli_name"})," allows also to install the Elemental OS on the storage device of the live booted host, applying the provided Elemental installation configuration. For the list and syntax of the commands available in the ",(0,a.jsx)(r,{name:"elemental_cli_name"}),", check the ",(0,a.jsx)(r,{link:"elemental_cli_url",children:"online documentation"}),"."]}),"\n",(0,a.jsx)(n.h3,{id:"",children:(0,a.jsx)(r,{name:"elemental_iso_name"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(r,{name:"elemental_iso_name"})," is a live ISO based on the Elemental OS (an Elemental live ISO).\nIt includes all the tools needed to perform a full node provisioning, from the OS to Kubernetes, including the ",(0,a.jsx)(n.a,{href:"#elemental-cli",children:(0,a.jsx)(r,{name:"elemental_cli_name"})})," and the ",(0,a.jsx)(n.a,{href:"#elemental-register-client",children:(0,a.jsx)(r,{name:"elemental_register_name"})}),"."]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"elemental-operator",children:"Elemental Operator"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(r,{name:"elemental_operator_name"})," is responsible for managing OS upgrades and a secure device inventory to assist\nwith zero touch provisioning.\nIt provides an ",(0,a.jsx)(r,{name:"elemental_operator_name"})," Helm Chart and an ",(0,a.jsx)(r,{name:"elemental_register_name"}),"."]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-operator-helm-chart",children:"Elemental Operator Helm Chart"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(r,{name:"elemental_operator_name"})," Helm Chart must be installed on a Rancher Cluster. It enables new hosts to:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["register against the ",(0,a.jsx)(r,{name:"elemental_operator_name"}),"."]}),"\n",(0,a.jsx)(n.li,{children:"retrieve the Elemental installation configuration (which is stored in custom Kubernetes resources) to start the Elemental OS installation."}),"\n",(0,a.jsxs)(n.li,{children:["download and install the ",(0,a.jsx)(r,{name:"ranchersystemagent_name",link:"ranchersystemagent_url"}),", which enables Rancher to provision and manage K3s and RKE2 on the Elemental nodes."]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(r,{name:"elemental_operator_name"})," allows control of the Elemental Nodes by extending the Kubernetes APIs with a set of ",(0,a.jsx)(n.em,{children:"elemental.cattle.io"})," ",(0,a.jsx)(n.a,{href:"https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/",children:"Kubernetes CRDs"}),":"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"MachineRegistration"}),"\n",(0,a.jsx)(n.li,{children:"MachineInventory"}),"\n",(0,a.jsx)(n.li,{children:"MachineInventorySelector"}),"\n",(0,a.jsx)(n.li,{children:"MachineInventorySelectorTemplate"}),"\n",(0,a.jsx)(n.li,{children:"ManagedOSImage"}),"\n",(0,a.jsx)(n.li,{children:"ManagedOSVersion"}),"\n",(0,a.jsx)(n.li,{children:"ManagedOSVersionChannel"}),"\n",(0,a.jsx)(n.li,{children:"SeedImage"}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"machineregistration",children:"MachineRegistration"}),"\n",(0,a.jsxs)(n.p,{children:["The MachineRegistration includes the Elemental installation configuration (provided by the user) and a registration token (generated by the ",(0,a.jsx)(r,{name:"elemental_operator_name"}),"), from which a registration URL is derived."]}),"\n",(0,a.jsxs)(n.p,{children:["The registration URL is the way through which an host can access the ",(0,a.jsx)(r,{name:"elemental_operator_name"})," services, to kick off the Elemental provisioning process."]}),"\n",(0,a.jsxs)(n.p,{children:["The MachineRegistration has a ",(0,a.jsx)(n.code,{children:"Ready"})," condition which turns to true when the ",(0,a.jsx)(r,{name:"elemental_operator_name"})," has successfully generated the registration URL and an associated ServiceAccount. From this point on the target host can connect to the registration URL to kick off the provisioning process."]}),"\n",(0,a.jsxs)(n.p,{children:["An HTTP GET request against the registration URL returns the ",(0,a.jsx)(n.em,{children:"registration file"}),": a .yaml file containing the registration data (i.e., the ",(0,a.jsx)(n.em,{children:"spec:config:elemental:registration"})," section only from the just created MachineRegistration).\nThe registration file contains all the required data to allow the target host to perform self registration and start the Elemental provisioning. See the ",(0,a.jsxs)(n.a,{href:"#elemental-register-client",children:[(0,a.jsx)(r,{name:"elemental_register_name"})," section"]})," for more info on the registration process and the ",(0,a.jsxs)(n.a,{href:"/machineregistration-reference#configelementalregistration",children:["config:elemental",":registration"," section in the MachineRegistration reference"]})," for more details on the available registration options."]}),"\n",(0,a.jsx)(n.h4,{id:"machineinventory",children:"MachineInventory"}),"\n",(0,a.jsxs)(n.p,{children:["When a new host registers successfully, the ",(0,a.jsx)(r,{name:"elemental_operator_name"})," creates a MachineInventory resource representing that particular host.\nThe MachineInventory stores the TPM hash of the tracked host, retrieved during the registration process, and allows to execute arbitrary commands (plans) on the machine."]}),"\n",(0,a.jsx)(n.p,{children:"A MachineInventory has two conditions:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"AdoptionReady"}),", which indicates the machine has been adopted by a selector to be part of a cluster."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"Ready"}),", which indicates that the machine has been registered and provisioned with an Elemental OS."]}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"machineinventoryselector",children:"MachineInventorySelector"}),"\n",(0,a.jsx)(n.p,{children:"A MachineInventorySelector selects MachineInventories based on applied selectors (usually pattern matching on MachineInventory label values)."}),"\n",(0,a.jsx)(n.p,{children:"MachineInventorySelectors have two conditions:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"InventoryReady"}),", turns to true if the MachineInventorySelector has found a matching MachineInventory and has successfully set itself as the MachineInventory owner."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"Ready"}),", tracks if the selector already adopted a machine and started the kubernetes provisioning process (node bootstrap)."]}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"machineinventoryselectortemplate",children:"MachineInventorySelectorTemplate"}),"\n",(0,a.jsx)(n.p,{children:"The MachineInventorySelectorTemplate is a user defined resource that will be used as the blueprint to create the required MachineInventorySelectors: it includes the selector to identify the eligible MachineInventories."}),"\n",(0,a.jsx)(n.h4,{id:"seedimage",children:"SeedImage"}),"\n",(0,a.jsx)(n.p,{children:"A SeedImage is a resource to handle the installation media creation. Includes the reference to the base installation system and a reference to the machine registration. It is used to create and serve installation ISOs including\nthe MachineRegistration metadata required for the machine registration. The installation media is created and being served in a devoted Pod."}),"\n",(0,a.jsx)(n.p,{children:"SeedImage have two conditions:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"SeedImageReady"}),", tracks the status of the associated pod."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"Ready"}),", tracks if all the SeedImage child resources have been successfully created."]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"elemental-register-client",children:"Elemental Register client"}),"\n",(0,a.jsxs)(n.p,{children:["New hosts start the Elemental provisioning process through the ",(0,a.jsx)(r,{name:"elemental_register_name"}),": this tool requires a valid elemental-operator registration URL as input (see the ",(0,a.jsx)(n.a,{href:"#machineregistration",children:"MachineRegistration section"}),"), and performs the following steps:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"setups a websocket connection to the registration URL"}),"\n",(0,a.jsxs)(n.li,{children:["authenticates itself using the registration token and the onboard ",(0,a.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Trusted_Platform_Module",children:"TPM (Trusted Platform Module)"})]}),"\n",(0,a.jsxs)(n.li,{children:["sends ",(0,a.jsx)(n.a,{href:"/smbios",children:"SMBIOS data"})," to the ",(0,a.jsx)(r,{name:"elemental_operator_name"})]}),"\n",(0,a.jsx)(n.li,{children:"retrieves the Elemental installation configuration"}),"\n",(0,a.jsxs)(n.li,{children:["starts the ",(0,a.jsx)(n.a,{href:"#elemental-cli",children:(0,a.jsx)(r,{name:"elemental_cli_name"})})," and performs the Elemental OS installation"]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"Note"}),"\nif no TPM 2.0 is available on the host, TPM can be emulated by software: see the ",(0,a.jsx)(n.code,{children:"emulate-tpm"})," key in the ",(0,a.jsx)(n.a,{href:"/machineregistration-reference#configelementalregistration",children:"config.elemental.register reference document"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(r,{name:"elemental_operator_name"})," includes a Kubernetes operator installed in the management cluster and a client\nside installed in nodes, so they can self register into the management cluster. Once a node is\nregistered the ",(0,a.jsx)(r,{name:"elemental_operator_name"})," will kick-start the OS installation and schedule the Kubernetes\nprovisioning using the ",(0,a.jsx)(r,{name:"ranchersystemagent_name",link:"ranchersystemagent_url"}),".\nRancher System Agent is responsible for bootstrapping RKE2/k3s and Rancher from an OCI registry. This means\nan update of containerd, k3s, RKE2, or Rancher does not require an OS upgrade\nor node reboot."]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"elemental-teal",children:"Elemental Teal"}),"\n",(0,a.jsx)(n.p,{children:"Elemental Teal is Elemental OS built on top of SUSE Linux Enterprise (SLE) Micro for Rancher using the Elemental stack."})]})}function d(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}function m(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},8466:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/elemental-arch-v1.3_nobg-cbe062db521c514fc332b92ff6e7f3d5.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>r});var a=t(7294);const i={},l=a.createContext(i);function r(e){const n=a.useContext(l);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5c2870c5.2c517fd4.js b/assets/js/5c2870c5.2c517fd4.js deleted file mode 100644 index 4f3e3a367..000000000 --- a/assets/js/5c2870c5.2c517fd4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8793],{2174:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>l,metadata:()=>c,toc:()=>o});var r=n(5893),s=n(1151);const l={sidebar_label:"MachineInventorySelectorTemplate reference",title:""},i="MachineInventorySelectorTemplate reference",c={id:"machineinventoryselectortemplate-reference",title:"",description:"The MachineInventorySelectorTemplate is the resource responsible of defining the matching criteria to pair an inventoried machine with a Cluster resource.",source:"@site/versioned_docs/version-1.3/machineinventoryselectortemplate-reference.md",sourceDirName:".",slug:"/machineinventoryselectortemplate-reference",permalink:"/machineinventoryselectortemplate-reference",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"MachineInventorySelectorTemplate reference",title:""},sidebar:"docs",previous:{title:"MachineRegistration reference",permalink:"/machineregistration-reference"},next:{title:"Cluster reference",permalink:"/cluster-reference"}},a={},o=[{value:"template.spec.selector.matchLabels",id:"templatespecselectormatchlabels",level:4},{value:"template.spec.selector.matchExpressions",id:"templatespecselectormatchexpressions",level:4}];function d(e){const t={code:"code",h1:"h1",h4:"h4",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components},{Details:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate reference"}),"\n",(0,r.jsx)(t.p,{children:"The MachineInventorySelectorTemplate is the resource responsible of defining the matching criteria to pair an inventoried machine with a Cluster resource."}),"\n",(0,r.jsxs)(t.p,{children:["The relevant key is the ",(0,r.jsx)(t.code,{children:"selector"})," which includes label selector expressions."]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",metastring:'title="MachineInventorySelectorTemplate" showLineNumbers',children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: my-machine-selector\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n ...\n"})}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:"template.spec.selector"})," can include ",(0,r.jsx)(t.code,{children:"matchLabels"})," and or ",(0,r.jsx)(t.code,{children:"matchExpressions"})," keys."]}),"\n",(0,r.jsx)(t.h4,{id:"templatespecselectormatchlabels",children:"template.spec.selector.matchLabels"}),"\n",(0,r.jsxs)(t.p,{children:["It is a map of ",(0,r.jsx)(t.code,{children:"{key,value}"})," pairs ",(0,r.jsx)(t.code,{children:"(map[string]string)"}),". When multiple labels are provided all labels must match."]}),"\n",(0,r.jsxs)(n,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",metastring:"showLineNumbers",children:"...\nspec:\n template:\n spec:\n selector:\n matchLabels:\n element: fire\n manufacturer: somevalue\n"})})]}),"\n",(0,r.jsx)(t.p,{children:"A Cluster defined with the above selector will only attempt to provision nodes inventoried including these two labels."}),"\n",(0,r.jsx)(t.h4,{id:"templatespecselectormatchexpressions",children:"template.spec.selector.matchExpressions"}),"\n",(0,r.jsx)(t.p,{children:"It is a list of label selectors, each label selectors can be defined as:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Key"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"key"}),(0,r.jsx)(t.td,{children:"string"}),(0,r.jsx)(t.td,{children:"This is the label key the selector applies on"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"operator"}),(0,r.jsx)(t.td,{children:"string"}),(0,r.jsx)(t.td,{children:"Represents the relationship of the key to a set of values. Valid operators are 'In', 'NotIn', 'Exists' and 'DoesNotExist'"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"values"}),(0,r.jsx)(t.td,{children:"[]string"}),(0,r.jsx)(t.td,{children:"Values is an array of string values. If the operator is 'In' or 'NotIn', the values array must be non-empty. If the operator is 'Exists' or 'DoesNotExist', the values array must be empty"})]})]})]}),"\n",(0,r.jsxs)(n,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",metastring:"showLineNumbers",children:"...\nspec:\n template:\n spec:\n selector:\n matchExpressions:\n - key: element\n operator: In\n values: [ 'fire' ]\n - key: manufacturer\n operator: Exists\n"})})]}),"\n",(0,r.jsxs)(t.p,{children:["A Cluster defined with the above selector will only attempt to provision nodes inventoried with the ",(0,r.jsx)(t.code,{children:"element=fire"})," label and including a ",(0,r.jsx)(t.code,{children:"manufacturer"})," label defined with any value."]})]})}function h(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>i});var r=n(7294);const s={},l=r.createContext(s);function i(e){const t=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(l.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5c2870c5.603ee4c7.js b/assets/js/5c2870c5.603ee4c7.js new file mode 100644 index 000000000..f1b5d8ec5 --- /dev/null +++ b/assets/js/5c2870c5.603ee4c7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8793],{2174:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>d,frontMatter:()=>l,metadata:()=>a,toc:()=>o});var r=n(5893),s=n(1151);const l={sidebar_label:"MachineInventorySelectorTemplate reference",title:""},c="MachineInventorySelectorTemplate reference",a={id:"machineinventoryselectortemplate-reference",title:"",description:"The MachineInventorySelectorTemplate is the resource responsible of defining the matching criteria to pair an inventoried machine with a Cluster resource.",source:"@site/versioned_docs/version-1.3/machineinventoryselectortemplate-reference.md",sourceDirName:".",slug:"/machineinventoryselectortemplate-reference",permalink:"/machineinventoryselectortemplate-reference",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"MachineInventorySelectorTemplate reference",title:""},sidebar:"docs",previous:{title:"MachineRegistration reference",permalink:"/machineregistration-reference"},next:{title:"Cluster reference",permalink:"/cluster-reference"}},i={},o=[{value:"template.spec.selector.matchLabels",id:"templatespecselectormatchlabels",level:4},{value:"template.spec.selector.matchExpressions",id:"templatespecselectormatchexpressions",level:4}];function h(e){const t={code:"code",h1:"h1",h4:"h4",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components},{Details:n,Head:l}=t;return n||p("Details",!0),l||p("Head",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(l,{children:(0,r.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/machineinventoryselectortemplate-reference"})}),"\n",(0,r.jsx)(t.h1,{id:"machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate reference"}),"\n",(0,r.jsx)(t.p,{children:"The MachineInventorySelectorTemplate is the resource responsible of defining the matching criteria to pair an inventoried machine with a Cluster resource."}),"\n",(0,r.jsxs)(t.p,{children:["The relevant key is the ",(0,r.jsx)(t.code,{children:"selector"})," which includes label selector expressions."]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",metastring:'title="MachineInventorySelectorTemplate" showLineNumbers',children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: my-machine-selector\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n ...\n"})}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:"template.spec.selector"})," can include ",(0,r.jsx)(t.code,{children:"matchLabels"})," and or ",(0,r.jsx)(t.code,{children:"matchExpressions"})," keys."]}),"\n",(0,r.jsx)(t.h4,{id:"templatespecselectormatchlabels",children:"template.spec.selector.matchLabels"}),"\n",(0,r.jsxs)(t.p,{children:["It is a map of ",(0,r.jsx)(t.code,{children:"{key,value}"})," pairs ",(0,r.jsx)(t.code,{children:"(map[string]string)"}),". When multiple labels are provided all labels must match."]}),"\n",(0,r.jsxs)(n,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",metastring:"showLineNumbers",children:"...\nspec:\n template:\n spec:\n selector:\n matchLabels:\n element: fire\n manufacturer: somevalue\n"})})]}),"\n",(0,r.jsx)(t.p,{children:"A Cluster defined with the above selector will only attempt to provision nodes inventoried including these two labels."}),"\n",(0,r.jsx)(t.h4,{id:"templatespecselectormatchexpressions",children:"template.spec.selector.matchExpressions"}),"\n",(0,r.jsx)(t.p,{children:"It is a list of label selectors, each label selectors can be defined as:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Key"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"key"}),(0,r.jsx)(t.td,{children:"string"}),(0,r.jsx)(t.td,{children:"This is the label key the selector applies on"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"operator"}),(0,r.jsx)(t.td,{children:"string"}),(0,r.jsx)(t.td,{children:"Represents the relationship of the key to a set of values. Valid operators are 'In', 'NotIn', 'Exists' and 'DoesNotExist'"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"values"}),(0,r.jsx)(t.td,{children:"[]string"}),(0,r.jsx)(t.td,{children:"Values is an array of string values. If the operator is 'In' or 'NotIn', the values array must be non-empty. If the operator is 'Exists' or 'DoesNotExist', the values array must be empty"})]})]})]}),"\n",(0,r.jsxs)(n,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",metastring:"showLineNumbers",children:"...\nspec:\n template:\n spec:\n selector:\n matchExpressions:\n - key: element\n operator: In\n values: [ 'fire' ]\n - key: manufacturer\n operator: Exists\n"})})]}),"\n",(0,r.jsxs)(t.p,{children:["A Cluster defined with the above selector will only attempt to provision nodes inventoried with the ",(0,r.jsx)(t.code,{children:"element=fire"})," label and including a ",(0,r.jsx)(t.code,{children:"manufacturer"})," label defined with any value."]})]})}function d(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}function p(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>c});var r=n(7294);const s={},l=r.createContext(s);function c(e){const t=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),r.createElement(l.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5d57b743.2e83a67c.js b/assets/js/5d57b743.2e83a67c.js deleted file mode 100644 index d0fae3fa7..000000000 --- a/assets/js/5d57b743.2e83a67c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[13],{2106:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var o=t(5893),i=t(1151);const r={sidebar_label:"Cloud-config reference",title:""},s="Cloud-config Reference",c={id:"cloud-config-reference",title:"",description:"All custom configuration applied on top of a fresh deployment should come",source:"@site/docs/cloud-config-reference.md",sourceDirName:".",slug:"/cloud-config-reference",permalink:"/next/cloud-config-reference",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Cloud-config reference",title:""},sidebar:"docs",previous:{title:"Elemental plans",permalink:"/next/elemental-plans"},next:{title:"MachineRegistration reference",permalink:"/next/machineregistration-reference"}},l={},a=[];function d(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",...(0,i.a)(),...e.components},{Details:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"cloud-config-reference",children:"Cloud-config Reference"}),"\n",(0,o.jsxs)(n.p,{children:["All custom configuration applied on top of a fresh deployment should come\nfrom the ",(0,o.jsx)(n.code,{children:"cloud-config"})," section in a ",(0,o.jsx)(n.code,{children:"MachineRegistration"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["This will get run by ",(0,o.jsx)(n.a,{href:"https://github.com/rancher/elemental-cli/blob/main/docs/elemental_run-stage.md",children:(0,o.jsx)(n.code,{children:"elemental-cli run-stage"})})," during the ",(0,o.jsx)(n.code,{children:"boot"})," stage, and\nit will be stored in the node under the ",(0,o.jsx)(n.code,{children:"/oem"})," dir."]}),"\n",(0,o.jsxs)(n.p,{children:["Elemental uses ",(0,o.jsx)(n.a,{href:"https://github.com/mudler/yip",children:"yip"})," to run these cloud-config files, so we support the ",(0,o.jsx)(n.a,{href:"https://github.com/mudler/yip#compatibility-with-cloud-init-format",children:"yip subset cloud-config implementation"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["Below is an example of the supported configuration on a ",(0,o.jsx)(n.code,{children:"MachineRegistration"})," resource."]}),"\n",(0,o.jsxs)(t,{children:[(0,o.jsx)("summary",{children:"Example"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: "bar"\n passwd: "foo"\n groups: "users"\n homedir: "/home/foo"\n shell: "/bin/bash"\n ssh_authorized_keys:\n - faaapploo\n # Assigns these keys to the first user in users or root if there\n # is none\n ssh_authorized_keys:\n - asdd\n # Run these commands once the system has fully booted\n runcmd:\n - foo\n # Write arbitrary files\n write_files:\n - encoding: b64\n content: CiMgVGhpcyBmaWxlIGNvbnRyb2xzIHRoZSBzdGF0ZSBvZiBTRUxpbnV4\n path: /foo/bar\n permissions: "0644"\n owner: "bar"\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineName: my-machine\n machineInventoryLabels:\n element: fire\n'})})]})]})}function u(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>s});var o=t(7294);const i={},r=o.createContext(i);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5d57b743.83252c7b.js b/assets/js/5d57b743.83252c7b.js new file mode 100644 index 000000000..7a46e5bad --- /dev/null +++ b/assets/js/5d57b743.83252c7b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[13],{2106:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>a});var o=t(5893),r=t(1151);const i={sidebar_label:"Cloud-config reference",title:""},s="Cloud-config Reference",c={id:"cloud-config-reference",title:"",description:"All custom configuration applied on top of a fresh deployment should come",source:"@site/docs/cloud-config-reference.md",sourceDirName:".",slug:"/cloud-config-reference",permalink:"/next/cloud-config-reference",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Cloud-config reference",title:""},sidebar:"docs",previous:{title:"Elemental plans",permalink:"/next/elemental-plans"},next:{title:"MachineRegistration reference",permalink:"/next/machineregistration-reference"}},l={},a=[];function d(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",...(0,r.a)(),...e.components},{Details:t,Head:i}=n;return t||h("Details",!0),i||h("Head",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i,{children:(0,o.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/cloud-config-reference"})}),"\n",(0,o.jsx)(n.h1,{id:"cloud-config-reference",children:"Cloud-config Reference"}),"\n",(0,o.jsxs)(n.p,{children:["All custom configuration applied on top of a fresh deployment should come\nfrom the ",(0,o.jsx)(n.code,{children:"cloud-config"})," section in a ",(0,o.jsx)(n.code,{children:"MachineRegistration"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["This will get run by ",(0,o.jsx)(n.a,{href:"https://github.com/rancher/elemental-cli/blob/main/docs/elemental_run-stage.md",children:(0,o.jsx)(n.code,{children:"elemental-cli run-stage"})})," during the ",(0,o.jsx)(n.code,{children:"boot"})," stage, and\nit will be stored in the node under the ",(0,o.jsx)(n.code,{children:"/oem"})," dir."]}),"\n",(0,o.jsxs)(n.p,{children:["Elemental uses ",(0,o.jsx)(n.a,{href:"https://github.com/mudler/yip",children:"yip"})," to run these cloud-config files, so we support the ",(0,o.jsx)(n.a,{href:"https://github.com/mudler/yip#compatibility-with-cloud-init-format",children:"yip subset cloud-config implementation"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["Below is an example of the supported configuration on a ",(0,o.jsx)(n.code,{children:"MachineRegistration"})," resource."]}),"\n",(0,o.jsxs)(t,{children:[(0,o.jsx)("summary",{children:"Example"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: "bar"\n passwd: "foo"\n groups: "users"\n homedir: "/home/foo"\n shell: "/bin/bash"\n ssh_authorized_keys:\n - faaapploo\n # Assigns these keys to the first user in users or root if there\n # is none\n ssh_authorized_keys:\n - asdd\n # Run these commands once the system has fully booted\n runcmd:\n - foo\n # Write arbitrary files\n write_files:\n - encoding: b64\n content: CiMgVGhpcyBmaWxlIGNvbnRyb2xzIHRoZSBzdGF0ZSBvZiBTRUxpbnV4\n path: /foo/bar\n permissions: "0644"\n owner: "bar"\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineName: my-machine\n machineInventoryLabels:\n element: fire\n'})})]})]})}function u(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}function h(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>s});var o=t(7294);const r={},i=o.createContext(r);function s(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5eb1fa47.7532541a.js b/assets/js/5eb1fa47.7532541a.js deleted file mode 100644 index 459e32b24..000000000 --- a/assets/js/5eb1fa47.7532541a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8795],{1068:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>d});var t=i(5893),a=i(1151);const l={sidebar_label:"Customize Elemental Install",title:""},o="Customize Elemental Install",s={id:"customizing",title:"",description:"Elemental Teal images can be customized in different ways.",source:"@site/docs/customizing.md",sourceDirName:".",slug:"/customizing",permalink:"/next/customizing",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Customize Elemental Install",title:""},sidebar:"docs",previous:{title:"Upgrade",permalink:"/next/upgrade"},next:{title:"Elemental plans",permalink:"/next/elemental-plans"}},r={},d=[{value:"Customize installation ISO and installation process",id:"customize-installation-iso-and-installation-process",level:2},{value:"Common customization pattern",id:"common-customization-pattern",level:3},{value:"Custom Elemental client configuration file",id:"custom-elemental-client-configuration-file",level:4},{value:"Adding additional cloud-init files within the installed OS",id:"adding-additional-cloud-init-files-within-the-installed-os",level:4},{value:"Adding installation hooks or boot stages for the live system",id:"adding-installation-hooks-or-boot-stages-for-the-live-system",level:4},{value:"Adding extra driver binaries into the ISO example",id:"adding-extra-driver-binaries-into-the-iso-example",level:3},{value:"Adding extra LVM volume group disks during the installation",id:"adding-extra-lvm-volume-group-disks-during-the-installation",level:3},{value:"Repacking the ISO image with extra files",id:"repacking-the-iso-image-with-extra-files",level:3},{value:"Remastering a custom docker image",id:"remastering-a-custom-docker-image",level:2},{value:"Create a custom bootable installation media",id:"create-a-custom-bootable-installation-media",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"customize-elemental-install",children:"Customize Elemental Install"}),"\n",(0,t.jsx)(n.p,{children:"Elemental Teal images can be customized in different ways.\nOne option is to provide\nadditional resources within the installation media so that during installation, or\neventually at boot time, additional binaries such as drivers can be included."}),"\n",(0,t.jsx)(n.p,{children:"Another option would be to remaster the Elemental Teal by simply using a docker build.\nElemental Teal is a regular container image, so it is absolutely possible to create\na new image using a Dockerfile based on Elemental Teal image."}),"\n",(0,t.jsx)(n.h2,{id:"customize-installation-iso-and-installation-process",children:"Customize installation ISO and installation process"}),"\n",(0,t.jsx)(n.p,{children:"In order to adapt the installation ISO a simple approach is to append extra configuration\nfiles into the ISO root in an analog way the registration yaml configuration file\nis added."}),"\n",(0,t.jsx)(n.h3,{id:"common-customization-pattern",children:"Common customization pattern"}),"\n",(0,t.jsxs)(n.p,{children:["Elemental Teal installation can be customized in three different non-exclusive ways. First, including\nsome custom Elemental client configuration file, second, by including additional cloud-init files to execute at\nboot time, and finally, by including ",(0,t.jsx)(n.code,{children:"cloud-init"})," files such as installation hooks or boot stages evaluated during\nthe live system boot itself."]}),"\n",(0,t.jsxs)(n.p,{children:["A common pattern is to combine the three ways described above. This pattern will allow you to add custom steps during the installation and add ",(0,t.jsx)(n.code,{children:"cloud-init"})," files to be evaluated at boot time."]}),"\n",(0,t.jsxs)(n.p,{children:["Additional config files can be added dynamically boot time by generating the ISO via a ",(0,t.jsx)(n.a,{href:"/next/seedimage-reference",children:"SeedImage"})," including custom cloud-config data."]}),"\n",(0,t.jsx)(n.p,{children:"To apply this pattern, the following files need to be included in the ISO or generated at boot time:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["A ",(0,t.jsx)(n.a,{href:"https://rancher.github.io/elemental-toolkit/docs/customizing/general_configuration/",children:"configuration file"}),"\nfor the elemental client. The file must be named ",(0,t.jsx)(n.code,{children:"config.yaml"})," and located by default in ",(0,t.jsx)(n.code,{children:"/etc/elemental"}),".\nThis path can be configured as part of the installation parameters of a ",(0,t.jsx)(n.a,{href:"/machineregistration-reference",children:"MachineRegistration"})," resource."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["The additional ",(0,t.jsx)(n.code,{children:"cloud-init"})," files to be included into the installed system. They\nallow to perform custom operations at boot time."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["The installation hooks are evalutated at install time. They allow to perform custom operations\nduring the installation process (include extra software, set additional disks...). The same\nway ",(0,t.jsx)(n.code,{children:"cloud-init"})," files can be included to perform custom operations during the live installation\nmedia boot time."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"custom-elemental-client-configuration-file",children:"Custom Elemental client configuration file"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/rancher/elemental-toolkit/blob/main/docs/elemental.md",children:"Elemental client"})," ",(0,t.jsx)(n.code,{children:"install"}),", ",(0,t.jsx)(n.code,{children:"upgrade"})," and ",(0,t.jsx)(n.code,{children:"reset"})," commands can be configured with a ",(0,t.jsx)(n.a,{href:"https://rancher.github.io/elemental-toolkit/docs/customizing/general_configuration/",children:"custom configuration file"})," located by default in ",(0,t.jsx)(n.code,{children:"/etc/elemental/config.yaml"}),".\nIf you have multiple yaml files, you need to add them in the ",(0,t.jsx)(n.code,{children:"/etc/elemental/config.d"})," directory."]}),"\n",(0,t.jsx)(n.p,{children:"A simple example to set hooks location could be:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"extra-partitions:\n - size: 10240\n fs: ext4\n label: EXTRA_PARTITION\n"})}),"\n",(0,t.jsx)(n.p,{children:"The above example sets an additional extra partition during the installation."}),"\n",(0,t.jsx)(n.h4,{id:"adding-additional-cloud-init-files-within-the-installed-os",children:"Adding additional cloud-init files within the installed OS"}),"\n",(0,t.jsxs)(n.p,{children:["In order to include additional cloud-init files during the installation they need\nto be added to the installation data into the MachineRegistration resource. More specific\nthe ",(0,t.jsx)(n.code,{children:"config-urls"})," field is used for this exact purpose. See ",(0,t.jsx)(n.a,{href:"/machineregistration-reference",children:"MachineRegistration reference"})," page."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"config-urls"})," is a list of string literals where each item is an HTTP URL or a local path pointing to a\ncloud-init file. The local path is evaluated during\nthe installation, hence it must exists within the installation media, commonly an ISO image."]}),"\n",(0,t.jsxs)(n.p,{children:["By default, Elemental Teal live systems mount the ISO root at ",(0,t.jsx)(n.code,{children:"/run/initramfs/live"})," which is also the default path set for ",(0,t.jsx)(n.code,{children:"config-url"})," in ",(0,t.jsx)(n.code,{children:"MachineRegistrations"}),":\nSee the example below:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n ...\n config:\n ...\n elemental:\n ...\n install:\n ...\n config-urls:\n - "/run/initramfs/live/oem/custom_config.yaml"\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Elemental Teal live ISOs, when booted, have the ISO root mounted at ",(0,t.jsx)(n.code,{children:"/run/initramfs/live"}),".\nAccording to that, the ISO for the example above is expected to include the ",(0,t.jsx)(n.code,{children:"/oem/custom_config.yaml"})," file."]}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"/run/initramfs/live"})," is a readonly mountpoint and it's not an appropriate path for dynamically generated content at ISO boot."]})}),"\n",(0,t.jsx)(n.h4,{id:"adding-installation-hooks-or-boot-stages-for-the-live-system",children:"Adding installation hooks or boot stages for the live system"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/rancher/elemental-cli",children:"Elemental client"})," ",(0,t.jsx)(n.code,{children:"install"}),", ",(0,t.jsx)(n.code,{children:"upgrade"})," and ",(0,t.jsx)(n.code,{children:"reset"})," procedures include four different hooks:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"before-install"}),": executed after all partition mountpoints are set."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"after-install-chroot"}),": executed after deploying the OS image and before unmounting the associated loop filesystem image. Runs chrooted to the OS image."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"after-install"}),": executed just after the after-install-chroot hook. It is not chrooted."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"post-install"}),": executed as the very last step before ending the installation, partitions are still mounted, the loop devices for the image is not."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Hooks are provided as ",(0,t.jsx)(n.code,{children:"cloud-init"})," stages. Equivalent hooks exist for ",(0,t.jsx)(n.code,{children:"reset"})," and ",(0,t.jsx)(n.code,{children:"upgrade"})," procedures.\nThey are loaded from the ",(0,t.jsx)(n.code,{children:"/iso-config"})," folder in ISO filesystem root. In fact, hooks are regular ",(0,t.jsx)(n.code,{children:"cloud-init"})," stages with the\nonly difference that Elemental client parses them during ",(0,t.jsx)(n.code,{children:"install"}),", ",(0,t.jsx)(n.code,{children:"upgrade"})," or ",(0,t.jsx)(n.code,{children:"reset"})," actions, rather than boot time.\nNote any boot stage included this way will be executed during the live installation media boot."]}),"\n",(0,t.jsxs)(n.p,{children:["Hooks are evaluated during ",(0,t.jsx)(n.code,{children:"install"}),",",(0,t.jsx)(n.code,{children:"reset"})," and ",(0,t.jsx)(n.code,{children:"upgrade"})," action from ",(0,t.jsx)(n.code,{children:"/oem"}),", ",(0,t.jsx)(n.code,{children:"/system/oem"})," and ",(0,t.jsx)(n.code,{children:"/usr/local/cloud-config"})," paths,\nhowever for the live ISOs there is an additional the path ",(0,t.jsx)(n.code,{children:"/run/initramfs/live/iso-config"})," included. Note the ",(0,t.jsx)(n.code,{children:"/run/initramfs/live"}),"\nprefix is the mount point of the ISO filesystem of the Elemental Live ISO once booted."]}),"\n",(0,t.jsx)(n.h3,{id:"adding-extra-driver-binaries-into-the-iso-example",children:"Adding extra driver binaries into the ISO example"}),"\n",(0,t.jsx)(n.p,{children:"This example is covering the case in which extra driver binaries are included into the ISO\nand during the installation they are installed over the OS image."}),"\n",(0,t.jsx)(n.p,{children:"For that use case the following files are required:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"additional binaries to install (they could be in the form of RPMs)"}),"\n",(0,t.jsx)(n.li,{children:"additional hooks file to copy binaries into the persistent storage and to install them"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Let's create an ",(0,t.jsx)(n.code,{children:"overlay"})," directory to create the directory tree that needs to be\nadded into the ISO root. In that case the ",(0,t.jsx)(n.code,{children:"overlay"})," directory could contain:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"overlay/\n data/\n extra_drivers/\n some_driver.rpm\n iso-config/\n install_hooks.yaml\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"overlay/iso-config/install_hooks.yaml"})," could be as:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'name: "Install extra drivers"\nstages:\n before-install:\n # Preload data to the persistent storage\n # During installation persistent partition is mounted at /run/cos/persistent\n - commands:\n - rsync -a /run/initramfs/live/data/ /run/cos/persistent\n after-install-chroot:\n # extra_drivers folder is at `/usr/local/extra_drivers` from the OS image chroot\n - commands:\n - rpm -iv /usr/local/extra_drivers/some_driver.rpm\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Note the installation hooks only cover installation procedures, for upgrades equivalent\n",(0,t.jsx)(n.code,{children:"before-upgrade"})," and/or ",(0,t.jsx)(n.code,{children:"after-upgrade-chroot"})," should be defined."]}),"\n",(0,t.jsx)(n.h3,{id:"adding-extra-lvm-volume-group-disks-during-the-installation",children:"Adding extra LVM volume group disks during the installation"}),"\n",(0,t.jsx)(n.p,{children:"This example is covering the setup of an host with multiple disks and some of them used\nas part of an LVM setup."}),"\n",(0,t.jsxs)(n.p,{children:["As an example, we have an host with three disks (",(0,t.jsx)(n.code,{children:"/dev/sda"}),", ",(0,t.jsx)(n.code,{children:"/dev/sdb"}),"\nand ",(0,t.jsx)(n.code,{children:"/dev/sdc"}),")."]}),"\n",(0,t.jsxs)(n.p,{children:["The first disk is used for a regular Elemental Teal installation\nand the other remaining two are used as part of a LVM group where arbitrary logical volumes\nare created, formatted and mounted at boot time via an extended ",(0,t.jsx)(n.code,{children:"fstab"})," file."]}),"\n",(0,t.jsx)(n.p,{children:"For this example, the following files are required:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["additional ",(0,t.jsx)(n.code,{children:"clout-init"})," files included in the installed system"]}),"\n",(0,t.jsx)(n.li,{children:"additional installation hooks to prepare the LVM volumes during the installation"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Let's create an ",(0,t.jsx)(n.code,{children:"overlay"})," directory to create the directory tree that needs to be\nadded into the ISO root. In that case the ",(0,t.jsx)(n.code,{children:"overlay"})," directory could contain:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"overlay/\n oem/\n lvm_volumes_in_fstab.yaml\n iso-config/\n lvm_volumes_hook.yaml\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The installation hook ",(0,t.jsx)(n.code,{children:"overlay/iso-config/lvm_volumes_hook.yaml"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'name: "Create LVM logic volumes over some physical disks"\nstages:\n post-install:\n - name: "Create physical volume, volume group and logical volumes"\n if: \'[ -e "/dev/sdb" ] && [ -e "/dev/sdc" ]\'\n commands:\n - | \n # Create the physical volume, volume group and logical volumes\n pvcreate /dev/sdb /dev/sdc\n vgcreate elementalLVM /dev/sdb /dev/sdc\n lvcreate -L 8G -n elementalVol1 elementalLVM\n lvcreate -l 100%FREE -n elementalVol2 elementalLVM\n\n # Trigger udev detection\n if [ ! -e "/dev/elementalLVM/elementalVol1" ] || [ ! -e "/dev/elementalLVM/elementalVol2" ]; then\n sleep 10\n udevadm settle\n fi\n\n # Ensure devices are already available\n [ -e "/dev/elementalLVM/elementalVol1" ] || exit 1\n [ -e "/dev/elementalLVM/elementalVol2" ] || exit 1\n\n # Format logical volumes with a known label for later use in fstab\n mkfs.xfs -L eVol1 /dev/elementalLVM/elementalVol1\n mkfs.xfs -L eVol2 /dev/elementalLVM/elementalVol2\n'})}),"\n",(0,t.jsx)(n.p,{children:"The LVM devices are created and formatted as desired. This is a good\nexample of an installation hook, as this setup is only needed once, at installation\ntime. As an alternative, the same action could be done on first boot, however it would\nrequire a more sophisticated logic to ensure it's only applied once at first boot."}),"\n",(0,t.jsxs)(n.p,{children:["Finally, the boot time ",(0,t.jsx)(n.code,{children:"cloud-init"})," files contain the mount points settings and trigger the\naction of mounting those mountpoints. The Elemental OS ",(0,t.jsx)(n.code,{children:"fstab"})," file is ephemeral and it's\ndynamically created at boot time. That's why it doesn't exist during the installation and\ncan't be used in an installation hook."]}),"\n",(0,t.jsxs)(n.p,{children:["Here's an example of ",(0,t.jsx)(n.code,{children:"overlay/oem/lvm_volumes_in_fstab.yaml"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'name: "Mount LVM volumes"\nstages:\n initramfs:\n - name: "Extend fstab to mount LVM logical volumes at boot"\n commands:\n - |\n echo "LABEL=eVol1 /usr/local/eVol1 xfs defaults 0 0" >> /etc/fstab\n echo "LABEL=eVol2 /usr/local/eVol2 xfs defaults 0 0" >> /etc/fstab\n'})}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"initramfs"})," stage is the last stage before switching to the actual root tree.\nAt this stage, the ",(0,t.jsx)(n.code,{children:"/etc/fstab"})," file already exists and can be adapted before\nswitching root. Once running in the final root tree, SystemD will handle the rest of the initialization and apply it."]})}),"\n",(0,t.jsxs)(n.p,{children:["This cloud-init file should be included into the ",(0,t.jsx)(n.code,{children:"/oem"})," directory on the installed\nsystem. ",(0,t.jsx)(n.code,{children:"/oem"})," is a mount point for the OEM partition. In order to include extra files,\nthey should be listed as ",(0,t.jsx)(n.code,{children:"config-urls"})," within the Registration CRD at the\nmanagement cluster."]}),"\n",(0,t.jsx)(n.h3,{id:"repacking-the-iso-image-with-extra-files",children:"Repacking the ISO image with extra files"}),"\n",(0,t.jsxs)(n.p,{children:["Assuming an ",(0,t.jsx)(n.code,{children:"overlay"})," folder was created in the current directory containing all\nadditional files to be appended, the following ",(0,t.jsx)(n.code,{children:"xorriso"})," command adds the extra files:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"xorriso -indev elemental-teal.x86_64.iso -outdev elemental-teal.custom.x86_64.iso -map overlay / -boot_image any replay\n"})}),"\n",(0,t.jsxs)(n.p,{children:["For that a ",(0,t.jsx)(n.code,{children:"xorriso"})," equal or higher than version 1.5 is required."]}),"\n",(0,t.jsx)(n.h2,{id:"remastering-a-custom-docker-image",children:"Remastering a custom docker image"}),"\n",(0,t.jsx)(n.p,{children:"Since Elemental Teal image is a Docker image it can also be used as a base image\nin a Dockerfile in order to create a new container image."}),"\n",(0,t.jsx)(n.p,{children:"Imagine some additional package from an extra repository is required, the following example\nshow case how this could be added:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-docker",metastring:"showLineNumbers",children:'# The version of Elemental to modify\nFROM registry.suse.com/rancher/elemental-teal/5.4:latest\n\n# Custom commands\nRUN rpm --import && \\\n zypper addrepo --refresh extra_repo && \\\n zypper install -y \n\n# IMPORTANT: /etc/os-release is used for versioning/upgrade. The\n# values here should reflect the tag of the image currently being built\nARG IMAGE_REPO=norepo\nARG IMAGE_TAG=latest\nRUN \\\n sed -i -e "s/^IMAGE_REPO=.*/IMAGE_REPO=\\"${IMAGE_REPO}\\"/g" /etc/os-release && \\\n sed -i -e "s/^IMAGE_TAG=.*/IMAGE_TAG=\\"${IMAGE_TAG}\\"/g" /etc/os-release && \\\n sed -i -e "s/^IMAGE=.*/IMAGE=\\"${IMAGE_REPO}:${IMAGE_TAG}\\"/g" /etc/os-release\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Where ",(0,t.jsx)(n.code,{children:"latest"})," is the base version we want to customize."]}),"\n",(0,t.jsx)(n.p,{children:"And then the following commands"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"docker build --build-arg IMAGE_REPO=myrepo/custom-build \\\n --build-arg IMAGE_TAG=v1.1.1 \\\n -t myrepo/custom-build:v1.1.1 .\ndocker push myrepo/custom-build:v1.1.1\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The new customized OS is available as the Docker image ",(0,t.jsx)(n.code,{children:"myrepo/custom-build:v1.1.1"})," and it can\nbe run and verified using docker with"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"docker run -it myrepo/custom-build:v1.1.1 bash\n"})}),"\n",(0,t.jsx)(n.h2,{id:"create-a-custom-bootable-installation-media",children:"Create a custom bootable installation media"}),"\n",(0,t.jsx)(n.p,{children:"Elemental Teal leverages container images to build its root filesystems; therefore, it is possible\nto use it in a multi-stage environment to create custom bootable media that bundles a custom container image."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-docker",metastring:"showLineNumbers",children:'FROM registry.suse.com/rancher/elemental-teal/5.4:latest as os\n\n# Check the section on remastering a custom docker image\n\nFROM registry.suse.com/rancher/elemental-builder-image/5.4:latest AS builder\n\nARG TARGETARCH\nWORKDIR /iso\nCOPY --from=os / rootfs\n\n# work around buildah issue: https://github.com/containers/buildah/issues/4242\nRUN rm rootfs/etc/resolv.conf\n\nRUN --mount=type=bind,source=./,target=/output,rw \\\n elemental build-iso \\\n dir:rootfs \\\n --bootloader-in-rootfs \\\n --squash-no-compression \\\n -o /output -n "elemental-teal-${TARGETARCH}"\n'})}),"\n",(0,t.jsx)(n.p,{children:"Modify the container image template and afterwards run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"buildah build --tag myrepo/custom-build:v1.1.1 \\\n --build-arg IMAGE_REPO=myrepo/custom-build \\\n --build-arg IMAGE_TAG=v1.1.1 \\\n .\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The new customized installation media can be found in ",(0,t.jsx)(n.code,{children:"elemental-teal-amd64.iso"}),"."]}),"\n",(0,t.jsx)(n.admonition,{title:"important",type:"caution",children:(0,t.jsxs)(n.p,{children:["You still need to ",(0,t.jsx)(n.a,{href:"quickstart-cli#preparing-the-installation-seed-image",children:"prepare the installation image"})," so it can be used to boot and provision the machine."]})})]})}function h(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>s,a:()=>o});var t=i(7294);const a={},l=t.createContext(a);function o(e){const n=t.useContext(l);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),t.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5eb1fa47.9994edd5.js b/assets/js/5eb1fa47.9994edd5.js new file mode 100644 index 000000000..3408c4675 --- /dev/null +++ b/assets/js/5eb1fa47.9994edd5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8795],{1068:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var t=i(5893),a=i(1151);const o={sidebar_label:"Customize Elemental Install",title:""},l="Customize Elemental Install",s={id:"customizing",title:"",description:"Elemental Teal images can be customized in different ways.",source:"@site/docs/customizing.md",sourceDirName:".",slug:"/customizing",permalink:"/next/customizing",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Customize Elemental Install",title:""},sidebar:"docs",previous:{title:"Upgrade",permalink:"/next/upgrade"},next:{title:"Elemental plans",permalink:"/next/elemental-plans"}},r={},d=[{value:"Customize installation ISO and installation process",id:"customize-installation-iso-and-installation-process",level:2},{value:"Common customization pattern",id:"common-customization-pattern",level:3},{value:"Custom Elemental client configuration file",id:"custom-elemental-client-configuration-file",level:4},{value:"Adding additional cloud-init files within the installed OS",id:"adding-additional-cloud-init-files-within-the-installed-os",level:4},{value:"Adding installation hooks or boot stages for the live system",id:"adding-installation-hooks-or-boot-stages-for-the-live-system",level:4},{value:"Adding extra driver binaries into the ISO example",id:"adding-extra-driver-binaries-into-the-iso-example",level:3},{value:"Adding extra LVM volume group disks during the installation",id:"adding-extra-lvm-volume-group-disks-during-the-installation",level:3},{value:"Repacking the ISO image with extra files",id:"repacking-the-iso-image-with-extra-files",level:3},{value:"Remastering a custom docker image",id:"remastering-a-custom-docker-image",level:2},{value:"Create a custom bootable installation media",id:"create-a-custom-bootable-installation-media",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components},{Head:i}=n;return i||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i,{children:(0,t.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/customizing"})}),"\n",(0,t.jsx)(n.h1,{id:"customize-elemental-install",children:"Customize Elemental Install"}),"\n",(0,t.jsx)(n.p,{children:"Elemental Teal images can be customized in different ways.\nOne option is to provide\nadditional resources within the installation media so that during installation, or\neventually at boot time, additional binaries such as drivers can be included."}),"\n",(0,t.jsx)(n.p,{children:"Another option would be to remaster the Elemental Teal by simply using a docker build.\nElemental Teal is a regular container image, so it is absolutely possible to create\na new image using a Dockerfile based on Elemental Teal image."}),"\n",(0,t.jsx)(n.h2,{id:"customize-installation-iso-and-installation-process",children:"Customize installation ISO and installation process"}),"\n",(0,t.jsx)(n.p,{children:"In order to adapt the installation ISO a simple approach is to append extra configuration\nfiles into the ISO root in an analog way the registration yaml configuration file\nis added."}),"\n",(0,t.jsx)(n.h3,{id:"common-customization-pattern",children:"Common customization pattern"}),"\n",(0,t.jsxs)(n.p,{children:["Elemental Teal installation can be customized in three different non-exclusive ways. First, including\nsome custom Elemental client configuration file, second, by including additional cloud-init files to execute at\nboot time, and finally, by including ",(0,t.jsx)(n.code,{children:"cloud-init"})," files such as installation hooks or boot stages evaluated during\nthe live system boot itself."]}),"\n",(0,t.jsxs)(n.p,{children:["A common pattern is to combine the three ways described above. This pattern will allow you to add custom steps during the installation and add ",(0,t.jsx)(n.code,{children:"cloud-init"})," files to be evaluated at boot time."]}),"\n",(0,t.jsxs)(n.p,{children:["Additional config files can be added dynamically boot time by generating the ISO via a ",(0,t.jsx)(n.a,{href:"/next/seedimage-reference",children:"SeedImage"})," including custom cloud-config data."]}),"\n",(0,t.jsx)(n.p,{children:"To apply this pattern, the following files need to be included in the ISO or generated at boot time:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["A ",(0,t.jsx)(n.a,{href:"https://rancher.github.io/elemental-toolkit/docs/customizing/general_configuration/",children:"configuration file"}),"\nfor the elemental client. The file must be named ",(0,t.jsx)(n.code,{children:"config.yaml"})," and located by default in ",(0,t.jsx)(n.code,{children:"/etc/elemental"}),".\nThis path can be configured as part of the installation parameters of a ",(0,t.jsx)(n.a,{href:"/machineregistration-reference",children:"MachineRegistration"})," resource."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["The additional ",(0,t.jsx)(n.code,{children:"cloud-init"})," files to be included into the installed system. They\nallow to perform custom operations at boot time."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["The installation hooks are evalutated at install time. They allow to perform custom operations\nduring the installation process (include extra software, set additional disks...). The same\nway ",(0,t.jsx)(n.code,{children:"cloud-init"})," files can be included to perform custom operations during the live installation\nmedia boot time."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"custom-elemental-client-configuration-file",children:"Custom Elemental client configuration file"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/rancher/elemental-toolkit/blob/main/docs/elemental.md",children:"Elemental client"})," ",(0,t.jsx)(n.code,{children:"install"}),", ",(0,t.jsx)(n.code,{children:"upgrade"})," and ",(0,t.jsx)(n.code,{children:"reset"})," commands can be configured with a ",(0,t.jsx)(n.a,{href:"https://rancher.github.io/elemental-toolkit/docs/customizing/general_configuration/",children:"custom configuration file"})," located by default in ",(0,t.jsx)(n.code,{children:"/etc/elemental/config.yaml"}),".\nIf you have multiple yaml files, you need to add them in the ",(0,t.jsx)(n.code,{children:"/etc/elemental/config.d"})," directory."]}),"\n",(0,t.jsx)(n.p,{children:"A simple example to set hooks location could be:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"extra-partitions:\n - size: 10240\n fs: ext4\n label: EXTRA_PARTITION\n"})}),"\n",(0,t.jsx)(n.p,{children:"The above example sets an additional extra partition during the installation."}),"\n",(0,t.jsx)(n.h4,{id:"adding-additional-cloud-init-files-within-the-installed-os",children:"Adding additional cloud-init files within the installed OS"}),"\n",(0,t.jsxs)(n.p,{children:["In order to include additional cloud-init files during the installation they need\nto be added to the installation data into the MachineRegistration resource. More specific\nthe ",(0,t.jsx)(n.code,{children:"config-urls"})," field is used for this exact purpose. See ",(0,t.jsx)(n.a,{href:"/machineregistration-reference",children:"MachineRegistration reference"})," page."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"config-urls"})," is a list of string literals where each item is an HTTP URL or a local path pointing to a\ncloud-init file. The local path is evaluated during\nthe installation, hence it must exists within the installation media, commonly an ISO image."]}),"\n",(0,t.jsxs)(n.p,{children:["By default, Elemental Teal live systems mount the ISO root at ",(0,t.jsx)(n.code,{children:"/run/initramfs/live"})," which is also the default path set for ",(0,t.jsx)(n.code,{children:"config-url"})," in ",(0,t.jsx)(n.code,{children:"MachineRegistrations"}),":\nSee the example below:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n ...\n config:\n ...\n elemental:\n ...\n install:\n ...\n config-urls:\n - "/run/initramfs/live/oem/custom_config.yaml"\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Elemental Teal live ISOs, when booted, have the ISO root mounted at ",(0,t.jsx)(n.code,{children:"/run/initramfs/live"}),".\nAccording to that, the ISO for the example above is expected to include the ",(0,t.jsx)(n.code,{children:"/oem/custom_config.yaml"})," file."]}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"/run/initramfs/live"})," is a readonly mountpoint and it's not an appropriate path for dynamically generated content at ISO boot."]})}),"\n",(0,t.jsx)(n.h4,{id:"adding-installation-hooks-or-boot-stages-for-the-live-system",children:"Adding installation hooks or boot stages for the live system"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/rancher/elemental-cli",children:"Elemental client"})," ",(0,t.jsx)(n.code,{children:"install"}),", ",(0,t.jsx)(n.code,{children:"upgrade"})," and ",(0,t.jsx)(n.code,{children:"reset"})," procedures include four different hooks:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"before-install"}),": executed after all partition mountpoints are set."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"after-install-chroot"}),": executed after deploying the OS image and before unmounting the associated loop filesystem image. Runs chrooted to the OS image."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"after-install"}),": executed just after the after-install-chroot hook. It is not chrooted."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"post-install"}),": executed as the very last step before ending the installation, partitions are still mounted, the loop devices for the image is not."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Hooks are provided as ",(0,t.jsx)(n.code,{children:"cloud-init"})," stages. Equivalent hooks exist for ",(0,t.jsx)(n.code,{children:"reset"})," and ",(0,t.jsx)(n.code,{children:"upgrade"})," procedures.\nThey are loaded from the ",(0,t.jsx)(n.code,{children:"/iso-config"})," folder in ISO filesystem root. In fact, hooks are regular ",(0,t.jsx)(n.code,{children:"cloud-init"})," stages with the\nonly difference that Elemental client parses them during ",(0,t.jsx)(n.code,{children:"install"}),", ",(0,t.jsx)(n.code,{children:"upgrade"})," or ",(0,t.jsx)(n.code,{children:"reset"})," actions, rather than boot time.\nNote any boot stage included this way will be executed during the live installation media boot."]}),"\n",(0,t.jsxs)(n.p,{children:["Hooks are evaluated during ",(0,t.jsx)(n.code,{children:"install"}),",",(0,t.jsx)(n.code,{children:"reset"})," and ",(0,t.jsx)(n.code,{children:"upgrade"})," action from ",(0,t.jsx)(n.code,{children:"/oem"}),", ",(0,t.jsx)(n.code,{children:"/system/oem"})," and ",(0,t.jsx)(n.code,{children:"/usr/local/cloud-config"})," paths,\nhowever for the live ISOs there is an additional the path ",(0,t.jsx)(n.code,{children:"/run/initramfs/live/iso-config"})," included. Note the ",(0,t.jsx)(n.code,{children:"/run/initramfs/live"}),"\nprefix is the mount point of the ISO filesystem of the Elemental Live ISO once booted."]}),"\n",(0,t.jsx)(n.h3,{id:"adding-extra-driver-binaries-into-the-iso-example",children:"Adding extra driver binaries into the ISO example"}),"\n",(0,t.jsx)(n.p,{children:"This example is covering the case in which extra driver binaries are included into the ISO\nand during the installation they are installed over the OS image."}),"\n",(0,t.jsx)(n.p,{children:"For that use case the following files are required:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"additional binaries to install (they could be in the form of RPMs)"}),"\n",(0,t.jsx)(n.li,{children:"additional hooks file to copy binaries into the persistent storage and to install them"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Let's create an ",(0,t.jsx)(n.code,{children:"overlay"})," directory to create the directory tree that needs to be\nadded into the ISO root. In that case the ",(0,t.jsx)(n.code,{children:"overlay"})," directory could contain:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"overlay/\n data/\n extra_drivers/\n some_driver.rpm\n iso-config/\n install_hooks.yaml\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"overlay/iso-config/install_hooks.yaml"})," could be as:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'name: "Install extra drivers"\nstages:\n before-install:\n # Preload data to the persistent storage\n # During installation persistent partition is mounted at /run/cos/persistent\n - commands:\n - rsync -a /run/initramfs/live/data/ /run/cos/persistent\n after-install-chroot:\n # extra_drivers folder is at `/usr/local/extra_drivers` from the OS image chroot\n - commands:\n - rpm -iv /usr/local/extra_drivers/some_driver.rpm\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Note the installation hooks only cover installation procedures, for upgrades equivalent\n",(0,t.jsx)(n.code,{children:"before-upgrade"})," and/or ",(0,t.jsx)(n.code,{children:"after-upgrade-chroot"})," should be defined."]}),"\n",(0,t.jsx)(n.h3,{id:"adding-extra-lvm-volume-group-disks-during-the-installation",children:"Adding extra LVM volume group disks during the installation"}),"\n",(0,t.jsx)(n.p,{children:"This example is covering the setup of an host with multiple disks and some of them used\nas part of an LVM setup."}),"\n",(0,t.jsxs)(n.p,{children:["As an example, we have an host with three disks (",(0,t.jsx)(n.code,{children:"/dev/sda"}),", ",(0,t.jsx)(n.code,{children:"/dev/sdb"}),"\nand ",(0,t.jsx)(n.code,{children:"/dev/sdc"}),")."]}),"\n",(0,t.jsxs)(n.p,{children:["The first disk is used for a regular Elemental Teal installation\nand the other remaining two are used as part of a LVM group where arbitrary logical volumes\nare created, formatted and mounted at boot time via an extended ",(0,t.jsx)(n.code,{children:"fstab"})," file."]}),"\n",(0,t.jsx)(n.p,{children:"For this example, the following files are required:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["additional ",(0,t.jsx)(n.code,{children:"clout-init"})," files included in the installed system"]}),"\n",(0,t.jsx)(n.li,{children:"additional installation hooks to prepare the LVM volumes during the installation"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Let's create an ",(0,t.jsx)(n.code,{children:"overlay"})," directory to create the directory tree that needs to be\nadded into the ISO root. In that case the ",(0,t.jsx)(n.code,{children:"overlay"})," directory could contain:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"overlay/\n oem/\n lvm_volumes_in_fstab.yaml\n iso-config/\n lvm_volumes_hook.yaml\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The installation hook ",(0,t.jsx)(n.code,{children:"overlay/iso-config/lvm_volumes_hook.yaml"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'name: "Create LVM logic volumes over some physical disks"\nstages:\n post-install:\n - name: "Create physical volume, volume group and logical volumes"\n if: \'[ -e "/dev/sdb" ] && [ -e "/dev/sdc" ]\'\n commands:\n - | \n # Create the physical volume, volume group and logical volumes\n pvcreate /dev/sdb /dev/sdc\n vgcreate elementalLVM /dev/sdb /dev/sdc\n lvcreate -L 8G -n elementalVol1 elementalLVM\n lvcreate -l 100%FREE -n elementalVol2 elementalLVM\n\n # Trigger udev detection\n if [ ! -e "/dev/elementalLVM/elementalVol1" ] || [ ! -e "/dev/elementalLVM/elementalVol2" ]; then\n sleep 10\n udevadm settle\n fi\n\n # Ensure devices are already available\n [ -e "/dev/elementalLVM/elementalVol1" ] || exit 1\n [ -e "/dev/elementalLVM/elementalVol2" ] || exit 1\n\n # Format logical volumes with a known label for later use in fstab\n mkfs.xfs -L eVol1 /dev/elementalLVM/elementalVol1\n mkfs.xfs -L eVol2 /dev/elementalLVM/elementalVol2\n'})}),"\n",(0,t.jsx)(n.p,{children:"The LVM devices are created and formatted as desired. This is a good\nexample of an installation hook, as this setup is only needed once, at installation\ntime. As an alternative, the same action could be done on first boot, however it would\nrequire a more sophisticated logic to ensure it's only applied once at first boot."}),"\n",(0,t.jsxs)(n.p,{children:["Finally, the boot time ",(0,t.jsx)(n.code,{children:"cloud-init"})," files contain the mount points settings and trigger the\naction of mounting those mountpoints. The Elemental OS ",(0,t.jsx)(n.code,{children:"fstab"})," file is ephemeral and it's\ndynamically created at boot time. That's why it doesn't exist during the installation and\ncan't be used in an installation hook."]}),"\n",(0,t.jsxs)(n.p,{children:["Here's an example of ",(0,t.jsx)(n.code,{children:"overlay/oem/lvm_volumes_in_fstab.yaml"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'name: "Mount LVM volumes"\nstages:\n initramfs:\n - name: "Extend fstab to mount LVM logical volumes at boot"\n commands:\n - |\n echo "LABEL=eVol1 /usr/local/eVol1 xfs defaults 0 0" >> /etc/fstab\n echo "LABEL=eVol2 /usr/local/eVol2 xfs defaults 0 0" >> /etc/fstab\n'})}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"initramfs"})," stage is the last stage before switching to the actual root tree.\nAt this stage, the ",(0,t.jsx)(n.code,{children:"/etc/fstab"})," file already exists and can be adapted before\nswitching root. Once running in the final root tree, SystemD will handle the rest of the initialization and apply it."]})}),"\n",(0,t.jsxs)(n.p,{children:["This cloud-init file should be included into the ",(0,t.jsx)(n.code,{children:"/oem"})," directory on the installed\nsystem. ",(0,t.jsx)(n.code,{children:"/oem"})," is a mount point for the OEM partition. In order to include extra files,\nthey should be listed as ",(0,t.jsx)(n.code,{children:"config-urls"})," within the Registration CRD at the\nmanagement cluster."]}),"\n",(0,t.jsx)(n.h3,{id:"repacking-the-iso-image-with-extra-files",children:"Repacking the ISO image with extra files"}),"\n",(0,t.jsxs)(n.p,{children:["Assuming an ",(0,t.jsx)(n.code,{children:"overlay"})," folder was created in the current directory containing all\nadditional files to be appended, the following ",(0,t.jsx)(n.code,{children:"xorriso"})," command adds the extra files:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"xorriso -indev elemental-teal.x86_64.iso -outdev elemental-teal.custom.x86_64.iso -map overlay / -boot_image any replay\n"})}),"\n",(0,t.jsxs)(n.p,{children:["For that a ",(0,t.jsx)(n.code,{children:"xorriso"})," equal or higher than version 1.5 is required."]}),"\n",(0,t.jsx)(n.h2,{id:"remastering-a-custom-docker-image",children:"Remastering a custom docker image"}),"\n",(0,t.jsx)(n.p,{children:"Since Elemental Teal image is a Docker image it can also be used as a base image\nin a Dockerfile in order to create a new container image."}),"\n",(0,t.jsx)(n.p,{children:"Imagine some additional package from an extra repository is required, the following example\nshow case how this could be added:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-docker",metastring:"showLineNumbers",children:'# The version of Elemental to modify\nFROM registry.suse.com/rancher/elemental-teal/5.4:latest\n\n# Custom commands\nRUN rpm --import && \\\n zypper addrepo --refresh extra_repo && \\\n zypper install -y \n\n# IMPORTANT: /etc/os-release is used for versioning/upgrade. The\n# values here should reflect the tag of the image currently being built\nARG IMAGE_REPO=norepo\nARG IMAGE_TAG=latest\nRUN \\\n sed -i -e "s/^IMAGE_REPO=.*/IMAGE_REPO=\\"${IMAGE_REPO}\\"/g" /etc/os-release && \\\n sed -i -e "s/^IMAGE_TAG=.*/IMAGE_TAG=\\"${IMAGE_TAG}\\"/g" /etc/os-release && \\\n sed -i -e "s/^IMAGE=.*/IMAGE=\\"${IMAGE_REPO}:${IMAGE_TAG}\\"/g" /etc/os-release\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Where ",(0,t.jsx)(n.code,{children:"latest"})," is the base version we want to customize."]}),"\n",(0,t.jsx)(n.p,{children:"And then the following commands"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"docker build --build-arg IMAGE_REPO=myrepo/custom-build \\\n --build-arg IMAGE_TAG=v1.1.1 \\\n -t myrepo/custom-build:v1.1.1 .\ndocker push myrepo/custom-build:v1.1.1\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The new customized OS is available as the Docker image ",(0,t.jsx)(n.code,{children:"myrepo/custom-build:v1.1.1"})," and it can\nbe run and verified using docker with"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"docker run -it myrepo/custom-build:v1.1.1 bash\n"})}),"\n",(0,t.jsx)(n.h2,{id:"create-a-custom-bootable-installation-media",children:"Create a custom bootable installation media"}),"\n",(0,t.jsx)(n.p,{children:"Elemental Teal leverages container images to build its root filesystems; therefore, it is possible\nto use it in a multi-stage environment to create custom bootable media that bundles a custom container image."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-docker",metastring:"showLineNumbers",children:'FROM registry.suse.com/rancher/elemental-teal/5.4:latest as os\n\n# Check the section on remastering a custom docker image\n\nFROM registry.suse.com/rancher/elemental-builder-image/5.4:latest AS builder\n\nARG TARGETARCH\nWORKDIR /iso\nCOPY --from=os / rootfs\n\n# work around buildah issue: https://github.com/containers/buildah/issues/4242\nRUN rm rootfs/etc/resolv.conf\n\nRUN --mount=type=bind,source=./,target=/output,rw \\\n elemental build-iso \\\n dir:rootfs \\\n --bootloader-in-rootfs \\\n --squash-no-compression \\\n -o /output -n "elemental-teal-${TARGETARCH}"\n'})}),"\n",(0,t.jsx)(n.p,{children:"Modify the container image template and afterwards run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"buildah build --tag myrepo/custom-build:v1.1.1 \\\n --build-arg IMAGE_REPO=myrepo/custom-build \\\n --build-arg IMAGE_TAG=v1.1.1 \\\n .\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The new customized installation media can be found in ",(0,t.jsx)(n.code,{children:"elemental-teal-amd64.iso"}),"."]}),"\n",(0,t.jsx)(n.admonition,{title:"important",type:"caution",children:(0,t.jsxs)(n.p,{children:["You still need to ",(0,t.jsx)(n.a,{href:"quickstart-cli#preparing-the-installation-seed-image",children:"prepare the installation image"})," so it can be used to boot and provision the machine."]})})]})}function h(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>s,a:()=>l});var t=i(7294);const a={},o=t.createContext(a);function l(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:l(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5f11e417.1d785b6d.js b/assets/js/5f11e417.1d785b6d.js deleted file mode 100644 index 19bbc755d..000000000 --- a/assets/js/5f11e417.1d785b6d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[49],{5779:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>s,default:()=>h,frontMatter:()=>l,metadata:()=>o,toc:()=>d});var t=i(5893),a=i(1151);const l={sidebar_label:"Customize Elemental Install",title:""},s="Customize Elemental Install",o={id:"customizing",title:"",description:"Elemental Teal images can be customized in different ways.",source:"@site/versioned_docs/version-1.2/customizing.md",sourceDirName:".",slug:"/customizing",permalink:"/1.2/customizing",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Customize Elemental Install",title:""},sidebar:"docs",previous:{title:"Upgrade",permalink:"/1.2/upgrade"},next:{title:"Elemental plans",permalink:"/1.2/elemental-plans"}},r={},d=[{value:"Customize installation ISO and installation process",id:"customize-installation-iso-and-installation-process",level:2},{value:"Common customization pattern",id:"common-customization-pattern",level:3},{value:"Custom Elemental client configuration file",id:"custom-elemental-client-configuration-file",level:4},{value:"Adding additional cloud-init files within the installed OS",id:"adding-additional-cloud-init-files-within-the-installed-os",level:4},{value:"Adding installation hooks or boot stages for the live system",id:"adding-installation-hooks-or-boot-stages-for-the-live-system",level:4},{value:"Adding extra driver binaries into the ISO example",id:"adding-extra-driver-binaries-into-the-iso-example",level:3},{value:"Adding extra LVM volume group disks during the installation",id:"adding-extra-lvm-volume-group-disks-during-the-installation",level:3},{value:"Repacking the ISO image with extra files",id:"repacking-the-iso-image-with-extra-files",level:3},{value:"Remastering a custom docker image",id:"remastering-a-custom-docker-image",level:2},{value:"Create a custom bootable installation media",id:"create-a-custom-bootable-installation-media",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"customize-elemental-install",children:"Customize Elemental Install"}),"\n",(0,t.jsx)(n.p,{children:"Elemental Teal images can be customized in different ways.\nOne option is to provide\nadditional resources within the installation media so that during installation, or\neventually at boot time, additional binaries such as drivers can be included."}),"\n",(0,t.jsx)(n.p,{children:"Another option would be to remaster the Elemental Teal by simply using a docker build.\nElemental Teal is a regular container image, so it is absolutely possible to create\na new image using a Dockerfile based on Elemental Teal image."}),"\n",(0,t.jsx)(n.h2,{id:"customize-installation-iso-and-installation-process",children:"Customize installation ISO and installation process"}),"\n",(0,t.jsx)(n.p,{children:"In order to adapt the installation ISO a simple approach is to append extra configuration\nfiles into the ISO root in an analog way the registration yaml configuration file\nis added."}),"\n",(0,t.jsx)(n.h3,{id:"common-customization-pattern",children:"Common customization pattern"}),"\n",(0,t.jsxs)(n.p,{children:["Elemental Teal installation can be customized in three different non-exclusive ways. First, including\nsome custom Elemental client configuration file, second, by including additional cloud-init files to execute at\nboot time, and finally, by including ",(0,t.jsx)(n.code,{children:"cloud-init"})," files such as installation hooks or boot stages evaluated during\nthe live system boot itself."]}),"\n",(0,t.jsxs)(n.p,{children:["A common pattern is to combine the three ways described above. This pattern will allow you to add custom steps during the installation and add ",(0,t.jsx)(n.code,{children:"cloud-init"})," files to be evaluated at boot time."]}),"\n",(0,t.jsx)(n.p,{children:"To apply this pattern, the ISO needs to include:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["A ",(0,t.jsx)(n.a,{href:"https://rancher.github.io/elemental-toolkit/docs/customizing/general_configuration/",children:"configuration file"}),"\nfor the elemental client, describing at least the installation hooks location. This file is usually added to the ISO with path and name ",(0,t.jsx)(n.code,{children:"/elemental/config.yaml"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["The additional ",(0,t.jsx)(n.code,{children:"cloud-init"})," files to be included into the installed system. They\nallow to perform custom operations at boot time."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["The installation hooks are evalutated at install time. They allow to perform custom operations\nduring the installation process (include extra software, set additional disks...). The same\nway ",(0,t.jsx)(n.code,{children:"cloud-init"})," files can be included to perform custom operations during the live installation\nmedia boot time."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"custom-elemental-client-configuration-file",children:"Custom Elemental client configuration file"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/rancher/elemental-toolkit/blob/main/docs/elemental.md",children:"Elemental client"})," ",(0,t.jsx)(n.code,{children:"install"}),", ",(0,t.jsx)(n.code,{children:"upgrade"})," and ",(0,t.jsx)(n.code,{children:"reset"})," commands can be configured with a ",(0,t.jsx)(n.a,{href:"https://rancher.github.io/elemental-toolkit/docs/customizing/general_configuration/",children:"custom configuration file"})," located by default in ",(0,t.jsx)(n.code,{children:"/elemental/config.yaml"})," or, if you have multiple yaml files, the ",(0,t.jsx)(n.code,{children:"/elemental/config.d"})," directory will be loaded too."]}),"\n",(0,t.jsx)(n.p,{children:"A simple example to set hooks location could be:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"extra-partitions:\n - size: 10240\n fs: ext4\n label: EXTRA_PARTITION\n"})}),"\n",(0,t.jsx)(n.p,{children:"The above example sets an additional extra partition during the installation."}),"\n",(0,t.jsx)(n.h4,{id:"adding-additional-cloud-init-files-within-the-installed-os",children:"Adding additional cloud-init files within the installed OS"}),"\n",(0,t.jsxs)(n.p,{children:["In order to include additional cloud-init files during the installation they need\nto be added to the installation data into the MachineRegistration resource. More specific\nthe ",(0,t.jsx)(n.code,{children:"config-urls"})," field is used for this exact purpose. See ",(0,t.jsx)(n.a,{href:"/machineregistration-reference",children:"MachineRegistration reference"})," page."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"config-urls"})," is a list of string literals where each item is an HTTP URL or a local path pointing to a\ncloud-init file. The local path is evaluated during\nthe installation, hence it must exists within the installation media, commonly an ISO image."]}),"\n",(0,t.jsxs)(n.p,{children:["By default, Elemental Teal live systems mount the ISO root at ",(0,t.jsx)(n.code,{children:"/run/initramfs/live"})," and this should be the path set for ",(0,t.jsx)(n.code,{children:"config-url"})," in ",(0,t.jsx)(n.code,{children:"MachineRegistrations"}),":\nSee the example below:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n ...\n config:\n ...\n elemental:\n ...\n install:\n ...\n config-urls:\n - "/run/initramfs/live/oem/custom_config.yaml"\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Elemental Teal live ISOs, when booted, have the ISO root mounted at ",(0,t.jsx)(n.code,{children:"/run/initramfs/live"}),".\nAccording to that, the example above is expected to include the ",(0,t.jsx)(n.code,{children:"/oem/custom_config.yaml"})," file."]}),"\n",(0,t.jsx)(n.h4,{id:"adding-installation-hooks-or-boot-stages-for-the-live-system",children:"Adding installation hooks or boot stages for the live system"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/rancher/elemental-cli",children:"Elemental client"})," ",(0,t.jsx)(n.code,{children:"install"}),", ",(0,t.jsx)(n.code,{children:"upgrade"})," and ",(0,t.jsx)(n.code,{children:"reset"})," procedures include four different hooks:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"before-install"}),": executed after all partition mountpoints are set."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"after-install-chroot"}),": executed after deploying the OS image and before unmounting the associated loop filesystem image. Runs chrooted to the OS image."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"after-install"}),": executed just after the after-install-chroot hook. It is not chrooted."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"post-install"}),": executed as the very last step before ending the installation, partitions are still mounted, the loop devices for the image is not."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Hooks are provided as ",(0,t.jsx)(n.code,{children:"cloud-init"})," stages. Equivalent hooks exist for ",(0,t.jsx)(n.code,{children:"reset"})," and ",(0,t.jsx)(n.code,{children:"upgrade"})," procedures.\nThey are loaded from the ",(0,t.jsx)(n.code,{children:"/iso-config"})," folder in ISO filesystem root. In fact, hooks are regular ",(0,t.jsx)(n.code,{children:"cloud-init"})," stages with the\nonly difference that Elemental client parses them during ",(0,t.jsx)(n.code,{children:"install"}),", ",(0,t.jsx)(n.code,{children:"upgrade"})," or ",(0,t.jsx)(n.code,{children:"reset"})," actions, rather than boot time.\nNote any boot stage included this way will be executed during the live installation media boot."]}),"\n",(0,t.jsxs)(n.p,{children:["Hooks are evaluated during ",(0,t.jsx)(n.code,{children:"install"}),",",(0,t.jsx)(n.code,{children:"reset"})," and ",(0,t.jsx)(n.code,{children:"upgrade"})," action from ",(0,t.jsx)(n.code,{children:"/oem"}),", ",(0,t.jsx)(n.code,{children:"/system/oem"})," and ",(0,t.jsx)(n.code,{children:"/usr/local/cloud-config"})," paths,\nhowever for the live ISOs there is an additional the path ",(0,t.jsx)(n.code,{children:"/run/initramfs/live/iso-config"})," included. Note the ",(0,t.jsx)(n.code,{children:"/run/initramfs/live"}),"\nprefix is the mount point of the ISO filesystem of the Elemental Live ISO once booted."]}),"\n",(0,t.jsx)(n.h3,{id:"adding-extra-driver-binaries-into-the-iso-example",children:"Adding extra driver binaries into the ISO example"}),"\n",(0,t.jsx)(n.p,{children:"This example is covering the case in which extra driver binaries are included into the ISO\nand during the installation they are installed over the OS image."}),"\n",(0,t.jsx)(n.p,{children:"For that use case the following files are required:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"additional binaries to install (they could be in the form of RPMs)"}),"\n",(0,t.jsx)(n.li,{children:"additional hooks file to copy binaries into the persistent storage and to install them"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Let's create an ",(0,t.jsx)(n.code,{children:"overlay"})," directory to create the directory tree that needs to be\nadded into the ISO root. In that case the ",(0,t.jsx)(n.code,{children:"overlay"})," directory could contain:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"overlay/\n data/\n extra_drivers/\n some_driver.rpm\n iso-config/\n install_hooks.yaml\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"overlay/iso-config/install_hooks.yaml"})," could be as:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'name: "Install extra drivers"\nstages:\n before-install:\n # Preload data to the persistent storage\n # During installation persistent partition is mounted at /run/cos/persistent\n - commands:\n - rsync -a /run/initramfs/live/data/ /run/cos/persistent\n after-install-chroot:\n # extra_drivers folder is at `/usr/local/extra_drivers` from the OS image chroot\n - commands:\n - rpm -iv /usr/local/extra_drivers/some_driver.rpm\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Note the installation hooks only cover installation procedures, for upgrades equivalent\n",(0,t.jsx)(n.code,{children:"before-upgrade"})," and/or ",(0,t.jsx)(n.code,{children:"after-upgrade-chroot"})," should be defined."]}),"\n",(0,t.jsx)(n.h3,{id:"adding-extra-lvm-volume-group-disks-during-the-installation",children:"Adding extra LVM volume group disks during the installation"}),"\n",(0,t.jsx)(n.p,{children:"This example is covering the setup of an host with multiple disks and some of them used\nas part of an LVM setup."}),"\n",(0,t.jsxs)(n.p,{children:["As an example, we have an host with three disks (",(0,t.jsx)(n.code,{children:"/dev/sda"}),", ",(0,t.jsx)(n.code,{children:"/dev/sdb"}),"\nand ",(0,t.jsx)(n.code,{children:"/dev/sdc"}),")."]}),"\n",(0,t.jsxs)(n.p,{children:["The first disk is used for a regular Elemental Teal installation\nand the other remaining two are used as part of a LVM group where arbitrary logical volumes\nare created, formatted and mounted at boot time via an extended ",(0,t.jsx)(n.code,{children:"fstab"})," file."]}),"\n",(0,t.jsx)(n.p,{children:"For this example, the following files are required:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["additional ",(0,t.jsx)(n.code,{children:"clout-init"})," files included in the installed system"]}),"\n",(0,t.jsx)(n.li,{children:"additional installation hooks to prepare the LVM volumes during the installation"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Let's create an ",(0,t.jsx)(n.code,{children:"overlay"})," directory to create the directory tree that needs to be\nadded into the ISO root. In that case the ",(0,t.jsx)(n.code,{children:"overlay"})," directory could contain:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"overlay/\n oem/\n lvm_volumes_in_fstab.yaml\n iso-config/\n lvm_volumes_hook.yaml\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The installation hook ",(0,t.jsx)(n.code,{children:"overlay/iso-config/lvm_volumes_hook.yaml"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'name: "Create LVM logic volumes over some physical disks"\nstages:\n post-install:\n - name: "Create physical volume, volume group and logical volumes"\n if: \'[ -e "/dev/sdb" ] && [ -e "/dev/sdc" ]\'\n commands:\n - | \n # Create the physical volume, volume group and logical volumes\n pvcreate /dev/sdb /dev/sdc\n vgcreate elementalLVM /dev/sdb /dev/sdc\n lvcreate -L 8G -n elementalVol1 elementalLVM\n lvcreate -l 100%FREE -n elementalVol2 elementalLVM\n\n # Trigger udev detection\n if [ ! -e "/dev/elementalLVM/elementalVol1" ] || [ ! -e "/dev/elementalLVM/elementalVol2" ]; then\n sleep 10\n udevadm settle\n fi\n\n # Ensure devices are already available\n [ -e "/dev/elementalLVM/elementalVol1" ] || exit 1\n [ -e "/dev/elementalLVM/elementalVol2" ] || exit 1\n\n # Format logical volumes with a known label for later use in fstab\n mkfs.xfs -L eVol1 /dev/elementalLVM/elementalVol1\n mkfs.xfs -L eVol2 /dev/elementalLVM/elementalVol2\n'})}),"\n",(0,t.jsx)(n.p,{children:"The LVM devices are created and formatted as desired. This is a good\nexample of an installation hook, as this setup is only needed once, at installation\ntime. As an alternative, the same action could be done on first boot, however it would\nrequire a more sophisticated logic to ensure it's only applied once at first boot."}),"\n",(0,t.jsxs)(n.p,{children:["Finally, the boot time ",(0,t.jsx)(n.code,{children:"cloud-init"})," files contain the mount points settings and trigger the\naction of mounting those mountpoints. The Elemental OS ",(0,t.jsx)(n.code,{children:"fstab"})," file is ephemeral and it's\ndynamically created at boot time. That's why it doesn't exist during the installation and\ncan't be used in an installation hook."]}),"\n",(0,t.jsxs)(n.p,{children:["Here's an example of ",(0,t.jsx)(n.code,{children:"overlay/oem/lvm_volumes_in_fstab.yaml"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'name: "Mount LVM volumes"\nstages:\n initramfs:\n - name: "Extend fstab to mount LVM logical volumes at boot"\n commands:\n - |\n echo "LABEL=eVol1 /usr/local/eVol1 xfs defaults 0 0" >> /etc/fstab\n echo "LABEL=eVol2 /usr/local/eVol2 xfs defaults 0 0" >> /etc/fstab\n'})}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"initramfs"})," stage is the last stage before switching to the actual root tree.\nAt this stage, the ",(0,t.jsx)(n.code,{children:"/etc/fstab"})," file already exists and can be adapted before\nswitching root. Once running in the final root tree, SystemD will handle the rest of the initialization and apply it."]})}),"\n",(0,t.jsxs)(n.p,{children:["This cloud-init file should be included into the ",(0,t.jsx)(n.code,{children:"/oem"})," directory on the installed\nsystem. ",(0,t.jsx)(n.code,{children:"/oem"})," is a mount point for the OEM partition. In order to include extra files,\nthey should be listed as ",(0,t.jsx)(n.code,{children:"config-urls"})," within the Registration CRD at the\nmanagement cluster."]}),"\n",(0,t.jsx)(n.h3,{id:"repacking-the-iso-image-with-extra-files",children:"Repacking the ISO image with extra files"}),"\n",(0,t.jsxs)(n.p,{children:["Assuming an ",(0,t.jsx)(n.code,{children:"overlay"})," folder was created in the current directory containing all\nadditional files to be appended, the following ",(0,t.jsx)(n.code,{children:"xorriso"})," command adds the extra files:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"xorriso -indev elemental-teal.x86_64.iso -outdev elemental-teal.custom.x86_64.iso -map overlay / -boot_image any replay\n"})}),"\n",(0,t.jsxs)(n.p,{children:["For that a ",(0,t.jsx)(n.code,{children:"xorriso"})," equal or higher than version 1.5 is required."]}),"\n",(0,t.jsx)(n.h2,{id:"remastering-a-custom-docker-image",children:"Remastering a custom docker image"}),"\n",(0,t.jsx)(n.p,{children:"Since Elemental Teal image is a Docker image it can also be used as a base image\nin a Dockerfile in order to create a new container image."}),"\n",(0,t.jsx)(n.p,{children:"Imagine some additional package from an extra repository is required, the following example\nshow case how this could be added:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-docker",metastring:"showLineNumbers",children:'# The version of Elemental to modify\nFROM registry.suse.com/rancher/elemental-teal/5.3:latest\n\n# Custom commands\nRUN rpm --import && \\\n zypper addrepo --refresh extra_repo && \\\n zypper install -y \n\n# IMPORTANT: /etc/os-release is used for versioning/upgrade. The\n# values here should reflect the tag of the image currently being built\nARG IMAGE_REPO=norepo\nARG IMAGE_TAG=latest\nRUN \\\n sed -i -e "s/^IMAGE_REPO=.*/IMAGE_REPO=\\"${IMAGE_REPO}\\"/g" /etc/os-release && \\\n sed -i -e "s/^IMAGE_TAG=.*/IMAGE_TAG=\\"${IMAGE_TAG}\\"/g" /etc/os-release && \\\n sed -i -e "s/^IMAGE=.*/IMAGE=\\"${IMAGE_REPO}:${IMAGE_TAG}\\"/g" /etc/os-release\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Where ",(0,t.jsx)(n.code,{children:"latest"})," is the base version we want to customize."]}),"\n",(0,t.jsx)(n.p,{children:"And then the following commands"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"docker build --build-arg IMAGE_REPO=myrepo/custom-build \\\n --build-arg IMAGE_TAG=v1.1.1 \\\n -t myrepo/custom-build:v1.1.1 .\ndocker push myrepo/custom-build:v1.1.1\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The new customized OS is available as the Docker image ",(0,t.jsx)(n.code,{children:"myrepo/custom-build:v1.1.1"})," and it can\nbe run and verified using docker with"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"docker run -it myrepo/custom-build:v1.1.1 bash\n"})}),"\n",(0,t.jsx)(n.h2,{id:"create-a-custom-bootable-installation-media",children:"Create a custom bootable installation media"}),"\n",(0,t.jsx)(n.p,{children:"Elemental Teal leverages container images to build its root filesystems; therefore, it is possible\nto use it in a multi-stage environment to create custom bootable media that bundles a custom container image."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-docker",metastring:"showLineNumbers",children:'FROM registry.suse.com/rancher/elemental-teal/5.3:latest as os\n\n# Check the section on remastering a custom docker image\n\nFROM registry.suse.com/rancher/elemental-builder-image/5.3:latest AS builder\n\nARG TARGETARCH\nWORKDIR /iso\nCOPY --from=os / rootfs\n\n# work around buildah issue: https://github.com/containers/buildah/issues/4242\nRUN rm rootfs/etc/resolv.conf\n\nRUN --mount=type=bind,source=./,target=/output,rw \\\n elemental build-iso \\\n dir:rootfs \\\n --bootloader-in-rootfs \\\n --squash-no-compression \\\n -o /output -n "elemental-teal-${TARGETARCH}"\n'})}),"\n",(0,t.jsx)(n.p,{children:"Modify the container image template and afterwards run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"buildah build --tag myrepo/custom-build:v1.1.1 \\\n --build-arg IMAGE_REPO=myrepo/custom-build \\\n --build-arg IMAGE_TAG=v1.1.1 \\\n .\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The new customized installation media can be found in ",(0,t.jsx)(n.code,{children:"elemental-teal-amd64.iso"}),"."]}),"\n",(0,t.jsx)(n.admonition,{title:"important",type:"caution",children:(0,t.jsxs)(n.p,{children:["You still need to ",(0,t.jsx)(n.a,{href:"quickstart-cli#preparing-the-installation-seed-image",children:"prepare the installation image"})," so it can be used to boot and provision the machine."]})})]})}function h(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>o,a:()=>s});var t=i(7294);const a={},l=t.createContext(a);function s(e){const n=t.useContext(l);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),t.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5f11e417.767dd3d1.js b/assets/js/5f11e417.767dd3d1.js new file mode 100644 index 000000000..92fd72fdc --- /dev/null +++ b/assets/js/5f11e417.767dd3d1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[49],{5779:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>d});var t=i(5893),a=i(1151);const l={sidebar_label:"Customize Elemental Install",title:""},o="Customize Elemental Install",s={id:"customizing",title:"",description:"Elemental Teal images can be customized in different ways.",source:"@site/versioned_docs/version-1.2/customizing.md",sourceDirName:".",slug:"/customizing",permalink:"/1.2/customizing",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Customize Elemental Install",title:""},sidebar:"docs",previous:{title:"Upgrade",permalink:"/1.2/upgrade"},next:{title:"Elemental plans",permalink:"/1.2/elemental-plans"}},r={},d=[{value:"Customize installation ISO and installation process",id:"customize-installation-iso-and-installation-process",level:2},{value:"Common customization pattern",id:"common-customization-pattern",level:3},{value:"Custom Elemental client configuration file",id:"custom-elemental-client-configuration-file",level:4},{value:"Adding additional cloud-init files within the installed OS",id:"adding-additional-cloud-init-files-within-the-installed-os",level:4},{value:"Adding installation hooks or boot stages for the live system",id:"adding-installation-hooks-or-boot-stages-for-the-live-system",level:4},{value:"Adding extra driver binaries into the ISO example",id:"adding-extra-driver-binaries-into-the-iso-example",level:3},{value:"Adding extra LVM volume group disks during the installation",id:"adding-extra-lvm-volume-group-disks-during-the-installation",level:3},{value:"Repacking the ISO image with extra files",id:"repacking-the-iso-image-with-extra-files",level:3},{value:"Remastering a custom docker image",id:"remastering-a-custom-docker-image",level:2},{value:"Create a custom bootable installation media",id:"create-a-custom-bootable-installation-media",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components},{Head:i}=n;return i||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i,{children:(0,t.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/customizing"})}),"\n",(0,t.jsx)(n.h1,{id:"customize-elemental-install",children:"Customize Elemental Install"}),"\n",(0,t.jsx)(n.p,{children:"Elemental Teal images can be customized in different ways.\nOne option is to provide\nadditional resources within the installation media so that during installation, or\neventually at boot time, additional binaries such as drivers can be included."}),"\n",(0,t.jsx)(n.p,{children:"Another option would be to remaster the Elemental Teal by simply using a docker build.\nElemental Teal is a regular container image, so it is absolutely possible to create\na new image using a Dockerfile based on Elemental Teal image."}),"\n",(0,t.jsx)(n.h2,{id:"customize-installation-iso-and-installation-process",children:"Customize installation ISO and installation process"}),"\n",(0,t.jsx)(n.p,{children:"In order to adapt the installation ISO a simple approach is to append extra configuration\nfiles into the ISO root in an analog way the registration yaml configuration file\nis added."}),"\n",(0,t.jsx)(n.h3,{id:"common-customization-pattern",children:"Common customization pattern"}),"\n",(0,t.jsxs)(n.p,{children:["Elemental Teal installation can be customized in three different non-exclusive ways. First, including\nsome custom Elemental client configuration file, second, by including additional cloud-init files to execute at\nboot time, and finally, by including ",(0,t.jsx)(n.code,{children:"cloud-init"})," files such as installation hooks or boot stages evaluated during\nthe live system boot itself."]}),"\n",(0,t.jsxs)(n.p,{children:["A common pattern is to combine the three ways described above. This pattern will allow you to add custom steps during the installation and add ",(0,t.jsx)(n.code,{children:"cloud-init"})," files to be evaluated at boot time."]}),"\n",(0,t.jsx)(n.p,{children:"To apply this pattern, the ISO needs to include:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["A ",(0,t.jsx)(n.a,{href:"https://rancher.github.io/elemental-toolkit/docs/customizing/general_configuration/",children:"configuration file"}),"\nfor the elemental client, describing at least the installation hooks location. This file is usually added to the ISO with path and name ",(0,t.jsx)(n.code,{children:"/elemental/config.yaml"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["The additional ",(0,t.jsx)(n.code,{children:"cloud-init"})," files to be included into the installed system. They\nallow to perform custom operations at boot time."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["The installation hooks are evalutated at install time. They allow to perform custom operations\nduring the installation process (include extra software, set additional disks...). The same\nway ",(0,t.jsx)(n.code,{children:"cloud-init"})," files can be included to perform custom operations during the live installation\nmedia boot time."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"custom-elemental-client-configuration-file",children:"Custom Elemental client configuration file"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/rancher/elemental-toolkit/blob/main/docs/elemental.md",children:"Elemental client"})," ",(0,t.jsx)(n.code,{children:"install"}),", ",(0,t.jsx)(n.code,{children:"upgrade"})," and ",(0,t.jsx)(n.code,{children:"reset"})," commands can be configured with a ",(0,t.jsx)(n.a,{href:"https://rancher.github.io/elemental-toolkit/docs/customizing/general_configuration/",children:"custom configuration file"})," located by default in ",(0,t.jsx)(n.code,{children:"/elemental/config.yaml"})," or, if you have multiple yaml files, the ",(0,t.jsx)(n.code,{children:"/elemental/config.d"})," directory will be loaded too."]}),"\n",(0,t.jsx)(n.p,{children:"A simple example to set hooks location could be:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"extra-partitions:\n - size: 10240\n fs: ext4\n label: EXTRA_PARTITION\n"})}),"\n",(0,t.jsx)(n.p,{children:"The above example sets an additional extra partition during the installation."}),"\n",(0,t.jsx)(n.h4,{id:"adding-additional-cloud-init-files-within-the-installed-os",children:"Adding additional cloud-init files within the installed OS"}),"\n",(0,t.jsxs)(n.p,{children:["In order to include additional cloud-init files during the installation they need\nto be added to the installation data into the MachineRegistration resource. More specific\nthe ",(0,t.jsx)(n.code,{children:"config-urls"})," field is used for this exact purpose. See ",(0,t.jsx)(n.a,{href:"/machineregistration-reference",children:"MachineRegistration reference"})," page."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"config-urls"})," is a list of string literals where each item is an HTTP URL or a local path pointing to a\ncloud-init file. The local path is evaluated during\nthe installation, hence it must exists within the installation media, commonly an ISO image."]}),"\n",(0,t.jsxs)(n.p,{children:["By default, Elemental Teal live systems mount the ISO root at ",(0,t.jsx)(n.code,{children:"/run/initramfs/live"})," and this should be the path set for ",(0,t.jsx)(n.code,{children:"config-url"})," in ",(0,t.jsx)(n.code,{children:"MachineRegistrations"}),":\nSee the example below:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n ...\n config:\n ...\n elemental:\n ...\n install:\n ...\n config-urls:\n - "/run/initramfs/live/oem/custom_config.yaml"\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Elemental Teal live ISOs, when booted, have the ISO root mounted at ",(0,t.jsx)(n.code,{children:"/run/initramfs/live"}),".\nAccording to that, the example above is expected to include the ",(0,t.jsx)(n.code,{children:"/oem/custom_config.yaml"})," file."]}),"\n",(0,t.jsx)(n.h4,{id:"adding-installation-hooks-or-boot-stages-for-the-live-system",children:"Adding installation hooks or boot stages for the live system"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/rancher/elemental-cli",children:"Elemental client"})," ",(0,t.jsx)(n.code,{children:"install"}),", ",(0,t.jsx)(n.code,{children:"upgrade"})," and ",(0,t.jsx)(n.code,{children:"reset"})," procedures include four different hooks:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"before-install"}),": executed after all partition mountpoints are set."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"after-install-chroot"}),": executed after deploying the OS image and before unmounting the associated loop filesystem image. Runs chrooted to the OS image."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"after-install"}),": executed just after the after-install-chroot hook. It is not chrooted."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"post-install"}),": executed as the very last step before ending the installation, partitions are still mounted, the loop devices for the image is not."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Hooks are provided as ",(0,t.jsx)(n.code,{children:"cloud-init"})," stages. Equivalent hooks exist for ",(0,t.jsx)(n.code,{children:"reset"})," and ",(0,t.jsx)(n.code,{children:"upgrade"})," procedures.\nThey are loaded from the ",(0,t.jsx)(n.code,{children:"/iso-config"})," folder in ISO filesystem root. In fact, hooks are regular ",(0,t.jsx)(n.code,{children:"cloud-init"})," stages with the\nonly difference that Elemental client parses them during ",(0,t.jsx)(n.code,{children:"install"}),", ",(0,t.jsx)(n.code,{children:"upgrade"})," or ",(0,t.jsx)(n.code,{children:"reset"})," actions, rather than boot time.\nNote any boot stage included this way will be executed during the live installation media boot."]}),"\n",(0,t.jsxs)(n.p,{children:["Hooks are evaluated during ",(0,t.jsx)(n.code,{children:"install"}),",",(0,t.jsx)(n.code,{children:"reset"})," and ",(0,t.jsx)(n.code,{children:"upgrade"})," action from ",(0,t.jsx)(n.code,{children:"/oem"}),", ",(0,t.jsx)(n.code,{children:"/system/oem"})," and ",(0,t.jsx)(n.code,{children:"/usr/local/cloud-config"})," paths,\nhowever for the live ISOs there is an additional the path ",(0,t.jsx)(n.code,{children:"/run/initramfs/live/iso-config"})," included. Note the ",(0,t.jsx)(n.code,{children:"/run/initramfs/live"}),"\nprefix is the mount point of the ISO filesystem of the Elemental Live ISO once booted."]}),"\n",(0,t.jsx)(n.h3,{id:"adding-extra-driver-binaries-into-the-iso-example",children:"Adding extra driver binaries into the ISO example"}),"\n",(0,t.jsx)(n.p,{children:"This example is covering the case in which extra driver binaries are included into the ISO\nand during the installation they are installed over the OS image."}),"\n",(0,t.jsx)(n.p,{children:"For that use case the following files are required:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"additional binaries to install (they could be in the form of RPMs)"}),"\n",(0,t.jsx)(n.li,{children:"additional hooks file to copy binaries into the persistent storage and to install them"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Let's create an ",(0,t.jsx)(n.code,{children:"overlay"})," directory to create the directory tree that needs to be\nadded into the ISO root. In that case the ",(0,t.jsx)(n.code,{children:"overlay"})," directory could contain:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"overlay/\n data/\n extra_drivers/\n some_driver.rpm\n iso-config/\n install_hooks.yaml\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"overlay/iso-config/install_hooks.yaml"})," could be as:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'name: "Install extra drivers"\nstages:\n before-install:\n # Preload data to the persistent storage\n # During installation persistent partition is mounted at /run/cos/persistent\n - commands:\n - rsync -a /run/initramfs/live/data/ /run/cos/persistent\n after-install-chroot:\n # extra_drivers folder is at `/usr/local/extra_drivers` from the OS image chroot\n - commands:\n - rpm -iv /usr/local/extra_drivers/some_driver.rpm\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Note the installation hooks only cover installation procedures, for upgrades equivalent\n",(0,t.jsx)(n.code,{children:"before-upgrade"})," and/or ",(0,t.jsx)(n.code,{children:"after-upgrade-chroot"})," should be defined."]}),"\n",(0,t.jsx)(n.h3,{id:"adding-extra-lvm-volume-group-disks-during-the-installation",children:"Adding extra LVM volume group disks during the installation"}),"\n",(0,t.jsx)(n.p,{children:"This example is covering the setup of an host with multiple disks and some of them used\nas part of an LVM setup."}),"\n",(0,t.jsxs)(n.p,{children:["As an example, we have an host with three disks (",(0,t.jsx)(n.code,{children:"/dev/sda"}),", ",(0,t.jsx)(n.code,{children:"/dev/sdb"}),"\nand ",(0,t.jsx)(n.code,{children:"/dev/sdc"}),")."]}),"\n",(0,t.jsxs)(n.p,{children:["The first disk is used for a regular Elemental Teal installation\nand the other remaining two are used as part of a LVM group where arbitrary logical volumes\nare created, formatted and mounted at boot time via an extended ",(0,t.jsx)(n.code,{children:"fstab"})," file."]}),"\n",(0,t.jsx)(n.p,{children:"For this example, the following files are required:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["additional ",(0,t.jsx)(n.code,{children:"clout-init"})," files included in the installed system"]}),"\n",(0,t.jsx)(n.li,{children:"additional installation hooks to prepare the LVM volumes during the installation"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Let's create an ",(0,t.jsx)(n.code,{children:"overlay"})," directory to create the directory tree that needs to be\nadded into the ISO root. In that case the ",(0,t.jsx)(n.code,{children:"overlay"})," directory could contain:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"overlay/\n oem/\n lvm_volumes_in_fstab.yaml\n iso-config/\n lvm_volumes_hook.yaml\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The installation hook ",(0,t.jsx)(n.code,{children:"overlay/iso-config/lvm_volumes_hook.yaml"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'name: "Create LVM logic volumes over some physical disks"\nstages:\n post-install:\n - name: "Create physical volume, volume group and logical volumes"\n if: \'[ -e "/dev/sdb" ] && [ -e "/dev/sdc" ]\'\n commands:\n - | \n # Create the physical volume, volume group and logical volumes\n pvcreate /dev/sdb /dev/sdc\n vgcreate elementalLVM /dev/sdb /dev/sdc\n lvcreate -L 8G -n elementalVol1 elementalLVM\n lvcreate -l 100%FREE -n elementalVol2 elementalLVM\n\n # Trigger udev detection\n if [ ! -e "/dev/elementalLVM/elementalVol1" ] || [ ! -e "/dev/elementalLVM/elementalVol2" ]; then\n sleep 10\n udevadm settle\n fi\n\n # Ensure devices are already available\n [ -e "/dev/elementalLVM/elementalVol1" ] || exit 1\n [ -e "/dev/elementalLVM/elementalVol2" ] || exit 1\n\n # Format logical volumes with a known label for later use in fstab\n mkfs.xfs -L eVol1 /dev/elementalLVM/elementalVol1\n mkfs.xfs -L eVol2 /dev/elementalLVM/elementalVol2\n'})}),"\n",(0,t.jsx)(n.p,{children:"The LVM devices are created and formatted as desired. This is a good\nexample of an installation hook, as this setup is only needed once, at installation\ntime. As an alternative, the same action could be done on first boot, however it would\nrequire a more sophisticated logic to ensure it's only applied once at first boot."}),"\n",(0,t.jsxs)(n.p,{children:["Finally, the boot time ",(0,t.jsx)(n.code,{children:"cloud-init"})," files contain the mount points settings and trigger the\naction of mounting those mountpoints. The Elemental OS ",(0,t.jsx)(n.code,{children:"fstab"})," file is ephemeral and it's\ndynamically created at boot time. That's why it doesn't exist during the installation and\ncan't be used in an installation hook."]}),"\n",(0,t.jsxs)(n.p,{children:["Here's an example of ",(0,t.jsx)(n.code,{children:"overlay/oem/lvm_volumes_in_fstab.yaml"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'name: "Mount LVM volumes"\nstages:\n initramfs:\n - name: "Extend fstab to mount LVM logical volumes at boot"\n commands:\n - |\n echo "LABEL=eVol1 /usr/local/eVol1 xfs defaults 0 0" >> /etc/fstab\n echo "LABEL=eVol2 /usr/local/eVol2 xfs defaults 0 0" >> /etc/fstab\n'})}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"initramfs"})," stage is the last stage before switching to the actual root tree.\nAt this stage, the ",(0,t.jsx)(n.code,{children:"/etc/fstab"})," file already exists and can be adapted before\nswitching root. Once running in the final root tree, SystemD will handle the rest of the initialization and apply it."]})}),"\n",(0,t.jsxs)(n.p,{children:["This cloud-init file should be included into the ",(0,t.jsx)(n.code,{children:"/oem"})," directory on the installed\nsystem. ",(0,t.jsx)(n.code,{children:"/oem"})," is a mount point for the OEM partition. In order to include extra files,\nthey should be listed as ",(0,t.jsx)(n.code,{children:"config-urls"})," within the Registration CRD at the\nmanagement cluster."]}),"\n",(0,t.jsx)(n.h3,{id:"repacking-the-iso-image-with-extra-files",children:"Repacking the ISO image with extra files"}),"\n",(0,t.jsxs)(n.p,{children:["Assuming an ",(0,t.jsx)(n.code,{children:"overlay"})," folder was created in the current directory containing all\nadditional files to be appended, the following ",(0,t.jsx)(n.code,{children:"xorriso"})," command adds the extra files:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"xorriso -indev elemental-teal.x86_64.iso -outdev elemental-teal.custom.x86_64.iso -map overlay / -boot_image any replay\n"})}),"\n",(0,t.jsxs)(n.p,{children:["For that a ",(0,t.jsx)(n.code,{children:"xorriso"})," equal or higher than version 1.5 is required."]}),"\n",(0,t.jsx)(n.h2,{id:"remastering-a-custom-docker-image",children:"Remastering a custom docker image"}),"\n",(0,t.jsx)(n.p,{children:"Since Elemental Teal image is a Docker image it can also be used as a base image\nin a Dockerfile in order to create a new container image."}),"\n",(0,t.jsx)(n.p,{children:"Imagine some additional package from an extra repository is required, the following example\nshow case how this could be added:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-docker",metastring:"showLineNumbers",children:'# The version of Elemental to modify\nFROM registry.suse.com/rancher/elemental-teal/5.3:latest\n\n# Custom commands\nRUN rpm --import && \\\n zypper addrepo --refresh extra_repo && \\\n zypper install -y \n\n# IMPORTANT: /etc/os-release is used for versioning/upgrade. The\n# values here should reflect the tag of the image currently being built\nARG IMAGE_REPO=norepo\nARG IMAGE_TAG=latest\nRUN \\\n sed -i -e "s/^IMAGE_REPO=.*/IMAGE_REPO=\\"${IMAGE_REPO}\\"/g" /etc/os-release && \\\n sed -i -e "s/^IMAGE_TAG=.*/IMAGE_TAG=\\"${IMAGE_TAG}\\"/g" /etc/os-release && \\\n sed -i -e "s/^IMAGE=.*/IMAGE=\\"${IMAGE_REPO}:${IMAGE_TAG}\\"/g" /etc/os-release\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Where ",(0,t.jsx)(n.code,{children:"latest"})," is the base version we want to customize."]}),"\n",(0,t.jsx)(n.p,{children:"And then the following commands"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"docker build --build-arg IMAGE_REPO=myrepo/custom-build \\\n --build-arg IMAGE_TAG=v1.1.1 \\\n -t myrepo/custom-build:v1.1.1 .\ndocker push myrepo/custom-build:v1.1.1\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The new customized OS is available as the Docker image ",(0,t.jsx)(n.code,{children:"myrepo/custom-build:v1.1.1"})," and it can\nbe run and verified using docker with"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"docker run -it myrepo/custom-build:v1.1.1 bash\n"})}),"\n",(0,t.jsx)(n.h2,{id:"create-a-custom-bootable-installation-media",children:"Create a custom bootable installation media"}),"\n",(0,t.jsx)(n.p,{children:"Elemental Teal leverages container images to build its root filesystems; therefore, it is possible\nto use it in a multi-stage environment to create custom bootable media that bundles a custom container image."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-docker",metastring:"showLineNumbers",children:'FROM registry.suse.com/rancher/elemental-teal/5.3:latest as os\n\n# Check the section on remastering a custom docker image\n\nFROM registry.suse.com/rancher/elemental-builder-image/5.3:latest AS builder\n\nARG TARGETARCH\nWORKDIR /iso\nCOPY --from=os / rootfs\n\n# work around buildah issue: https://github.com/containers/buildah/issues/4242\nRUN rm rootfs/etc/resolv.conf\n\nRUN --mount=type=bind,source=./,target=/output,rw \\\n elemental build-iso \\\n dir:rootfs \\\n --bootloader-in-rootfs \\\n --squash-no-compression \\\n -o /output -n "elemental-teal-${TARGETARCH}"\n'})}),"\n",(0,t.jsx)(n.p,{children:"Modify the container image template and afterwards run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"buildah build --tag myrepo/custom-build:v1.1.1 \\\n --build-arg IMAGE_REPO=myrepo/custom-build \\\n --build-arg IMAGE_TAG=v1.1.1 \\\n .\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The new customized installation media can be found in ",(0,t.jsx)(n.code,{children:"elemental-teal-amd64.iso"}),"."]}),"\n",(0,t.jsx)(n.admonition,{title:"important",type:"caution",children:(0,t.jsxs)(n.p,{children:["You still need to ",(0,t.jsx)(n.a,{href:"quickstart-cli#preparing-the-installation-seed-image",children:"prepare the installation image"})," so it can be used to boot and provision the machine."]})})]})}function h(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>s,a:()=>o});var t=i(7294);const a={},l=t.createContext(a);function o(e){const n=t.useContext(l);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),t.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/639e78ad.2a3212a7.js b/assets/js/639e78ad.2a3212a7.js deleted file mode 100644 index 68189ea89..000000000 --- a/assets/js/639e78ad.2a3212a7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8399],{2055:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var s=n(5893),r=n(1151);const o={sidebar_label:"Release Notes",title:""},l="Release Notes",a={id:"release-notes",title:"",description:"The Elemental project stack is made of various components such as the Operator and UI for example.",source:"@site/versioned_docs/version-1.3/release-notes.md",sourceDirName:".",slug:"/release-notes",permalink:"/release-notes",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Release Notes",title:""},sidebar:"docs",previous:{title:"Reset",permalink:"/troubleshooting-reset"}},i={},c=[];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"release-notes",children:"Release Notes"}),"\n",(0,s.jsxs)(t.p,{children:["The Elemental project stack is made of various components such as the ",(0,s.jsx)(t.code,{children:"Operator"})," and ",(0,s.jsx)(t.code,{children:"UI"})," for example."]}),"\n",(0,s.jsx)(t.p,{children:"Each of these components have an independent development lifecycle with its own versioning. Once a new version is ready, meaning it fully integrates with the others components of the Elemental project stack, a release is made."}),"\n",(0,s.jsx)(t.p,{children:"Here's the different components, their latest version and a link to the respective release notes on GitHub:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Name"}),(0,s.jsx)(t.th,{children:"Version"}),(0,s.jsx)(t.th,{children:"Release Notes"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-operator/",children:"Elemental Operator"})}),(0,s.jsx)(t.td,{children:"v1.3.4"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-operator/releases/tag/v1.3.4",children:"Link"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-toolkit/",children:"Elemental Toolkit"})}),(0,s.jsx)(t.td,{children:"v0.11.1"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-toolkit/releases/tag/v0.11.1",children:"Link"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental",children:"Elemental Linux"})}),(0,s.jsx)(t.td,{children:"v1.2.2"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental/releases/tag/v1.2.2",children:"Link"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-ui",children:"Elemental UI"})}),(0,s.jsx)(t.td,{children:"v1.2.0"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-ui/releases/tag/elemental-1.2.0",children:"Link"})})]})]})]}),"\n",(0,s.jsx)(t.admonition,{title:"Information on docs versioning",type:"note",children:(0,s.jsxs)(t.p,{children:["The docs versioning is based on the ",(0,s.jsx)(t.code,{children:"Elemental Operator"}),' component as it\'s the user "entrypoint" to the Elemental project stack.']})})]})}function d(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>l});var s=n(7294);const r={},o=s.createContext(r);function l(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/639e78ad.f78e1fd7.js b/assets/js/639e78ad.f78e1fd7.js new file mode 100644 index 000000000..d2891b143 --- /dev/null +++ b/assets/js/639e78ad.f78e1fd7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8399],{2055:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var s=n(5893),r=n(1151);const o={sidebar_label:"Release Notes",title:""},l="Release Notes",a={id:"release-notes",title:"",description:"The Elemental project stack is made of various components such as the Operator and UI for example.",source:"@site/versioned_docs/version-1.3/release-notes.md",sourceDirName:".",slug:"/release-notes",permalink:"/release-notes",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Release Notes",title:""},sidebar:"docs",previous:{title:"Reset",permalink:"/troubleshooting-reset"}},i={},c=[];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.a)(),...e.components},{Head:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n,{children:(0,s.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/release-notes"})}),"\n",(0,s.jsx)(t.h1,{id:"release-notes",children:"Release Notes"}),"\n",(0,s.jsxs)(t.p,{children:["The Elemental project stack is made of various components such as the ",(0,s.jsx)(t.code,{children:"Operator"})," and ",(0,s.jsx)(t.code,{children:"UI"})," for example."]}),"\n",(0,s.jsx)(t.p,{children:"Each of these components have an independent development lifecycle with its own versioning. Once a new version is ready, meaning it fully integrates with the others components of the Elemental project stack, a release is made."}),"\n",(0,s.jsx)(t.p,{children:"Here's the different components, their latest version and a link to the respective release notes on GitHub:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Name"}),(0,s.jsx)(t.th,{children:"Version"}),(0,s.jsx)(t.th,{children:"Release Notes"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-operator/",children:"Elemental Operator"})}),(0,s.jsx)(t.td,{children:"v1.3.4"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-operator/releases/tag/v1.3.4",children:"Link"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-toolkit/",children:"Elemental Toolkit"})}),(0,s.jsx)(t.td,{children:"v0.11.1"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-toolkit/releases/tag/v0.11.1",children:"Link"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental",children:"Elemental Linux"})}),(0,s.jsx)(t.td,{children:"v1.2.2"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental/releases/tag/v1.2.2",children:"Link"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-ui",children:"Elemental UI"})}),(0,s.jsx)(t.td,{children:"v1.2.0"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-ui/releases/tag/elemental-1.2.0",children:"Link"})})]})]})]}),"\n",(0,s.jsx)(t.admonition,{title:"Information on docs versioning",type:"note",children:(0,s.jsxs)(t.p,{children:["The docs versioning is based on the ",(0,s.jsx)(t.code,{children:"Elemental Operator"}),' component as it\'s the user "entrypoint" to the Elemental project stack.']})})]})}function d(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>l});var s=n(7294);const r={},o=s.createContext(r);function l(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/65295181.5f3359a1.js b/assets/js/65295181.5f3359a1.js new file mode 100644 index 000000000..55966b60e --- /dev/null +++ b/assets/js/65295181.5f3359a1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[5870],{732:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var o=t(5893),a=t(1151),r=t(4713);const i={sidebar_label:"Smbios",title:""},s=void 0,l={id:"smbios",title:"",description:"Introduction",source:"@site/versioned_docs/version-1.2/smbios.md",sourceDirName:".",slug:"/smbios",permalink:"/1.2/smbios",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Smbios",title:""},sidebar:"docs",previous:{title:"Kubernetes versions",permalink:"/1.2/kubernetesversions"},next:{title:"Hardware Labels",permalink:"/1.2/hardwarelabels"}},c={},d=[{value:"Introduction",id:"introduction",level:2},{value:"How does Elemental uses SMBIOS data?",id:"how-does-elemental-uses-smbios-data",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,a.a)(),...e.components},{CodeBlock:t,Head:i}=n;return t||u("CodeBlock",!0),i||u("Head",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i,{children:(0,o.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/smbios"})}),"\n","\n","\n",(0,o.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,o.jsx)(n.p,{children:"The System Management BIOS (SMBIOS) specification defines data structures (and access methods) that can be used to read management information produced by the BIOS of a computer."}),"\n",(0,o.jsx)(n.p,{children:"This allows us to gather hardware information about the running system and use that as part of our labels."}),"\n",(0,o.jsx)(n.h2,{id:"how-does-elemental-uses-smbios-data",children:"How does Elemental uses SMBIOS data?"}),"\n",(0,o.jsxs)(n.p,{children:["The registration client tries to gather SMBIOS data by running ",(0,o.jsx)(n.code,{children:"dmidecode"})," during the initial registration of the node and that data is\nsent to the registration controller to use on interpolating different fields in the inventory that we create for that node."]}),"\n",(0,o.jsxs)(n.p,{children:["Currently, we support interpolating that data into the ",(0,o.jsx)(n.code,{children:"machineName"})," and the ",(0,o.jsx)(n.code,{children:"machineInventoryLabels"})," of a ",(0,o.jsx)(n.a,{href:"/1.2/machineregistration-reference",children:"machineRegistration"})]}),"\n",(0,o.jsx)(n.p,{children:"The interpolation format is as follows:"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"{$KEY/VALUE}"})," and ",(0,o.jsx)(n.code,{children:"${KEY/SUBKEY/VALUE}"})]}),"\n",(0,o.jsxs)(n.p,{children:["This can be mixed with normal strings so ",(0,o.jsx)(n.code,{children:"my-prefix-${KEY/VALUE}"})," would result into the resolved values with ",(0,o.jsx)(n.code,{children:"my-prefix-"})," prefixed"]}),"\n",(0,o.jsx)(n.p,{children:"For example, having the following SMBIOS data:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-console",metastring:"showLineNumbers",children:"System Information\n\tManufacturer: My manufacturer\n\tProduct Name: Awesome PC\n\tVersion: Not Specified\n\tSerial Number: THX1138\n\tFamily: Toretto\n"})}),"\n",(0,o.jsxs)(n.p,{children:["And setting the ",(0,o.jsx)(n.code,{children:"machineName"})," to ",(0,o.jsx)(n.code,{children:"serial-${System Information/Serial Number}"})," would result in the final value of ",(0,o.jsx)(n.code,{children:"serial-THX1138"})]}),"\n",(0,o.jsxs)(n.p,{children:["This is useful to generate automatic names for machines based on their hardware values, for example using the UUID or the Product name.\nOur default ",(0,o.jsx)(n.code,{children:"machineName"})," when the registration values are empty is ",(0,o.jsx)(n.code,{children:'"m-${System Information/UUID}"'}),"."]}),"\n",(0,o.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,o.jsxs)(n.p,{children:["All non-valid characters will be changed into ",(0,o.jsx)(n.code,{children:"-"})," automatically on parse. Valid characters for labels are alphanumeric and ",(0,o.jsx)(n.code,{children:"-"}),",",(0,o.jsx)(n.code,{children:"_"})," and ",(0,o.jsx)(n.code,{children:"."}),"\nFor machineName the constraints are stricter as that value is used for the hostname so valid values are lowercase alphanumeric and ",(0,o.jsx)(n.code,{children:"-"})," only."]})}),"\n",(0,o.jsx)(n.p,{children:"A good use of SMBIOS data is to set up different labels for all your machines and get those values from the hardware directly."}),"\n",(0,o.jsxs)(n.p,{children:["Having your ",(0,o.jsx)(n.code,{children:"machineInventoryLabels"})," on the ",(0,o.jsx)(n.a,{href:"/1.2/machineregistration-reference",children:"machineRegistration"})," set to SMBIOS data would allow\nyou to use selectors down the line to select similar machines."]}),"\n",(0,o.jsxs)(n.p,{children:["For example using the following label ",(0,o.jsx)(n.code,{children:'cpuFamily: "${Processor Information/Family}'})," would allow you to use a selector to search for i7 cpus in your machine fleet."]}),"\n",(0,o.jsx)(t,{language:"yaml",title:"registration example with smbios labels",showLineNumbers:!0,children:r.Z})]})}function m(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}function u(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},4713:(e,n,t)=>{t.d(n,{Z:()=>o});const o='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>i});var o=t(7294);const a={},r=o.createContext(a);function i(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/65295181.fe80ffe0.js b/assets/js/65295181.fe80ffe0.js deleted file mode 100644 index 696de0b32..000000000 --- a/assets/js/65295181.fe80ffe0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[5870],{732:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var o=t(5893),a=t(1151),r=t(4713);const i={sidebar_label:"Smbios",title:""},s=void 0,l={id:"smbios",title:"",description:"Introduction",source:"@site/versioned_docs/version-1.2/smbios.md",sourceDirName:".",slug:"/smbios",permalink:"/1.2/smbios",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Smbios",title:""},sidebar:"docs",previous:{title:"Kubernetes versions",permalink:"/1.2/kubernetesversions"},next:{title:"Hardware Labels",permalink:"/1.2/hardwarelabels"}},d={},c=[{value:"Introduction",id:"introduction",level:2},{value:"How does Elemental uses SMBIOS data?",id:"how-does-elemental-uses-smbios-data",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,a.a)(),...e.components},{CodeBlock:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("CodeBlock",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,o.jsx)(n.p,{children:"The System Management BIOS (SMBIOS) specification defines data structures (and access methods) that can be used to read management information produced by the BIOS of a computer."}),"\n",(0,o.jsx)(n.p,{children:"This allows us to gather hardware information about the running system and use that as part of our labels."}),"\n",(0,o.jsx)(n.h2,{id:"how-does-elemental-uses-smbios-data",children:"How does Elemental uses SMBIOS data?"}),"\n",(0,o.jsxs)(n.p,{children:["The registration client tries to gather SMBIOS data by running ",(0,o.jsx)(n.code,{children:"dmidecode"})," during the initial registration of the node and that data is\nsent to the registration controller to use on interpolating different fields in the inventory that we create for that node."]}),"\n",(0,o.jsxs)(n.p,{children:["Currently, we support interpolating that data into the ",(0,o.jsx)(n.code,{children:"machineName"})," and the ",(0,o.jsx)(n.code,{children:"machineInventoryLabels"})," of a ",(0,o.jsx)(n.a,{href:"/1.2/machineregistration-reference",children:"machineRegistration"})]}),"\n",(0,o.jsx)(n.p,{children:"The interpolation format is as follows:"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"{$KEY/VALUE}"})," and ",(0,o.jsx)(n.code,{children:"${KEY/SUBKEY/VALUE}"})]}),"\n",(0,o.jsxs)(n.p,{children:["This can be mixed with normal strings so ",(0,o.jsx)(n.code,{children:"my-prefix-${KEY/VALUE}"})," would result into the resolved values with ",(0,o.jsx)(n.code,{children:"my-prefix-"})," prefixed"]}),"\n",(0,o.jsx)(n.p,{children:"For example, having the following SMBIOS data:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-console",metastring:"showLineNumbers",children:"System Information\n\tManufacturer: My manufacturer\n\tProduct Name: Awesome PC\n\tVersion: Not Specified\n\tSerial Number: THX1138\n\tFamily: Toretto\n"})}),"\n",(0,o.jsxs)(n.p,{children:["And setting the ",(0,o.jsx)(n.code,{children:"machineName"})," to ",(0,o.jsx)(n.code,{children:"serial-${System Information/Serial Number}"})," would result in the final value of ",(0,o.jsx)(n.code,{children:"serial-THX1138"})]}),"\n",(0,o.jsxs)(n.p,{children:["This is useful to generate automatic names for machines based on their hardware values, for example using the UUID or the Product name.\nOur default ",(0,o.jsx)(n.code,{children:"machineName"})," when the registration values are empty is ",(0,o.jsx)(n.code,{children:'"m-${System Information/UUID}"'}),"."]}),"\n",(0,o.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,o.jsxs)(n.p,{children:["All non-valid characters will be changed into ",(0,o.jsx)(n.code,{children:"-"})," automatically on parse. Valid characters for labels are alphanumeric and ",(0,o.jsx)(n.code,{children:"-"}),",",(0,o.jsx)(n.code,{children:"_"})," and ",(0,o.jsx)(n.code,{children:"."}),"\nFor machineName the constraints are stricter as that value is used for the hostname so valid values are lowercase alphanumeric and ",(0,o.jsx)(n.code,{children:"-"})," only."]})}),"\n",(0,o.jsx)(n.p,{children:"A good use of SMBIOS data is to set up different labels for all your machines and get those values from the hardware directly."}),"\n",(0,o.jsxs)(n.p,{children:["Having your ",(0,o.jsx)(n.code,{children:"machineInventoryLabels"})," on the ",(0,o.jsx)(n.a,{href:"/1.2/machineregistration-reference",children:"machineRegistration"})," set to SMBIOS data would allow\nyou to use selectors down the line to select similar machines."]}),"\n",(0,o.jsxs)(n.p,{children:["For example using the following label ",(0,o.jsx)(n.code,{children:'cpuFamily: "${Processor Information/Family}'})," would allow you to use a selector to search for i7 cpus in your machine fleet."]}),"\n",(0,o.jsx)(t,{language:"yaml",title:"registration example with smbios labels",showLineNumbers:!0,children:r.Z})]})}function m(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},4713:(e,n,t)=>{t.d(n,{Z:()=>o});const o='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>i});var o=t(7294);const a={},r=o.createContext(a);function i(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6654e683.a9af6535.js b/assets/js/6654e683.a9af6535.js new file mode 100644 index 000000000..648d336cd --- /dev/null +++ b/assets/js/6654e683.a9af6535.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8677],{1074:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>d,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var r=n(5893),o=n(1151);const s={sidebar_label:"Restore",title:""},a="Troubleshooting restore",c={id:"troubleshooting-restore",title:"",description:"When a restore is performed, do not restart the rancher-system-agent on elemental nodes as it can stale and end with the following error:",source:"@site/versioned_docs/version-1.3/troubleshooting-restore.md",sourceDirName:".",slug:"/troubleshooting-restore",permalink:"/troubleshooting-restore",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Restore",title:""},sidebar:"docs",previous:{title:"Rancher upgrades",permalink:"/troubleshooting-rancher-upgrades"},next:{title:"Upgrade",permalink:"/troubleshooting-upgrade"}},i={},l=[];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",p:"p",pre:"pre",...(0,o.a)(),...e.components},{Head:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n,{children:(0,r.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/troubleshooting-restore"})}),"\n",(0,r.jsx)(t.h1,{id:"troubleshooting-restore",children:"Troubleshooting restore"}),"\n",(0,r.jsxs)(t.admonition,{title:"warning",type:"warning",children:[(0,r.jsxs)(t.p,{children:["When a restore is performed, do not restart the ",(0,r.jsx)(t.code,{children:"rancher-system-agent"})," on elemental nodes as it can stale and end with the following error:"]}),(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"panic: error while connecting to Kubernetes cluster: the server has asked for the client to provide credentials"})}),(0,r.jsx)(t.p,{children:"If you face this problem, please follow the procedure below."})]}),"\n",(0,r.jsxs)(t.p,{children:["Before you initiate a restore, you need to copy ",(0,r.jsx)(t.code,{children:"/var/lib/rancher/agent/rancher2_connection_info.json"})," from the elemental node to a place where you have access with Rancher UI."]}),"\n",(0,r.jsxs)(t.p,{children:["Once the file is copied, download the ",(0,r.jsx)(t.code,{children:"rancher-agent-token-update.sh"})," script from the ",(0,r.jsx)(t.a,{href:"https://github.com/rancher/elemental",children:"Elemental repository"}),":"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://raw.githubusercontent.com/rancher/elemental/main/scripts/rancher-agent-token-update && chmod +x rancher-agent-token-update\n"})}),"\n",(0,r.jsx)(t.p,{children:"Execute the script without any additional options:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"./rancher-agent-token-update\n"})}),"\n",(0,r.jsxs)(t.p,{children:["After the restore successfully completed, copy ",(0,r.jsx)(t.code,{children:"rancher2_connection_info.json"})," back to the elemental node to the path\n",(0,r.jsx)(t.code,{children:"/var/lib/rancher/agent/rancher2_connection_info.json"}),". Finally, restart the ",(0,r.jsx)(t.code,{children:"rancher-system-agent"})," service:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"systemctl restart rancher-system-agent\n"})})]})}function d(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>a});var r=n(7294);const o={},s=r.createContext(o);function a(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6654e683.c868b00c.js b/assets/js/6654e683.c868b00c.js deleted file mode 100644 index b488c73c9..000000000 --- a/assets/js/6654e683.c868b00c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8677],{1074:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>a,default:()=>d,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var r=t(5893),o=t(1151);const s={sidebar_label:"Restore",title:""},a="Troubleshooting restore",c={id:"troubleshooting-restore",title:"",description:"When a restore is performed, do not restart the rancher-system-agent on elemental nodes as it can stale and end with the following error:",source:"@site/versioned_docs/version-1.3/troubleshooting-restore.md",sourceDirName:".",slug:"/troubleshooting-restore",permalink:"/troubleshooting-restore",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Restore",title:""},sidebar:"docs",previous:{title:"Rancher upgrades",permalink:"/troubleshooting-rancher-upgrades"},next:{title:"Upgrade",permalink:"/troubleshooting-upgrade"}},i={},l=[];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",p:"p",pre:"pre",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"troubleshooting-restore",children:"Troubleshooting restore"}),"\n",(0,r.jsxs)(n.admonition,{title:"warning",type:"warning",children:[(0,r.jsxs)(n.p,{children:["When a restore is performed, do not restart the ",(0,r.jsx)(n.code,{children:"rancher-system-agent"})," on elemental nodes as it can stale and end with the following error:"]}),(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"panic: error while connecting to Kubernetes cluster: the server has asked for the client to provide credentials"})}),(0,r.jsx)(n.p,{children:"If you face this problem, please follow the procedure below."})]}),"\n",(0,r.jsxs)(n.p,{children:["Before you initiate a restore, you need to copy ",(0,r.jsx)(n.code,{children:"/var/lib/rancher/agent/rancher2_connection_info.json"})," from the elemental node to a place where you have access with Rancher UI."]}),"\n",(0,r.jsxs)(n.p,{children:["Once the file is copied, download the ",(0,r.jsx)(n.code,{children:"rancher-agent-token-update.sh"})," script from the ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/elemental",children:"Elemental repository"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://raw.githubusercontent.com/rancher/elemental/main/scripts/rancher-agent-token-update && chmod +x rancher-agent-token-update\n"})}),"\n",(0,r.jsx)(n.p,{children:"Execute the script without any additional options:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"./rancher-agent-token-update\n"})}),"\n",(0,r.jsxs)(n.p,{children:["After the restore successfully completed, copy ",(0,r.jsx)(n.code,{children:"rancher2_connection_info.json"})," back to the elemental node to the path\n",(0,r.jsx)(n.code,{children:"/var/lib/rancher/agent/rancher2_connection_info.json"}),". Finally, restart the ",(0,r.jsx)(n.code,{children:"rancher-system-agent"})," service:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"systemctl restart rancher-system-agent\n"})})]})}function d(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>a});var r=t(7294);const o={},s=r.createContext(o);function a(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6e738032.90ced99b.js b/assets/js/6e738032.90ced99b.js deleted file mode 100644 index bc7d8b465..000000000 --- a/assets/js/6e738032.90ced99b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[9323],{7877:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var a=t(5893),i=t(1151);const o={sidebar_label:"Inventory Management",title:"",version_badge:"1.3.0"},r=void 0,s={id:"inventory-management",title:"",description:"Inventory Management",source:"@site/docs/inventory-management.md",sourceDirName:".",slug:"/inventory-management",permalink:"/next/inventory-management",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Inventory Management",title:"",version_badge:"1.3.0"},sidebar:"docs",previous:{title:"Hardware Labels",permalink:"/next/hardwarelabels"},next:{title:"Machine Reset",permalink:"/next/reset"}},c={},l=[{value:"Inventory Management",id:"inventory-management",level:2},{value:"MachineInventory",id:"machineinventory",level:3},{value:"Reference",id:"reference",level:4},{value:"MachineRegistration",id:"machineregistration",level:3},{value:"Reference",id:"reference-1",level:4}];function d(e){const n={br:"br",code:"code",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h2,{id:"inventory-management",children:"Inventory Management"}),"\n",(0,a.jsx)(n.p,{children:"The Elemental operator can hold an inventory of machines and\nthe mapping of the machine to it's configuration and assigned cluster."}),"\n",(0,a.jsx)(n.h3,{id:"machineinventory",children:"MachineInventory"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"MachineInventory"})," holds all the relevant information for a registered machine.",(0,a.jsx)(n.br,{}),"\n","Upon successful registration, the ",(0,a.jsx)(n.code,{children:"MachineInventory"})," will inherit all ",(0,a.jsx)(n.code,{children:"machineInventoryLabels"})," defined in the related ",(0,a.jsx)(n.code,{children:"MachineRegistration"}),".",(0,a.jsx)(n.br,{}),"\n","Additionally, the machine ",(0,a.jsx)(n.code,{children:"annotations"})," will also be updated on each successful registration."]}),"\n",(0,a.jsx)(n.p,{children:"By default, Elemental Teal machines will attempt a registration update every 24 hours to update labels and annotations."}),"\n",(0,a.jsx)(n.h4,{id:"reference",children:"Reference"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventory\nmetadata:\n # Machine annotations can be useful to identify hosts\n annotations:\n elemental.cattle.io/auth: tpm\n elemental.cattle.io/registration-ip: 192.168.122.152\n labels:\n # A label inherited from the MachineRegistration definition\n element: fire\n # Generic SMBIOS labels that are typically populated with\n # the MachineRegister approach\n machineUUID: f266c64b-3972-40e7-9937-3dc4a311436c\n manufacturer: QEMU\n productName: Standard-PC-Q35-ICH9-2009\n serialNumber: Not-Specified\n # Custom labels can be applied to each MachineInventory\n myCustomLabel: foo \n name: m-479ab68e-00ff-4081-a731-5b1a76610289\n # The namespace must match the namespace of the cluster\n # assigned to the clusters.provisioning.cattle.io resource\n namespace: fleet-default\n # A reference to the MachineInventorySelector that links the \n # machine to a Cluster definition\n ownerReferences:\n - apiVersion: elemental.cattle.io/v1beta1\n controller: true\n kind: MachineInventorySelector\n name: fire-machine-selector-qcn7d\n uid: 0a1f751e-4ca9-4a0d-919a-97ba1f434d12\nspec:\n # The hash of the TPM EK public key. This is used if you are\n # using TPM2 to identifiy nodes. Nodes can report their TPM\n # hash by using the MachineRegistration.\n tpmHash: d68795c6192af9922692f050b...\n"})}),"\n",(0,a.jsx)(n.h3,{id:"machineregistration",children:"MachineRegistration"}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"MachineRegistration"})," holds information on how to install, reset, and configure all connected Elemental Teal machines."]}),"\n",(0,a.jsxs)(n.p,{children:["It's possible to update the ",(0,a.jsx)(n.code,{children:"spec.machineInventoryLabels"})," and ",(0,a.jsx)(n.code,{children:"spec.machineInventoryAnnotations"})," and this will be applied to all registered machines.\nBy default, Elemental Teal machines will attempt a registration update every 24 hours to update labels and annotations."]}),"\n",(0,a.jsxs)(n.p,{children:["While it's possible to modify the ",(0,a.jsx)(n.code,{children:"spec.config"})," definition, updates to the ",(0,a.jsx)(n.code,{children:"spec.config"})," will be ignored by machines that already completed installation.\nMachines that couldn't complete the installation will try again every 30 minutes by reloading the remote ",(0,a.jsx)(n.code,{children:"MachineRegistration"})," definition. This can be useful to correct ",(0,a.jsx)(n.code,{children:"spec.config"})," mistakes that prevent successful installation (for ex. ",(0,a.jsx)(n.code,{children:"spec.config.elemental.install.device"}),"), without having to create a new ",(0,a.jsx)(n.code,{children:"MachineRegistration"})," and a new ISO."]}),"\n",(0,a.jsx)(n.h4,{id:"reference-1",children:"Reference"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n # The namespace must match the namespace of the cluster\n # assigned to the clusters.provisioning.cattle.io resource\n namespace: fleet-default\nspec:\n # The cloud config that will be used to provision the node\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n reset:\n enabled: true\n debug: true\n reset-persistent: true\n reset-oem: true\n reboot: true\n # Labels to be added to the created MachineInventory object\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n # Annotations to be added to the created MachineInventory object\n machineInventoryAnnotations: {}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>r});var a=t(7294);const i={},o=a.createContext(i);function r(e){const n=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6e738032.93d70adc.js b/assets/js/6e738032.93d70adc.js new file mode 100644 index 000000000..425c657fd --- /dev/null +++ b/assets/js/6e738032.93d70adc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[9323],{7877:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var a=t(5893),i=t(1151);const o={sidebar_label:"Inventory Management",title:"",version_badge:"1.3.0"},r=void 0,s={id:"inventory-management",title:"",description:"Inventory Management",source:"@site/docs/inventory-management.md",sourceDirName:".",slug:"/inventory-management",permalink:"/next/inventory-management",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Inventory Management",title:"",version_badge:"1.3.0"},sidebar:"docs",previous:{title:"Hardware Labels",permalink:"/next/hardwarelabels"},next:{title:"Machine Reset",permalink:"/next/reset"}},c={},l=[{value:"Inventory Management",id:"inventory-management",level:2},{value:"MachineInventory",id:"machineinventory",level:3},{value:"Reference",id:"reference",level:4},{value:"MachineRegistration",id:"machineregistration",level:3},{value:"Reference",id:"reference-1",level:4}];function d(e){const n={br:"br",code:"code",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,i.a)(),...e.components},{Head:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t,{children:(0,a.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/inventory-management"})}),"\n",(0,a.jsx)(n.h2,{id:"inventory-management",children:"Inventory Management"}),"\n",(0,a.jsx)(n.p,{children:"The Elemental operator can hold an inventory of machines and\nthe mapping of the machine to it's configuration and assigned cluster."}),"\n",(0,a.jsx)(n.h3,{id:"machineinventory",children:"MachineInventory"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"MachineInventory"})," holds all the relevant information for a registered machine.",(0,a.jsx)(n.br,{}),"\n","Upon successful registration, the ",(0,a.jsx)(n.code,{children:"MachineInventory"})," will inherit all ",(0,a.jsx)(n.code,{children:"machineInventoryLabels"})," defined in the related ",(0,a.jsx)(n.code,{children:"MachineRegistration"}),".",(0,a.jsx)(n.br,{}),"\n","Additionally, the machine ",(0,a.jsx)(n.code,{children:"annotations"})," will also be updated on each successful registration."]}),"\n",(0,a.jsx)(n.p,{children:"By default, Elemental Teal machines will attempt a registration update every 24 hours to update labels and annotations."}),"\n",(0,a.jsx)(n.h4,{id:"reference",children:"Reference"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventory\nmetadata:\n # Machine annotations can be useful to identify hosts\n annotations:\n elemental.cattle.io/auth: tpm\n elemental.cattle.io/registration-ip: 192.168.122.152\n labels:\n # A label inherited from the MachineRegistration definition\n element: fire\n # Generic SMBIOS labels that are typically populated with\n # the MachineRegister approach\n machineUUID: f266c64b-3972-40e7-9937-3dc4a311436c\n manufacturer: QEMU\n productName: Standard-PC-Q35-ICH9-2009\n serialNumber: Not-Specified\n # Custom labels can be applied to each MachineInventory\n myCustomLabel: foo \n name: m-479ab68e-00ff-4081-a731-5b1a76610289\n # The namespace must match the namespace of the cluster\n # assigned to the clusters.provisioning.cattle.io resource\n namespace: fleet-default\n # A reference to the MachineInventorySelector that links the \n # machine to a Cluster definition\n ownerReferences:\n - apiVersion: elemental.cattle.io/v1beta1\n controller: true\n kind: MachineInventorySelector\n name: fire-machine-selector-qcn7d\n uid: 0a1f751e-4ca9-4a0d-919a-97ba1f434d12\nspec:\n # The hash of the TPM EK public key. This is used if you are\n # using TPM2 to identifiy nodes. Nodes can report their TPM\n # hash by using the MachineRegistration.\n tpmHash: d68795c6192af9922692f050b...\n"})}),"\n",(0,a.jsx)(n.h3,{id:"machineregistration",children:"MachineRegistration"}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"MachineRegistration"})," holds information on how to install, reset, and configure all connected Elemental Teal machines."]}),"\n",(0,a.jsxs)(n.p,{children:["It's possible to update the ",(0,a.jsx)(n.code,{children:"spec.machineInventoryLabels"})," and ",(0,a.jsx)(n.code,{children:"spec.machineInventoryAnnotations"})," and this will be applied to all registered machines.\nBy default, Elemental Teal machines will attempt a registration update every 24 hours to update labels and annotations."]}),"\n",(0,a.jsxs)(n.p,{children:["While it's possible to modify the ",(0,a.jsx)(n.code,{children:"spec.config"})," definition, updates to the ",(0,a.jsx)(n.code,{children:"spec.config"})," will be ignored by machines that already completed installation.\nMachines that couldn't complete the installation will try again every 30 minutes by reloading the remote ",(0,a.jsx)(n.code,{children:"MachineRegistration"})," definition. This can be useful to correct ",(0,a.jsx)(n.code,{children:"spec.config"})," mistakes that prevent successful installation (for ex. ",(0,a.jsx)(n.code,{children:"spec.config.elemental.install.device"}),"), without having to create a new ",(0,a.jsx)(n.code,{children:"MachineRegistration"})," and a new ISO."]}),"\n",(0,a.jsx)(n.h4,{id:"reference-1",children:"Reference"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n # The namespace must match the namespace of the cluster\n # assigned to the clusters.provisioning.cattle.io resource\n namespace: fleet-default\nspec:\n # The cloud config that will be used to provision the node\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n reset:\n enabled: true\n debug: true\n reset-persistent: true\n reset-oem: true\n reboot: true\n # Labels to be added to the created MachineInventory object\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n # Annotations to be added to the created MachineInventory object\n machineInventoryAnnotations: {}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>r});var a=t(7294);const i={},o=a.createContext(i);function r(e){const n=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6ffb9ece.14ec47c0.js b/assets/js/6ffb9ece.14ec47c0.js new file mode 100644 index 000000000..86d75b64d --- /dev/null +++ b/assets/js/6ffb9ece.14ec47c0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6994],{4490:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>a,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var o=t(5893),i=t(1151);const l={sidebar_label:"Reset",title:""},a="Troubleshooting reset",s={id:"troubleshooting-reset",title:"",description:'Each MachineInventory with the elemental.cattle.io/resettable: "true" annotation will trigger the execution of a reset plan, upon deletion.',source:"@site/docs/troubleshooting-reset.md",sourceDirName:".",slug:"/troubleshooting-reset",permalink:"/next/troubleshooting-reset",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Reset",title:""},sidebar:"docs",previous:{title:"Upgrade",permalink:"/next/troubleshooting-upgrade"},next:{title:"Release Notes",permalink:"/next/release-notes"}},r={},c=[{value:"Forcefully deleting a MachineInventory undergoing reset",id:"forcefully-deleting-a-machineinventory-undergoing-reset",level:2}];function d(e){const n={br:"br",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components},{Head:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t,{children:(0,o.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/troubleshooting-reset"})}),"\n",(0,o.jsx)(n.h1,{id:"troubleshooting-reset",children:"Troubleshooting reset"}),"\n",(0,o.jsxs)(n.p,{children:["Each ",(0,o.jsx)(n.code,{children:"MachineInventory"})," with the ",(0,o.jsx)(n.code,{children:'elemental.cattle.io/resettable: "true"'})," annotation will trigger the execution of a reset plan, upon deletion.",(0,o.jsx)(n.br,{}),"\n","The ",(0,o.jsx)(n.code,{children:"machineinventory.elemental.cattle.io"})," finalizer is going to be removed only after the plan has been executed successfully by the ",(0,o.jsx)(n.code,{children:"elemental-system-agent"})," running on the machine."]}),"\n",(0,o.jsxs)(n.p,{children:["You can investigate why a ",(0,o.jsx)(n.code,{children:"MachineInventory"})," has not been deleted yet, by examining it:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventory\nmetadata:\n # deletionTimestamp has been set. This object has been marked for deletion.\n deletionTimestamp: "2023-08-04T08:41:25Z"\n annotations:\n # `resettable` annotation is enabled.\n # This means the machine has to go through reset, before deletion of this object.\n elemental.cattle.io/resettable: "true"\n # `machineinventory.elemental.cattle.io` finalizer is set.\n # The `elemental-operator` is going to create a reset plan for the machine to execute.\n # After successful execution of the reset plan, the finalizer is removed and the object will be deleted.\n finalizers:\n - machineinventory.elemental.cattle.io\nstatus:\n conditions:\n # Most recent condition shows that the MachineInventory is waiting for a plan to be applied.\n - lastTransitionTime: "2023-08-04T08:41:25Z"\n message: waiting for plan to be applied\n reason: WaitingForPlan\n status: "False"\n type: Ready\n # The plan to be executed is referenced. \n # Normally it has the same name of the MachineInventory and lives within the same namespace. \n plan:\n checksum: 5aba8b6b3161bc52d8953b2428e54ecda3b59e8e0043b49d761d1e79174eded6\n secretRef:\n name: m-bf1008a1-61d6-4355-b5f5-f7d1c527affe\n namespace: fleet-default\n'})}),"\n",(0,o.jsxs)(n.p,{children:["You can also examine the referenced plan ",(0,o.jsx)(n.code,{children:"Secret"}),".",(0,o.jsx)(n.br,{}),"\n","Note that the ",(0,o.jsx)(n.code,{children:"elemental-system-agent"})," running on the machine is watching this secret and it should execute the plan.",(0,o.jsx)(n.br,{}),"\n","You can also monitor its progress from the machine logs: ",(0,o.jsx)(n.code,{children:"journalctl -u elemental-system-agent -f"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'apiVersion: v1\nkind: Secret\n# This is a `elemental.cattle.io/plan` secret plan.\ntype: elemental.cattle.io/plan\nmetadata:\n annotations:\n # This is a `reset` plan type.\n elemental.cattle.io/plan.type: reset\n labels:\n elemental.cattle.io/managed: "true"\n name: m-bf1008a1-61d6-4355-b5f5-f7d1c527affe\n namespace: fleet-default\n # It is owned by the `MachineInventory` waiting for deletion.\n ownerReferences:\n - apiVersion: elemental.cattle.io/v1beta1\n controller: true\n kind: MachineInventory\n name: m-bf1008a1-61d6-4355-b5f5-f7d1c527affe\n uid: 5aa3863c-63a5-4cb9-91fd-7a45191d4842\ndata:\n # The plan has not been applied yet.\n applied-checksum: ""\n # It also hasn\'t failed.\n failed-checksum: ""\n # The actual plan to be executed, base64 encoded.\n plan: eyJmaWxlcyI6W3siY29udGVudCI6ImJtRnRaVG9nUld4bGJXVnVkR0ZzSUZKbGMyVjBDbk4wWVdkbGN6b0tJQ0FnSUc1bGRIZHZjbXN1WVdaMFpYSTZDaUFnSUNBZ0lDQWdMU0JqYjIxdFlXNWtjem9LSUNBZ0lDQWdJQ0FnSUNBZ0xTQmxiR1Z0Wlc1MFlXd3RjbVZuYVhOMFpYSWdMUzFrWldKMVp5QXRMWEpsYzJWMENpQWdJQ0FnSUNBZ0lDQnBaam9nSjFzZ0xXWWdMM0oxYmk5amIzTXZjbVZqYjNabGNubGZiVzlrWlNCZEp3b2dJQ0FnSUNBZ0lDQWdibUZ0WlRvZ1VuVnVjeUJsYkdWdFpXNTBZV3dnY21WelpYUUsiLCJwYXRoIjoiL29lbS9yZXNldC1jbG91ZC1jb25maWcueWFtbCIsInBlcm1pc3Npb25zIjoiMDYwMCJ9XSwiaW5zdHJ1Y3Rpb25zIjpbeyJuYW1lIjoiY29uZmlndXJlIG5leHQgYm9vdCB0byByZWNvdmVyeSBtb2RlIiwiYXJncyI6WyIvb2VtL2dydWJlbnYiLCJzZXQiLCJuZXh0X2VudHJ5PXJlY292ZXJ5Il0sImNvbW1hbmQiOiJncnViMi1lZGl0ZW52In0seyJuYW1lIjoic2NoZWR1bGUgcmVib290IiwiYXJncyI6WyItciIsIisxIl0sImNvbW1hbmQiOiJzaHV0ZG93biJ9XX0K\n'})}),"\n",(0,o.jsxs)(n.p,{children:["The plan created by the ",(0,o.jsx)(n.code,{children:"elemental-operator"})," should contain the following instructions:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-json",children:'{\n "files": [\n // A cloud-init config file is created on the default /oem directory. \n // This config will be executed once in recovery mode.\n {\n "content": "bmFtZTogRWxlbWVudGFsIFJlc2V0CnN0YWdlczoKICAgIG5ldHdvcmsuYWZ0ZXI6CiAgICAgICAgLSBjb21tYW5kczoKICAgICAgICAgICAgLSBlbGVtZW50YWwtcmVnaXN0ZXIgLS1kZWJ1ZyAtLXJlc2V0CiAgICAgICAgICBpZjogJ1sgLWYgL3J1bi9jb3MvcmVjb3ZlcnlfbW9kZSBdJwogICAgICAgICAgbmFtZTogUnVucyBlbGVtZW50YWwgcmVzZXQK",\n "path": "/oem/reset-cloud-config.yaml",\n "permissions": "0600"\n }\n ],\n "instructions": [\n {\n "name": "configure next boot to recovery mode",\n "args": [\n "/oem/grubenv",\n "set",\n "next_entry=recovery"\n ],\n "command": "grub2-editenv"\n },\n {\n "name": "schedule reboot",\n "args": [\n "-r",\n "+1"\n ],\n "command": "shutdown"\n }\n ]\n}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["If the ",(0,o.jsx)(n.code,{children:"elemental-system-agent"})," successfully executed the plan, the ",(0,o.jsx)(n.code,{children:"machineinventory.elemental.cattle.io"})," finalizer on the ",(0,o.jsx)(n.code,{children:"MachineInventory"})," will be removed and the ",(0,o.jsx)(n.code,{children:"MachineInventory"})," will be deleted.",(0,o.jsx)(n.br,{}),"\n","Note that this is not an indication that the machine has been fully reset yet.",(0,o.jsx)(n.br,{}),"\n","This is a limitation of the current implementation and it will eventually improve, so that it will be possible to completely track the reset status."]}),"\n",(0,o.jsxs)(n.p,{children:["However, at this stage we do expect the host to undergo reboot, and reboot in recovery mode.",(0,o.jsx)(n.br,{}),"\n","Once in recovery mode, the ",(0,o.jsx)(n.code,{children:"cos-setup-network"})," should execute the cloud-init config that has been written on ",(0,o.jsx)(n.code,{children:"/oem/reset-cloud-config.yaml"}),".",(0,o.jsx)(n.br,{}),"\n","You can monitor the status with ",(0,o.jsx)(n.code,{children:"journalctl -u cos-setup-network -f"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"The cloud-init instructions should look like the following:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"name: Elemental Reset\nstages:\n network.after:\n - if: '[ -f /run/cos/recovery_mode ]'\n name: Runs elemental reset\n commands:\n - systemctl start elemental-register-reset\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"elemental-register"})," cli will register with the ",(0,o.jsx)(n.code,{children:"elemental-operator"})," as a new machine. This will lead to the creation of a new ",(0,o.jsx)(n.code,{children:"MachineInventory"})," object.",(0,o.jsx)(n.br,{}),"\n","The remote ",(0,o.jsx)(n.code,{children:"MachineRegistration"})," configuration will also be fetched to apply the reset options, for example ",(0,o.jsx)(n.code,{children:"reset-persistent"}),", ",(0,o.jsx)(n.code,{children:"reset-oem"}),", or the power settings, either ",(0,o.jsx)(n.code,{children:"reboot"})," or ",(0,o.jsx)(n.code,{children:"power-off"}),".",(0,o.jsx)(n.br,{}),"\n","After reset, depending on the settings, the machine should either shut down or reboot and be ready to be adopted within a new cluster."]}),"\n",(0,o.jsx)(n.h2,{id:"forcefully-deleting-a-machineinventory-undergoing-reset",children:"Forcefully deleting a MachineInventory undergoing reset"}),"\n",(0,o.jsxs)(n.p,{children:["If the machine is unable to execute the reset instructions and the related ",(0,o.jsx)(n.code,{children:"MachineInventory"})," is not deleted, there are two equivalent ways you can manually fix the issue."]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Remove the ",(0,o.jsx)(n.code,{children:'elemental.cattle.io/resettable: "true"'})," annotation from the ",(0,o.jsx)(n.code,{children:"MachineInventory"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Remove the ",(0,o.jsx)(n.code,{children:"machineinventory.elemental.cattle.io"})," finalizer from the ",(0,o.jsx)(n.code,{children:"MachineInventory"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Remember to also take care of the machine itself, by fully reprovisioning it or rebooting into recovery mode and using the ",(0,o.jsx)(n.code,{children:"elemental reset"})," command directly."]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>a});var o=t(7294);const i={},l=o.createContext(i);function a(e){const n=o.useContext(l);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),o.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6ffb9ece.ffdefc5e.js b/assets/js/6ffb9ece.ffdefc5e.js deleted file mode 100644 index a8b29e6dd..000000000 --- a/assets/js/6ffb9ece.ffdefc5e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6994],{4490:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>a,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var o=t(5893),i=t(1151);const l={sidebar_label:"Reset",title:""},a="Troubleshooting reset",s={id:"troubleshooting-reset",title:"",description:'Each MachineInventory with the elemental.cattle.io/resettable: "true" annotation will trigger the execution of a reset plan, upon deletion.',source:"@site/docs/troubleshooting-reset.md",sourceDirName:".",slug:"/troubleshooting-reset",permalink:"/next/troubleshooting-reset",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Reset",title:""},sidebar:"docs",previous:{title:"Upgrade",permalink:"/next/troubleshooting-upgrade"},next:{title:"Release Notes",permalink:"/next/release-notes"}},r={},c=[{value:"Forcefully deleting a MachineInventory undergoing reset",id:"forcefully-deleting-a-machineinventory-undergoing-reset",level:2}];function d(e){const n={br:"br",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"troubleshooting-reset",children:"Troubleshooting reset"}),"\n",(0,o.jsxs)(n.p,{children:["Each ",(0,o.jsx)(n.code,{children:"MachineInventory"})," with the ",(0,o.jsx)(n.code,{children:'elemental.cattle.io/resettable: "true"'})," annotation will trigger the execution of a reset plan, upon deletion.",(0,o.jsx)(n.br,{}),"\n","The ",(0,o.jsx)(n.code,{children:"machineinventory.elemental.cattle.io"})," finalizer is going to be removed only after the plan has been executed successfully by the ",(0,o.jsx)(n.code,{children:"elemental-system-agent"})," running on the machine."]}),"\n",(0,o.jsxs)(n.p,{children:["You can investigate why a ",(0,o.jsx)(n.code,{children:"MachineInventory"})," has not been deleted yet, by examining it:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventory\nmetadata:\n # deletionTimestamp has been set. This object has been marked for deletion.\n deletionTimestamp: "2023-08-04T08:41:25Z"\n annotations:\n # `resettable` annotation is enabled.\n # This means the machine has to go through reset, before deletion of this object.\n elemental.cattle.io/resettable: "true"\n # `machineinventory.elemental.cattle.io` finalizer is set.\n # The `elemental-operator` is going to create a reset plan for the machine to execute.\n # After successful execution of the reset plan, the finalizer is removed and the object will be deleted.\n finalizers:\n - machineinventory.elemental.cattle.io\nstatus:\n conditions:\n # Most recent condition shows that the MachineInventory is waiting for a plan to be applied.\n - lastTransitionTime: "2023-08-04T08:41:25Z"\n message: waiting for plan to be applied\n reason: WaitingForPlan\n status: "False"\n type: Ready\n # The plan to be executed is referenced. \n # Normally it has the same name of the MachineInventory and lives within the same namespace. \n plan:\n checksum: 5aba8b6b3161bc52d8953b2428e54ecda3b59e8e0043b49d761d1e79174eded6\n secretRef:\n name: m-bf1008a1-61d6-4355-b5f5-f7d1c527affe\n namespace: fleet-default\n'})}),"\n",(0,o.jsxs)(n.p,{children:["You can also examine the referenced plan ",(0,o.jsx)(n.code,{children:"Secret"}),".",(0,o.jsx)(n.br,{}),"\n","Note that the ",(0,o.jsx)(n.code,{children:"elemental-system-agent"})," running on the machine is watching this secret and it should execute the plan.",(0,o.jsx)(n.br,{}),"\n","You can also monitor its progress from the machine logs: ",(0,o.jsx)(n.code,{children:"journalctl -u elemental-system-agent -f"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'apiVersion: v1\nkind: Secret\n# This is a `elemental.cattle.io/plan` secret plan.\ntype: elemental.cattle.io/plan\nmetadata:\n annotations:\n # This is a `reset` plan type.\n elemental.cattle.io/plan.type: reset\n labels:\n elemental.cattle.io/managed: "true"\n name: m-bf1008a1-61d6-4355-b5f5-f7d1c527affe\n namespace: fleet-default\n # It is owned by the `MachineInventory` waiting for deletion.\n ownerReferences:\n - apiVersion: elemental.cattle.io/v1beta1\n controller: true\n kind: MachineInventory\n name: m-bf1008a1-61d6-4355-b5f5-f7d1c527affe\n uid: 5aa3863c-63a5-4cb9-91fd-7a45191d4842\ndata:\n # The plan has not been applied yet.\n applied-checksum: ""\n # It also hasn\'t failed.\n failed-checksum: ""\n # The actual plan to be executed, base64 encoded.\n plan: eyJmaWxlcyI6W3siY29udGVudCI6ImJtRnRaVG9nUld4bGJXVnVkR0ZzSUZKbGMyVjBDbk4wWVdkbGN6b0tJQ0FnSUc1bGRIZHZjbXN1WVdaMFpYSTZDaUFnSUNBZ0lDQWdMU0JqYjIxdFlXNWtjem9LSUNBZ0lDQWdJQ0FnSUNBZ0xTQmxiR1Z0Wlc1MFlXd3RjbVZuYVhOMFpYSWdMUzFrWldKMVp5QXRMWEpsYzJWMENpQWdJQ0FnSUNBZ0lDQnBaam9nSjFzZ0xXWWdMM0oxYmk5amIzTXZjbVZqYjNabGNubGZiVzlrWlNCZEp3b2dJQ0FnSUNBZ0lDQWdibUZ0WlRvZ1VuVnVjeUJsYkdWdFpXNTBZV3dnY21WelpYUUsiLCJwYXRoIjoiL29lbS9yZXNldC1jbG91ZC1jb25maWcueWFtbCIsInBlcm1pc3Npb25zIjoiMDYwMCJ9XSwiaW5zdHJ1Y3Rpb25zIjpbeyJuYW1lIjoiY29uZmlndXJlIG5leHQgYm9vdCB0byByZWNvdmVyeSBtb2RlIiwiYXJncyI6WyIvb2VtL2dydWJlbnYiLCJzZXQiLCJuZXh0X2VudHJ5PXJlY292ZXJ5Il0sImNvbW1hbmQiOiJncnViMi1lZGl0ZW52In0seyJuYW1lIjoic2NoZWR1bGUgcmVib290IiwiYXJncyI6WyItciIsIisxIl0sImNvbW1hbmQiOiJzaHV0ZG93biJ9XX0K\n'})}),"\n",(0,o.jsxs)(n.p,{children:["The plan created by the ",(0,o.jsx)(n.code,{children:"elemental-operator"})," should contain the following instructions:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-json",children:'{\n "files": [\n // A cloud-init config file is created on the default /oem directory. \n // This config will be executed once in recovery mode.\n {\n "content": "bmFtZTogRWxlbWVudGFsIFJlc2V0CnN0YWdlczoKICAgIG5ldHdvcmsuYWZ0ZXI6CiAgICAgICAgLSBjb21tYW5kczoKICAgICAgICAgICAgLSBlbGVtZW50YWwtcmVnaXN0ZXIgLS1kZWJ1ZyAtLXJlc2V0CiAgICAgICAgICBpZjogJ1sgLWYgL3J1bi9jb3MvcmVjb3ZlcnlfbW9kZSBdJwogICAgICAgICAgbmFtZTogUnVucyBlbGVtZW50YWwgcmVzZXQK",\n "path": "/oem/reset-cloud-config.yaml",\n "permissions": "0600"\n }\n ],\n "instructions": [\n {\n "name": "configure next boot to recovery mode",\n "args": [\n "/oem/grubenv",\n "set",\n "next_entry=recovery"\n ],\n "command": "grub2-editenv"\n },\n {\n "name": "schedule reboot",\n "args": [\n "-r",\n "+1"\n ],\n "command": "shutdown"\n }\n ]\n}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["If the ",(0,o.jsx)(n.code,{children:"elemental-system-agent"})," successfully executed the plan, the ",(0,o.jsx)(n.code,{children:"machineinventory.elemental.cattle.io"})," finalizer on the ",(0,o.jsx)(n.code,{children:"MachineInventory"})," will be removed and the ",(0,o.jsx)(n.code,{children:"MachineInventory"})," will be deleted.",(0,o.jsx)(n.br,{}),"\n","Note that this is not an indication that the machine has been fully reset yet.",(0,o.jsx)(n.br,{}),"\n","This is a limitation of the current implementation and it will eventually improve, so that it will be possible to completely track the reset status."]}),"\n",(0,o.jsxs)(n.p,{children:["However, at this stage we do expect the host to undergo reboot, and reboot in recovery mode.",(0,o.jsx)(n.br,{}),"\n","Once in recovery mode, the ",(0,o.jsx)(n.code,{children:"cos-setup-network"})," should execute the cloud-init config that has been written on ",(0,o.jsx)(n.code,{children:"/oem/reset-cloud-config.yaml"}),".",(0,o.jsx)(n.br,{}),"\n","You can monitor the status with ",(0,o.jsx)(n.code,{children:"journalctl -u cos-setup-network -f"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"The cloud-init instructions should look like the following:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"name: Elemental Reset\nstages:\n network.after:\n - if: '[ -f /run/cos/recovery_mode ]'\n name: Runs elemental reset\n commands:\n - systemctl start elemental-register-reset\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"elemental-register"})," cli will register with the ",(0,o.jsx)(n.code,{children:"elemental-operator"})," as a new machine. This will lead to the creation of a new ",(0,o.jsx)(n.code,{children:"MachineInventory"})," object.",(0,o.jsx)(n.br,{}),"\n","The remote ",(0,o.jsx)(n.code,{children:"MachineRegistration"})," configuration will also be fetched to apply the reset options, for example ",(0,o.jsx)(n.code,{children:"reset-persistent"}),", ",(0,o.jsx)(n.code,{children:"reset-oem"}),", or the power settings, either ",(0,o.jsx)(n.code,{children:"reboot"})," or ",(0,o.jsx)(n.code,{children:"power-off"}),".",(0,o.jsx)(n.br,{}),"\n","After reset, depending on the settings, the machine should either shut down or reboot and be ready to be adopted within a new cluster."]}),"\n",(0,o.jsx)(n.h2,{id:"forcefully-deleting-a-machineinventory-undergoing-reset",children:"Forcefully deleting a MachineInventory undergoing reset"}),"\n",(0,o.jsxs)(n.p,{children:["If the machine is unable to execute the reset instructions and the related ",(0,o.jsx)(n.code,{children:"MachineInventory"})," is not deleted, there are two equivalent ways you can manually fix the issue."]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Remove the ",(0,o.jsx)(n.code,{children:'elemental.cattle.io/resettable: "true"'})," annotation from the ",(0,o.jsx)(n.code,{children:"MachineInventory"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Remove the ",(0,o.jsx)(n.code,{children:"machineinventory.elemental.cattle.io"})," finalizer from the ",(0,o.jsx)(n.code,{children:"MachineInventory"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Remember to also take care of the machine itself, by fully reprovisioning it or rebooting into recovery mode and using the ",(0,o.jsx)(n.code,{children:"elemental reset"})," command directly."]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>a});var o=t(7294);const i={},l=o.createContext(i);function a(e){const n=o.useContext(l);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),o.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/70b99476.0b97e05f.js b/assets/js/70b99476.0b97e05f.js deleted file mode 100644 index 26f310054..000000000 --- a/assets/js/70b99476.0b97e05f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8883],{9188:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>a,default:()=>d,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var r=t(5893),o=t(1151);const s={sidebar_label:"Restore",title:""},a="Troubleshooting restore",c={id:"troubleshooting-restore",title:"",description:"When a restore is performed, do not restart the rancher-system-agent on elemental nodes as it can stale and end with the following error:",source:"@site/versioned_docs/version-1.2/troubleshooting-restore.md",sourceDirName:".",slug:"/troubleshooting-restore",permalink:"/1.2/troubleshooting-restore",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Restore",title:""},sidebar:"docs",previous:{title:"Rancher upgrades",permalink:"/1.2/troubleshooting-rancher-upgrades"},next:{title:"Upgrade",permalink:"/1.2/troubleshooting-upgrade"}},i={},l=[];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",p:"p",pre:"pre",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"troubleshooting-restore",children:"Troubleshooting restore"}),"\n",(0,r.jsxs)(n.admonition,{title:"warning",type:"warning",children:[(0,r.jsxs)(n.p,{children:["When a restore is performed, do not restart the ",(0,r.jsx)(n.code,{children:"rancher-system-agent"})," on elemental nodes as it can stale and end with the following error:"]}),(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"panic: error while connecting to Kubernetes cluster: the server has asked for the client to provide credentials"})}),(0,r.jsx)(n.p,{children:"If you face this problem, please follow the procedure below."})]}),"\n",(0,r.jsxs)(n.p,{children:["Before you initiate a restore, you need to copy ",(0,r.jsx)(n.code,{children:"/var/lib/rancher/agent/rancher2_connection_info.json"})," from the elemental node to a place where you have access with Rancher UI."]}),"\n",(0,r.jsxs)(n.p,{children:["Once the file is copied, download the ",(0,r.jsx)(n.code,{children:"rancher-agent-token-update.sh"})," script from the ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/elemental",children:"Elemental repository"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://raw.githubusercontent.com/rancher/elemental/main/scripts/rancher-agent-token-update && chmod +x rancher-agent-token-update\n"})}),"\n",(0,r.jsx)(n.p,{children:"Execute the script without any additional options:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"./rancher-agent-token-update\n"})}),"\n",(0,r.jsxs)(n.p,{children:["After the restore successfully completed, copy ",(0,r.jsx)(n.code,{children:"rancher2_connection_info.json"})," back to the elemental node to the path\n",(0,r.jsx)(n.code,{children:"/var/lib/rancher/agent/rancher2_connection_info.json"}),". Finally, restart the ",(0,r.jsx)(n.code,{children:"rancher-system-agent"})," service:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"systemctl restart rancher-system-agent\n"})})]})}function d(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>a});var r=t(7294);const o={},s=r.createContext(o);function a(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/70b99476.31ab229c.js b/assets/js/70b99476.31ab229c.js new file mode 100644 index 000000000..3ff31df87 --- /dev/null +++ b/assets/js/70b99476.31ab229c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8883],{9188:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>d,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var r=n(5893),o=n(1151);const s={sidebar_label:"Restore",title:""},a="Troubleshooting restore",c={id:"troubleshooting-restore",title:"",description:"When a restore is performed, do not restart the rancher-system-agent on elemental nodes as it can stale and end with the following error:",source:"@site/versioned_docs/version-1.2/troubleshooting-restore.md",sourceDirName:".",slug:"/troubleshooting-restore",permalink:"/1.2/troubleshooting-restore",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Restore",title:""},sidebar:"docs",previous:{title:"Rancher upgrades",permalink:"/1.2/troubleshooting-rancher-upgrades"},next:{title:"Upgrade",permalink:"/1.2/troubleshooting-upgrade"}},i={},l=[];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",p:"p",pre:"pre",...(0,o.a)(),...e.components},{Head:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n,{children:(0,r.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/troubleshooting-restore"})}),"\n",(0,r.jsx)(t.h1,{id:"troubleshooting-restore",children:"Troubleshooting restore"}),"\n",(0,r.jsxs)(t.admonition,{title:"warning",type:"warning",children:[(0,r.jsxs)(t.p,{children:["When a restore is performed, do not restart the ",(0,r.jsx)(t.code,{children:"rancher-system-agent"})," on elemental nodes as it can stale and end with the following error:"]}),(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"panic: error while connecting to Kubernetes cluster: the server has asked for the client to provide credentials"})}),(0,r.jsx)(t.p,{children:"If you face this problem, please follow the procedure below."})]}),"\n",(0,r.jsxs)(t.p,{children:["Before you initiate a restore, you need to copy ",(0,r.jsx)(t.code,{children:"/var/lib/rancher/agent/rancher2_connection_info.json"})," from the elemental node to a place where you have access with Rancher UI."]}),"\n",(0,r.jsxs)(t.p,{children:["Once the file is copied, download the ",(0,r.jsx)(t.code,{children:"rancher-agent-token-update.sh"})," script from the ",(0,r.jsx)(t.a,{href:"https://github.com/rancher/elemental",children:"Elemental repository"}),":"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://raw.githubusercontent.com/rancher/elemental/main/scripts/rancher-agent-token-update && chmod +x rancher-agent-token-update\n"})}),"\n",(0,r.jsx)(t.p,{children:"Execute the script without any additional options:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"./rancher-agent-token-update\n"})}),"\n",(0,r.jsxs)(t.p,{children:["After the restore successfully completed, copy ",(0,r.jsx)(t.code,{children:"rancher2_connection_info.json"})," back to the elemental node to the path\n",(0,r.jsx)(t.code,{children:"/var/lib/rancher/agent/rancher2_connection_info.json"}),". Finally, restart the ",(0,r.jsx)(t.code,{children:"rancher-system-agent"})," service:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"systemctl restart rancher-system-agent\n"})})]})}function d(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>a});var r=n(7294);const o={},s=r.createContext(o);function a(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/72c75985.a1c9f42c.js b/assets/js/72c75985.a1c9f42c.js deleted file mode 100644 index 1e654c758..000000000 --- a/assets/js/72c75985.a1c9f42c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[5713],{9288:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>s,metadata:()=>l,toc:()=>d});var a=t(5893),r=t(1151);const s={sidebar_label:"Upgrade",title:""},o="Troubleshooting upgrade",l={id:"troubleshooting-upgrade",title:"",description:"Upgrade Flow",source:"@site/docs/troubleshooting-upgrade.md",sourceDirName:".",slug:"/troubleshooting-upgrade",permalink:"/next/troubleshooting-upgrade",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Upgrade",title:""},sidebar:"docs",previous:{title:"Restore",permalink:"/next/troubleshooting-restore"},next:{title:"Reset",permalink:"/next/troubleshooting-reset"}},i={},d=[{value:"Rancher side",id:"rancher-side",level:2},{value:"Elemental Cluster side",id:"elemental-cluster-side",level:2}];function c(e){const n={admonition:"admonition",br:"br",code:"code",h1:"h1",h2:"h2",img:"img",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components},{Details:s}=n;return s||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"troubleshooting-upgrade",children:"Troubleshooting upgrade"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"Upgrade Flow",src:t(4558).Z+"",width:"883",height:"831"})}),"\n",(0,a.jsx)(n.p,{children:"For a high level overview of the upgrade workflow, please refer to the image above."}),"\n",(0,a.jsx)(n.h2,{id:"rancher-side",children:"Rancher side"}),"\n",(0,a.jsx)(n.p,{children:"In this example we upgraded the cluster nodes with the following ManagedOSImage definition:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to or track the latest tag\n osImage: "registry.suse.com/rancher/elemental-teal/5.4:latest"\n clusterTargets:\n - clusterName: my-cluster\n'})}),"\n",(0,a.jsxs)(n.p,{children:["Once the ",(0,a.jsx)(n.code,{children:"ManagedOSImage"})," is applied, the ",(0,a.jsx)(n.code,{children:"elemental-operator"})," will verify it and generate a related ",(0,a.jsx)(n.code,{children:"Bundle"}),".",(0,a.jsx)(n.br,{}),"\n","The ",(0,a.jsx)(n.code,{children:"Bundle"})," name will be prefixed with ",(0,a.jsx)(n.code,{children:"mos"})," and then the ",(0,a.jsx)(n.code,{children:"ManagedOSImage"})," name. In this case ",(0,a.jsx)(n.code,{children:"mos-my-upgrade"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["In the ",(0,a.jsx)(n.code,{children:"Bundle"})," definition, you will find the details about the upgrade plan and the desired target.",(0,a.jsx)(n.br,{}),"\n","For example:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n fleet-default get bundle mos-my-upgrade -o yaml\n"})}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Example"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: fleet.cattle.io/v1alpha1\nkind: Bundle\nmetadata:\n creationTimestamp: "2023-06-16T09:01:47Z"\n generation: 1\n name: mos-my-upgrade\n namespace: fleet-default\n ownerReferences:\n - apiVersion: elemental.cattle.io/v1beta1\n controller: true\n kind: ManagedOSImage\n name: my-upgrade\n uid: e468ed21-23bb-487a-a022-dbc7ef753720\n resourceVersion: "1038645"\n uid: 35e83fc4-28c8-4b10-8059-cae6cdff2cda\nspec:\n resources:\n - content: \'{"kind":"ClusterRole","apiVersion":"rbac.authorization.k8s.io/v1","metadata":{"name":"os-upgrader-my-upgrade","creationTimestamp":null},"rules":[{"verbs":["update","get","list","watch","patch"],"apiGroups":[""],"resources":["nodes"]},{"verbs":["list"],"apiGroups":[""],"resources":["pods"]}]}\'\n name: ClusterRole--os-upgrader-my-upgrade-296a3abf3451.yaml\n - content: \'{"kind":"ClusterRoleBinding","apiVersion":"rbac.authorization.k8s.io/v1","metadata":{"name":"os-upgrader-my-upgrade","creationTimestamp":null},"subjects":[{"kind":"ServiceAccount","name":"os-upgrader-my-upgrade","namespace":"cattle-system"}],"roleRef":{"apiGroup":"rbac.authorization.k8s.io","kind":"ClusterRole","name":"os-upgrader-my-upgrade"}}\'\n name: ClusterRoleBinding--os-upgrader-my-upgrade-f63eaecde935.yaml\n - content: \'{"kind":"ServiceAccount","apiVersion":"v1","metadata":{"name":"os-upgrader-my-upgrade","namespace":"cattle-system","creationTimestamp":null}}\'\n name: ServiceAccount-cattle-system-os-upgrader-my-upgrade-ce93d-01096.yaml\n - content: \'{"kind":"Secret","apiVersion":"v1","metadata":{"name":"os-upgrader-my-upgrade","namespace":"cattle-system","creationTimestamp":null},"data":{"cloud-config":""}}\'\n name: Secret-cattle-system-os-upgrader-my-upgrade-a997ee6a67ef.yaml\n - content: \'{"kind":"Plan","apiVersion":"upgrade.cattle.io/v1","metadata":{"name":"os-upgrader-my-upgrade","namespace":"cattle-system","creationTimestamp":null},"spec":{"concurrency":1,"nodeSelector":{},"serviceAccountName":"os-upgrader-my-upgrade","version":"latest","secrets":[{"name":"os-upgrader-my-upgrade","path":"/run/data"}],"tolerations":[{"operator":"Exists"}],"cordon":true,"upgrade":{"image":"registry.suse.com/rancher/elemental-teal/5.4","command":["/usr/sbin/suc-upgrade"]}},"status":{}}\'\n name: Plan-cattle-system-os-upgrader-my-upgrade-273c2c09afca.yaml\n targets:\n - clusterName: my-cluster\n.\n.\n.\n'})})]}),"\n",(0,a.jsx)(n.h2,{id:"elemental-cluster-side",children:"Elemental Cluster side"}),"\n",(0,a.jsxs)(n.p,{children:["Any Elemental Teal node correctly registered and part of the target cluster will fetch the bundle and start applying it.",(0,a.jsx)(n.br,{}),"\n","This operation is performed by the Rancher's ",(0,a.jsx)(n.code,{children:"system-upgrade-controller"})," running on the Elemental Cluster.",(0,a.jsx)(n.br,{}),"\n","To monitor the correct operation of this controller, you can read its logs:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system logs deployment/system-upgrade-controller\n"})}),"\n",(0,a.jsxs)(n.p,{children:["If everything is correct, the ",(0,a.jsx)(n.code,{children:"system-upgrade-controller"})," will create an upgrade job for each targeted machine.",(0,a.jsx)(n.br,{}),"\n","The job names will use the Plan name (",(0,a.jsx)(n.code,{children:"os-upgrader-my-upgrade"}),") and the target machine hostname (",(0,a.jsx)(n.code,{children:"my-host"}),") for easy discoverability.",(0,a.jsx)(n.br,{}),"\n","For example: ",(0,a.jsx)(n.code,{children:"apply-os-upgrader-my-upgrade-on-my-host-7a25e"}),(0,a.jsx)(n.br,{}),"\n","You can monitor these jobs with:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system get jobs\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Each job will use a ",(0,a.jsx)(n.code,{children:"privileged: true"})," container with the Elemental Teal image specified in the ",(0,a.jsx)(n.code,{children:"ManagedOSImage"})," definition. This container will try to upgrade the system and perform a reboot."]}),"\n",(0,a.jsx)(n.p,{children:"If the job fails, you can check its status by examining the logs:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system logs job.batch/apply-os-upgrader-my-upgrade-on-my-host-7a25e\n"})}),"\n",(0,a.jsxs)(n.admonition,{title:"Two stages job process",type:"info",children:[(0,a.jsxs)(n.p,{children:["Note that the upgrade process is performed in two stages.",(0,a.jsx)(n.br,{}),"\n","You will notice that the same job is ran twice and the first one ends with the ",(0,a.jsx)(n.code,{children:"Uknown"})," Status and will not complete.",(0,a.jsx)(n.br,{}),"\n",(0,a.jsx)(n.strong,{children:"This is to be expected"}),", as Elemental Teal relies on the job to be ran again after the machine restarts, so that it can verify the new version was installed correctly.",(0,a.jsx)(n.br,{}),"\n","You will notice a second run of the job, this time completing correctly."]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system get jobs \nNAMESPACE NAME COMPLETIONS DURATION AGE\ncattle-system apply-os-upgrader-my-upgrade-on-my-host-0b392 1/1 2m34s 6m23s\ncattle-system apply-os-upgrader-my-upgrade-on-my-host-7a25e 0/1 6m23s 6m23s\n"})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system get pods \nNAME READY STATUS RESTARTS AGE\napply-os-upgrader-my-upgrade-on-my-host-zbkrh 0/1 Completed 0 9m40s\napply-os-upgrader-my-upgrade-on-my-host-zvrff 0/1 Unknown 0 12m\n"})})]})]})}function m(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},4558:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/troubleshooting-upgrade-d04ebc28593991d53a8c0e59bb2a666b.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>o});var a=t(7294);const r={},s=a.createContext(r);function o(e){const n=a.useContext(s);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),a.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/72c75985.e28c9fa5.js b/assets/js/72c75985.e28c9fa5.js new file mode 100644 index 000000000..12e5370d1 --- /dev/null +++ b/assets/js/72c75985.e28c9fa5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[5713],{9288:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>s,metadata:()=>l,toc:()=>c});var a=t(5893),r=t(1151);const s={sidebar_label:"Upgrade",title:""},o="Troubleshooting upgrade",l={id:"troubleshooting-upgrade",title:"",description:"Upgrade Flow",source:"@site/docs/troubleshooting-upgrade.md",sourceDirName:".",slug:"/troubleshooting-upgrade",permalink:"/next/troubleshooting-upgrade",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Upgrade",title:""},sidebar:"docs",previous:{title:"Restore",permalink:"/next/troubleshooting-restore"},next:{title:"Reset",permalink:"/next/troubleshooting-reset"}},i={},c=[{value:"Rancher side",id:"rancher-side",level:2},{value:"Elemental Cluster side",id:"elemental-cluster-side",level:2}];function d(e){const n={admonition:"admonition",br:"br",code:"code",h1:"h1",h2:"h2",img:"img",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components},{Details:s,Head:o}=n;return s||u("Details",!0),o||u("Head",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o,{children:(0,a.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/troubleshooting-upgrade"})}),"\n",(0,a.jsx)(n.h1,{id:"troubleshooting-upgrade",children:"Troubleshooting upgrade"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"Upgrade Flow",src:t(4558).Z+"",width:"883",height:"831"})}),"\n",(0,a.jsx)(n.p,{children:"For a high level overview of the upgrade workflow, please refer to the image above."}),"\n",(0,a.jsx)(n.h2,{id:"rancher-side",children:"Rancher side"}),"\n",(0,a.jsx)(n.p,{children:"In this example we upgraded the cluster nodes with the following ManagedOSImage definition:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to or track the latest tag\n osImage: "registry.suse.com/rancher/elemental-teal/5.4:latest"\n clusterTargets:\n - clusterName: my-cluster\n'})}),"\n",(0,a.jsxs)(n.p,{children:["Once the ",(0,a.jsx)(n.code,{children:"ManagedOSImage"})," is applied, the ",(0,a.jsx)(n.code,{children:"elemental-operator"})," will verify it and generate a related ",(0,a.jsx)(n.code,{children:"Bundle"}),".",(0,a.jsx)(n.br,{}),"\n","The ",(0,a.jsx)(n.code,{children:"Bundle"})," name will be prefixed with ",(0,a.jsx)(n.code,{children:"mos"})," and then the ",(0,a.jsx)(n.code,{children:"ManagedOSImage"})," name. In this case ",(0,a.jsx)(n.code,{children:"mos-my-upgrade"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["In the ",(0,a.jsx)(n.code,{children:"Bundle"})," definition, you will find the details about the upgrade plan and the desired target.",(0,a.jsx)(n.br,{}),"\n","For example:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n fleet-default get bundle mos-my-upgrade -o yaml\n"})}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Example"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: fleet.cattle.io/v1alpha1\nkind: Bundle\nmetadata:\n creationTimestamp: "2023-06-16T09:01:47Z"\n generation: 1\n name: mos-my-upgrade\n namespace: fleet-default\n ownerReferences:\n - apiVersion: elemental.cattle.io/v1beta1\n controller: true\n kind: ManagedOSImage\n name: my-upgrade\n uid: e468ed21-23bb-487a-a022-dbc7ef753720\n resourceVersion: "1038645"\n uid: 35e83fc4-28c8-4b10-8059-cae6cdff2cda\nspec:\n resources:\n - content: \'{"kind":"ClusterRole","apiVersion":"rbac.authorization.k8s.io/v1","metadata":{"name":"os-upgrader-my-upgrade","creationTimestamp":null},"rules":[{"verbs":["update","get","list","watch","patch"],"apiGroups":[""],"resources":["nodes"]},{"verbs":["list"],"apiGroups":[""],"resources":["pods"]}]}\'\n name: ClusterRole--os-upgrader-my-upgrade-296a3abf3451.yaml\n - content: \'{"kind":"ClusterRoleBinding","apiVersion":"rbac.authorization.k8s.io/v1","metadata":{"name":"os-upgrader-my-upgrade","creationTimestamp":null},"subjects":[{"kind":"ServiceAccount","name":"os-upgrader-my-upgrade","namespace":"cattle-system"}],"roleRef":{"apiGroup":"rbac.authorization.k8s.io","kind":"ClusterRole","name":"os-upgrader-my-upgrade"}}\'\n name: ClusterRoleBinding--os-upgrader-my-upgrade-f63eaecde935.yaml\n - content: \'{"kind":"ServiceAccount","apiVersion":"v1","metadata":{"name":"os-upgrader-my-upgrade","namespace":"cattle-system","creationTimestamp":null}}\'\n name: ServiceAccount-cattle-system-os-upgrader-my-upgrade-ce93d-01096.yaml\n - content: \'{"kind":"Secret","apiVersion":"v1","metadata":{"name":"os-upgrader-my-upgrade","namespace":"cattle-system","creationTimestamp":null},"data":{"cloud-config":""}}\'\n name: Secret-cattle-system-os-upgrader-my-upgrade-a997ee6a67ef.yaml\n - content: \'{"kind":"Plan","apiVersion":"upgrade.cattle.io/v1","metadata":{"name":"os-upgrader-my-upgrade","namespace":"cattle-system","creationTimestamp":null},"spec":{"concurrency":1,"nodeSelector":{},"serviceAccountName":"os-upgrader-my-upgrade","version":"latest","secrets":[{"name":"os-upgrader-my-upgrade","path":"/run/data"}],"tolerations":[{"operator":"Exists"}],"cordon":true,"upgrade":{"image":"registry.suse.com/rancher/elemental-teal/5.4","command":["/usr/sbin/suc-upgrade"]}},"status":{}}\'\n name: Plan-cattle-system-os-upgrader-my-upgrade-273c2c09afca.yaml\n targets:\n - clusterName: my-cluster\n.\n.\n.\n'})})]}),"\n",(0,a.jsx)(n.h2,{id:"elemental-cluster-side",children:"Elemental Cluster side"}),"\n",(0,a.jsxs)(n.p,{children:["Any Elemental Teal node correctly registered and part of the target cluster will fetch the bundle and start applying it.",(0,a.jsx)(n.br,{}),"\n","This operation is performed by the Rancher's ",(0,a.jsx)(n.code,{children:"system-upgrade-controller"})," running on the Elemental Cluster.",(0,a.jsx)(n.br,{}),"\n","To monitor the correct operation of this controller, you can read its logs:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system logs deployment/system-upgrade-controller\n"})}),"\n",(0,a.jsxs)(n.p,{children:["If everything is correct, the ",(0,a.jsx)(n.code,{children:"system-upgrade-controller"})," will create an upgrade job for each targeted machine.",(0,a.jsx)(n.br,{}),"\n","The job names will use the Plan name (",(0,a.jsx)(n.code,{children:"os-upgrader-my-upgrade"}),") and the target machine hostname (",(0,a.jsx)(n.code,{children:"my-host"}),") for easy discoverability.",(0,a.jsx)(n.br,{}),"\n","For example: ",(0,a.jsx)(n.code,{children:"apply-os-upgrader-my-upgrade-on-my-host-7a25e"}),(0,a.jsx)(n.br,{}),"\n","You can monitor these jobs with:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system get jobs\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Each job will use a ",(0,a.jsx)(n.code,{children:"privileged: true"})," container with the Elemental Teal image specified in the ",(0,a.jsx)(n.code,{children:"ManagedOSImage"})," definition. This container will try to upgrade the system and perform a reboot."]}),"\n",(0,a.jsx)(n.p,{children:"If the job fails, you can check its status by examining the logs:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system logs job.batch/apply-os-upgrader-my-upgrade-on-my-host-7a25e\n"})}),"\n",(0,a.jsxs)(n.admonition,{title:"Two stages job process",type:"info",children:[(0,a.jsxs)(n.p,{children:["Note that the upgrade process is performed in two stages.",(0,a.jsx)(n.br,{}),"\n","You will notice that the same job is ran twice and the first one ends with the ",(0,a.jsx)(n.code,{children:"Uknown"})," Status and will not complete.",(0,a.jsx)(n.br,{}),"\n",(0,a.jsx)(n.strong,{children:"This is to be expected"}),", as Elemental Teal relies on the job to be ran again after the machine restarts, so that it can verify the new version was installed correctly.",(0,a.jsx)(n.br,{}),"\n","You will notice a second run of the job, this time completing correctly."]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system get jobs \nNAMESPACE NAME COMPLETIONS DURATION AGE\ncattle-system apply-os-upgrader-my-upgrade-on-my-host-0b392 1/1 2m34s 6m23s\ncattle-system apply-os-upgrader-my-upgrade-on-my-host-7a25e 0/1 6m23s 6m23s\n"})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl -n cattle-system get pods \nNAME READY STATUS RESTARTS AGE\napply-os-upgrader-my-upgrade-on-my-host-zbkrh 0/1 Completed 0 9m40s\napply-os-upgrader-my-upgrade-on-my-host-zvrff 0/1 Unknown 0 12m\n"})})]})]})}function m(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}function u(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},4558:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/troubleshooting-upgrade-d04ebc28593991d53a8c0e59bb2a666b.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>o});var a=t(7294);const r={},s=a.createContext(r);function o(e){const n=a.useContext(s);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),a.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/76faf03d.0a6be094.js b/assets/js/76faf03d.0a6be094.js deleted file mode 100644 index e3c99a79c..000000000 --- a/assets/js/76faf03d.0a6be094.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4793],{9740:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var o=t(5893),l=t(1151),r=t(2070);const i={sidebar_label:"Cluster reference",title:""},s="Cluster reference",a={id:"cluster-reference",title:"",description:"A Cluster definition includes a kubernetesVersion and a list of machinePools to deploy the cluster to.",source:"@site/versioned_docs/version-1.3/cluster-reference.md",sourceDirName:".",slug:"/cluster-reference",permalink:"/cluster-reference",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Cluster reference",title:""},sidebar:"docs",previous:{title:"MachineInventorySelectorTemplate reference",permalink:"/machineinventoryselectortemplate-reference"},next:{title:"SeedImage reference",permalink:"/seedimage-reference"}},c={},d=[{value:"rkeConfig.machinePools",id:"rkeconfigmachinepools",level:2},{value:"machinePools Spec Reference",id:"machinepools-spec-reference",level:2},{value:"machineConfigRef Spec Reference",id:"machineconfigref-spec-reference",level:2},{value:"Example",id:"example",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,l.a)(),...e.components},{CodeBlock:t,Details:i}=n;return t||p("CodeBlock",!0),i||p("Details",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"cluster-reference",children:"Cluster reference"}),"\n",(0,o.jsxs)(n.p,{children:["A ",(0,o.jsx)(n.code,{children:"Cluster"})," definition includes a ",(0,o.jsx)(n.code,{children:"kubernetesVersion"})," and a list of ",(0,o.jsx)(n.code,{children:"machinePools"})," to deploy the cluster to."]}),"\n",(0,o.jsxs)(n.p,{children:["For how to select a ",(0,o.jsx)(n.code,{children:"kubernetesVersion"})," please check our ",(0,o.jsx)(n.a,{href:"/kubernetesversions",children:"Kubernetes Versions"})," page."]}),"\n",(0,o.jsxs)(n.p,{children:["A ",(0,o.jsx)(n.code,{children:"machinePool"})," is a bundle of configuration with a ",(0,o.jsx)(n.code,{children:"ObjectReference"})," so the cluster is deployed to those ",(0,o.jsx)(n.code,{children:"machinePools"}),"\nwith the proper roles (etcd, control-plane, worker) with a quantity (how many nodes to deploy from this pool) and some extra configurations (rolling update config, max unhealthy nodes, etc...)."]}),"\n",(0,o.jsxs)(i,{children:[(0,o.jsx)("summary",{children:"Example"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: ...\n namespace: ...\nspec:\n rkeConfig:\n machinePools:\n - name: ...\n controlPlaneRole: ...\n etcdRole: ...\n workerRole: ...\n quantity: ...\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: ...\n - name: ...\n controlPlaneRole: ...\n etcdRole: ...\n workerRole: ...\n quantity: ...\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: ...\n"})})]}),"\n",(0,o.jsxs)(n.p,{children:["It's also possible to disable cluster components via the ",(0,o.jsx)(n.code,{children:"Cluster"})," object in ",(0,o.jsx)(n.code,{children:"spec.rkeConfig.machineGlobalConfig"}),", for example:"]}),"\n",(0,o.jsxs)(i,{children:[(0,o.jsx)("summary",{children:"Service Disabling Example"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: ...\n namespace: ...\nspec:\n rkeConfig:\n machinePools:\n - name: ...\n controlPlaneRole: ...\n etcdRole: ...\n workerRole: ...\n quantity: ...\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: ...\n machineGlobalConfig:\n disable:\n - servicelb\n - ...\n"})})]}),"\n",(0,o.jsx)(n.h2,{id:"rkeconfigmachinepools",children:"rkeConfig.machinePools"}),"\n",(0,o.jsxs)(n.p,{children:["A list of ",(0,o.jsx)(n.code,{children:"machinePools"}),". A minimum of 1 ",(0,o.jsx)(n.code,{children:"machinePools"})," is required for the cluster to be deployed to."]}),"\n",(0,o.jsx)(n.h2,{id:"machinepools-spec-reference",children:"machinePools Spec Reference"}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Key"}),(0,o.jsx)(n.th,{children:"Type"}),(0,o.jsx)(n.th,{children:"Default value"}),(0,o.jsx)(n.th,{children:"Description"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"controlPlaneRole"}),(0,o.jsx)(n.td,{children:"bool"}),(0,o.jsx)(n.td,{children:"false"}),(0,o.jsx)(n.td,{children:"Set machines in this pool as control-plane"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"etcdRole"}),(0,o.jsx)(n.td,{children:"bool"}),(0,o.jsx)(n.td,{children:"false"}),(0,o.jsx)(n.td,{children:"Set machines in this pool as etcd"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"workerRole"}),(0,o.jsx)(n.td,{children:"bool"}),(0,o.jsx)(n.td,{children:"false"}),(0,o.jsx)(n.td,{children:"Set machines in this pool as worker"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"name"}),(0,o.jsx)(n.td,{children:"string"}),(0,o.jsx)(n.td,{children:"nil"}),(0,o.jsx)(n.td,{children:"Name for this pool"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"quantity"}),(0,o.jsx)(n.td,{children:"int"}),(0,o.jsx)(n.td,{children:"nil"}),(0,o.jsx)(n.td,{children:"Number of machines to deploy from this pool"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"unhealthyNodeTimeout"}),(0,o.jsx)(n.td,{children:"int"}),(0,o.jsx)(n.td,{children:"nil"}),(0,o.jsx)(n.td,{children:"Timeout for unhealthy node health checks"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"machineConfigRef"}),(0,o.jsx)(n.td,{children:"int"}),(0,o.jsx)(n.td,{children:"ObjectReference"}),(0,o.jsx)(n.td,{children:"Reference to an object used to know what nodes are part of this pool"})]})]})]}),"\n",(0,o.jsxs)(n.p,{children:["A minimum of ",(0,o.jsx)(n.code,{children:"quantity"})," set to one is required for this pool to be used.\nBasically translates to how many nodes from this pool are going to be setup for this cluster."]}),"\n",(0,o.jsxs)(i,{children:[(0,o.jsx)("summary",{children:"Example"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: cluster-example\n namespace: example-default\nspec:\n rkeConfig:\n machinePools:\n - name: examplePool \n controlPlaneRole: true\n etcdRole: true\n workerRole: false\n quantity: 3\n unhealthyNodeTimeout: 0s\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: exampleSelector\n"})})]}),"\n",(0,o.jsx)(n.h2,{id:"machineconfigref-spec-reference",children:"machineConfigRef Spec Reference"}),"\n",(0,o.jsxs)(n.p,{children:["A ",(0,o.jsx)(n.code,{children:"machineConfigRef"})," is a generic k8s ",(0,o.jsx)(n.code,{children:"ObjectReference"})," which usually contain a\n",(0,o.jsx)(n.code,{children:"kind"})," ",(0,o.jsx)(n.code,{children:"name"})," and ",(0,o.jsx)(n.code,{children:"apiVersion"})," to point to a different object."]}),"\n",(0,o.jsxs)(n.p,{children:["In Elemental, we set this to a ",(0,o.jsx)(n.a,{href:"/machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate"}),".\nThis allows us to point to more than one object by using the selector."]}),"\n",(0,o.jsx)(n.h3,{id:"example",children:"Example"}),"\n",(0,o.jsxs)(n.p,{children:["The example below creates a cluster that uses 2 different ",(0,o.jsx)(n.code,{children:"machinePool"}),"'s to set different nodes to control-plane and workers nodes,\nbased on 2 different ",(0,o.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," that select their nodes based on a ",(0,o.jsx)(n.code,{children:"MachineInventory"})," label (location):"]}),"\n",(0,o.jsxs)(n.admonition,{title:"warning",type:"warning",children:[(0,o.jsx)(n.p,{children:"The labels for the example are manual set labels, they are not set by Elemental automatically.."}),(0,o.jsxs)(n.p,{children:["For automatic labels generated by Elemental please check the ",(0,o.jsx)(n.a,{href:"/smbios",children:"SMBIOS"})," page."]})]}),"\n",(0,o.jsx)(t,{language:"yaml",title:"Example of a cluster with more than one machinePool",showLineNumbers:!0,children:r.Z})]})}function m(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}function p(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},2070:(e,n,t)=>{t.d(n,{Z:()=>o});const o="kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: cluster-machinepools\n namespace: fleet-default\nspec:\n rkeConfig:\n machinePools:\n - name: controlPlanePool\n controlPlaneRole: true\n etcdRole: true\n workerRole: false\n quantity: 3\n unhealthyNodeTimeout: 0s\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: selectorControlPlanes\n - name: workersPool\n controlPlaneRole: false\n etcdRole: false\n workerRole: true\n quantity: 1\n unhealthyNodeTimeout: 0s\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: selectorWorkers\n kubernetesVersion: v1.23.7+k3s1\n---\napiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: selectorControlPlanes\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n matchLabels:\n location: server-room-1\n---\napiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: selectorWorkers\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n matchLabels:\n location: server-room-2"},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>i});var o=t(7294);const l={},r=o.createContext(l);function i(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/76faf03d.4bb09eca.js b/assets/js/76faf03d.4bb09eca.js new file mode 100644 index 000000000..2c0b81bd2 --- /dev/null +++ b/assets/js/76faf03d.4bb09eca.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4793],{9740:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var o=t(5893),l=t(1151),r=t(2070);const i={sidebar_label:"Cluster reference",title:""},s="Cluster reference",a={id:"cluster-reference",title:"",description:"A Cluster definition includes a kubernetesVersion and a list of machinePools to deploy the cluster to.",source:"@site/versioned_docs/version-1.3/cluster-reference.md",sourceDirName:".",slug:"/cluster-reference",permalink:"/cluster-reference",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Cluster reference",title:""},sidebar:"docs",previous:{title:"MachineInventorySelectorTemplate reference",permalink:"/machineinventoryselectortemplate-reference"},next:{title:"SeedImage reference",permalink:"/seedimage-reference"}},c={},d=[{value:"rkeConfig.machinePools",id:"rkeconfigmachinepools",level:2},{value:"machinePools Spec Reference",id:"machinepools-spec-reference",level:2},{value:"machineConfigRef Spec Reference",id:"machineconfigref-spec-reference",level:2},{value:"Example",id:"example",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,l.a)(),...e.components},{CodeBlock:t,Details:i,Head:s}=n;return t||p("CodeBlock",!0),i||p("Details",!0),s||p("Head",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s,{children:(0,o.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/cluster-reference"})}),"\n","\n","\n",(0,o.jsx)(n.h1,{id:"cluster-reference",children:"Cluster reference"}),"\n",(0,o.jsxs)(n.p,{children:["A ",(0,o.jsx)(n.code,{children:"Cluster"})," definition includes a ",(0,o.jsx)(n.code,{children:"kubernetesVersion"})," and a list of ",(0,o.jsx)(n.code,{children:"machinePools"})," to deploy the cluster to."]}),"\n",(0,o.jsxs)(n.p,{children:["For how to select a ",(0,o.jsx)(n.code,{children:"kubernetesVersion"})," please check our ",(0,o.jsx)(n.a,{href:"/kubernetesversions",children:"Kubernetes Versions"})," page."]}),"\n",(0,o.jsxs)(n.p,{children:["A ",(0,o.jsx)(n.code,{children:"machinePool"})," is a bundle of configuration with a ",(0,o.jsx)(n.code,{children:"ObjectReference"})," so the cluster is deployed to those ",(0,o.jsx)(n.code,{children:"machinePools"}),"\nwith the proper roles (etcd, control-plane, worker) with a quantity (how many nodes to deploy from this pool) and some extra configurations (rolling update config, max unhealthy nodes, etc...)."]}),"\n",(0,o.jsxs)(i,{children:[(0,o.jsx)("summary",{children:"Example"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: ...\n namespace: ...\nspec:\n rkeConfig:\n machinePools:\n - name: ...\n controlPlaneRole: ...\n etcdRole: ...\n workerRole: ...\n quantity: ...\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: ...\n - name: ...\n controlPlaneRole: ...\n etcdRole: ...\n workerRole: ...\n quantity: ...\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: ...\n"})})]}),"\n",(0,o.jsxs)(n.p,{children:["It's also possible to disable cluster components via the ",(0,o.jsx)(n.code,{children:"Cluster"})," object in ",(0,o.jsx)(n.code,{children:"spec.rkeConfig.machineGlobalConfig"}),", for example:"]}),"\n",(0,o.jsxs)(i,{children:[(0,o.jsx)("summary",{children:"Service Disabling Example"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: ...\n namespace: ...\nspec:\n rkeConfig:\n machinePools:\n - name: ...\n controlPlaneRole: ...\n etcdRole: ...\n workerRole: ...\n quantity: ...\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: ...\n machineGlobalConfig:\n disable:\n - servicelb\n - ...\n"})})]}),"\n",(0,o.jsx)(n.h2,{id:"rkeconfigmachinepools",children:"rkeConfig.machinePools"}),"\n",(0,o.jsxs)(n.p,{children:["A list of ",(0,o.jsx)(n.code,{children:"machinePools"}),". A minimum of 1 ",(0,o.jsx)(n.code,{children:"machinePools"})," is required for the cluster to be deployed to."]}),"\n",(0,o.jsx)(n.h2,{id:"machinepools-spec-reference",children:"machinePools Spec Reference"}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Key"}),(0,o.jsx)(n.th,{children:"Type"}),(0,o.jsx)(n.th,{children:"Default value"}),(0,o.jsx)(n.th,{children:"Description"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"controlPlaneRole"}),(0,o.jsx)(n.td,{children:"bool"}),(0,o.jsx)(n.td,{children:"false"}),(0,o.jsx)(n.td,{children:"Set machines in this pool as control-plane"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"etcdRole"}),(0,o.jsx)(n.td,{children:"bool"}),(0,o.jsx)(n.td,{children:"false"}),(0,o.jsx)(n.td,{children:"Set machines in this pool as etcd"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"workerRole"}),(0,o.jsx)(n.td,{children:"bool"}),(0,o.jsx)(n.td,{children:"false"}),(0,o.jsx)(n.td,{children:"Set machines in this pool as worker"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"name"}),(0,o.jsx)(n.td,{children:"string"}),(0,o.jsx)(n.td,{children:"nil"}),(0,o.jsx)(n.td,{children:"Name for this pool"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"quantity"}),(0,o.jsx)(n.td,{children:"int"}),(0,o.jsx)(n.td,{children:"nil"}),(0,o.jsx)(n.td,{children:"Number of machines to deploy from this pool"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"unhealthyNodeTimeout"}),(0,o.jsx)(n.td,{children:"int"}),(0,o.jsx)(n.td,{children:"nil"}),(0,o.jsx)(n.td,{children:"Timeout for unhealthy node health checks"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"machineConfigRef"}),(0,o.jsx)(n.td,{children:"int"}),(0,o.jsx)(n.td,{children:"ObjectReference"}),(0,o.jsx)(n.td,{children:"Reference to an object used to know what nodes are part of this pool"})]})]})]}),"\n",(0,o.jsxs)(n.p,{children:["A minimum of ",(0,o.jsx)(n.code,{children:"quantity"})," set to one is required for this pool to be used.\nBasically translates to how many nodes from this pool are going to be setup for this cluster."]}),"\n",(0,o.jsxs)(i,{children:[(0,o.jsx)("summary",{children:"Example"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: cluster-example\n namespace: example-default\nspec:\n rkeConfig:\n machinePools:\n - name: examplePool \n controlPlaneRole: true\n etcdRole: true\n workerRole: false\n quantity: 3\n unhealthyNodeTimeout: 0s\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: exampleSelector\n"})})]}),"\n",(0,o.jsx)(n.h2,{id:"machineconfigref-spec-reference",children:"machineConfigRef Spec Reference"}),"\n",(0,o.jsxs)(n.p,{children:["A ",(0,o.jsx)(n.code,{children:"machineConfigRef"})," is a generic k8s ",(0,o.jsx)(n.code,{children:"ObjectReference"})," which usually contain a\n",(0,o.jsx)(n.code,{children:"kind"})," ",(0,o.jsx)(n.code,{children:"name"})," and ",(0,o.jsx)(n.code,{children:"apiVersion"})," to point to a different object."]}),"\n",(0,o.jsxs)(n.p,{children:["In Elemental, we set this to a ",(0,o.jsx)(n.a,{href:"/machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate"}),".\nThis allows us to point to more than one object by using the selector."]}),"\n",(0,o.jsx)(n.h3,{id:"example",children:"Example"}),"\n",(0,o.jsxs)(n.p,{children:["The example below creates a cluster that uses 2 different ",(0,o.jsx)(n.code,{children:"machinePool"}),"'s to set different nodes to control-plane and workers nodes,\nbased on 2 different ",(0,o.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," that select their nodes based on a ",(0,o.jsx)(n.code,{children:"MachineInventory"})," label (location):"]}),"\n",(0,o.jsxs)(n.admonition,{title:"warning",type:"warning",children:[(0,o.jsx)(n.p,{children:"The labels for the example are manual set labels, they are not set by Elemental automatically.."}),(0,o.jsxs)(n.p,{children:["For automatic labels generated by Elemental please check the ",(0,o.jsx)(n.a,{href:"/smbios",children:"SMBIOS"})," page."]})]}),"\n",(0,o.jsx)(t,{language:"yaml",title:"Example of a cluster with more than one machinePool",showLineNumbers:!0,children:r.Z})]})}function m(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}function p(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},2070:(e,n,t)=>{t.d(n,{Z:()=>o});const o="kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: cluster-machinepools\n namespace: fleet-default\nspec:\n rkeConfig:\n machinePools:\n - name: controlPlanePool\n controlPlaneRole: true\n etcdRole: true\n workerRole: false\n quantity: 3\n unhealthyNodeTimeout: 0s\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: selectorControlPlanes\n - name: workersPool\n controlPlaneRole: false\n etcdRole: false\n workerRole: true\n quantity: 1\n unhealthyNodeTimeout: 0s\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: selectorWorkers\n kubernetesVersion: v1.23.7+k3s1\n---\napiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: selectorControlPlanes\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n matchLabels:\n location: server-room-1\n---\napiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: selectorWorkers\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n matchLabels:\n location: server-room-2"},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>i});var o=t(7294);const l={},r=o.createContext(l);function i(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7f011206.0f957a55.js b/assets/js/7f011206.0f957a55.js deleted file mode 100644 index 294d78692..000000000 --- a/assets/js/7f011206.0f957a55.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7844],{5861:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>d});var r=n(5893),s=n(1151);const a={sidebar_label:"SeedImage reference",title:""},o="SeedImage reference",i={id:"seedimage-reference",title:"",description:"A SeedImage resource allows to build an ISO that can be used to install Elemental onto a node.",source:"@site/docs/seedimage-reference.md",sourceDirName:".",slug:"/seedimage-reference",permalink:"/next/seedimage-reference",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"SeedImage reference",title:""},sidebar:"docs",previous:{title:"Cluster reference",permalink:"/next/cluster-reference"},next:{title:"Elemental Operator Helm Chart",permalink:"/next/elementaloperatorchart-reference"}},c={},d=[];function l(e){const t={admonition:"admonition",br:"br",code:"code",em:"em",h1:"h1",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components},{Details:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"seedimage-reference",children:"SeedImage reference"}),"\n",(0,r.jsxs)(t.p,{children:["A ",(0,r.jsx)(t.code,{children:"SeedImage"})," resource allows to build an ISO that can be used to install Elemental onto a node.",(0,r.jsx)(t.br,{}),"\n","It requires a ",(0,r.jsx)(t.code,{children:"baseImage"}),", i.e., a URL to an Elemental installation ISO, and a ",(0,r.jsx)(t.code,{children:"registrationRef"})," reference to a ",(0,r.jsx)(t.code,{children:"MachineRegistration"})," resource, from which the registration part of the Elemental configuration is extracted and injected in the ISO to produce the final ",(0,r.jsx)(t.em,{children:"seed image"}),".",(0,r.jsx)(t.br,{}),"\n","It is also possible to inject ISO customizations in the ",(0,r.jsx)(t.code,{children:"cloud-config"})," field."]}),"\n",(0,r.jsxs)(t.p,{children:["Once the seed image is ready, the download URL is shared in the ",(0,r.jsx)(t.code,{children:".status.downloadURL"})," field.\nIt stays available for download for ",(0,r.jsx)(t.code,{children:"cleanupAfterMinutes"})," minutes (default is ",(0,r.jsx)(t.code,{children:"60"}),", 1 hour), after which it is deleted.",(0,r.jsx)(t.br,{}),"\n","Setting ",(0,r.jsx)(t.code,{children:"retriggerBuild"})," to ",(0,r.jsx)(t.code,{children:"true"})," retriggers the seed image build process while setting ",(0,r.jsx)(t.code,{children:"cleanupAfterMinutes"})," to ",(0,r.jsx)(t.code,{children:"0"})," keeps the seed image around till the ",(0,r.jsx)(t.code,{children:"SeedImage"})," resource is deleted."]}),"\n",(0,r.jsx)(t.admonition,{title:"seed images may fill up local storage",type:"warning",children:(0,r.jsxs)(t.p,{children:["The seed images are kept on the node's local storage: pay attention to the number of ",(0,r.jsx)(t.code,{children:"SeedImage"})," resources you start concurrently and to the ones you may leave around with the auto-cleanup feature disabled (",(0,r.jsx)(t.code,{children:"cleanupAfterMinutes"})," = ",(0,r.jsx)(t.code,{children:"0"}),") as you may exhaust the storage on your cluster nodes."]})}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.code,{children:"SeedImage"})," resource tracks the seed image build process through two status conditions:"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Ready"}),": tracks the creation of all the required child resources that perform the actual build process."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"SeedImageReady"}),": tracks the status of the build process in the child resources."]}),"\n"]}),"\n",(0,r.jsxs)(n,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: SeedImage\nmetadata:\n name: ...\n namespace: ...\nspec:\n baseImage: ...\n cloud-config: ...\n registrationRef:\n name: ...\n namespace: ...\n cleanupAfterMinutes: ...\n retriggerBuild: ...\n"})})]})]})}function u(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>i,a:()=>o});var r=n(7294);const s={},a=r.createContext(s);function o(e){const t=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7f011206.bb1c2c22.js b/assets/js/7f011206.bb1c2c22.js new file mode 100644 index 000000000..4ac1ca795 --- /dev/null +++ b/assets/js/7f011206.bb1c2c22.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7844],{5861:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>d});var r=t(5893),s=t(1151);const a={sidebar_label:"SeedImage reference",title:""},o="SeedImage reference",i={id:"seedimage-reference",title:"",description:"A SeedImage resource allows to build an ISO that can be used to install Elemental onto a node.",source:"@site/docs/seedimage-reference.md",sourceDirName:".",slug:"/seedimage-reference",permalink:"/next/seedimage-reference",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"SeedImage reference",title:""},sidebar:"docs",previous:{title:"Cluster reference",permalink:"/next/cluster-reference"},next:{title:"Elemental Operator Helm Chart",permalink:"/next/elementaloperatorchart-reference"}},c={},d=[];function l(e){const n={admonition:"admonition",br:"br",code:"code",em:"em",h1:"h1",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components},{Details:t,Head:a}=n;return t||u("Details",!0),a||u("Head",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(a,{children:(0,r.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/seedimage-reference"})}),"\n",(0,r.jsx)(n.h1,{id:"seedimage-reference",children:"SeedImage reference"}),"\n",(0,r.jsxs)(n.p,{children:["A ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource allows to build an ISO that can be used to install Elemental onto a node.",(0,r.jsx)(n.br,{}),"\n","It requires a ",(0,r.jsx)(n.code,{children:"baseImage"}),", i.e., a URL to an Elemental installation ISO, and a ",(0,r.jsx)(n.code,{children:"registrationRef"})," reference to a ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," resource, from which the registration part of the Elemental configuration is extracted and injected in the ISO to produce the final ",(0,r.jsx)(n.em,{children:"seed image"}),".",(0,r.jsx)(n.br,{}),"\n","It is also possible to inject ISO customizations in the ",(0,r.jsx)(n.code,{children:"cloud-config"})," field."]}),"\n",(0,r.jsxs)(n.p,{children:["Once the seed image is ready, the download URL is shared in the ",(0,r.jsx)(n.code,{children:".status.downloadURL"})," field.\nIt stays available for download for ",(0,r.jsx)(n.code,{children:"cleanupAfterMinutes"})," minutes (default is ",(0,r.jsx)(n.code,{children:"60"}),", 1 hour), after which it is deleted.",(0,r.jsx)(n.br,{}),"\n","Setting ",(0,r.jsx)(n.code,{children:"retriggerBuild"})," to ",(0,r.jsx)(n.code,{children:"true"})," retriggers the seed image build process while setting ",(0,r.jsx)(n.code,{children:"cleanupAfterMinutes"})," to ",(0,r.jsx)(n.code,{children:"0"})," keeps the seed image around till the ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource is deleted."]}),"\n",(0,r.jsx)(n.admonition,{title:"seed images may fill up local storage",type:"warning",children:(0,r.jsxs)(n.p,{children:["The seed images are kept on the node's local storage: pay attention to the number of ",(0,r.jsx)(n.code,{children:"SeedImage"})," resources you start concurrently and to the ones you may leave around with the auto-cleanup feature disabled (",(0,r.jsx)(n.code,{children:"cleanupAfterMinutes"})," = ",(0,r.jsx)(n.code,{children:"0"}),") as you may exhaust the storage on your cluster nodes."]})}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource tracks the seed image build process through two status conditions:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Ready"}),": tracks the creation of all the required child resources that perform the actual build process."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"SeedImageReady"}),": tracks the status of the build process in the child resources."]}),"\n"]}),"\n",(0,r.jsxs)(t,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: SeedImage\nmetadata:\n name: ...\n namespace: ...\nspec:\n baseImage: ...\n cloud-config: ...\n registrationRef:\n name: ...\n namespace: ...\n cleanupAfterMinutes: ...\n retriggerBuild: ...\n"})})]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}function u(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,n,t)=>{t.d(n,{Z:()=>i,a:()=>o});var r=t(7294);const s={},a=r.createContext(s);function o(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/807ea154.6f3e93e5.js b/assets/js/807ea154.6f3e93e5.js new file mode 100644 index 000000000..e3bc49b5a --- /dev/null +++ b/assets/js/807ea154.6f3e93e5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6625],{4146:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>a,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var o=t(5893),i=t(1151);const l={sidebar_label:"Reset",title:""},a="Troubleshooting reset",s={id:"troubleshooting-reset",title:"",description:'Each MachineInventory with the elemental.cattle.io/resettable: "true" annotation will trigger the execution of a reset plan, upon deletion.',source:"@site/versioned_docs/version-1.3/troubleshooting-reset.md",sourceDirName:".",slug:"/troubleshooting-reset",permalink:"/troubleshooting-reset",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Reset",title:""},sidebar:"docs",previous:{title:"Upgrade",permalink:"/troubleshooting-upgrade"},next:{title:"Release Notes",permalink:"/release-notes"}},r={},c=[{value:"Forcefully deleting a MachineInventory undergoing reset",id:"forcefully-deleting-a-machineinventory-undergoing-reset",level:2}];function d(e){const n={br:"br",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components},{Head:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t,{children:(0,o.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/troubleshooting-reset"})}),"\n",(0,o.jsx)(n.h1,{id:"troubleshooting-reset",children:"Troubleshooting reset"}),"\n",(0,o.jsxs)(n.p,{children:["Each ",(0,o.jsx)(n.code,{children:"MachineInventory"})," with the ",(0,o.jsx)(n.code,{children:'elemental.cattle.io/resettable: "true"'})," annotation will trigger the execution of a reset plan, upon deletion.",(0,o.jsx)(n.br,{}),"\n","The ",(0,o.jsx)(n.code,{children:"machineinventory.elemental.cattle.io"})," finalizer is going to be removed only after the plan has been executed successfully by the ",(0,o.jsx)(n.code,{children:"elemental-system-agent"})," running on the machine."]}),"\n",(0,o.jsxs)(n.p,{children:["You can investigate why a ",(0,o.jsx)(n.code,{children:"MachineInventory"})," has not been deleted yet, by examining it:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventory\nmetadata:\n # deletionTimestamp has been set. This object has been marked for deletion.\n deletionTimestamp: "2023-08-04T08:41:25Z"\n annotations:\n # `resettable` annotation is enabled.\n # This means the machine has to go through reset, before deletion of this object.\n elemental.cattle.io/resettable: "true"\n # `machineinventory.elemental.cattle.io` finalizer is set.\n # The `elemental-operator` is going to create a reset plan for the machine to execute.\n # After successful execution of the reset plan, the finalizer is removed and the object will be deleted.\n finalizers:\n - machineinventory.elemental.cattle.io\nstatus:\n conditions:\n # Most recent condition shows that the MachineInventory is waiting for a plan to be applied.\n - lastTransitionTime: "2023-08-04T08:41:25Z"\n message: waiting for plan to be applied\n reason: WaitingForPlan\n status: "False"\n type: Ready\n # The plan to be executed is referenced. \n # Normally it has the same name of the MachineInventory and lives within the same namespace. \n plan:\n checksum: 5aba8b6b3161bc52d8953b2428e54ecda3b59e8e0043b49d761d1e79174eded6\n secretRef:\n name: m-bf1008a1-61d6-4355-b5f5-f7d1c527affe\n namespace: fleet-default\n'})}),"\n",(0,o.jsxs)(n.p,{children:["You can also examine the referenced plan ",(0,o.jsx)(n.code,{children:"Secret"}),".",(0,o.jsx)(n.br,{}),"\n","Note that the ",(0,o.jsx)(n.code,{children:"elemental-system-agent"})," running on the machine is watching this secret and it should execute the plan.",(0,o.jsx)(n.br,{}),"\n","You can also monitor its progress from the machine logs: ",(0,o.jsx)(n.code,{children:"journalctl -u elemental-system-agent -f"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'apiVersion: v1\nkind: Secret\n# This is a `elemental.cattle.io/plan` secret plan.\ntype: elemental.cattle.io/plan\nmetadata:\n annotations:\n # This is a `reset` plan type.\n elemental.cattle.io/plan.type: reset\n labels:\n elemental.cattle.io/managed: "true"\n name: m-bf1008a1-61d6-4355-b5f5-f7d1c527affe\n namespace: fleet-default\n # It is owned by the `MachineInventory` waiting for deletion.\n ownerReferences:\n - apiVersion: elemental.cattle.io/v1beta1\n controller: true\n kind: MachineInventory\n name: m-bf1008a1-61d6-4355-b5f5-f7d1c527affe\n uid: 5aa3863c-63a5-4cb9-91fd-7a45191d4842\ndata:\n # The plan has not been applied yet.\n applied-checksum: ""\n # It also hasn\'t failed.\n failed-checksum: ""\n # The actual plan to be executed, base64 encoded.\n plan: eyJmaWxlcyI6W3siY29udGVudCI6ImJtRnRaVG9nUld4bGJXVnVkR0ZzSUZKbGMyVjBDbk4wWVdkbGN6b0tJQ0FnSUc1bGRIZHZjbXN1WVdaMFpYSTZDaUFnSUNBZ0lDQWdMU0JqYjIxdFlXNWtjem9LSUNBZ0lDQWdJQ0FnSUNBZ0xTQmxiR1Z0Wlc1MFlXd3RjbVZuYVhOMFpYSWdMUzFrWldKMVp5QXRMWEpsYzJWMENpQWdJQ0FnSUNBZ0lDQnBaam9nSjFzZ0xXWWdMM0oxYmk5amIzTXZjbVZqYjNabGNubGZiVzlrWlNCZEp3b2dJQ0FnSUNBZ0lDQWdibUZ0WlRvZ1VuVnVjeUJsYkdWdFpXNTBZV3dnY21WelpYUUsiLCJwYXRoIjoiL29lbS9yZXNldC1jbG91ZC1jb25maWcueWFtbCIsInBlcm1pc3Npb25zIjoiMDYwMCJ9XSwiaW5zdHJ1Y3Rpb25zIjpbeyJuYW1lIjoiY29uZmlndXJlIG5leHQgYm9vdCB0byByZWNvdmVyeSBtb2RlIiwiYXJncyI6WyIvb2VtL2dydWJlbnYiLCJzZXQiLCJuZXh0X2VudHJ5PXJlY292ZXJ5Il0sImNvbW1hbmQiOiJncnViMi1lZGl0ZW52In0seyJuYW1lIjoic2NoZWR1bGUgcmVib290IiwiYXJncyI6WyItciIsIisxIl0sImNvbW1hbmQiOiJzaHV0ZG93biJ9XX0K\n'})}),"\n",(0,o.jsxs)(n.p,{children:["The plan created by the ",(0,o.jsx)(n.code,{children:"elemental-operator"})," should contain the following instructions:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-json",children:'{\n "files": [\n // A cloud-init config file is created on the default /oem directory. \n // This config will be executed once in recovery mode.\n {\n "content": "bmFtZTogRWxlbWVudGFsIFJlc2V0CnN0YWdlczoKICAgIG5ldHdvcmsuYWZ0ZXI6CiAgICAgICAgLSBjb21tYW5kczoKICAgICAgICAgICAgLSBlbGVtZW50YWwtcmVnaXN0ZXIgLS1kZWJ1ZyAtLXJlc2V0CiAgICAgICAgICBpZjogJ1sgLWYgL3J1bi9jb3MvcmVjb3ZlcnlfbW9kZSBdJwogICAgICAgICAgbmFtZTogUnVucyBlbGVtZW50YWwgcmVzZXQK",\n "path": "/oem/reset-cloud-config.yaml",\n "permissions": "0600"\n }\n ],\n "instructions": [\n {\n "name": "configure next boot to recovery mode",\n "args": [\n "/oem/grubenv",\n "set",\n "next_entry=recovery"\n ],\n "command": "grub2-editenv"\n },\n {\n "name": "schedule reboot",\n "args": [\n "-r",\n "+1"\n ],\n "command": "shutdown"\n }\n ]\n}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["If the ",(0,o.jsx)(n.code,{children:"elemental-system-agent"})," successfully executed the plan, the ",(0,o.jsx)(n.code,{children:"machineinventory.elemental.cattle.io"})," finalizer on the ",(0,o.jsx)(n.code,{children:"MachineInventory"})," will be removed and the ",(0,o.jsx)(n.code,{children:"MachineInventory"})," will be deleted.",(0,o.jsx)(n.br,{}),"\n","Note that this is not an indication that the machine has been fully reset yet.",(0,o.jsx)(n.br,{}),"\n","This is a limitation of the current implementation and it will eventually improve, so that it will be possible to completely track the reset status."]}),"\n",(0,o.jsxs)(n.p,{children:["However, at this stage we do expect the host to undergo reboot, and reboot in recovery mode.",(0,o.jsx)(n.br,{}),"\n","Once in recovery mode, the ",(0,o.jsx)(n.code,{children:"cos-setup-network"})," should execute the cloud-init config that has been written on ",(0,o.jsx)(n.code,{children:"/oem/reset-cloud-config.yaml"}),".",(0,o.jsx)(n.br,{}),"\n","You can monitor the status with ",(0,o.jsx)(n.code,{children:"journalctl -u cos-setup-network -f"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"The cloud-init instructions should look like the following:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"name: Elemental Reset\nstages:\n network.after:\n - if: '[ -f /run/cos/recovery_mode ]'\n name: Runs elemental reset\n commands:\n - systemctl start elemental-register-reset\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"elemental-register"})," cli will register with the ",(0,o.jsx)(n.code,{children:"elemental-operator"})," as a new machine. This will lead to the creation of a new ",(0,o.jsx)(n.code,{children:"MachineInventory"})," object.",(0,o.jsx)(n.br,{}),"\n","The remote ",(0,o.jsx)(n.code,{children:"MachineRegistration"})," configuration will also be fetched to apply the reset options, for example ",(0,o.jsx)(n.code,{children:"reset-persistent"}),", ",(0,o.jsx)(n.code,{children:"reset-oem"}),", or the power settings, either ",(0,o.jsx)(n.code,{children:"reboot"})," or ",(0,o.jsx)(n.code,{children:"power-off"}),".",(0,o.jsx)(n.br,{}),"\n","After reset, depending on the settings, the machine should either shut down or reboot and be ready to be adopted within a new cluster."]}),"\n",(0,o.jsx)(n.h2,{id:"forcefully-deleting-a-machineinventory-undergoing-reset",children:"Forcefully deleting a MachineInventory undergoing reset"}),"\n",(0,o.jsxs)(n.p,{children:["If the machine is unable to execute the reset instructions and the related ",(0,o.jsx)(n.code,{children:"MachineInventory"})," is not deleted, there are two equivalent ways you can manually fix the issue."]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Remove the ",(0,o.jsx)(n.code,{children:'elemental.cattle.io/resettable: "true"'})," annotation from the ",(0,o.jsx)(n.code,{children:"MachineInventory"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Remove the ",(0,o.jsx)(n.code,{children:"machineinventory.elemental.cattle.io"})," finalizer from the ",(0,o.jsx)(n.code,{children:"MachineInventory"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Remember to also take care of the machine itself, by fully reprovisioning it or rebooting into recovery mode and using the ",(0,o.jsx)(n.code,{children:"elemental reset"})," command directly."]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>a});var o=t(7294);const i={},l=o.createContext(i);function a(e){const n=o.useContext(l);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),o.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/807ea154.7ff7d588.js b/assets/js/807ea154.7ff7d588.js deleted file mode 100644 index 8b123f5a1..000000000 --- a/assets/js/807ea154.7ff7d588.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6625],{4146:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>a,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var o=t(5893),i=t(1151);const l={sidebar_label:"Reset",title:""},a="Troubleshooting reset",s={id:"troubleshooting-reset",title:"",description:'Each MachineInventory with the elemental.cattle.io/resettable: "true" annotation will trigger the execution of a reset plan, upon deletion.',source:"@site/versioned_docs/version-1.3/troubleshooting-reset.md",sourceDirName:".",slug:"/troubleshooting-reset",permalink:"/troubleshooting-reset",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Reset",title:""},sidebar:"docs",previous:{title:"Upgrade",permalink:"/troubleshooting-upgrade"},next:{title:"Release Notes",permalink:"/release-notes"}},r={},c=[{value:"Forcefully deleting a MachineInventory undergoing reset",id:"forcefully-deleting-a-machineinventory-undergoing-reset",level:2}];function d(e){const n={br:"br",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"troubleshooting-reset",children:"Troubleshooting reset"}),"\n",(0,o.jsxs)(n.p,{children:["Each ",(0,o.jsx)(n.code,{children:"MachineInventory"})," with the ",(0,o.jsx)(n.code,{children:'elemental.cattle.io/resettable: "true"'})," annotation will trigger the execution of a reset plan, upon deletion.",(0,o.jsx)(n.br,{}),"\n","The ",(0,o.jsx)(n.code,{children:"machineinventory.elemental.cattle.io"})," finalizer is going to be removed only after the plan has been executed successfully by the ",(0,o.jsx)(n.code,{children:"elemental-system-agent"})," running on the machine."]}),"\n",(0,o.jsxs)(n.p,{children:["You can investigate why a ",(0,o.jsx)(n.code,{children:"MachineInventory"})," has not been deleted yet, by examining it:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventory\nmetadata:\n # deletionTimestamp has been set. This object has been marked for deletion.\n deletionTimestamp: "2023-08-04T08:41:25Z"\n annotations:\n # `resettable` annotation is enabled.\n # This means the machine has to go through reset, before deletion of this object.\n elemental.cattle.io/resettable: "true"\n # `machineinventory.elemental.cattle.io` finalizer is set.\n # The `elemental-operator` is going to create a reset plan for the machine to execute.\n # After successful execution of the reset plan, the finalizer is removed and the object will be deleted.\n finalizers:\n - machineinventory.elemental.cattle.io\nstatus:\n conditions:\n # Most recent condition shows that the MachineInventory is waiting for a plan to be applied.\n - lastTransitionTime: "2023-08-04T08:41:25Z"\n message: waiting for plan to be applied\n reason: WaitingForPlan\n status: "False"\n type: Ready\n # The plan to be executed is referenced. \n # Normally it has the same name of the MachineInventory and lives within the same namespace. \n plan:\n checksum: 5aba8b6b3161bc52d8953b2428e54ecda3b59e8e0043b49d761d1e79174eded6\n secretRef:\n name: m-bf1008a1-61d6-4355-b5f5-f7d1c527affe\n namespace: fleet-default\n'})}),"\n",(0,o.jsxs)(n.p,{children:["You can also examine the referenced plan ",(0,o.jsx)(n.code,{children:"Secret"}),".",(0,o.jsx)(n.br,{}),"\n","Note that the ",(0,o.jsx)(n.code,{children:"elemental-system-agent"})," running on the machine is watching this secret and it should execute the plan.",(0,o.jsx)(n.br,{}),"\n","You can also monitor its progress from the machine logs: ",(0,o.jsx)(n.code,{children:"journalctl -u elemental-system-agent -f"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'apiVersion: v1\nkind: Secret\n# This is a `elemental.cattle.io/plan` secret plan.\ntype: elemental.cattle.io/plan\nmetadata:\n annotations:\n # This is a `reset` plan type.\n elemental.cattle.io/plan.type: reset\n labels:\n elemental.cattle.io/managed: "true"\n name: m-bf1008a1-61d6-4355-b5f5-f7d1c527affe\n namespace: fleet-default\n # It is owned by the `MachineInventory` waiting for deletion.\n ownerReferences:\n - apiVersion: elemental.cattle.io/v1beta1\n controller: true\n kind: MachineInventory\n name: m-bf1008a1-61d6-4355-b5f5-f7d1c527affe\n uid: 5aa3863c-63a5-4cb9-91fd-7a45191d4842\ndata:\n # The plan has not been applied yet.\n applied-checksum: ""\n # It also hasn\'t failed.\n failed-checksum: ""\n # The actual plan to be executed, base64 encoded.\n plan: eyJmaWxlcyI6W3siY29udGVudCI6ImJtRnRaVG9nUld4bGJXVnVkR0ZzSUZKbGMyVjBDbk4wWVdkbGN6b0tJQ0FnSUc1bGRIZHZjbXN1WVdaMFpYSTZDaUFnSUNBZ0lDQWdMU0JqYjIxdFlXNWtjem9LSUNBZ0lDQWdJQ0FnSUNBZ0xTQmxiR1Z0Wlc1MFlXd3RjbVZuYVhOMFpYSWdMUzFrWldKMVp5QXRMWEpsYzJWMENpQWdJQ0FnSUNBZ0lDQnBaam9nSjFzZ0xXWWdMM0oxYmk5amIzTXZjbVZqYjNabGNubGZiVzlrWlNCZEp3b2dJQ0FnSUNBZ0lDQWdibUZ0WlRvZ1VuVnVjeUJsYkdWdFpXNTBZV3dnY21WelpYUUsiLCJwYXRoIjoiL29lbS9yZXNldC1jbG91ZC1jb25maWcueWFtbCIsInBlcm1pc3Npb25zIjoiMDYwMCJ9XSwiaW5zdHJ1Y3Rpb25zIjpbeyJuYW1lIjoiY29uZmlndXJlIG5leHQgYm9vdCB0byByZWNvdmVyeSBtb2RlIiwiYXJncyI6WyIvb2VtL2dydWJlbnYiLCJzZXQiLCJuZXh0X2VudHJ5PXJlY292ZXJ5Il0sImNvbW1hbmQiOiJncnViMi1lZGl0ZW52In0seyJuYW1lIjoic2NoZWR1bGUgcmVib290IiwiYXJncyI6WyItciIsIisxIl0sImNvbW1hbmQiOiJzaHV0ZG93biJ9XX0K\n'})}),"\n",(0,o.jsxs)(n.p,{children:["The plan created by the ",(0,o.jsx)(n.code,{children:"elemental-operator"})," should contain the following instructions:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-json",children:'{\n "files": [\n // A cloud-init config file is created on the default /oem directory. \n // This config will be executed once in recovery mode.\n {\n "content": "bmFtZTogRWxlbWVudGFsIFJlc2V0CnN0YWdlczoKICAgIG5ldHdvcmsuYWZ0ZXI6CiAgICAgICAgLSBjb21tYW5kczoKICAgICAgICAgICAgLSBlbGVtZW50YWwtcmVnaXN0ZXIgLS1kZWJ1ZyAtLXJlc2V0CiAgICAgICAgICBpZjogJ1sgLWYgL3J1bi9jb3MvcmVjb3ZlcnlfbW9kZSBdJwogICAgICAgICAgbmFtZTogUnVucyBlbGVtZW50YWwgcmVzZXQK",\n "path": "/oem/reset-cloud-config.yaml",\n "permissions": "0600"\n }\n ],\n "instructions": [\n {\n "name": "configure next boot to recovery mode",\n "args": [\n "/oem/grubenv",\n "set",\n "next_entry=recovery"\n ],\n "command": "grub2-editenv"\n },\n {\n "name": "schedule reboot",\n "args": [\n "-r",\n "+1"\n ],\n "command": "shutdown"\n }\n ]\n}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["If the ",(0,o.jsx)(n.code,{children:"elemental-system-agent"})," successfully executed the plan, the ",(0,o.jsx)(n.code,{children:"machineinventory.elemental.cattle.io"})," finalizer on the ",(0,o.jsx)(n.code,{children:"MachineInventory"})," will be removed and the ",(0,o.jsx)(n.code,{children:"MachineInventory"})," will be deleted.",(0,o.jsx)(n.br,{}),"\n","Note that this is not an indication that the machine has been fully reset yet.",(0,o.jsx)(n.br,{}),"\n","This is a limitation of the current implementation and it will eventually improve, so that it will be possible to completely track the reset status."]}),"\n",(0,o.jsxs)(n.p,{children:["However, at this stage we do expect the host to undergo reboot, and reboot in recovery mode.",(0,o.jsx)(n.br,{}),"\n","Once in recovery mode, the ",(0,o.jsx)(n.code,{children:"cos-setup-network"})," should execute the cloud-init config that has been written on ",(0,o.jsx)(n.code,{children:"/oem/reset-cloud-config.yaml"}),".",(0,o.jsx)(n.br,{}),"\n","You can monitor the status with ",(0,o.jsx)(n.code,{children:"journalctl -u cos-setup-network -f"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"The cloud-init instructions should look like the following:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"name: Elemental Reset\nstages:\n network.after:\n - if: '[ -f /run/cos/recovery_mode ]'\n name: Runs elemental reset\n commands:\n - systemctl start elemental-register-reset\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"elemental-register"})," cli will register with the ",(0,o.jsx)(n.code,{children:"elemental-operator"})," as a new machine. This will lead to the creation of a new ",(0,o.jsx)(n.code,{children:"MachineInventory"})," object.",(0,o.jsx)(n.br,{}),"\n","The remote ",(0,o.jsx)(n.code,{children:"MachineRegistration"})," configuration will also be fetched to apply the reset options, for example ",(0,o.jsx)(n.code,{children:"reset-persistent"}),", ",(0,o.jsx)(n.code,{children:"reset-oem"}),", or the power settings, either ",(0,o.jsx)(n.code,{children:"reboot"})," or ",(0,o.jsx)(n.code,{children:"power-off"}),".",(0,o.jsx)(n.br,{}),"\n","After reset, depending on the settings, the machine should either shut down or reboot and be ready to be adopted within a new cluster."]}),"\n",(0,o.jsx)(n.h2,{id:"forcefully-deleting-a-machineinventory-undergoing-reset",children:"Forcefully deleting a MachineInventory undergoing reset"}),"\n",(0,o.jsxs)(n.p,{children:["If the machine is unable to execute the reset instructions and the related ",(0,o.jsx)(n.code,{children:"MachineInventory"})," is not deleted, there are two equivalent ways you can manually fix the issue."]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Remove the ",(0,o.jsx)(n.code,{children:'elemental.cattle.io/resettable: "true"'})," annotation from the ",(0,o.jsx)(n.code,{children:"MachineInventory"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Remove the ",(0,o.jsx)(n.code,{children:"machineinventory.elemental.cattle.io"})," finalizer from the ",(0,o.jsx)(n.code,{children:"MachineInventory"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Remember to also take care of the machine itself, by fully reprovisioning it or rebooting into recovery mode and using the ",(0,o.jsx)(n.code,{children:"elemental reset"})," command directly."]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>a});var o=t(7294);const i={},l=o.createContext(i);function a(e){const n=o.useContext(l);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),o.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/82d729f6.0cd8c1ba.js b/assets/js/82d729f6.0cd8c1ba.js new file mode 100644 index 000000000..2cd558089 --- /dev/null +++ b/assets/js/82d729f6.0cd8c1ba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[827],{4271:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var o=t(5893),l=t(1151),r=t(2070);const i={sidebar_label:"Cluster reference",title:""},s="Cluster reference",a={id:"cluster-reference",title:"",description:"A Cluster definition includes a kubernetesVersion and a list of machinePools to deploy the cluster to.",source:"@site/versioned_docs/version-1.2/cluster-reference.md",sourceDirName:".",slug:"/cluster-reference",permalink:"/1.2/cluster-reference",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Cluster reference",title:""},sidebar:"docs",previous:{title:"MachineInventorySelectorTemplate reference",permalink:"/1.2/machineinventoryselectortemplate-reference"},next:{title:"SeedImage reference",permalink:"/1.2/seedimage-reference"}},c={},d=[{value:"rkeConfig.machinePools",id:"rkeconfigmachinepools",level:2},{value:"machinePools Spec Reference",id:"machinepools-spec-reference",level:2},{value:"machineConfigRef Spec Reference",id:"machineconfigref-spec-reference",level:2},{value:"Example",id:"example",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,l.a)(),...e.components},{CodeBlock:t,Details:i,Head:s}=n;return t||p("CodeBlock",!0),i||p("Details",!0),s||p("Head",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s,{children:(0,o.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/cluster-reference"})}),"\n","\n","\n",(0,o.jsx)(n.h1,{id:"cluster-reference",children:"Cluster reference"}),"\n",(0,o.jsxs)(n.p,{children:["A ",(0,o.jsx)(n.code,{children:"Cluster"})," definition includes a ",(0,o.jsx)(n.code,{children:"kubernetesVersion"})," and a list of ",(0,o.jsx)(n.code,{children:"machinePools"})," to deploy the cluster to."]}),"\n",(0,o.jsxs)(n.p,{children:["For how to select a ",(0,o.jsx)(n.code,{children:"kubernetesVersion"})," please check our ",(0,o.jsx)(n.a,{href:"/1.2/kubernetesversions",children:"Kubernetes Versions"})," page."]}),"\n",(0,o.jsxs)(n.p,{children:["A ",(0,o.jsx)(n.code,{children:"machinePool"})," is a bundle of configuration with a ",(0,o.jsx)(n.code,{children:"ObjectReference"})," so the cluster is deployed to those ",(0,o.jsx)(n.code,{children:"machinePools"}),"\nwith the proper roles (etcd, control-plane, worker) with a quantity (how many nodes to deploy from this pool) and some extra configurations (rolling update config, max unhealthy nodes, etc...)."]}),"\n",(0,o.jsxs)(i,{children:[(0,o.jsx)("summary",{children:"Example"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: ...\n namespace: ...\nspec:\n rkeConfig:\n machinePools:\n - name: ...\n controlPlaneRole: ...\n etcdRole: ...\n workerRole: ...\n quantity: ...\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: ...\n - name: ...\n controlPlaneRole: ...\n etcdRole: ...\n workerRole: ...\n quantity: ...\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: ...\n"})})]}),"\n",(0,o.jsxs)(n.p,{children:["It's also possible to disable cluster components via the ",(0,o.jsx)(n.code,{children:"Cluster"})," object in ",(0,o.jsx)(n.code,{children:"spec.rkeConfig.machineGlobalConfig"}),", for example:"]}),"\n",(0,o.jsxs)(i,{children:[(0,o.jsx)("summary",{children:"Service Disabling Example"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: ...\n namespace: ...\nspec:\n rkeConfig:\n machinePools:\n - name: ...\n controlPlaneRole: ...\n etcdRole: ...\n workerRole: ...\n quantity: ...\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: ...\n machineGlobalConfig:\n disable:\n - servicelb\n - ...\n"})})]}),"\n",(0,o.jsx)(n.h2,{id:"rkeconfigmachinepools",children:"rkeConfig.machinePools"}),"\n",(0,o.jsxs)(n.p,{children:["A list of ",(0,o.jsx)(n.code,{children:"machinePools"}),". A minimum of 1 ",(0,o.jsx)(n.code,{children:"machinePools"})," is required for the cluster to be deployed to."]}),"\n",(0,o.jsx)(n.h2,{id:"machinepools-spec-reference",children:"machinePools Spec Reference"}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Key"}),(0,o.jsx)(n.th,{children:"Type"}),(0,o.jsx)(n.th,{children:"Default value"}),(0,o.jsx)(n.th,{children:"Description"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"controlPlaneRole"}),(0,o.jsx)(n.td,{children:"bool"}),(0,o.jsx)(n.td,{children:"false"}),(0,o.jsx)(n.td,{children:"Set machines in this pool as control-plane"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"etcdRole"}),(0,o.jsx)(n.td,{children:"bool"}),(0,o.jsx)(n.td,{children:"false"}),(0,o.jsx)(n.td,{children:"Set machines in this pool as etcd"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"workerRole"}),(0,o.jsx)(n.td,{children:"bool"}),(0,o.jsx)(n.td,{children:"false"}),(0,o.jsx)(n.td,{children:"Set machines in this pool as worker"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"name"}),(0,o.jsx)(n.td,{children:"string"}),(0,o.jsx)(n.td,{children:"nil"}),(0,o.jsx)(n.td,{children:"Name for this pool"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"quantity"}),(0,o.jsx)(n.td,{children:"int"}),(0,o.jsx)(n.td,{children:"nil"}),(0,o.jsx)(n.td,{children:"Number of machines to deploy from this pool"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"unhealthyNodeTimeout"}),(0,o.jsx)(n.td,{children:"int"}),(0,o.jsx)(n.td,{children:"nil"}),(0,o.jsx)(n.td,{children:"Timeout for unhealthy node health checks"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"machineConfigRef"}),(0,o.jsx)(n.td,{children:"int"}),(0,o.jsx)(n.td,{children:"ObjectReference"}),(0,o.jsx)(n.td,{children:"Reference to an object used to know what nodes are part of this pool"})]})]})]}),"\n",(0,o.jsxs)(n.p,{children:["A minimum of ",(0,o.jsx)(n.code,{children:"quantity"})," set to one is required for this pool to be used.\nBasically translates to how many nodes from this pool are going to be setup for this cluster."]}),"\n",(0,o.jsxs)(i,{children:[(0,o.jsx)("summary",{children:"Example"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: cluster-example\n namespace: example-default\nspec:\n rkeConfig:\n machinePools:\n - name: examplePool \n controlPlaneRole: true\n etcdRole: true\n workerRole: false\n quantity: 3\n unhealthyNodeTimeout: 0s\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: exampleSelector\n"})})]}),"\n",(0,o.jsx)(n.h2,{id:"machineconfigref-spec-reference",children:"machineConfigRef Spec Reference"}),"\n",(0,o.jsxs)(n.p,{children:["A ",(0,o.jsx)(n.code,{children:"machineConfigRef"})," is a generic k8s ",(0,o.jsx)(n.code,{children:"ObjectReference"})," which usually contain a\n",(0,o.jsx)(n.code,{children:"kind"})," ",(0,o.jsx)(n.code,{children:"name"})," and ",(0,o.jsx)(n.code,{children:"apiVersion"})," to point to a different object."]}),"\n",(0,o.jsxs)(n.p,{children:["In Elemental, we set this to a ",(0,o.jsx)(n.a,{href:"/1.2/machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate"}),".\nThis allows us to point to more than one object by using the selector."]}),"\n",(0,o.jsx)(n.h3,{id:"example",children:"Example"}),"\n",(0,o.jsxs)(n.p,{children:["The example below creates a cluster that uses 2 different ",(0,o.jsx)(n.code,{children:"machinePool"}),"'s to set different nodes to control-plane and workers nodes,\nbased on 2 different ",(0,o.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," that select their nodes based on a ",(0,o.jsx)(n.code,{children:"MachineInventory"})," label (location):"]}),"\n",(0,o.jsxs)(n.admonition,{title:"warning",type:"warning",children:[(0,o.jsx)(n.p,{children:"The labels for the example are manual set labels, they are not set by Elemental automatically.."}),(0,o.jsxs)(n.p,{children:["For automatic labels generated by Elemental please check the ",(0,o.jsx)(n.a,{href:"/1.2/smbios",children:"SMBIOS"})," page."]})]}),"\n",(0,o.jsx)(t,{language:"yaml",title:"Example of a cluster with more than one machinePool",showLineNumbers:!0,children:r.Z})]})}function m(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}function p(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},2070:(e,n,t)=>{t.d(n,{Z:()=>o});const o="kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: cluster-machinepools\n namespace: fleet-default\nspec:\n rkeConfig:\n machinePools:\n - name: controlPlanePool\n controlPlaneRole: true\n etcdRole: true\n workerRole: false\n quantity: 3\n unhealthyNodeTimeout: 0s\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: selectorControlPlanes\n - name: workersPool\n controlPlaneRole: false\n etcdRole: false\n workerRole: true\n quantity: 1\n unhealthyNodeTimeout: 0s\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: selectorWorkers\n kubernetesVersion: v1.23.7+k3s1\n---\napiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: selectorControlPlanes\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n matchLabels:\n location: server-room-1\n---\napiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: selectorWorkers\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n matchLabels:\n location: server-room-2"},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>i});var o=t(7294);const l={},r=o.createContext(l);function i(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/82d729f6.ab7b499c.js b/assets/js/82d729f6.ab7b499c.js deleted file mode 100644 index c10a66def..000000000 --- a/assets/js/82d729f6.ab7b499c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[827],{4271:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var o=t(5893),l=t(1151),r=t(2070);const i={sidebar_label:"Cluster reference",title:""},s="Cluster reference",a={id:"cluster-reference",title:"",description:"A Cluster definition includes a kubernetesVersion and a list of machinePools to deploy the cluster to.",source:"@site/versioned_docs/version-1.2/cluster-reference.md",sourceDirName:".",slug:"/cluster-reference",permalink:"/1.2/cluster-reference",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Cluster reference",title:""},sidebar:"docs",previous:{title:"MachineInventorySelectorTemplate reference",permalink:"/1.2/machineinventoryselectortemplate-reference"},next:{title:"SeedImage reference",permalink:"/1.2/seedimage-reference"}},c={},d=[{value:"rkeConfig.machinePools",id:"rkeconfigmachinepools",level:2},{value:"machinePools Spec Reference",id:"machinepools-spec-reference",level:2},{value:"machineConfigRef Spec Reference",id:"machineconfigref-spec-reference",level:2},{value:"Example",id:"example",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,l.a)(),...e.components},{CodeBlock:t,Details:i}=n;return t||p("CodeBlock",!0),i||p("Details",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"cluster-reference",children:"Cluster reference"}),"\n",(0,o.jsxs)(n.p,{children:["A ",(0,o.jsx)(n.code,{children:"Cluster"})," definition includes a ",(0,o.jsx)(n.code,{children:"kubernetesVersion"})," and a list of ",(0,o.jsx)(n.code,{children:"machinePools"})," to deploy the cluster to."]}),"\n",(0,o.jsxs)(n.p,{children:["For how to select a ",(0,o.jsx)(n.code,{children:"kubernetesVersion"})," please check our ",(0,o.jsx)(n.a,{href:"/1.2/kubernetesversions",children:"Kubernetes Versions"})," page."]}),"\n",(0,o.jsxs)(n.p,{children:["A ",(0,o.jsx)(n.code,{children:"machinePool"})," is a bundle of configuration with a ",(0,o.jsx)(n.code,{children:"ObjectReference"})," so the cluster is deployed to those ",(0,o.jsx)(n.code,{children:"machinePools"}),"\nwith the proper roles (etcd, control-plane, worker) with a quantity (how many nodes to deploy from this pool) and some extra configurations (rolling update config, max unhealthy nodes, etc...)."]}),"\n",(0,o.jsxs)(i,{children:[(0,o.jsx)("summary",{children:"Example"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: ...\n namespace: ...\nspec:\n rkeConfig:\n machinePools:\n - name: ...\n controlPlaneRole: ...\n etcdRole: ...\n workerRole: ...\n quantity: ...\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: ...\n - name: ...\n controlPlaneRole: ...\n etcdRole: ...\n workerRole: ...\n quantity: ...\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: ...\n"})})]}),"\n",(0,o.jsxs)(n.p,{children:["It's also possible to disable cluster components via the ",(0,o.jsx)(n.code,{children:"Cluster"})," object in ",(0,o.jsx)(n.code,{children:"spec.rkeConfig.machineGlobalConfig"}),", for example:"]}),"\n",(0,o.jsxs)(i,{children:[(0,o.jsx)("summary",{children:"Service Disabling Example"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: ...\n namespace: ...\nspec:\n rkeConfig:\n machinePools:\n - name: ...\n controlPlaneRole: ...\n etcdRole: ...\n workerRole: ...\n quantity: ...\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: ...\n machineGlobalConfig:\n disable:\n - servicelb\n - ...\n"})})]}),"\n",(0,o.jsx)(n.h2,{id:"rkeconfigmachinepools",children:"rkeConfig.machinePools"}),"\n",(0,o.jsxs)(n.p,{children:["A list of ",(0,o.jsx)(n.code,{children:"machinePools"}),". A minimum of 1 ",(0,o.jsx)(n.code,{children:"machinePools"})," is required for the cluster to be deployed to."]}),"\n",(0,o.jsx)(n.h2,{id:"machinepools-spec-reference",children:"machinePools Spec Reference"}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Key"}),(0,o.jsx)(n.th,{children:"Type"}),(0,o.jsx)(n.th,{children:"Default value"}),(0,o.jsx)(n.th,{children:"Description"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"controlPlaneRole"}),(0,o.jsx)(n.td,{children:"bool"}),(0,o.jsx)(n.td,{children:"false"}),(0,o.jsx)(n.td,{children:"Set machines in this pool as control-plane"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"etcdRole"}),(0,o.jsx)(n.td,{children:"bool"}),(0,o.jsx)(n.td,{children:"false"}),(0,o.jsx)(n.td,{children:"Set machines in this pool as etcd"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"workerRole"}),(0,o.jsx)(n.td,{children:"bool"}),(0,o.jsx)(n.td,{children:"false"}),(0,o.jsx)(n.td,{children:"Set machines in this pool as worker"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"name"}),(0,o.jsx)(n.td,{children:"string"}),(0,o.jsx)(n.td,{children:"nil"}),(0,o.jsx)(n.td,{children:"Name for this pool"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"quantity"}),(0,o.jsx)(n.td,{children:"int"}),(0,o.jsx)(n.td,{children:"nil"}),(0,o.jsx)(n.td,{children:"Number of machines to deploy from this pool"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"unhealthyNodeTimeout"}),(0,o.jsx)(n.td,{children:"int"}),(0,o.jsx)(n.td,{children:"nil"}),(0,o.jsx)(n.td,{children:"Timeout for unhealthy node health checks"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"machineConfigRef"}),(0,o.jsx)(n.td,{children:"int"}),(0,o.jsx)(n.td,{children:"ObjectReference"}),(0,o.jsx)(n.td,{children:"Reference to an object used to know what nodes are part of this pool"})]})]})]}),"\n",(0,o.jsxs)(n.p,{children:["A minimum of ",(0,o.jsx)(n.code,{children:"quantity"})," set to one is required for this pool to be used.\nBasically translates to how many nodes from this pool are going to be setup for this cluster."]}),"\n",(0,o.jsxs)(i,{children:[(0,o.jsx)("summary",{children:"Example"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: cluster-example\n namespace: example-default\nspec:\n rkeConfig:\n machinePools:\n - name: examplePool \n controlPlaneRole: true\n etcdRole: true\n workerRole: false\n quantity: 3\n unhealthyNodeTimeout: 0s\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: exampleSelector\n"})})]}),"\n",(0,o.jsx)(n.h2,{id:"machineconfigref-spec-reference",children:"machineConfigRef Spec Reference"}),"\n",(0,o.jsxs)(n.p,{children:["A ",(0,o.jsx)(n.code,{children:"machineConfigRef"})," is a generic k8s ",(0,o.jsx)(n.code,{children:"ObjectReference"})," which usually contain a\n",(0,o.jsx)(n.code,{children:"kind"})," ",(0,o.jsx)(n.code,{children:"name"})," and ",(0,o.jsx)(n.code,{children:"apiVersion"})," to point to a different object."]}),"\n",(0,o.jsxs)(n.p,{children:["In Elemental, we set this to a ",(0,o.jsx)(n.a,{href:"/1.2/machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate"}),".\nThis allows us to point to more than one object by using the selector."]}),"\n",(0,o.jsx)(n.h3,{id:"example",children:"Example"}),"\n",(0,o.jsxs)(n.p,{children:["The example below creates a cluster that uses 2 different ",(0,o.jsx)(n.code,{children:"machinePool"}),"'s to set different nodes to control-plane and workers nodes,\nbased on 2 different ",(0,o.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," that select their nodes based on a ",(0,o.jsx)(n.code,{children:"MachineInventory"})," label (location):"]}),"\n",(0,o.jsxs)(n.admonition,{title:"warning",type:"warning",children:[(0,o.jsx)(n.p,{children:"The labels for the example are manual set labels, they are not set by Elemental automatically.."}),(0,o.jsxs)(n.p,{children:["For automatic labels generated by Elemental please check the ",(0,o.jsx)(n.a,{href:"/1.2/smbios",children:"SMBIOS"})," page."]})]}),"\n",(0,o.jsx)(t,{language:"yaml",title:"Example of a cluster with more than one machinePool",showLineNumbers:!0,children:r.Z})]})}function m(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}function p(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},2070:(e,n,t)=>{t.d(n,{Z:()=>o});const o="kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: cluster-machinepools\n namespace: fleet-default\nspec:\n rkeConfig:\n machinePools:\n - name: controlPlanePool\n controlPlaneRole: true\n etcdRole: true\n workerRole: false\n quantity: 3\n unhealthyNodeTimeout: 0s\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: selectorControlPlanes\n - name: workersPool\n controlPlaneRole: false\n etcdRole: false\n workerRole: true\n quantity: 1\n unhealthyNodeTimeout: 0s\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: selectorWorkers\n kubernetesVersion: v1.23.7+k3s1\n---\napiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: selectorControlPlanes\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n matchLabels:\n location: server-room-1\n---\napiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: selectorWorkers\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n matchLabels:\n location: server-room-2"},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>i});var o=t(7294);const l={},r=o.createContext(l);function i(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/866c3a03.acaff01e.js b/assets/js/866c3a03.acaff01e.js deleted file mode 100644 index 4f9b355e3..000000000 --- a/assets/js/866c3a03.acaff01e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[3304],{3444:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var a=t(5893),i=t(1151);const o={sidebar_label:"Inventory Management",title:"",version_badge:"1.3.0"},r=void 0,s={id:"inventory-management",title:"",description:"Inventory Management",source:"@site/versioned_docs/version-1.3/inventory-management.md",sourceDirName:".",slug:"/inventory-management",permalink:"/inventory-management",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Inventory Management",title:"",version_badge:"1.3.0"},sidebar:"docs",previous:{title:"Hardware Labels",permalink:"/hardwarelabels"},next:{title:"Machine Reset",permalink:"/reset"}},c={},l=[{value:"Inventory Management",id:"inventory-management",level:2},{value:"MachineInventory",id:"machineinventory",level:3},{value:"Reference",id:"reference",level:4},{value:"MachineRegistration",id:"machineregistration",level:3},{value:"Reference",id:"reference-1",level:4}];function d(e){const n={br:"br",code:"code",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h2,{id:"inventory-management",children:"Inventory Management"}),"\n",(0,a.jsx)(n.p,{children:"The Elemental operator can hold an inventory of machines and\nthe mapping of the machine to it's configuration and assigned cluster."}),"\n",(0,a.jsx)(n.h3,{id:"machineinventory",children:"MachineInventory"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"MachineInventory"})," holds all the relevant information for a registered machine.",(0,a.jsx)(n.br,{}),"\n","Upon successful registration, the ",(0,a.jsx)(n.code,{children:"MachineInventory"})," will inherit all ",(0,a.jsx)(n.code,{children:"machineInventoryLabels"})," defined in the related ",(0,a.jsx)(n.code,{children:"MachineRegistration"}),".",(0,a.jsx)(n.br,{}),"\n","Additionally, the machine ",(0,a.jsx)(n.code,{children:"annotations"})," will also be updated on each successful registration."]}),"\n",(0,a.jsx)(n.p,{children:"By default, Elemental Teal machines will attempt a registration update every 24 hours to update labels and annotations."}),"\n",(0,a.jsx)(n.h4,{id:"reference",children:"Reference"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventory\nmetadata:\n # Machine annotations can be useful to identify hosts\n annotations:\n elemental.cattle.io/auth: tpm\n elemental.cattle.io/registration-ip: 192.168.122.152\n labels:\n # A label inherited from the MachineRegistration definition\n element: fire\n # Generic SMBIOS labels that are typically populated with\n # the MachineRegister approach\n machineUUID: f266c64b-3972-40e7-9937-3dc4a311436c\n manufacturer: QEMU\n productName: Standard-PC-Q35-ICH9-2009\n serialNumber: Not-Specified\n # Custom labels can be applied to each MachineInventory\n myCustomLabel: foo \n name: m-479ab68e-00ff-4081-a731-5b1a76610289\n # The namespace must match the namespace of the cluster\n # assigned to the clusters.provisioning.cattle.io resource\n namespace: fleet-default\n # A reference to the MachineInventorySelector that links the \n # machine to a Cluster definition\n ownerReferences:\n - apiVersion: elemental.cattle.io/v1beta1\n controller: true\n kind: MachineInventorySelector\n name: fire-machine-selector-qcn7d\n uid: 0a1f751e-4ca9-4a0d-919a-97ba1f434d12\nspec:\n # The hash of the TPM EK public key. This is used if you are\n # using TPM2 to identifiy nodes. Nodes can report their TPM\n # hash by using the MachineRegistration.\n tpmHash: d68795c6192af9922692f050b...\n"})}),"\n",(0,a.jsx)(n.h3,{id:"machineregistration",children:"MachineRegistration"}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"MachineRegistration"})," holds information on how to install, reset, and configure all connected Elemental Teal machines."]}),"\n",(0,a.jsxs)(n.p,{children:["It's possible to update the ",(0,a.jsx)(n.code,{children:"spec.machineInventoryLabels"})," and ",(0,a.jsx)(n.code,{children:"spec.machineInventoryAnnotations"})," and this will be applied to all registered machines.\nBy default, Elemental Teal machines will attempt a registration update every 24 hours to update labels and annotations."]}),"\n",(0,a.jsxs)(n.p,{children:["While it's possible to modify the ",(0,a.jsx)(n.code,{children:"spec.config"})," definition, updates to the ",(0,a.jsx)(n.code,{children:"spec.config"})," will be ignored by machines that already completed installation.\nMachines that couldn't complete the installation will try again every 30 minutes by reloading the remote ",(0,a.jsx)(n.code,{children:"MachineRegistration"})," definition. This can be useful to correct ",(0,a.jsx)(n.code,{children:"spec.config"})," mistakes that prevent successful installation (for ex. ",(0,a.jsx)(n.code,{children:"spec.config.elemental.install.device"}),"), without having to create a new ",(0,a.jsx)(n.code,{children:"MachineRegistration"})," and a new ISO."]}),"\n",(0,a.jsx)(n.h4,{id:"reference-1",children:"Reference"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n # The namespace must match the namespace of the cluster\n # assigned to the clusters.provisioning.cattle.io resource\n namespace: fleet-default\nspec:\n # The cloud config that will be used to provision the node\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n reset:\n enabled: true\n debug: true\n reset-persistent: true\n reset-oem: true\n reboot: true\n # Labels to be added to the created MachineInventory object\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n # Annotations to be added to the created MachineInventory object\n machineInventoryAnnotations: {}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>r});var a=t(7294);const i={},o=a.createContext(i);function r(e){const n=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/866c3a03.dda3f66f.js b/assets/js/866c3a03.dda3f66f.js new file mode 100644 index 000000000..0360d18d8 --- /dev/null +++ b/assets/js/866c3a03.dda3f66f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[3304],{3444:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var a=t(5893),i=t(1151);const o={sidebar_label:"Inventory Management",title:"",version_badge:"1.3.0"},r=void 0,s={id:"inventory-management",title:"",description:"Inventory Management",source:"@site/versioned_docs/version-1.3/inventory-management.md",sourceDirName:".",slug:"/inventory-management",permalink:"/inventory-management",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Inventory Management",title:"",version_badge:"1.3.0"},sidebar:"docs",previous:{title:"Hardware Labels",permalink:"/hardwarelabels"},next:{title:"Machine Reset",permalink:"/reset"}},c={},l=[{value:"Inventory Management",id:"inventory-management",level:2},{value:"MachineInventory",id:"machineinventory",level:3},{value:"Reference",id:"reference",level:4},{value:"MachineRegistration",id:"machineregistration",level:3},{value:"Reference",id:"reference-1",level:4}];function d(e){const n={br:"br",code:"code",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,i.a)(),...e.components},{Head:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t,{children:(0,a.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/inventory-management"})}),"\n",(0,a.jsx)(n.h2,{id:"inventory-management",children:"Inventory Management"}),"\n",(0,a.jsx)(n.p,{children:"The Elemental operator can hold an inventory of machines and\nthe mapping of the machine to it's configuration and assigned cluster."}),"\n",(0,a.jsx)(n.h3,{id:"machineinventory",children:"MachineInventory"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"MachineInventory"})," holds all the relevant information for a registered machine.",(0,a.jsx)(n.br,{}),"\n","Upon successful registration, the ",(0,a.jsx)(n.code,{children:"MachineInventory"})," will inherit all ",(0,a.jsx)(n.code,{children:"machineInventoryLabels"})," defined in the related ",(0,a.jsx)(n.code,{children:"MachineRegistration"}),".",(0,a.jsx)(n.br,{}),"\n","Additionally, the machine ",(0,a.jsx)(n.code,{children:"annotations"})," will also be updated on each successful registration."]}),"\n",(0,a.jsx)(n.p,{children:"By default, Elemental Teal machines will attempt a registration update every 24 hours to update labels and annotations."}),"\n",(0,a.jsx)(n.h4,{id:"reference",children:"Reference"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventory\nmetadata:\n # Machine annotations can be useful to identify hosts\n annotations:\n elemental.cattle.io/auth: tpm\n elemental.cattle.io/registration-ip: 192.168.122.152\n labels:\n # A label inherited from the MachineRegistration definition\n element: fire\n # Generic SMBIOS labels that are typically populated with\n # the MachineRegister approach\n machineUUID: f266c64b-3972-40e7-9937-3dc4a311436c\n manufacturer: QEMU\n productName: Standard-PC-Q35-ICH9-2009\n serialNumber: Not-Specified\n # Custom labels can be applied to each MachineInventory\n myCustomLabel: foo \n name: m-479ab68e-00ff-4081-a731-5b1a76610289\n # The namespace must match the namespace of the cluster\n # assigned to the clusters.provisioning.cattle.io resource\n namespace: fleet-default\n # A reference to the MachineInventorySelector that links the \n # machine to a Cluster definition\n ownerReferences:\n - apiVersion: elemental.cattle.io/v1beta1\n controller: true\n kind: MachineInventorySelector\n name: fire-machine-selector-qcn7d\n uid: 0a1f751e-4ca9-4a0d-919a-97ba1f434d12\nspec:\n # The hash of the TPM EK public key. This is used if you are\n # using TPM2 to identifiy nodes. Nodes can report their TPM\n # hash by using the MachineRegistration.\n tpmHash: d68795c6192af9922692f050b...\n"})}),"\n",(0,a.jsx)(n.h3,{id:"machineregistration",children:"MachineRegistration"}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"MachineRegistration"})," holds information on how to install, reset, and configure all connected Elemental Teal machines."]}),"\n",(0,a.jsxs)(n.p,{children:["It's possible to update the ",(0,a.jsx)(n.code,{children:"spec.machineInventoryLabels"})," and ",(0,a.jsx)(n.code,{children:"spec.machineInventoryAnnotations"})," and this will be applied to all registered machines.\nBy default, Elemental Teal machines will attempt a registration update every 24 hours to update labels and annotations."]}),"\n",(0,a.jsxs)(n.p,{children:["While it's possible to modify the ",(0,a.jsx)(n.code,{children:"spec.config"})," definition, updates to the ",(0,a.jsx)(n.code,{children:"spec.config"})," will be ignored by machines that already completed installation.\nMachines that couldn't complete the installation will try again every 30 minutes by reloading the remote ",(0,a.jsx)(n.code,{children:"MachineRegistration"})," definition. This can be useful to correct ",(0,a.jsx)(n.code,{children:"spec.config"})," mistakes that prevent successful installation (for ex. ",(0,a.jsx)(n.code,{children:"spec.config.elemental.install.device"}),"), without having to create a new ",(0,a.jsx)(n.code,{children:"MachineRegistration"})," and a new ISO."]}),"\n",(0,a.jsx)(n.h4,{id:"reference-1",children:"Reference"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n # The namespace must match the namespace of the cluster\n # assigned to the clusters.provisioning.cattle.io resource\n namespace: fleet-default\nspec:\n # The cloud config that will be used to provision the node\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n reset:\n enabled: true\n debug: true\n reset-persistent: true\n reset-oem: true\n reboot: true\n # Labels to be added to the created MachineInventory object\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n # Annotations to be added to the created MachineInventory object\n machineInventoryAnnotations: {}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>r});var a=t(7294);const i={},o=a.createContext(i);function r(e){const n=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8699bfc7.03fc0ce4.js b/assets/js/8699bfc7.03fc0ce4.js new file mode 100644 index 000000000..140b12000 --- /dev/null +++ b/assets/js/8699bfc7.03fc0ce4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[2310],{1126:(e,n,t)=>{t.d(n,{ZP:()=>r});var i=t(5893),s=t(1151);function a(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components},{TabItem:t,Tabs:a}=n;return t||l("TabItem",!0),a||l("Tabs",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"install-elemental-operator",children:"Install Elemental Operator"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"elemental-operator"})," is the management endpoint, running the management\ncluster and taking care of creating inventories, registrations for machines and much more."]}),"\n",(0,i.jsx)(n.p,{children:"We will use the Helm package manager to install the elemental-operator chart into our cluster."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Now after a few seconds you should see the operator pod appear on the ",(0,i.jsx)(n.code,{children:"cattle-elemental-system"})," namespace:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl get pods -n cattle-elemental-system\nNAME READY STATUS RESTARTS AGE\nelemental-operator-64f88fc695-b8qhn 1/1 Running 0 16s\n"})}),"\n",(0,i.jsx)(n.admonition,{title:"Helm v3.8.0+ required",type:"info",children:(0,i.jsx)(n.p,{children:"The Elemental Operator chart is distributed via an OCI registry: Helm correctly supports OCI based registries starting from the v3.8.0 release."})}),"\n",(0,i.jsx)(n.admonition,{title:"Swap charts installation order when upgrading from elemental-operator release < 1.2.4",type:"warning",children:(0,i.jsx)(n.p,{children:"When upgrading from an elemental-operator release embedding the Elemental CRDs (version < 1.2.4) the elemental-operator-crds chart installation will fail.\nYou will need to upgrade the elemental-operator chart first, and only then install the elemental-operator-crds chart."})}),"\n",(0,i.jsx)(n.h3,{id:"non-stable-installations",children:"Non-stable installations"}),"\n",(0,i.jsxs)(n.p,{children:["Besides the Helm charts listed above, there are two other ",(0,i.jsx)(n.code,{children:"non-stable"}),"\nversions available."]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Staging:"})," refers to the latest tagged release from Github. This is documented in the ",(0,i.jsx)(n.a,{href:"next/quickstart-ui",children:"Next"})," pages."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Development:"})," refers to the 'tip of HEAD' from Github. This is the ongoing development version and changes constantly."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(a,{children:[(0,i.jsx)(t,{value:"stagingOperator",label:"Staging version (x86-64, ARM64 (Raspberry Pi 4))",default:!0,children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.opensuse.org/isv/rancher/elemental/staging/charts/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.opensuse.org/isv/rancher/elemental/staging/charts/rancher/elemental-operator-chart\n"})})}),(0,i.jsxs)(t,{value:"develOperator",label:"Development version (x86-64, ARM64 (Raspberry Pi 4))",default:!0,children:[(0,i.jsx)(n.admonition,{title:"Reminder",type:"warning",children:(0,i.jsx)(n.p,{children:"The development version is not recommended for production environments. We welcome feedback via Slack or Github issues, but it could be unstable and contain experimental features that can be dropped without notice."})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.opensuse.org/isv/rancher/elemental/dev/charts/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install --set image.imagePullPolicy=Always elemental-operator oci://registry.opensuse.org/isv/rancher/elemental/dev/charts/rancher/elemental-operator-chart\n"})})]})]}),"\n",(0,i.jsx)(n.h3,{id:"installation-options",children:"Installation options"}),"\n",(0,i.jsxs)(n.p,{children:["There are a few options that can be set in the chart install but that is out of scope for this document. You can see all the values on the chart ",(0,i.jsx)(n.a,{href:"https://github.com/rancher/elemental-operator/blob/main/charts/operator/values.yaml",children:"values.yaml"}),"."]})]})}function r(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}function l(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},8297:(e,n,t)=>{t.d(n,{ZP:()=>r});var i=t(5893),s=t(1151);function a(e){const n={a:"a",code:"code",h2:"h2",li:"li",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["A Rancher server (v2.7.0 or later) configured (server-url set)","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["To configure the Rancher ",(0,i.jsx)(n.code,{children:"server-url"})," please check the ",(0,i.jsx)(n.a,{href:"https://rancher.com/docs/rancher/v2.6/en/admin-settings/#first-log-in",children:"Rancher docs"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["A machine (bare metal or virtualized) with TPM 2.0","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Hint 1: Libvirt allows setting virtual TPMs for virtual machines ",(0,i.jsx)(n.a,{href:"tpm/#add-tpm-module-to-virtual-machine",children:"example here"})]}),"\n",(0,i.jsxs)(n.li,{children:["Hint 2: You can enable TPM emulation on bare metal machines missing the TPM 2.0 module ",(0,i.jsx)(n.a,{href:"tpm/#add-tpm-emulation-to-bare-metal-machine",children:"example here"})]}),"\n",(0,i.jsx)(n.li,{children:"Hint 3: Make sure you're using UEFI (not BIOS) on x86-64, or the ISO won't boot"}),"\n",(0,i.jsxs)(n.li,{children:["Hint 4: A minimum volume size of 25 GB is recommended. See the ",(0,i.jsx)(n.a,{href:"/1.2/installation#deployed-elemental-teal-partition-table",children:"Elemental Teal partition table"})," for more details"]}),"\n",(0,i.jsxs)(n.li,{children:["Hint 5: CPU and RAM requirements depend on the Kubernetes version installed, for example ",(0,i.jsx)(n.a,{href:"https://docs.k3s.io/installation/requirements#hardware",children:"K3s"})," or ",(0,i.jsx)(n.a,{href:"https://docs.rke2.io/install/requirements#hardware",children:"RKE2"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Helm Package Manager (",(0,i.jsx)(n.a,{href:"https://helm.sh/",children:"https://helm.sh/"}),")"]}),"\n",(0,i.jsxs)(n.li,{children:["For ARM (aarch64) - One SD-card (32 GB or more, must be ",(0,i.jsx)(n.strong,{children:"fast"})," - 40MB/s write speed is acceptable) and a USB-stick for installation"]}),"\n"]})]})}function r(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},3724:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>o,default:()=>p,frontMatter:()=>l,metadata:()=>c,toc:()=>d});var i=t(5893),s=t(1151),a=t(8297),r=t(1126);const l={sidebar_label:"Elemental the visual way",title:""},o="Elemental the visual way",c={id:"quickstart-ui",title:"",description:"This quickstart will show you how to deploy the Elemental plugin into an existing Rancher Manager instance.",source:"@site/versioned_docs/version-1.2/quickstart-ui.md",sourceDirName:".",slug:"/quickstart-ui",permalink:"/1.2/quickstart-ui",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Elemental the visual way",title:""},sidebar:"docs",previous:{title:"Overview",permalink:"/1.2/"},next:{title:"Elemental the command line way",permalink:"/1.2/quickstart-cli"}},h={},d=[{value:"Enable the Rancher Manager Extensions Support",id:"enable-the-rancher-manager-extensions-support",level:2},{value:"Install the elemental plugin",id:"install-the-elemental-plugin",level:2},{value:"Add a Machine Registration Endpoint",id:"add-a-machine-registration-endpoint",level:2},{value:"Preparing the installation (seed) image",id:"preparing-the-installation-seed-image",level:2},{value:"Machine Inventory",id:"machine-inventory",level:2},{value:"Create your first Elemental Cluster",id:"create-your-first-elemental-cluster",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components},{Head:l}=n;return l||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(l,{children:(0,i.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/quickstart-ui"})}),"\n","\n","\n",(0,i.jsx)(n.h1,{id:"elemental-the-visual-way",children:"Elemental the visual way"}),"\n",(0,i.jsx)(n.p,{children:"This quickstart will show you how to deploy the Elemental plugin into an existing Rancher Manager instance."}),"\n",(0,i.jsx)(n.p,{children:"Once installed, you'll be able to provision a new Elemental cluster based on RKE2 or K3s."}),"\n",(0,i.jsx)(a.ZP,{}),"\n",(0,i.jsx)(r.ZP,{}),"\n",(0,i.jsx)(n.h2,{id:"enable-the-rancher-manager-extensions-support",children:"Enable the Rancher Manager Extensions Support"}),"\n",(0,i.jsx)(n.p,{children:"In order to enable the Rancher Manager Extensions Support, you'll need to follow the steps below:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Open a web browser, connect and login to your Rancher Manager instance"}),"\n",(0,i.jsxs)(n.li,{children:["Click on the top left menu ",(0,i.jsx)(n.code,{children:"a"})," and click on ",(0,i.jsx)(n.code,{children:"Extensions"})]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Rancher Manager menu",src:t(2422).Z+"",width:"279",height:"545"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Click on ",(0,i.jsx)(n.code,{children:"Enable"})," button to install the ",(0,i.jsx)(n.code,{children:"Extension Operator"})]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Enable Rancher Manager Extensions Operator",src:t(9744).Z+"",width:"1107",height:"420"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["A popup will appear, click on the ",(0,i.jsx)(n.code,{children:"OK"})," button to continue and install the Rancher Manager Extensions repository"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Add Rancher Manager Extensions repository",src:t(2e3).Z+"",width:"1212",height:"586"})}),"\n",(0,i.jsx)(n.h2,{id:"install-the-elemental-plugin",children:"Install the elemental plugin"}),"\n",(0,i.jsxs)(n.p,{children:["After the Rancher Manager Extensions Support is enabled, you can install the ",(0,i.jsx)(n.code,{children:"elemental"})," plugin as follow:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Under the ",(0,i.jsx)(n.code,{children:"Available"})," tab you will see ",(0,i.jsx)(n.code,{children:"elemental"})," plugin available"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Rancher Manager Available plugins",src:t(7351).Z+"",width:"620",height:"296"})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["If the ",(0,i.jsx)(n.code,{children:"Available"})," tab shows no entries, refresh the page. The ",(0,i.jsx)(n.code,{children:"elemental"})," plugin will then appear."]})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Click on the ",(0,i.jsx)(n.code,{children:"Install"})," button, a popup will appear and click on ",(0,i.jsx)(n.code,{children:"Install"})," again to continue."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Elemental plugin install",src:t(3040).Z+"",width:"1215",height:"598"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["On the ",(0,i.jsx)(n.code,{children:"Installed"})," tab, the ",(0,i.jsx)(n.code,{children:"elemental"})," plugin is now listed."]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["If the ",(0,i.jsx)(n.code,{children:"elemental"})," plugin is listed and the status stays at ",(0,i.jsx)(n.code,{children:"Installing..."}),", refresh the page. The ",(0,i.jsx)(n.code,{children:"elemental"})," plugin will display correctly."]})}),"\n",(0,i.jsxs)(n.p,{children:["Once the ",(0,i.jsx)(n.code,{children:"elemental"})," plugin installed, you can see the ",(0,i.jsx)(n.code,{children:"OS Manamagent"})," option in the Rancher Manager menu."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Rancher Manager OS Management menu",src:t(1723).Z+"",width:"278",height:"579"})}),"\n",(0,i.jsx)(n.h2,{id:"add-a-machine-registration-endpoint",children:"Add a Machine Registration Endpoint"}),"\n",(0,i.jsxs)(n.p,{children:["In the OS Management dashboard, click the ",(0,i.jsx)(n.code,{children:"Create Registration Endpoint"})," button."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"OS Management registration endpoints",src:t(2505).Z+"",width:"766",height:"307"})}),"\n",(0,i.jsx)(n.p,{children:"Now here either you can enter each detail in its respective places or you can edit this as YAML and create the endpoint in one go. Here we'll edit every fields."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Create a Registration Endpoint with UI",src:t(7716).Z+"",width:"953",height:"1524"})}),"\n",(0,i.jsxs)(n.admonition,{title:"main options",type:"info",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"name: elemental-cluster1"}),": change this as per your need"]}),(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"device: /dev/sda"}),': make sure your target device is "sda". Otherwise find out how the disk device is named and change it here. For example, in Raspberry Pi it could be "mmblk"']}),(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"emulate-tpm: true"}),": use this only if your target device doesn't have a TPM device and you have a way of emulating TPM like in VMware or KVM"]}),(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"emulated-tpm-seed: 1"}),": increase this by 1 for every new machine. If this value is not set, each machine will receive the same TPM hash and it won't show up under the machine inventory."]})]}),"\n",(0,i.jsx)(n.admonition,{title:"attention",type:"danger",children:(0,i.jsxs)(n.p,{children:["Emulated TPM is only for non-production usage like for testing as it beats the purpose of security. So in production usage use the code above without the ",(0,i.jsx)(n.code,{children:"emulate-tpm"})," and ",(0,i.jsx)(n.code,{children:"emulate-tpm-seed"})]})}),"\n",(0,i.jsx)(n.p,{children:"Once you create the machine registration end point it should show up as active."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Machine registered in Registration Endpoints",src:t(3161).Z+"",width:"572",height:"376"})}),"\n",(0,i.jsx)(n.h2,{id:"preparing-the-installation-seed-image",children:"Preparing the installation (seed) image"}),"\n",(0,i.jsx)(n.p,{children:"Now this is the last step, you need to prepare an Elemental Teal seed image that includes the initial registration config, so\nit can be auto registered, installed and fully deployed as part of your cluster. The contents of the file are nothing\nmore than the registration URL that the node needs to register and the proper server certificate, so it can connect securely."}),"\n",(0,i.jsx)(n.p,{children:"This seed image can then be used to provision an infinite number of machines."}),"\n",(0,i.jsxs)(n.p,{children:["The seed image is created as a Kubernetes resource above and can be built using the ",(0,i.jsx)(n.code,{children:"Build ISO"})," button:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Build ISO in Registration Endpoints",src:t(3077).Z+"",width:"1247",height:"435"})}),"\n",(0,i.jsxs)(n.p,{children:["Once the build is done, ISO can be downloaded using the ",(0,i.jsx)(n.code,{children:"Download ISO"})," button:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Download ISO in Registration Endpoints",src:t(2990).Z+"",width:"1247",height:"435"})}),"\n",(0,i.jsx)(n.p,{children:"You can now boot your nodes with this image and they will:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Register with the registrationURL given and create a per-machine ",(0,i.jsx)(n.code,{children:"MachineInventory"})]}),"\n",(0,i.jsx)(n.li,{children:"Install Elemental Teal to the given device"}),"\n",(0,i.jsx)(n.li,{children:"Reboot"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"machine-inventory",children:"Machine Inventory"}),"\n",(0,i.jsxs)(n.p,{children:["When nodes are booting up for the first time, they connect to Rancher Manager and a ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/architecture#machineinventory",children:(0,i.jsx)(n.code,{children:"Machine Inventory"})})," is created for each node."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Machine Inventory menu",src:t(2691).Z+"",width:"1673",height:"574"})}),"\n",(0,i.jsxs)(n.p,{children:["Custom columns are based on ",(0,i.jsx)(n.code,{children:"Machine Inventory Labels"})," which you can add when you create your ",(0,i.jsx)(n.code,{children:"Machine Registration Endpoint"}),":"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Machine Registration Endpoint Hardware Labels",src:t(2469).Z+"",width:"1665",height:"1368"})}),"\n",(0,i.jsxs)(n.p,{children:["On the following screenshot, ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/hardwarelabels/#hardware-labels",children:(0,i.jsx)(n.code,{children:"Hardware Labels"})})," are used as custom columns:"]}),"\n",(0,i.jsx)(n.p,{children:"You can also add custom columns by clicking on the three dots menu."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Machine Inventory custom columns",src:t(11).Z+"",width:"1672",height:"734"})}),"\n",(0,i.jsxs)(n.p,{children:["Finally, you can also filter your ",(0,i.jsx)(n.code,{children:"Machine Inventory"})," using those labels."]}),"\n",(0,i.jsxs)(n.p,{children:["For instance if you only want to see your AMD machines, you can filter on ",(0,i.jsx)(n.code,{children:"CPUModel"})," like below:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Machine Inventory filtering",src:t(122).Z+"",width:"1672",height:"734"})}),"\n",(0,i.jsx)(n.h2,{id:"create-your-first-elemental-cluster",children:"Create your first Elemental Cluster"}),"\n",(0,i.jsxs)(n.p,{children:["Now let's use those ",(0,i.jsx)(n.code,{children:"Machine Inventory"})," to create a cluster by clicking on ",(0,i.jsx)(n.code,{children:"Create Elemental Cluster"})," :"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Create Elemental Cluster button",src:t(2018).Z+"",width:"1663",height:"854"})}),"\n",(0,i.jsx)(n.p,{children:"For your Elemental cluster, you can either choose K3s or RKE2 for Kubernetes."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Elemental Cluster Creation Screen",src:t(3150).Z+"",width:"1677",height:"1374"})}),"\n",(0,i.jsxs)(n.p,{children:["Most of the options are coming from Rancher, that's why we will not detail all the possibilities.\nFeel free to check the ",(0,i.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/pages-for-subheaders/rancher-server-configuration",children:"Rancher Manager documentation"})," if you want to know more."]}),"\n",(0,i.jsxs)(n.p,{children:["However, it is important to highlight the ",(0,i.jsx)(n.code,{children:"Inventory of Machines Selector Template"})," section."]}),"\n",(0,i.jsxs)(n.p,{children:["It lets you choose which ",(0,i.jsx)(n.code,{children:"Machine Inventory"})," you want to use to create your Elemental cluster using the previously defined ",(0,i.jsx)(n.code,{children:"Machine Inventory Labels"})," :"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Use Machine Inventory Selector Template",src:t(6695).Z+"",width:"1359",height:"547"})}),"\n",(0,i.jsxs)(n.p,{children:["As our three Machine Inventories contain the label ",(0,i.jsx)(n.code,{children:"CPUVendor"})," with the key ",(0,i.jsx)(n.code,{children:"AuthenticAMD"}),", the three machines will be used to create the Elemental cluster."]})]})}function p(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},2018:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-create-cluster-button-e1d0392a7278e6de17a5fbe26b77b5eb.png"},6695:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-create-cluster-machine-selector-template-a114d9eb08cb6423423a79c94900afd1.png"},3150:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-create-cluster-standard-screen--fdccedc04c52226c9b621f580de28f85.png"},3040:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-elemental-plugin-install-ecdc4ce7ce04426c02ff914ecf13d906.png"},1723:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-elemental-plugin-menu-0e0659f62678b700aa7d7341284fd9a5.png"},9744:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-extension-enable-86662009426b5220cab5c9f72a71ea4b.png"},2e3:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-extension-repository-84e4ca717832fe04524f71741750f69c.png"},7351:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-extensions-available-31f7812c57abc824b1337bd8ae3d6247.png"},11:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-machine-inventory-custom-columns-120ed1afa8effc83540bb72631623aa7.png"},122:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-machine-inventory-filtering-b7918cd6394c1d0aa8158adbc7d6039b.png"},2691:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-machine-inventory-menu-e868fad782ec36416690986b9a0ee4b9.png"},2422:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-menu-62e787746510862a9bc32b4ac1d65213.png"},3077:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-build-ISO-e3e6386d33bb61f4c45bfd261000cdc5.png"},3161:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-complete-7c3686ae051927fdb9cec1ee38a8eb58.png"},7716:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-create-details-5954e7fe1555060b20987c13a0978cd8.png"},2505:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-create-f687c90235eea798645d699b6bbd8d23.png"},2990:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-download-ISO-d9eccf8bb5bdc387fecfa757df572815.png"},2469:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-hardware-labels-d96f34687fee37f7f1438e21508cacce.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>r});var i=t(7294);const s={},a=i.createContext(s);function r(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8699bfc7.22e7e3ee.js b/assets/js/8699bfc7.22e7e3ee.js deleted file mode 100644 index f8095a08b..000000000 --- a/assets/js/8699bfc7.22e7e3ee.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[2310],{1126:(e,n,t)=>{t.d(n,{ZP:()=>r});var s=t(5893),i=t(1151);function a(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components},{TabItem:t,Tabs:a}=n;return t||l("TabItem",!0),a||l("Tabs",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"install-elemental-operator",children:"Install Elemental Operator"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"elemental-operator"})," is the management endpoint, running the management\ncluster and taking care of creating inventories, registrations for machines and much more."]}),"\n",(0,s.jsx)(n.p,{children:"We will use the Helm package manager to install the elemental-operator chart into our cluster."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Now after a few seconds you should see the operator pod appear on the ",(0,s.jsx)(n.code,{children:"cattle-elemental-system"})," namespace:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl get pods -n cattle-elemental-system\nNAME READY STATUS RESTARTS AGE\nelemental-operator-64f88fc695-b8qhn 1/1 Running 0 16s\n"})}),"\n",(0,s.jsx)(n.admonition,{title:"Helm v3.8.0+ required",type:"info",children:(0,s.jsx)(n.p,{children:"The Elemental Operator chart is distributed via an OCI registry: Helm correctly supports OCI based registries starting from the v3.8.0 release."})}),"\n",(0,s.jsx)(n.admonition,{title:"Swap charts installation order when upgrading from elemental-operator release < 1.2.4",type:"warning",children:(0,s.jsx)(n.p,{children:"When upgrading from an elemental-operator release embedding the Elemental CRDs (version < 1.2.4) the elemental-operator-crds chart installation will fail.\nYou will need to upgrade the elemental-operator chart first, and only then install the elemental-operator-crds chart."})}),"\n",(0,s.jsx)(n.h3,{id:"non-stable-installations",children:"Non-stable installations"}),"\n",(0,s.jsxs)(n.p,{children:["Besides the Helm charts listed above, there are two other ",(0,s.jsx)(n.code,{children:"non-stable"}),"\nversions available."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Staging:"})," refers to the latest tagged release from Github. This is documented in the ",(0,s.jsx)(n.a,{href:"next/quickstart-ui",children:"Next"})," pages."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Development:"})," refers to the 'tip of HEAD' from Github. This is the ongoing development version and changes constantly."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(a,{children:[(0,s.jsx)(t,{value:"stagingOperator",label:"Staging version (x86-64, ARM64 (Raspberry Pi 4))",default:!0,children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.opensuse.org/isv/rancher/elemental/staging/charts/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.opensuse.org/isv/rancher/elemental/staging/charts/rancher/elemental-operator-chart\n"})})}),(0,s.jsxs)(t,{value:"develOperator",label:"Development version (x86-64, ARM64 (Raspberry Pi 4))",default:!0,children:[(0,s.jsx)(n.admonition,{title:"Reminder",type:"warning",children:(0,s.jsx)(n.p,{children:"The development version is not recommended for production environments. We welcome feedback via Slack or Github issues, but it could be unstable and contain experimental features that can be dropped without notice."})}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.opensuse.org/isv/rancher/elemental/dev/charts/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install --set image.imagePullPolicy=Always elemental-operator oci://registry.opensuse.org/isv/rancher/elemental/dev/charts/rancher/elemental-operator-chart\n"})})]})]}),"\n",(0,s.jsx)(n.h3,{id:"installation-options",children:"Installation options"}),"\n",(0,s.jsxs)(n.p,{children:["There are a few options that can be set in the chart install but that is out of scope for this document. You can see all the values on the chart ",(0,s.jsx)(n.a,{href:"https://github.com/rancher/elemental-operator/blob/main/charts/operator/values.yaml",children:"values.yaml"}),"."]})]})}function r(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}function l(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},8297:(e,n,t)=>{t.d(n,{ZP:()=>r});var s=t(5893),i=t(1151);function a(e){const n={a:"a",code:"code",h2:"h2",li:"li",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["A Rancher server (v2.7.0 or later) configured (server-url set)","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["To configure the Rancher ",(0,s.jsx)(n.code,{children:"server-url"})," please check the ",(0,s.jsx)(n.a,{href:"https://rancher.com/docs/rancher/v2.6/en/admin-settings/#first-log-in",children:"Rancher docs"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["A machine (bare metal or virtualized) with TPM 2.0","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Hint 1: Libvirt allows setting virtual TPMs for virtual machines ",(0,s.jsx)(n.a,{href:"tpm/#add-tpm-module-to-virtual-machine",children:"example here"})]}),"\n",(0,s.jsxs)(n.li,{children:["Hint 2: You can enable TPM emulation on bare metal machines missing the TPM 2.0 module ",(0,s.jsx)(n.a,{href:"tpm/#add-tpm-emulation-to-bare-metal-machine",children:"example here"})]}),"\n",(0,s.jsx)(n.li,{children:"Hint 3: Make sure you're using UEFI (not BIOS) on x86-64, or the ISO won't boot"}),"\n",(0,s.jsxs)(n.li,{children:["Hint 4: A minimum volume size of 25 GB is recommended. See the ",(0,s.jsx)(n.a,{href:"/1.2/installation#deployed-elemental-teal-partition-table",children:"Elemental Teal partition table"})," for more details"]}),"\n",(0,s.jsxs)(n.li,{children:["Hint 5: CPU and RAM requirements depend on the Kubernetes version installed, for example ",(0,s.jsx)(n.a,{href:"https://docs.k3s.io/installation/requirements#hardware",children:"K3s"})," or ",(0,s.jsx)(n.a,{href:"https://docs.rke2.io/install/requirements#hardware",children:"RKE2"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Helm Package Manager (",(0,s.jsx)(n.a,{href:"https://helm.sh/",children:"https://helm.sh/"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:["For ARM (aarch64) - One SD-card (32 GB or more, must be ",(0,s.jsx)(n.strong,{children:"fast"})," - 40MB/s write speed is acceptable) and a USB-stick for installation"]}),"\n"]})]})}function r(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},3724:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>o,default:()=>p,frontMatter:()=>l,metadata:()=>c,toc:()=>d});var s=t(5893),i=t(1151),a=t(8297),r=t(1126);const l={sidebar_label:"Elemental the visual way",title:""},o="Elemental the visual way",c={id:"quickstart-ui",title:"",description:"This quickstart will show you how to deploy the Elemental plugin into an existing Rancher Manager instance.",source:"@site/versioned_docs/version-1.2/quickstart-ui.md",sourceDirName:".",slug:"/quickstart-ui",permalink:"/1.2/quickstart-ui",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Elemental the visual way",title:""},sidebar:"docs",previous:{title:"Overview",permalink:"/1.2/"},next:{title:"Elemental the command line way",permalink:"/1.2/quickstart-cli"}},h={},d=[{value:"Enable the Rancher Manager Extensions Support",id:"enable-the-rancher-manager-extensions-support",level:2},{value:"Install the elemental plugin",id:"install-the-elemental-plugin",level:2},{value:"Add a Machine Registration Endpoint",id:"add-a-machine-registration-endpoint",level:2},{value:"Preparing the installation (seed) image",id:"preparing-the-installation-seed-image",level:2},{value:"Machine Inventory",id:"machine-inventory",level:2},{value:"Create your first Elemental Cluster",id:"create-your-first-elemental-cluster",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",img:"img",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"elemental-the-visual-way",children:"Elemental the visual way"}),"\n",(0,s.jsx)(n.p,{children:"This quickstart will show you how to deploy the Elemental plugin into an existing Rancher Manager instance."}),"\n",(0,s.jsx)(n.p,{children:"Once installed, you'll be able to provision a new Elemental cluster based on RKE2 or K3s."}),"\n",(0,s.jsx)(a.ZP,{}),"\n",(0,s.jsx)(r.ZP,{}),"\n",(0,s.jsx)(n.h2,{id:"enable-the-rancher-manager-extensions-support",children:"Enable the Rancher Manager Extensions Support"}),"\n",(0,s.jsx)(n.p,{children:"In order to enable the Rancher Manager Extensions Support, you'll need to follow the steps below:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Open a web browser, connect and login to your Rancher Manager instance"}),"\n",(0,s.jsxs)(n.li,{children:["Click on the top left menu ",(0,s.jsx)(n.code,{children:"a"})," and click on ",(0,s.jsx)(n.code,{children:"Extensions"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Rancher Manager menu",src:t(2422).Z+"",width:"279",height:"545"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Click on ",(0,s.jsx)(n.code,{children:"Enable"})," button to install the ",(0,s.jsx)(n.code,{children:"Extension Operator"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Enable Rancher Manager Extensions Operator",src:t(9744).Z+"",width:"1107",height:"420"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["A popup will appear, click on the ",(0,s.jsx)(n.code,{children:"OK"})," button to continue and install the Rancher Manager Extensions repository"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Add Rancher Manager Extensions repository",src:t(2e3).Z+"",width:"1212",height:"586"})}),"\n",(0,s.jsx)(n.h2,{id:"install-the-elemental-plugin",children:"Install the elemental plugin"}),"\n",(0,s.jsxs)(n.p,{children:["After the Rancher Manager Extensions Support is enabled, you can install the ",(0,s.jsx)(n.code,{children:"elemental"})," plugin as follow:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Under the ",(0,s.jsx)(n.code,{children:"Available"})," tab you will see ",(0,s.jsx)(n.code,{children:"elemental"})," plugin available"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Rancher Manager Available plugins",src:t(7351).Z+"",width:"620",height:"296"})}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["If the ",(0,s.jsx)(n.code,{children:"Available"})," tab shows no entries, refresh the page. The ",(0,s.jsx)(n.code,{children:"elemental"})," plugin will then appear."]})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Click on the ",(0,s.jsx)(n.code,{children:"Install"})," button, a popup will appear and click on ",(0,s.jsx)(n.code,{children:"Install"})," again to continue."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Elemental plugin install",src:t(3040).Z+"",width:"1215",height:"598"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["On the ",(0,s.jsx)(n.code,{children:"Installed"})," tab, the ",(0,s.jsx)(n.code,{children:"elemental"})," plugin is now listed."]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["If the ",(0,s.jsx)(n.code,{children:"elemental"})," plugin is listed and the status stays at ",(0,s.jsx)(n.code,{children:"Installing..."}),", refresh the page. The ",(0,s.jsx)(n.code,{children:"elemental"})," plugin will display correctly."]})}),"\n",(0,s.jsxs)(n.p,{children:["Once the ",(0,s.jsx)(n.code,{children:"elemental"})," plugin installed, you can see the ",(0,s.jsx)(n.code,{children:"OS Manamagent"})," option in the Rancher Manager menu."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Rancher Manager OS Management menu",src:t(1723).Z+"",width:"278",height:"579"})}),"\n",(0,s.jsx)(n.h2,{id:"add-a-machine-registration-endpoint",children:"Add a Machine Registration Endpoint"}),"\n",(0,s.jsxs)(n.p,{children:["In the OS Management dashboard, click the ",(0,s.jsx)(n.code,{children:"Create Registration Endpoint"})," button."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"OS Management registration endpoints",src:t(2505).Z+"",width:"766",height:"307"})}),"\n",(0,s.jsx)(n.p,{children:"Now here either you can enter each detail in its respective places or you can edit this as YAML and create the endpoint in one go. Here we'll edit every fields."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Create a Registration Endpoint with UI",src:t(7716).Z+"",width:"953",height:"1524"})}),"\n",(0,s.jsxs)(n.admonition,{title:"main options",type:"info",children:[(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"name: elemental-cluster1"}),": change this as per your need"]}),(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"device: /dev/sda"}),': make sure your target device is "sda". Otherwise find out how the disk device is named and change it here. For example, in Raspberry Pi it could be "mmblk"']}),(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"emulate-tpm: true"}),": use this only if your target device doesn't have a TPM device and you have a way of emulating TPM like in VMware or KVM"]}),(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"emulated-tpm-seed: 1"}),": increase this by 1 for every new machine. If this value is not set, each machine will receive the same TPM hash and it won't show up under the machine inventory."]})]}),"\n",(0,s.jsx)(n.admonition,{title:"attention",type:"danger",children:(0,s.jsxs)(n.p,{children:["Emulated TPM is only for non-production usage like for testing as it beats the purpose of security. So in production usage use the code above without the ",(0,s.jsx)(n.code,{children:"emulate-tpm"})," and ",(0,s.jsx)(n.code,{children:"emulate-tpm-seed"})]})}),"\n",(0,s.jsx)(n.p,{children:"Once you create the machine registration end point it should show up as active."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Machine registered in Registration Endpoints",src:t(3161).Z+"",width:"572",height:"376"})}),"\n",(0,s.jsx)(n.h2,{id:"preparing-the-installation-seed-image",children:"Preparing the installation (seed) image"}),"\n",(0,s.jsx)(n.p,{children:"Now this is the last step, you need to prepare an Elemental Teal seed image that includes the initial registration config, so\nit can be auto registered, installed and fully deployed as part of your cluster. The contents of the file are nothing\nmore than the registration URL that the node needs to register and the proper server certificate, so it can connect securely."}),"\n",(0,s.jsx)(n.p,{children:"This seed image can then be used to provision an infinite number of machines."}),"\n",(0,s.jsxs)(n.p,{children:["The seed image is created as a Kubernetes resource above and can be built using the ",(0,s.jsx)(n.code,{children:"Build ISO"})," button:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Build ISO in Registration Endpoints",src:t(3077).Z+"",width:"1247",height:"435"})}),"\n",(0,s.jsxs)(n.p,{children:["Once the build is done, ISO can be downloaded using the ",(0,s.jsx)(n.code,{children:"Download ISO"})," button:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Download ISO in Registration Endpoints",src:t(2990).Z+"",width:"1247",height:"435"})}),"\n",(0,s.jsx)(n.p,{children:"You can now boot your nodes with this image and they will:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Register with the registrationURL given and create a per-machine ",(0,s.jsx)(n.code,{children:"MachineInventory"})]}),"\n",(0,s.jsx)(n.li,{children:"Install Elemental Teal to the given device"}),"\n",(0,s.jsx)(n.li,{children:"Reboot"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"machine-inventory",children:"Machine Inventory"}),"\n",(0,s.jsxs)(n.p,{children:["When nodes are booting up for the first time, they connect to Rancher Manager and a ",(0,s.jsx)(n.a,{href:"https://elemental.docs.rancher.com/architecture#machineinventory",children:(0,s.jsx)(n.code,{children:"Machine Inventory"})})," is created for each node."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Machine Inventory menu",src:t(2691).Z+"",width:"1673",height:"574"})}),"\n",(0,s.jsxs)(n.p,{children:["Custom columns are based on ",(0,s.jsx)(n.code,{children:"Machine Inventory Labels"})," which you can add when you create your ",(0,s.jsx)(n.code,{children:"Machine Registration Endpoint"}),":"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Machine Registration Endpoint Hardware Labels",src:t(2469).Z+"",width:"1665",height:"1368"})}),"\n",(0,s.jsxs)(n.p,{children:["On the following screenshot, ",(0,s.jsx)(n.a,{href:"https://elemental.docs.rancher.com/hardwarelabels/#hardware-labels",children:(0,s.jsx)(n.code,{children:"Hardware Labels"})})," are used as custom columns:"]}),"\n",(0,s.jsx)(n.p,{children:"You can also add custom columns by clicking on the three dots menu."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Machine Inventory custom columns",src:t(11).Z+"",width:"1672",height:"734"})}),"\n",(0,s.jsxs)(n.p,{children:["Finally, you can also filter your ",(0,s.jsx)(n.code,{children:"Machine Inventory"})," using those labels."]}),"\n",(0,s.jsxs)(n.p,{children:["For instance if you only want to see your AMD machines, you can filter on ",(0,s.jsx)(n.code,{children:"CPUModel"})," like below:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Machine Inventory filtering",src:t(122).Z+"",width:"1672",height:"734"})}),"\n",(0,s.jsx)(n.h2,{id:"create-your-first-elemental-cluster",children:"Create your first Elemental Cluster"}),"\n",(0,s.jsxs)(n.p,{children:["Now let's use those ",(0,s.jsx)(n.code,{children:"Machine Inventory"})," to create a cluster by clicking on ",(0,s.jsx)(n.code,{children:"Create Elemental Cluster"})," :"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Create Elemental Cluster button",src:t(2018).Z+"",width:"1663",height:"854"})}),"\n",(0,s.jsx)(n.p,{children:"For your Elemental cluster, you can either choose K3s or RKE2 for Kubernetes."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Elemental Cluster Creation Screen",src:t(3150).Z+"",width:"1677",height:"1374"})}),"\n",(0,s.jsxs)(n.p,{children:["Most of the options are coming from Rancher, that's why we will not detail all the possibilities.\nFeel free to check the ",(0,s.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/pages-for-subheaders/rancher-server-configuration",children:"Rancher Manager documentation"})," if you want to know more."]}),"\n",(0,s.jsxs)(n.p,{children:["However, it is important to highlight the ",(0,s.jsx)(n.code,{children:"Inventory of Machines Selector Template"})," section."]}),"\n",(0,s.jsxs)(n.p,{children:["It lets you choose which ",(0,s.jsx)(n.code,{children:"Machine Inventory"})," you want to use to create your Elemental cluster using the previously defined ",(0,s.jsx)(n.code,{children:"Machine Inventory Labels"})," :"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Use Machine Inventory Selector Template",src:t(6695).Z+"",width:"1359",height:"547"})}),"\n",(0,s.jsxs)(n.p,{children:["As our three Machine Inventories contain the label ",(0,s.jsx)(n.code,{children:"CPUVendor"})," with the key ",(0,s.jsx)(n.code,{children:"AuthenticAMD"}),", the three machines will be used to create the Elemental cluster."]})]})}function p(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},2018:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-create-cluster-button-e1d0392a7278e6de17a5fbe26b77b5eb.png"},6695:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-create-cluster-machine-selector-template-a114d9eb08cb6423423a79c94900afd1.png"},3150:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-create-cluster-standard-screen--fdccedc04c52226c9b621f580de28f85.png"},3040:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-elemental-plugin-install-ecdc4ce7ce04426c02ff914ecf13d906.png"},1723:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-elemental-plugin-menu-0e0659f62678b700aa7d7341284fd9a5.png"},9744:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-extension-enable-86662009426b5220cab5c9f72a71ea4b.png"},2e3:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-extension-repository-84e4ca717832fe04524f71741750f69c.png"},7351:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-extensions-available-31f7812c57abc824b1337bd8ae3d6247.png"},11:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-machine-inventory-custom-columns-120ed1afa8effc83540bb72631623aa7.png"},122:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-machine-inventory-filtering-b7918cd6394c1d0aa8158adbc7d6039b.png"},2691:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-machine-inventory-menu-e868fad782ec36416690986b9a0ee4b9.png"},2422:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-menu-62e787746510862a9bc32b4ac1d65213.png"},3077:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-registration-endpoint-build-ISO-e3e6386d33bb61f4c45bfd261000cdc5.png"},3161:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-registration-endpoint-complete-7c3686ae051927fdb9cec1ee38a8eb58.png"},7716:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-registration-endpoint-create-details-5954e7fe1555060b20987c13a0978cd8.png"},2505:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-registration-endpoint-create-f687c90235eea798645d699b6bbd8d23.png"},2990:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-registration-endpoint-download-ISO-d9eccf8bb5bdc387fecfa757df572815.png"},2469:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-registration-endpoint-hardware-labels-d96f34687fee37f7f1438e21508cacce.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>r});var s=t(7294);const i={},a=s.createContext(i);function r(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8a4439a6.c1c15b37.js b/assets/js/8a4439a6.c1c15b37.js deleted file mode 100644 index e301be7e3..000000000 --- a/assets/js/8a4439a6.c1c15b37.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8994],{6505:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>i,default:()=>m,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var s=t(5893),l=t(1151);const a={sidebar_label:"Elemental plans",title:""},i=void 0,o={id:"elemental-plans",title:"",description:"Introduction",source:"@site/versioned_docs/version-1.2/elemental-plans.md",sourceDirName:".",slug:"/elemental-plans",permalink:"/1.2/elemental-plans",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Elemental plans",title:""},sidebar:"docs",previous:{title:"Customize Elemental Install",permalink:"/1.2/customizing"},next:{title:"Cloud-config reference",permalink:"/1.2/cloud-config-reference"}},r={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Types of Plans",id:"types-of-plans",level:2},{value:"Adding local plans on Elemental",id:"adding-local-plans-on-elemental",level:2},{value:"Plan examples",id:"plan-examples",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.a)(),...e.components},{TabItem:t,Tabs:a}=n;return t||p("TabItem",!0),a||p("Tabs",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsxs)(n.p,{children:["Elemental uses the ",(0,s.jsx)(n.a,{href:"https://github.com/rancher/system-agent",children:"Rancher System Agent"}),", renamed to Elemental System Agent, to initially bootstrap the node with a simple plan."]}),"\n",(0,s.jsx)(n.p,{children:"The plan will apply the following configurations:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Set some labels for the node"}),"\n",(0,s.jsxs)(n.li,{children:["Set the proper hostname according to the ",(0,s.jsx)(n.code,{children:"MachineInventory"})," value"]}),"\n",(0,s.jsx)(n.li,{children:"Install the default Rancher System Agent from Rancher Server, and install the proper Kubernetes components"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The bootstrap service also accepts local plans stored under ",(0,s.jsx)(n.code,{children:"/var/lib/elemental/agent/plans"}),". Any plan written\nin there will also be applied during the initial node start after the installation is completed."]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["The local plans run only during the initial Elemental bootstrap ",(0,s.jsx)(n.strong,{children:"before"})," Kubernetes is installed on the node."]})}),"\n",(0,s.jsx)(n.h2,{id:"types-of-plans",children:"Types of Plans"}),"\n",(0,s.jsx)(n.p,{children:"The type of plans that Elemental can use are:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"One time instructions: Only run once"}),"\n",(0,s.jsx)(n.li,{children:"Periodic instructions: They run periodically"}),"\n",(0,s.jsx)(n.li,{children:"Files: Creates files"}),"\n",(0,s.jsx)(n.li,{children:"Probes: http probes"}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsx)(n.p,{children:"Both one time instructions and periodic instructions can run either a direct command or a docker image."})}),"\n",(0,s.jsx)(n.h2,{id:"adding-local-plans-on-elemental",children:"Adding local plans on Elemental"}),"\n",(0,s.jsxs)(n.p,{children:["You can add local plans to Elemental as part of the ",(0,s.jsx)(n.code,{children:"MachineRegistration"})," CRD, in the ",(0,s.jsx)(n.code,{children:"cloud-config"})," section as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n write_files:\n - path: /var/lib/elemental/agent/plans/mycustomplan.plan\n permissions: "0600"\n content: |\n {"instructions":\n [\n {\n "name":"set hostname",\n "command":"hostnamectl",\n "args": ["set-hostname", "myHostname"]\n },\n {\n "name":"stop sshd service",\n "command":"systemctl",\n "args": ["stop", "sshd"]\n }\n ]\n }\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineName: my-machine\n machineInventoryLabels:\n element: fire\n'})}),"\n",(0,s.jsx)(n.h2,{id:"plan-examples",children:"Plan examples"}),"\n",(0,s.jsxs)(n.p,{children:["The following plans are provided as a quick reference and are not guaranteed to work in your environment. To learn more about plans please check ",(0,s.jsx)(n.a,{href:"https://github.com/rancher/system-agent",children:"Rancher System Agent"}),"."]}),"\n",(0,s.jsxs)(a,{children:[(0,s.jsx)(t,{value:"example1",label:"Example 1: one time instructions",default:!0,children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"instructions":\n [\n {\n "name":"set hostname",\n "command":"hostnamectl",\n "args": ["set-hostname", "myHostname"]\n },\n {\n "name":"stop sshd service",\n "command":"systemctl",\n "args": ["stop", "sshd"]\n }\n ]\n}\n'})})}),(0,s.jsx)(t,{value:"example2",label:"Example 2: periodic instructions",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"periodicInstructions":\n [\n {\n "name":"set hostname",\n "image":"ghcr.io/rancher-sandbox/elemental-example-plan:main"\n "command": "run.sh"\n }\n ]\n}\n'})})}),(0,s.jsx)(t,{value:"example3",label:"Example 3: files",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"files":\n [\n {\n "content":"Welcome to the system",\n "path":"/etc/motd",\n "permissions": "0644"\n }\n ]\n}\n'})})}),(0,s.jsx)(t,{value:"example4",label:"Example 4: probes",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"probes":\n "probe1": {\n "name": "Service Up",\n "httpGet": {\n "url": "http://10.0.0.1/healthz",\n "insecure": "false",\n "clientCert": "....",\n "clientKey": "....",\n "caCert": "....."\n } \n }\n}\n'})})})]})]})}function m(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}function p(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>i});var s=t(7294);const l={},a=s.createContext(l);function i(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8a4439a6.f877937c.js b/assets/js/8a4439a6.f877937c.js new file mode 100644 index 000000000..f0c851ce2 --- /dev/null +++ b/assets/js/8a4439a6.f877937c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8994],{6505:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>i,default:()=>m,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var s=t(5893),l=t(1151);const a={sidebar_label:"Elemental plans",title:""},i=void 0,o={id:"elemental-plans",title:"",description:"Introduction",source:"@site/versioned_docs/version-1.2/elemental-plans.md",sourceDirName:".",slug:"/elemental-plans",permalink:"/1.2/elemental-plans",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Elemental plans",title:""},sidebar:"docs",previous:{title:"Customize Elemental Install",permalink:"/1.2/customizing"},next:{title:"Cloud-config reference",permalink:"/1.2/cloud-config-reference"}},r={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Types of Plans",id:"types-of-plans",level:2},{value:"Adding local plans on Elemental",id:"adding-local-plans-on-elemental",level:2},{value:"Plan examples",id:"plan-examples",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.a)(),...e.components},{Head:t,TabItem:a,Tabs:i}=n;return t||p("Head",!0),a||p("TabItem",!0),i||p("Tabs",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t,{children:(0,s.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/elemental-plans"})}),"\n",(0,s.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsxs)(n.p,{children:["Elemental uses the ",(0,s.jsx)(n.a,{href:"https://github.com/rancher/system-agent",children:"Rancher System Agent"}),", renamed to Elemental System Agent, to initially bootstrap the node with a simple plan."]}),"\n",(0,s.jsx)(n.p,{children:"The plan will apply the following configurations:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Set some labels for the node"}),"\n",(0,s.jsxs)(n.li,{children:["Set the proper hostname according to the ",(0,s.jsx)(n.code,{children:"MachineInventory"})," value"]}),"\n",(0,s.jsx)(n.li,{children:"Install the default Rancher System Agent from Rancher Server, and install the proper Kubernetes components"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The bootstrap service also accepts local plans stored under ",(0,s.jsx)(n.code,{children:"/var/lib/elemental/agent/plans"}),". Any plan written\nin there will also be applied during the initial node start after the installation is completed."]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["The local plans run only during the initial Elemental bootstrap ",(0,s.jsx)(n.strong,{children:"before"})," Kubernetes is installed on the node."]})}),"\n",(0,s.jsx)(n.h2,{id:"types-of-plans",children:"Types of Plans"}),"\n",(0,s.jsx)(n.p,{children:"The type of plans that Elemental can use are:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"One time instructions: Only run once"}),"\n",(0,s.jsx)(n.li,{children:"Periodic instructions: They run periodically"}),"\n",(0,s.jsx)(n.li,{children:"Files: Creates files"}),"\n",(0,s.jsx)(n.li,{children:"Probes: http probes"}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsx)(n.p,{children:"Both one time instructions and periodic instructions can run either a direct command or a docker image."})}),"\n",(0,s.jsx)(n.h2,{id:"adding-local-plans-on-elemental",children:"Adding local plans on Elemental"}),"\n",(0,s.jsxs)(n.p,{children:["You can add local plans to Elemental as part of the ",(0,s.jsx)(n.code,{children:"MachineRegistration"})," CRD, in the ",(0,s.jsx)(n.code,{children:"cloud-config"})," section as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n write_files:\n - path: /var/lib/elemental/agent/plans/mycustomplan.plan\n permissions: "0600"\n content: |\n {"instructions":\n [\n {\n "name":"set hostname",\n "command":"hostnamectl",\n "args": ["set-hostname", "myHostname"]\n },\n {\n "name":"stop sshd service",\n "command":"systemctl",\n "args": ["stop", "sshd"]\n }\n ]\n }\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineName: my-machine\n machineInventoryLabels:\n element: fire\n'})}),"\n",(0,s.jsx)(n.h2,{id:"plan-examples",children:"Plan examples"}),"\n",(0,s.jsxs)(n.p,{children:["The following plans are provided as a quick reference and are not guaranteed to work in your environment. To learn more about plans please check ",(0,s.jsx)(n.a,{href:"https://github.com/rancher/system-agent",children:"Rancher System Agent"}),"."]}),"\n",(0,s.jsxs)(i,{children:[(0,s.jsx)(a,{value:"example1",label:"Example 1: one time instructions",default:!0,children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"instructions":\n [\n {\n "name":"set hostname",\n "command":"hostnamectl",\n "args": ["set-hostname", "myHostname"]\n },\n {\n "name":"stop sshd service",\n "command":"systemctl",\n "args": ["stop", "sshd"]\n }\n ]\n}\n'})})}),(0,s.jsx)(a,{value:"example2",label:"Example 2: periodic instructions",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"periodicInstructions":\n [\n {\n "name":"set hostname",\n "image":"ghcr.io/rancher-sandbox/elemental-example-plan:main"\n "command": "run.sh"\n }\n ]\n}\n'})})}),(0,s.jsx)(a,{value:"example3",label:"Example 3: files",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"files":\n [\n {\n "content":"Welcome to the system",\n "path":"/etc/motd",\n "permissions": "0644"\n }\n ]\n}\n'})})}),(0,s.jsx)(a,{value:"example4",label:"Example 4: probes",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"probes":\n "probe1": {\n "name": "Service Up",\n "httpGet": {\n "url": "http://10.0.0.1/healthz",\n "insecure": "false",\n "clientCert": "....",\n "clientKey": "....",\n "caCert": "....."\n } \n }\n}\n'})})})]})]})}function m(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}function p(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>i});var s=t(7294);const l={},a=s.createContext(l);function i(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8a54026e.14fb0e94.js b/assets/js/8a54026e.14fb0e94.js deleted file mode 100644 index 6cc9524b3..000000000 --- a/assets/js/8a54026e.14fb0e94.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8639],{4517:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var c=i(5893),n=i(1151);const o={sidebar_label:"Add a custom certificate",title:""},r=void 0,s={id:"custom-certificate",title:"",description:"How to add a custom certificate",source:"@site/docs/custom-certificate.md",sourceDirName:".",slug:"/custom-certificate",permalink:"/next/custom-certificate",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Add a custom certificate",title:""},sidebar:"docs",previous:{title:"Include cloud-config from removable devices",permalink:"/next/removable-device-cloudconfig"},next:{title:"Air-Gapped Installation",permalink:"/next/airgap"}},a={},d=[{value:"How to add a custom certificate",id:"how-to-add-a-custom-certificate",level:3}];function l(e){const t={admonition:"admonition",code:"code",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.a)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(t.h3,{id:"how-to-add-a-custom-certificate",children:"How to add a custom certificate"}),"\n",(0,c.jsxs)(t.p,{children:["Prerequisite: A certificate in ",(0,c.jsx)(t.code,{children:".pem"})," format"]}),"\n",(0,c.jsx)(t.p,{children:"Goal: Make a custom certificate available system-wide"}),"\n",(0,c.jsx)(t.admonition,{title:"This is for certificates used by system-level services.",type:"note",children:(0,c.jsx)(t.p,{children:"Kubernetes workloads should bring their certificates within the\ncontainer image instead."})}),"\n",(0,c.jsx)(t.p,{children:"In order to install a custom certificate on SLE Micro for Rancher we\nneed to"}),"\n",(0,c.jsxs)(t.ul,{children:["\n",(0,c.jsxs)(t.li,{children:["copy the ",(0,c.jsx)(t.code,{children:".pem"})," file to ",(0,c.jsx)(t.code,{children:"/etc/pki/trust/anchors/"})]}),"\n",(0,c.jsxs)(t.li,{children:["run ",(0,c.jsx)(t.code,{children:"update-ca-certificates"})]}),"\n"]}),"\n",(0,c.jsxs)(t.p,{children:["The respective ",(0,c.jsx)(t.code,{children:"cloud-config"})," snippet looks like this:"]}),"\n",(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:"language-yaml",children:"write_files:\n - path: /etc/pki/trust/anchors/my-custom-certificate.pem\n permission: 0444\n content: |-\n -----BEGIN CERTIFICATE-----\n ...\n -----END CERTIFICATE-----\nruncmd:\n - update-ca-certificates\n"})}),"\n",(0,c.jsx)(t.p,{children:"(actual certificate content omitted for brevity reasons)"})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,c.jsx)(t,{...e,children:(0,c.jsx)(l,{...e})}):l(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>s,a:()=>r});var c=i(7294);const n={},o=c.createContext(n);function r(e){const t=c.useContext(o);return c.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),c.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8a54026e.c3648038.js b/assets/js/8a54026e.c3648038.js new file mode 100644 index 000000000..afada0ac0 --- /dev/null +++ b/assets/js/8a54026e.c3648038.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8639],{4517:(e,t,c)=>{c.r(t),c.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var i=c(5893),n=c(1151);const o={sidebar_label:"Add a custom certificate",title:""},r=void 0,s={id:"custom-certificate",title:"",description:"How to add a custom certificate",source:"@site/docs/custom-certificate.md",sourceDirName:".",slug:"/custom-certificate",permalink:"/next/custom-certificate",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Add a custom certificate",title:""},sidebar:"docs",previous:{title:"Include cloud-config from removable devices",permalink:"/next/removable-device-cloudconfig"},next:{title:"Air-Gapped Installation",permalink:"/next/airgap"}},a={},d=[{value:"How to add a custom certificate",id:"how-to-add-a-custom-certificate",level:3}];function l(e){const t={admonition:"admonition",code:"code",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.a)(),...e.components},{Head:c}=t;return c||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(c,{children:(0,i.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/custom-certificate"})}),"\n",(0,i.jsx)(t.h3,{id:"how-to-add-a-custom-certificate",children:"How to add a custom certificate"}),"\n",(0,i.jsxs)(t.p,{children:["Prerequisite: A certificate in ",(0,i.jsx)(t.code,{children:".pem"})," format"]}),"\n",(0,i.jsx)(t.p,{children:"Goal: Make a custom certificate available system-wide"}),"\n",(0,i.jsx)(t.admonition,{title:"This is for certificates used by system-level services.",type:"note",children:(0,i.jsx)(t.p,{children:"Kubernetes workloads should bring their certificates within the\ncontainer image instead."})}),"\n",(0,i.jsx)(t.p,{children:"In order to install a custom certificate on SLE Micro for Rancher we\nneed to"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["copy the ",(0,i.jsx)(t.code,{children:".pem"})," file to ",(0,i.jsx)(t.code,{children:"/etc/pki/trust/anchors/"})]}),"\n",(0,i.jsxs)(t.li,{children:["run ",(0,i.jsx)(t.code,{children:"update-ca-certificates"})]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["The respective ",(0,i.jsx)(t.code,{children:"cloud-config"})," snippet looks like this:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-yaml",children:"write_files:\n - path: /etc/pki/trust/anchors/my-custom-certificate.pem\n permission: 0444\n content: |-\n -----BEGIN CERTIFICATE-----\n ...\n -----END CERTIFICATE-----\nruncmd:\n - update-ca-certificates\n"})}),"\n",(0,i.jsx)(t.p,{children:"(actual certificate content omitted for brevity reasons)"})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},1151:(e,t,c)=>{c.d(t,{Z:()=>s,a:()=>r});var i=c(7294);const n={},o=i.createContext(n);function r(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8d09d3e9.08d1d35e.js b/assets/js/8d09d3e9.08d1d35e.js deleted file mode 100644 index d95ee8585..000000000 --- a/assets/js/8d09d3e9.08d1d35e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6747],{1015:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>o});var a=n(5893),i=n(1151);const r={sidebar_label:"How to use Elemental with Rancher and VMware",title:""},s="How to use Elemental with Rancher and VMware",l={id:"rancher-vmware",title:"",description:"Excerpt",source:"@site/docs/rancher-vmware.md",sourceDirName:".",slug:"/rancher-vmware",permalink:"/next/rancher-vmware",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"How to use Elemental with Rancher and VMware",title:""},sidebar:"docs",previous:{title:"Elemental behind proxy",permalink:"/next/elemental_behind_proxy"},next:{title:"Include cloud-config from removable devices",permalink:"/next/removable-device-cloudconfig"}},c={},o=[{value:"Excerpt",id:"excerpt",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"Part 1: Rancher Configuration",id:"part-1-rancher-configuration",level:2},{value:"1.1 Enable the extensions under Rancher configurations menu",id:"11-enable-the-extensions-under-rancher-configurations-menu",level:3},{value:"1.2 Install Elemental Plugin",id:"12-install-elemental-plugin",level:3},{value:"1.3 Install the elemental operator in Rancher cluster",id:"13-install-the-elemental-operator-in-rancher-cluster",level:3},{value:"Part 2: Create the Machine Registration Endpoint",id:"part-2-create-the-machine-registration-endpoint",level:2},{value:"Part 3: Create the ISO",id:"part-3-create-the-iso",level:2},{value:"Part 4: Boot the target device",id:"part-4-boot-the-target-device",level:2},{value:"4.1 Prepare the VM to emulate TPM",id:"41-prepare-the-vm-to-emulate-tpm",level:3},{value:"4.2 Boot the VM with the elemental ISO",id:"42-boot-the-vm-with-the-elemental-iso",level:3},{value:"Part 5: Create a cluster on the machine",id:"part-5-create-a-cluster-on-the-machine",level:2}];function d(e){const t={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h1,{id:"how-to-use-elemental-with-rancher-and-vmware",children:"How to use Elemental with Rancher and VMware"}),"\n",(0,a.jsx)(t.h2,{id:"excerpt",children:"Excerpt"}),"\n",(0,a.jsx)(t.p,{children:"In this document we will see how we can enable elemental support in Rancher and then build iso and test it on a vm in VMware mimicking it for an edge device."}),"\n",(0,a.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsx)(t.li,{children:"Rancher 2.7 or higher installed and running."}),"\n",(0,a.jsx)(t.li,{children:"One Linux machine with docker installed."}),"\n"]}),"\n",(0,a.jsx)(t.h2,{id:"part-1-rancher-configuration",children:"Part 1: Rancher Configuration"}),"\n",(0,a.jsx)(t.h3,{id:"11-enable-the-extensions-under-rancher-configurations-menu",children:"1.1 Enable the extensions under Rancher configurations menu"}),"\n",(0,a.jsx)(t.p,{children:"Click on extensions under the configuration menu and enable it by hitting enable."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Enable extensions in Rancher",src:n(9699).Z+"",width:"323",height:"193"})}),"\n",(0,a.jsx)(t.p,{children:"Once you click on enable a dialogue box will pop up asking for confirmation and it will also notify you that the rancher extensions repository will be enabled, make sure it is checked and then confirm."}),"\n",(0,a.jsx)(t.h3,{id:"12-install-elemental-plugin",children:"1.2 Install Elemental Plugin"}),"\n",(0,a.jsx)(t.p,{children:"After the extensions are enabled under the available tab you should see elemental plugin available for installation."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental extension enabled",src:n(9573).Z+"",width:"770",height:"367"})}),"\n",(0,a.jsx)(t.p,{children:"Click on Install, this will again ask for a confirmation. Click on Install again to continue. Once the installation is finished it will ask to reload the tab. Reload it by hitting reload, post reloading you should see the elemental plugin under the installed tab."}),"\n",(0,a.jsx)(t.h3,{id:"13-install-the-elemental-operator-in-rancher-cluster",children:"1.3 Install the elemental operator in Rancher cluster"}),"\n",(0,a.jsx)(t.p,{children:"The next step is to install the elemental operator in Rancher Cluster. For that connect to the Rancher K8S cluster and enter the below command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental operator install",src:n(1696).Z+"",width:"2100",height:"527"})}),"\n",(0,a.jsx)(t.p,{children:"Once the command is successful validate whether the the pod is running before continuing"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl get pods -n cattle-elemental-system\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental operator pod",src:n(7813).Z+"",width:"817",height:"120"})}),"\n",(0,a.jsx)(t.p,{children:'This will enable the "OS Management" sub menu under the "Global Apps" menu.'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"OS Management menu",src:n(950).Z+"",width:"433",height:"272"})}),"\n",(0,a.jsx)(t.p,{children:"The OS Management dashboard at this point should have nothing in it."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"OS Management dashboard",src:n(51).Z+"",width:"2546",height:"913"})}),"\n",(0,a.jsx)(t.p,{children:"At this point we are ready to proceed with the next step, that is to prepare the ISO."}),"\n",(0,a.jsx)(t.h2,{id:"part-2-create-the-machine-registration-endpoint",children:"Part 2: Create the Machine Registration Endpoint"}),"\n",(0,a.jsx)(t.p,{children:"In the OS Management dashboard hit the create registration endpoint button."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"OS Management registration endpoints",src:n(1717).Z+"",width:"757",height:"404"})}),"\n",(0,a.jsx)(t.p,{children:"Now here either you can enter each detail in its respective places or you can edit this as yaml and create the endpoint in one go. Here we will edit this as yaml."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: elemental-cls1\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n registration:\n emulate-tpm: true\n emulated-tpm-seed: 1\n machineName:\n machineInventoryLabels:\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'})}),"\n",(0,a.jsx)(t.p,{children:"Remove the existing content and enter this code snippet and click on save. Remember to modify this as per your need."}),"\n",(0,a.jsxs)(t.admonition,{title:"main options",type:"info",children:[(0,a.jsx)(t.p,{children:'name: elemental-cls1 --\x3e "Change this as per your need"'}),(0,a.jsx)(t.p,{children:'device: /dev/sda --\x3e Make sure your target device is "sda" otherwise find out and change the naming convention here, for example in raspberry pi it could be "mmblk---"'}),(0,a.jsx)(t.p,{children:"emulate-tpm: true --\x3e Use this only if your target device doesnt have a tpm device and you have a way of emulating tpm like in VMware or KVM"}),(0,a.jsx)(t.p,{children:"emulated-tpm-seed: 1 --\x3e increase this by 1 for every new machine. --\x3e If this is not given each machine will recieve the same tpm hash so at any point in time regardless of how many machines you boot it wont show up under the machine inventory."})]}),"\n",(0,a.jsx)(t.admonition,{title:"attention",type:"danger",children:(0,a.jsx)(t.p,{children:"Emulate TPM is only for non-production usage like for testing as it beats the purpose of security. So in production usage use the code above without the emulate-tpm and emulate-tpm-seed"})}),"\n",(0,a.jsx)(t.p,{children:"Once you create the machine registration end point it should show up as active."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Machine registered in Registration Endpoints",src:n(8588).Z+"",width:"559",height:"464"})}),"\n",(0,a.jsx)(t.p,{children:"Next click on it to view the registration url and download the initial-registration yaml."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Initial registration URL",src:n(306).Z+"",width:"1454",height:"611"})}),"\n",(0,a.jsx)(t.p,{children:'Hit the download button, this will download the "initial-registration.yaml" file on to your local system.'}),"\n",(0,a.jsx)(t.p,{children:"The registration yaml looks something like this:"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Example of initial registration YAML",src:n(1318).Z+"",width:"947",height:"384"})}),"\n",(0,a.jsx)(t.p,{children:"We will use this file and inject its content into our vanilla elemental iso."}),"\n",(0,a.jsx)(t.h2,{id:"part-3-create-the-iso",children:"Part 3: Create the ISO"}),"\n",(0,a.jsx)(t.p,{children:"Make sure you have initial-registration.yaml in the system where you will create the iso in this we will use a Linux vm."}),"\n",(0,a.jsx)(t.p,{children:"Create a directory to keep everything:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"mkdir /home/tux/elemental-demo && cd /home/tux/elemental-demo\n"})}),"\n",(0,a.jsx)(t.p,{children:"Create a file and copy the contents of the initial-registration.yaml in it."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"vim initial-registration.yaml\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create file with initial registration YAML",src:n(2008).Z+"",width:"1105",height:"441"})}),"\n",(0,a.jsx)(t.p,{children:"Next download the script to download the iso and inject the registration.yaml in the iso and make it executable"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://raw.githubusercontent.com/rancher/elemental/main/.github/elemental-iso-add-registration && chmod +x elemental-iso-add-registration\n"})}),"\n",(0,a.jsx)(t.p,{children:"Next execute the script and pass the initial-registration.yaml as an argument"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"./elemental-iso-add-registration initial-registration.yaml\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create ISO with the initial registration options",src:n(297).Z+"",width:"1654",height:"1206"})}),"\n",(0,a.jsx)(t.p,{children:"This command will download the vanilla iso and inject it with the parameters of initial-registration.yaml and create a final iso for you to boot your end device."}),"\n",(0,a.jsxs)(t.admonition,{type:"note",children:[(0,a.jsx)(t.p,{children:"If you would like to download the vanilla ISO and reuse it later to create additional ISO's, then you can download the iso separately using the below command and then pass the local file path as an argument to the script"}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable:/Teal53/media/iso/elemental-teal.x86_64.iso \n\n./elemental-iso-add-registration initial-registration.yaml /home/elemental-iso/elemental-teal.x86_64.iso\n"})})]}),"\n",(0,a.jsx)(t.h2,{id:"part-4-boot-the-target-device",children:"Part 4: Boot the target device"}),"\n",(0,a.jsx)(t.p,{children:"Now ideally you would just burn the iso to a usb drive and boot your edge device using the usb device and once it boots and become active in Rancher under machine inventory you can select and create a cluster from it, however here we will use a vm to mimic an edge device for testing."}),"\n",(0,a.jsx)(t.h3,{id:"41-prepare-the-vm-to-emulate-tpm",children:"4.1 Prepare the VM to emulate TPM"}),"\n",(0,a.jsx)(t.p,{children:"In VMware workstation create a vm the way you would do normally, make sure to give the HDD size at least 40 GB."}),"\n",(0,a.jsx)(t.p,{children:'Now edit the machine settings and go to the "Options" tab. The very last option would be "Advanced".'}),"\n",(0,a.jsx)(t.p,{children:'Click on "advanced" and on the right window pane change the firmware type from "BIOS" to "UEFI" and check the "Enable secure boot" option as follow:'}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Default settings with BIOS selected"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"VM boot options with BIOS",src:n(5994).Z+"",width:"709",height:"218"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Updated settings with UEFI selected and secure boot enabled"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"VM boot options with UEFI",src:n(4948).Z+"",width:"684",height:"208"})}),"\n",(0,a.jsx)(t.p,{children:'Now on the same "Options" tab click on the "Access Control" option and click on "Encrypt" on the right side.'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Access control menu",src:n(1394).Z+"",width:"242",height:"28"})}),"\n",(0,a.jsx)(t.p,{children:'This will ask you to enter a password to encrypt the machine. Enter a password and click on "Encrypt"'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Access control encryption credentials",src:n(8670).Z+"",width:"352",height:"431"})}),"\n",(0,a.jsx)(t.p,{children:'This is important to add the TPM Hardware. Next go back to the Hardware options and click on "Add"'}),"\n",(0,a.jsx)(t.p,{children:'And add the TPM (Trusted Platform Module) hardware and click on "Finish"'}),"\n",(0,a.jsx)(t.p,{children:"Now with the completion of this step our VM is ready."}),"\n",(0,a.jsx)(t.h3,{id:"42-boot-the-vm-with-the-elemental-iso",children:"4.2 Boot the VM with the elemental ISO"}),"\n",(0,a.jsx)(t.p,{children:"Next add the ISO that we created earlier in the VM and boot it up."}),"\n",(0,a.jsx)(t.p,{children:"It should boot up with the ISO and start installing Elemental:"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental OS install grub menu",src:n(8464).Z+"",width:"677",height:"451"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental OS install logs",src:n(5786).Z+"",width:"1052",height:"281"})}),"\n",(0,a.jsx)(t.p,{children:"And once it is complete it will reboot the VM and it should show up as active under the machine inventory in Rancher as follow:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Machine inventory status while booting"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Machine inventory status during boot",src:n(3518).Z+"",width:"612",height:"159"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Machine inventory status after boot completed"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Machine inventory status after boot complete",src:n(3021).Z+"",width:"622",height:"112"})}),"\n",(0,a.jsx)(t.h2,{id:"part-5-create-a-cluster-on-the-machine",children:"Part 5: Create a cluster on the machine"}),"\n",(0,a.jsx)(t.p,{children:'Once the machine shows up as active, select it and hit "Create Elemental Cluster".'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create Elemental cluster",src:n(8264).Z+"",width:"811",height:"398"})}),"\n",(0,a.jsx)(t.p,{children:"At this stage you get a pretty familiar page of creating a cluster in Rancher."}),"\n",(0,a.jsx)(t.p,{children:'Give the cluster a name select the Kubernetes version and hit "Create".'}),"\n",(0,a.jsx)(t.p,{children:"For this we have selected to create a K3S cluster."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental cluster configuration",src:n(9411).Z+"",width:"2294",height:"1224"})}),"\n",(0,a.jsx)(t.p,{children:"Now under the Cluster Management page the cluster should show up as creating:"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental cluster provisioning",src:n(5419).Z+"",width:"793",height:"279"})}),"\n",(0,a.jsx)(t.p,{children:'And once the cluster is fully provisioned it should be active with provider type as "Elemental".'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental cluster created",src:n(5114).Z+"",width:"2279",height:"242"})}),"\n",(0,a.jsx)(t.p,{children:"Now you can start deploying application on this cluster the normal way."})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8670:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-access-control-encrypt-60a89768dd80961e42f48b1717f607cb.png"},1394:(e,t,n)=>{n.d(t,{Z:()=>a});const a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPIAAAAcCAIAAADURHUBAAAGgklEQVR4nO2bQWwaRxSG/21SUCwtlaotXZWTLUhpiOEMPtmqrAIXR5Ecu4rk9rI0J7Aqt6VKpCiKiqo0Ak6tuSStrJpEiuKLQXId+2SqqifcotIuik9IGG8ii5XsQGzRA+yyu2CDE7Ax2e/E23lv5s2bp5k3C+BWIFQ+gE8mmdab2KAd9iArCvYgywbtYGKy1hgD4ZGgyVSNKjYVVZmKtLFOv9Zh1U4c2l7Tg2Bb7bnaeoCtYkSVU8hZtAmjL8HCYSKmK6I9yBqNxl+CDhNBALAzjB0AnLOs8KiilPgQ01Uje5BNGAH4bjCEi4jYg2zCZwSATMhhmv4dMBH/xMpjcn0jah0ysbITmX8r3twYJCp6wtCAUeiZYYCP5M5IbFVOP8StQOjGN96Gbc5PPYdYxn+d7YxLKiqvy2G7tZq4KqeUt07aARWV9qOmtUoP0oYrI+FPv34nKiptpHFam67dO9yM/fHzDjijotIeDtytD0ncpkmvonKyvEptrW7VKl1Ok9r6Da1GaIqdxFSQS5y0I73D8Ya0+ZXxKNWIJjQ94AU3dAze2wzlCbL6OZUl5viWrE5hvrIBM1afmpZKwKH+n9TUujKkbX3BR+vc4OMgx+l29lqPY7S/PAGPP03404Q/7YGO6eyAJ0qeZy2GUIdD2mMc/QXf+vKj7LsgiMsfPFNs5A4riVR2QT8wY9X4ciUAABkLGJwAgHg07UrKxU2K9VJGACiGwxu+HByj/WvDWgDIc0NBDnJR2A804xaEw9mIMG5kLgsAtNgb7/FnIzTFTmJxi/JaxNE1oUnKqMdagMqkeLxXXNyivBZBWWp75KB0lOLtFax9TPqkJ5LSYcnUxK1dplYMhzd8qI8JZGu0ypksEMKydWF64PyKqEP9F+XdI1oWpFMvmsvHXdcpFlTiAJDnOh+rKkdM6/L+4039ZacVwOPf1i+V90GcEdo04xYszpci7/OzIzrHEpeAJjRtQDRNJKsKcpGMBbR3/OkIKgcZ9XAePw+XPP6NCMBcNVykqRmpCFTTmta59aU7OYVnZMxLsdG0KQnHaP/aVTKyDOip8ytpYg6wGcojlCPJ+eY5d+XEpCnWK7Q2tO0qklnPoDlmS7s2K3Kdw3N8bWo1MzLmVUa4LiaFcemi0BQ7LIYFWOHLgySSPGw6Z4pzbWrdes1/4bQrVykCDUwyKxm3bkGDxeuCn5Va5dg4YloXnl0qPQGsAC6VnqBA4x19tYnWucFP5YBcIT5BjdNcAjo3uKkkJApSUWsCORswC7874S/mCiyo2YAB/mxkLguQYzJRQr74t8IxWmvKVztPrPMZr45ZLiLP3a4Mt1nM1M9FbG1o22VElrmZScoxD6CRw+AbnDD1EUZdTBSLAklYACQL8QkdAx6DZPyvLKBFnn+YE5uoC9LSqH44GqKfx8zR0vr7u/f3SsW3//wBwMsXu2f/uP/1ra8qTQ4radRr1wJURTRZNb71Zt3llZfLiD8NkLGAeRa8x591ycXqyuWKrJ4ap7mEcsPuaXLcVKr/urW1m7GIIsI0NXM0e34hZRizkbDwC3NA0/r+dYdrGwdeGRu+2tstbL98sbuz/Xxn+/nLF7u7hW2xadyijUerdzgiyhstOkeusAjquk3QUIpFVi8RAdBUbFQD8C7/03Bec8EmF2sx5W+vwus1iNdE5qqBkfTmsJLGVOHA+livvah40rrtiZJY4jBMGXGww4qp1Ue4HsWi1BFZ5kwTBtPqljImNp1T3Lkr49YPlyuy+ur7A4eVNLYwx3bReLd+hbfRsrMsWa1DfPMc6zWXJ4DKDUMhhmsi8txQsAjvQHkYADKrT01JbSwgESV7c2JpYwj9a+J5l8oS4CO13niPnwetbeBljruTMs8GzDMpHhArDd7Viu3Jw7uifHkEDRyGZGq1KyOvjPB8fZ8l2Rqt1t3qcoXFPIl14Q6qp4QDmff4uYRiXOWCcq6oruw1e4FMim9QB3aMw/5GAMB07Z40xW/6vlUo3Ax9p/7UqZexGcojxWpp0ZWvqBvSvLYWq5He/EJR5VCYQTK+ku3+PFbQZLduqQt1t1bpMtS/Eaj0IA2KkPsPFh4tLu3t7Tc3Pnvmsnu0HBjrgGMqKq9Og7R+tLj04Ke7fX3nmhrv7Oxe+eLLz66oaa3SXTQoQvb29lvJaQB9feda2dRVVI4ZtbZW6UHe1LTOhByO0HF+QfBGEPcQBEEQhCcu/3zs/A8CtQt0OqppGQAAAABJRU5ErkJggg=="},8264:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-create-8d06bbcd84075d084212bc3d049dfbbc.png"},5114:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-created-39460fab3f9c3863673be51507d2d22d.png"},5419:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-provisioning-b1a441f0c9dd8db3af090c57bf8b216c.png"},9411:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-template-71f1e521ea8047e899ec3b0f9e48225b.png"},8464:(e,t,n)=>{n.d(t,{Z:()=>a});const a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqUAAAHDCAIAAACS//S/AAAT3klEQVR4nO3dXbqjqBoGULufHmyGlOGei3R7LBUERcXPta5SlhsQ0de/mGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA4/66uwHQke/3O37+fD7jlN/n6T9T0/eVP1VS73L+F5p1RUk/jH8ym3m5XiCev+9uAPRizNRlEi9TtlX5Y7qs1rtUO//tvt/vGS2cdmZhP0w7fLlyp0VBSPIehmEtfVdnOK98qtRm87T/p5FfeGEGAvjn7gZAp87OgJdkzEsWE/on7+GNlhe3Z88KjGbzLG+BZ+6jr94vry0faML1fNh2wZ3y8T53Yc7Vzl/ejGHtvvj4eTY9fx89dVukvPyqNpfPvJw4KqwUHsf5PfwhFVerz8Y3LD81JWUMxV9GHm9YlVSN17ekyUHP9FrFLf0JF5D38IezT+UzX8PrJ2zKF39s9nTKOY1asSPse+heuIW8h1KtTvH7tztBrzxk8Wg9VHH/HnrxiO/Td0LYQy15D8Nw32X8u0xv/w/p4Nx8hK2fZ9xmzVi9y+A797yZ9+nC/6USYvbds9XwLsmPzPt0Vx9WX5bf9n26q8m3WW/J/Mv/2vz+XuYrgqmWzyyrTjV18/uBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENdf11f5/X6vrxQAHu3z+Rz5839ataPWwXYDwEs0OU/++3gRAEDn5D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQ323v2xl53R4ALLV9MZ3zewCIT94DQHz3X89PWb2OMV78H//3+tsBn8+nvNLydi6X9+CiNWnnjf0MQEP9nt+PAfP9fpdhc1f81N5NKW/ndDFXF7lKq3aKeYAY+s37GcEDALs9Ju8HkQ8Ae3Vx//538fn7/Y4fljOUhP3sIvbvT6Z3oGflZ+YfZ16WM51nWU7zg5JUe/Ltv76dAPSsi/P7WdDO/rfwVvT45+PN79Qf/qan5h8/L6en7q+XVLpbqj2Z9t/STgB6dv/5/Sx4lqk/PbVtWFEwztcByLg/75dX3VPzlEiF+u+gYXno8Nwjid+yVF2ij33EA0DG/Xk//HmLuupb40u1f3v8tHh2F+BgaVWmjd/suhvbCcDtusj76f3mzGwHDwUA4LW6eF6vRO0p6exa9+3zN1fYgNvbCUAP+s37MaVWE2v6v78P45Xqcf78xYDa+Wd/NX6elpP6RtxQcLwyXcySkM63v1U7y9sPQM/+ur7Kkgf0AODllie0R0rr9/weAGhF3gNAfPIeAOK7//t4HgQDgLM5vweA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+P65q+Lv93tX1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwLq/7m7A6b7f7zAMn89n9Z9tK5oW+6vopLrOcFKDb++H2Xq5rNLfh+NVH2x/q5Zcth5vWV/lrunP47VsllDbz7dvyBz3990NCGLcGEaP2ypOavC9/bBcL9dotdTH27/Zku/3W1LLNevxgvVVuLwp1/Rn5n+blL+jBx63Q2NJ3gNAfP/c3QBKdXKdc/XMoLxh591PYZ+3rYuzl/fp5RPYq/N+Fl2ze/zL6ZuFrIbZ8r5XVfnTPymM/Gn5ywcXVu/DXXPde/VZillTM89btFovtf3fZJzUlrM5rlYLzzynkl/vmcGwOZ7zTZqVkxqHqeXNz1/7XM6O5d1XVGpi4XrZXelm+fu2i7vui9HWe6/nj2P9Z5ySmp4yzjb7PJtnd/k7rBY+/nP5X1Xn3MvZqvaPyx10YT+0Wi+t6j27nJJxVWvZzmWxJct1ZHlT4zC1vJlxu8O+5c2XVt6fqQ2tvN7j5e/YLlyTC+PV5/dT543m4yXPDsnbNvXKjblhLXftfc6ut7dxmAqPu/TT/61a0s8SrRL2kbw373+Hw6lj87OvX51a/tmN/yRuCmxaHqxUnUtl1td52o6TC66LNj8iPKL/68B3jas+9b++OOK9eT8sdtzTHWU/B93LLTC/Q8/c8L7XuGOdNr6qnzPr61QNx8nbsuQRy3vXuOrQaxf8Jd57/54jfvsFe4feTJ8JAJh67/l91QO9tafjDefvNlN3NGz1FP9nsx8O3kfc/ecXj5Pa6UvTuy3Htbp9e/Z2tNvL708fH28v78Bnif8+3aH++1Sp6YW1zK6lzx6O3V1+uWnVy3o329O2STv6ofCB8H3rZUc5O8bJ6v3gfeOt/FGJsW9XO3nZ/1XtzJeTaU+q/FQ5qe1oWd2OcVu1XvIlnNqfJc+LHFxf5dtFvp/lPdDG7FkqWPWIcXJ2Ix/RCdzI/Xv65dSBEj2PExlPP15xPZ8HOftmBzE8aJxkbkk8onwAAAAAAMJzdxn64Xk9oCMOEeAk8Z/XO/XL5Vc6+zWfB8sv/5r4Se2Zzd+8PVUa1r6jHwqrbvv+iXwtp76x6uzt4veh/H0Pzx23Fwi/gD2Lf34/fdV5h2+VL3R2m4+X33brrW1Pb0d1DQ96Tqp6jNXZdpGavttYzhku2JZTjV+9DvH0cXuB8AvYs/h5DzxFz9+kh6d77/vzgd48KOkf1FT4eW/ez142Phx4z3mT97Gn2jOdOfOS7c1yShpTUv6mg/2ZaU9t+2vbU1LFZeXsWy9N7sv8rlT/ij37/TC7q2g4bnf0Z35QPXHcTqubtic1fVbO8scRVvc/q/35oFcnPV385/WG9O9zrH5eHdM7ppc0prBtq8XuK6ewVSUNyBdysN+aPOS1uqtqtb6OrKAj/VCy3mtXVuqfm4XscHBF50vbUf7u/iyfWNX+4aZxu6w0/7mkrtTnqh0dDb3o/D6/C6sdYan5exupvbXnem174Oz+bJh8x5sxPdF/m9uD565xu3lJY5/C/nznYLvMi/K+aiQtB/d4nXNWYGp6bfn7tCrnbcr7Lb9+a/v/Wet9dm2/od7GbW/tSTm7nb81Pj2Vz0xv0ph9+0/2eVHeV9m8BjDdD6am15bfqp1squq3zPptdVmo1tPXe2/t7609Kf20c3lNfrcd+0/28X084P9mJ1tAGPJ+w7j7S+0HD+4fa//8pGY0L6eVVv2ze/7CAs9ej2ev93Jta+xt3N5VTm/zX6bbhoUU//n81J2hzB2j2fhbPrRcOL2kSctyUs/Vj3+VrzezXIWtOmm5yqen2lNY+6wfUs8Jp+rNlFze/tW10KofCstZFjVzpD1HrrjW9n9haWeP29R/xRi3Y0XfyX362YfVR+tns622OXXZf99yAXAFJ2QAEJywBwAAAAAAAHgX94kB2vL9e4JwiACQ8aLv39d+rXP3F9n32d3OTIGP/iZr7fe8983/8+iOOknVgGw+endbPebb/J73jsFw1/b19O2aG8U/v9+3bYzh0eQF0SXabsOZBj/lPHjs/DNcv34fZ/dPDMxcPN6mP22wTPTPf4bJSt8xGO4aMIEH6lP2S48WP++POzV4aOLIS9+s38AKX0K3+weQ4EH8Pt7rhNyjhVyoGG5fNXf9hiFVdPsFXpT3J71ne/ai6SPl17Zz8/355S/hz7d/9n7szZYv27Nafq2z37Pdqv21N4P3rd/Cl5mn2pNfrlZXVveNt2V7dtc+PXH/XTH+TWkyCDP9vFlFbT+k6t38nHohf+F43lFOfjsaFv02rI2THeV4D/+m+M/rDdnNYLkbGrb2j5kyC8tv0s58+ZnqUhtbpt7axpf0T6ao2vL3FfWze/3uaHPJPIXrvfxzSV2pz00Wdsd4y5RW3pKf1R44XlF+oQqL3dEPhZ2Z/68jm/bu/d5mpYULXrggR8ZPYC86vy9Xu6eb/e0JLYqjVf8cKafn9VtefuoU/OCp+eaR4lTPo3163DOdOPz3aFhXje9nXPVZfq3e2tOJt+f9wZ3j7eXToQtW+ufP3yfNT2/Vngv2oW27LtXgz5/X9jv09P3G9e0f1+l0ysVt6N/b8/5th72cLXVj6C69tSfP9vLz9H64pf2z2xw9H8/dxffxgMh+Rzmzk7/N+SEeef+v8t1Bn+X3Vu/ZLFdsy37Y1zObfzK78lFbxV37jaeMk7Gd0ycnhhMuADylQ+71oufzR5vf30jdBFqdP3PHKFX+Ge3M1J5ahMLneA+2v+Edtdr2lJRzZP1ull/4YGDV+p0+qDwtPzU9057C9V6y4CVdenC8FebE6k5/s/yDa3m16vKVXrXfyNS7HA+ZEmqfz5+Vtq/9qeoy4yQzPTXOV1sFFHHsDK9l8w/D9XzW2cgBInnF9Xz2aXgpHngiOwEAAAAAAAAAAAAAAAAAAAAglvjv28m8zHzz/eSr04fiV3kDQCfe+D7d73+/jzkMw+c/wyLRZ9MB4LlelPdiG4DXekve/87UV3+H0Q/DABDeP3c34GbuwQPwBm85vweAN5P3/zp+Vd99AQC69d68H5+9H3M6f21/Or/n9gEAAAAAAAAAAAAAAAAAAKLp9/dwl99un33r/eCrcK8p53gtmyWM7wNoVeBBte05VWphyzvh7O66zNvGyanlHx9X15juRTtpEjd63vt2Wo3akh19yRt1St7Sc175O975c/ZO9rzCN6tOHSMulXdCjL3k28ZJpvwm78E8Pq42NXnj5/DnT37zcl3n/ThGDVaAciXvDOVt+v19vNlIvX7gnl2jTbEt/UmJp4yTp7STB+k37zctb5XNLn8VbjCrt9w2Jy4Pn6tu3R0vf7qws5kz/VB1hXC1nLGuwvbk55+1OX/7IzP/BfdNj4+3fH9O51n9gYZ8vat9Plw+TjILsq89mY0iU+9q+UNinJT088Hnb8rHeaqdqe1od5NGDizeo+vr+Zume4TlzaryfdZy/uU2MC0/tdGW13u8/Ok9uennTD9UXeJLlTN+Xk5fbU9q/rYu2GfN2l873jb7c3XKcv7aes8eJ1WN2deemWngLWdOlT9OWS0tU9R5gzZj2c5929F3Ypwy3Lpo3OjB5/etdvG9lXNS+Z3cz7u9AR36fD7jHrm2f5r3ZyfjZOmaWOpwwY+YHk59176wEGx5yXtw3q9yrPrTqh867M/V3dZdavvn7PlrNSn/gkHyOyT6TK5mX1Bvh4P/uOnB5TjlxvZwpWh5b+z+POWixdM1OR2f3pqdHc10ftFoyD5wcKqz671ruS4wXemp835Cevb9e95meg8bgHJh8352zSq81PK26ofacs7r/z7PRXb3z/Q8MnM22Wr9nj1Oap1dbz/jthObCxi+B96s3/fpDlvft5nuHFd3lPlgyJSzWfXyD6vKaVj+coZUOcvpQ3EXrZZT2J7MncJ97flkv6x4cHqm3uX8VeMtNf/qgMmP583p+S46b5zM6m3SnulKP1j+kFjvO/rzyHY9VA6Vwu0uX0imPatbZZ9H1XCD3k5KAnjhIvNCxjk3Cns9vzkZfx6nFLyBcc69ur6e35uqi8Adlt+V2ovh8ETGOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADzN/wCwXEkY4Glz7QAAAABJRU5ErkJggg=="},5786:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-install-logs-a0fe1cb2f06bd446319ea8755907dcba.png"},1696:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-operator-install-ead7a27570833aea52fc48bf864e7458.png"},7813:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-operator-pod-5cf9077cbdd41cc2ea98372e615773e3.png"},9573:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-extension-enabled-c4e29279c65407712c74245a906fe8f1.png"},9699:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-extensions-menu-3417b5f0744722377d8b9e1826abc4f8.png"},1318:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-initial-registration-url-yaml-2976a9c6180726ebb308057cb33ae38f.png"},306:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-initial-registration-url-0c8db5dad180464052c36f376b17c8e3.png"},2008:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-initial-registration-yaml-61b7ae494fd22967d770b3124dd1da9b.png"},297:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-iso-create-94c20367fff7dd76b113c5f2e046fd69.png"},3021:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-machine-inventory-status-boot-complete-401945492ded59c3f4f94e8dc7ecc419.png"},3518:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-machine-inventory-status-booting-fba3e4b35fc4b52b43fa92dc00f14d28.png"},8588:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-machine-registered-fa33715b7ace60ba91c3ab12694be684.png"},51:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-osmanagement-dashboard-5ec27221ddfdd9d63f846c6370847cbd.png"},950:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-osmanagement-menu-18bc9bca56db4f66db675cb679e6ada9.png"},1717:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-registration-endpoints-040525e42e8fcfde1c35a85e44b1bc32.png"},5994:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-vm-boot-bios-28b0123c0fbaf64ff7fe1f5634b0f1ae.png"},4948:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-vm-boot-uefi-ca7f800f1c8469b9c1477f78b6ca22e5.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>s});var a=n(7294);const i={},r=a.createContext(i);function s(e){const t=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),a.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8d09d3e9.676d4bf2.js b/assets/js/8d09d3e9.676d4bf2.js new file mode 100644 index 000000000..1ed17b236 --- /dev/null +++ b/assets/js/8d09d3e9.676d4bf2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6747],{1015:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var a=n(5893),i=n(1151);const r={sidebar_label:"How to use Elemental with Rancher and VMware",title:""},s="How to use Elemental with Rancher and VMware",l={id:"rancher-vmware",title:"",description:"Excerpt",source:"@site/docs/rancher-vmware.md",sourceDirName:".",slug:"/rancher-vmware",permalink:"/next/rancher-vmware",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"How to use Elemental with Rancher and VMware",title:""},sidebar:"docs",previous:{title:"Elemental behind proxy",permalink:"/next/elemental_behind_proxy"},next:{title:"Include cloud-config from removable devices",permalink:"/next/removable-device-cloudconfig"}},o={},c=[{value:"Excerpt",id:"excerpt",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"Part 1: Rancher Configuration",id:"part-1-rancher-configuration",level:2},{value:"1.1 Enable the extensions under Rancher configurations menu",id:"11-enable-the-extensions-under-rancher-configurations-menu",level:3},{value:"1.2 Install Elemental Plugin",id:"12-install-elemental-plugin",level:3},{value:"1.3 Install the elemental operator in Rancher cluster",id:"13-install-the-elemental-operator-in-rancher-cluster",level:3},{value:"Part 2: Create the Machine Registration Endpoint",id:"part-2-create-the-machine-registration-endpoint",level:2},{value:"Part 3: Create the ISO",id:"part-3-create-the-iso",level:2},{value:"Part 4: Boot the target device",id:"part-4-boot-the-target-device",level:2},{value:"4.1 Prepare the VM to emulate TPM",id:"41-prepare-the-vm-to-emulate-tpm",level:3},{value:"4.2 Boot the VM with the elemental ISO",id:"42-boot-the-vm-with-the-elemental-iso",level:3},{value:"Part 5: Create a cluster on the machine",id:"part-5-create-a-cluster-on-the-machine",level:2}];function d(e){const t={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components},{Head:r}=t;return r||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(r,{children:(0,a.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/rancher-vmware"})}),"\n",(0,a.jsx)(t.h1,{id:"how-to-use-elemental-with-rancher-and-vmware",children:"How to use Elemental with Rancher and VMware"}),"\n",(0,a.jsx)(t.h2,{id:"excerpt",children:"Excerpt"}),"\n",(0,a.jsx)(t.p,{children:"In this document we will see how we can enable elemental support in Rancher and then build iso and test it on a vm in VMware mimicking it for an edge device."}),"\n",(0,a.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsx)(t.li,{children:"Rancher 2.7 or higher installed and running."}),"\n",(0,a.jsx)(t.li,{children:"One Linux machine with docker installed."}),"\n"]}),"\n",(0,a.jsx)(t.h2,{id:"part-1-rancher-configuration",children:"Part 1: Rancher Configuration"}),"\n",(0,a.jsx)(t.h3,{id:"11-enable-the-extensions-under-rancher-configurations-menu",children:"1.1 Enable the extensions under Rancher configurations menu"}),"\n",(0,a.jsx)(t.p,{children:"Click on extensions under the configuration menu and enable it by hitting enable."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Enable extensions in Rancher",src:n(9699).Z+"",width:"323",height:"193"})}),"\n",(0,a.jsx)(t.p,{children:"Once you click on enable a dialogue box will pop up asking for confirmation and it will also notify you that the rancher extensions repository will be enabled, make sure it is checked and then confirm."}),"\n",(0,a.jsx)(t.h3,{id:"12-install-elemental-plugin",children:"1.2 Install Elemental Plugin"}),"\n",(0,a.jsx)(t.p,{children:"After the extensions are enabled under the available tab you should see elemental plugin available for installation."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental extension enabled",src:n(9573).Z+"",width:"770",height:"367"})}),"\n",(0,a.jsx)(t.p,{children:"Click on Install, this will again ask for a confirmation. Click on Install again to continue. Once the installation is finished it will ask to reload the tab. Reload it by hitting reload, post reloading you should see the elemental plugin under the installed tab."}),"\n",(0,a.jsx)(t.h3,{id:"13-install-the-elemental-operator-in-rancher-cluster",children:"1.3 Install the elemental operator in Rancher cluster"}),"\n",(0,a.jsx)(t.p,{children:"The next step is to install the elemental operator in Rancher Cluster. For that connect to the Rancher K8S cluster and enter the below command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental operator install",src:n(1696).Z+"",width:"2100",height:"527"})}),"\n",(0,a.jsx)(t.p,{children:"Once the command is successful validate whether the the pod is running before continuing"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl get pods -n cattle-elemental-system\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental operator pod",src:n(7813).Z+"",width:"817",height:"120"})}),"\n",(0,a.jsx)(t.p,{children:'This will enable the "OS Management" sub menu under the "Global Apps" menu.'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"OS Management menu",src:n(950).Z+"",width:"433",height:"272"})}),"\n",(0,a.jsx)(t.p,{children:"The OS Management dashboard at this point should have nothing in it."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"OS Management dashboard",src:n(51).Z+"",width:"2546",height:"913"})}),"\n",(0,a.jsx)(t.p,{children:"At this point we are ready to proceed with the next step, that is to prepare the ISO."}),"\n",(0,a.jsx)(t.h2,{id:"part-2-create-the-machine-registration-endpoint",children:"Part 2: Create the Machine Registration Endpoint"}),"\n",(0,a.jsx)(t.p,{children:"In the OS Management dashboard hit the create registration endpoint button."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"OS Management registration endpoints",src:n(1717).Z+"",width:"757",height:"404"})}),"\n",(0,a.jsx)(t.p,{children:"Now here either you can enter each detail in its respective places or you can edit this as yaml and create the endpoint in one go. Here we will edit this as yaml."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: elemental-cls1\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n registration:\n emulate-tpm: true\n emulated-tpm-seed: 1\n machineName:\n machineInventoryLabels:\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'})}),"\n",(0,a.jsx)(t.p,{children:"Remove the existing content and enter this code snippet and click on save. Remember to modify this as per your need."}),"\n",(0,a.jsxs)(t.admonition,{title:"main options",type:"info",children:[(0,a.jsx)(t.p,{children:'name: elemental-cls1 --\x3e "Change this as per your need"'}),(0,a.jsx)(t.p,{children:'device: /dev/sda --\x3e Make sure your target device is "sda" otherwise find out and change the naming convention here, for example in raspberry pi it could be "mmblk---"'}),(0,a.jsx)(t.p,{children:"emulate-tpm: true --\x3e Use this only if your target device doesnt have a tpm device and you have a way of emulating tpm like in VMware or KVM"}),(0,a.jsx)(t.p,{children:"emulated-tpm-seed: 1 --\x3e increase this by 1 for every new machine. --\x3e If this is not given each machine will recieve the same tpm hash so at any point in time regardless of how many machines you boot it wont show up under the machine inventory."})]}),"\n",(0,a.jsx)(t.admonition,{title:"attention",type:"danger",children:(0,a.jsx)(t.p,{children:"Emulate TPM is only for non-production usage like for testing as it beats the purpose of security. So in production usage use the code above without the emulate-tpm and emulate-tpm-seed"})}),"\n",(0,a.jsx)(t.p,{children:"Once you create the machine registration end point it should show up as active."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Machine registered in Registration Endpoints",src:n(8588).Z+"",width:"559",height:"464"})}),"\n",(0,a.jsx)(t.p,{children:"Next click on it to view the registration url and download the initial-registration yaml."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Initial registration URL",src:n(306).Z+"",width:"1454",height:"611"})}),"\n",(0,a.jsx)(t.p,{children:'Hit the download button, this will download the "initial-registration.yaml" file on to your local system.'}),"\n",(0,a.jsx)(t.p,{children:"The registration yaml looks something like this:"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Example of initial registration YAML",src:n(1318).Z+"",width:"947",height:"384"})}),"\n",(0,a.jsx)(t.p,{children:"We will use this file and inject its content into our vanilla elemental iso."}),"\n",(0,a.jsx)(t.h2,{id:"part-3-create-the-iso",children:"Part 3: Create the ISO"}),"\n",(0,a.jsx)(t.p,{children:"Make sure you have initial-registration.yaml in the system where you will create the iso in this we will use a Linux vm."}),"\n",(0,a.jsx)(t.p,{children:"Create a directory to keep everything:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"mkdir /home/tux/elemental-demo && cd /home/tux/elemental-demo\n"})}),"\n",(0,a.jsx)(t.p,{children:"Create a file and copy the contents of the initial-registration.yaml in it."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"vim initial-registration.yaml\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create file with initial registration YAML",src:n(2008).Z+"",width:"1105",height:"441"})}),"\n",(0,a.jsx)(t.p,{children:"Next download the script to download the iso and inject the registration.yaml in the iso and make it executable"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://raw.githubusercontent.com/rancher/elemental/main/.github/elemental-iso-add-registration && chmod +x elemental-iso-add-registration\n"})}),"\n",(0,a.jsx)(t.p,{children:"Next execute the script and pass the initial-registration.yaml as an argument"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"./elemental-iso-add-registration initial-registration.yaml\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create ISO with the initial registration options",src:n(297).Z+"",width:"1654",height:"1206"})}),"\n",(0,a.jsx)(t.p,{children:"This command will download the vanilla iso and inject it with the parameters of initial-registration.yaml and create a final iso for you to boot your end device."}),"\n",(0,a.jsxs)(t.admonition,{type:"note",children:[(0,a.jsx)(t.p,{children:"If you would like to download the vanilla ISO and reuse it later to create additional ISO's, then you can download the iso separately using the below command and then pass the local file path as an argument to the script"}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable:/Teal53/media/iso/elemental-teal.x86_64.iso \n\n./elemental-iso-add-registration initial-registration.yaml /home/elemental-iso/elemental-teal.x86_64.iso\n"})})]}),"\n",(0,a.jsx)(t.h2,{id:"part-4-boot-the-target-device",children:"Part 4: Boot the target device"}),"\n",(0,a.jsx)(t.p,{children:"Now ideally you would just burn the iso to a usb drive and boot your edge device using the usb device and once it boots and become active in Rancher under machine inventory you can select and create a cluster from it, however here we will use a vm to mimic an edge device for testing."}),"\n",(0,a.jsx)(t.h3,{id:"41-prepare-the-vm-to-emulate-tpm",children:"4.1 Prepare the VM to emulate TPM"}),"\n",(0,a.jsx)(t.p,{children:"In VMware workstation create a vm the way you would do normally, make sure to give the HDD size at least 40 GB."}),"\n",(0,a.jsx)(t.p,{children:'Now edit the machine settings and go to the "Options" tab. The very last option would be "Advanced".'}),"\n",(0,a.jsx)(t.p,{children:'Click on "advanced" and on the right window pane change the firmware type from "BIOS" to "UEFI" and check the "Enable secure boot" option as follow:'}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Default settings with BIOS selected"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"VM boot options with BIOS",src:n(5994).Z+"",width:"709",height:"218"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Updated settings with UEFI selected and secure boot enabled"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"VM boot options with UEFI",src:n(4948).Z+"",width:"684",height:"208"})}),"\n",(0,a.jsx)(t.p,{children:'Now on the same "Options" tab click on the "Access Control" option and click on "Encrypt" on the right side.'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Access control menu",src:n(1394).Z+"",width:"242",height:"28"})}),"\n",(0,a.jsx)(t.p,{children:'This will ask you to enter a password to encrypt the machine. Enter a password and click on "Encrypt"'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Access control encryption credentials",src:n(8670).Z+"",width:"352",height:"431"})}),"\n",(0,a.jsx)(t.p,{children:'This is important to add the TPM Hardware. Next go back to the Hardware options and click on "Add"'}),"\n",(0,a.jsx)(t.p,{children:'And add the TPM (Trusted Platform Module) hardware and click on "Finish"'}),"\n",(0,a.jsx)(t.p,{children:"Now with the completion of this step our VM is ready."}),"\n",(0,a.jsx)(t.h3,{id:"42-boot-the-vm-with-the-elemental-iso",children:"4.2 Boot the VM with the elemental ISO"}),"\n",(0,a.jsx)(t.p,{children:"Next add the ISO that we created earlier in the VM and boot it up."}),"\n",(0,a.jsx)(t.p,{children:"It should boot up with the ISO and start installing Elemental:"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental OS install grub menu",src:n(8464).Z+"",width:"677",height:"451"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental OS install logs",src:n(5786).Z+"",width:"1052",height:"281"})}),"\n",(0,a.jsx)(t.p,{children:"And once it is complete it will reboot the VM and it should show up as active under the machine inventory in Rancher as follow:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Machine inventory status while booting"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Machine inventory status during boot",src:n(3518).Z+"",width:"612",height:"159"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Machine inventory status after boot completed"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Machine inventory status after boot complete",src:n(3021).Z+"",width:"622",height:"112"})}),"\n",(0,a.jsx)(t.h2,{id:"part-5-create-a-cluster-on-the-machine",children:"Part 5: Create a cluster on the machine"}),"\n",(0,a.jsx)(t.p,{children:'Once the machine shows up as active, select it and hit "Create Elemental Cluster".'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create Elemental cluster",src:n(8264).Z+"",width:"811",height:"398"})}),"\n",(0,a.jsx)(t.p,{children:"At this stage you get a pretty familiar page of creating a cluster in Rancher."}),"\n",(0,a.jsx)(t.p,{children:'Give the cluster a name select the Kubernetes version and hit "Create".'}),"\n",(0,a.jsx)(t.p,{children:"For this we have selected to create a K3S cluster."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental cluster configuration",src:n(9411).Z+"",width:"2294",height:"1224"})}),"\n",(0,a.jsx)(t.p,{children:"Now under the Cluster Management page the cluster should show up as creating:"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental cluster provisioning",src:n(5419).Z+"",width:"793",height:"279"})}),"\n",(0,a.jsx)(t.p,{children:'And once the cluster is fully provisioned it should be active with provider type as "Elemental".'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental cluster created",src:n(5114).Z+"",width:"2279",height:"242"})}),"\n",(0,a.jsx)(t.p,{children:"Now you can start deploying application on this cluster the normal way."})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8670:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-access-control-encrypt-60a89768dd80961e42f48b1717f607cb.png"},1394:(e,t,n)=>{n.d(t,{Z:()=>a});const a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPIAAAAcCAIAAADURHUBAAAGgklEQVR4nO2bQWwaRxSG/21SUCwtlaotXZWTLUhpiOEMPtmqrAIXR5Ecu4rk9rI0J7Aqt6VKpCiKiqo0Ak6tuSStrJpEiuKLQXId+2SqqifcotIuik9IGG8ii5XsQGzRA+yyu2CDE7Ax2e/E23lv5s2bp5k3C+BWIFQ+gE8mmdab2KAd9iArCvYgywbtYGKy1hgD4ZGgyVSNKjYVVZmKtLFOv9Zh1U4c2l7Tg2Bb7bnaeoCtYkSVU8hZtAmjL8HCYSKmK6I9yBqNxl+CDhNBALAzjB0AnLOs8KiilPgQ01Uje5BNGAH4bjCEi4jYg2zCZwSATMhhmv4dMBH/xMpjcn0jah0ysbITmX8r3twYJCp6wtCAUeiZYYCP5M5IbFVOP8StQOjGN96Gbc5PPYdYxn+d7YxLKiqvy2G7tZq4KqeUt07aARWV9qOmtUoP0oYrI+FPv34nKiptpHFam67dO9yM/fHzDjijotIeDtytD0ncpkmvonKyvEptrW7VKl1Ok9r6Da1GaIqdxFSQS5y0I73D8Ya0+ZXxKNWIJjQ94AU3dAze2wzlCbL6OZUl5viWrE5hvrIBM1afmpZKwKH+n9TUujKkbX3BR+vc4OMgx+l29lqPY7S/PAGPP03404Q/7YGO6eyAJ0qeZy2GUIdD2mMc/QXf+vKj7LsgiMsfPFNs5A4riVR2QT8wY9X4ciUAABkLGJwAgHg07UrKxU2K9VJGACiGwxu+HByj/WvDWgDIc0NBDnJR2A804xaEw9mIMG5kLgsAtNgb7/FnIzTFTmJxi/JaxNE1oUnKqMdagMqkeLxXXNyivBZBWWp75KB0lOLtFax9TPqkJ5LSYcnUxK1dplYMhzd8qI8JZGu0ypksEMKydWF64PyKqEP9F+XdI1oWpFMvmsvHXdcpFlTiAJDnOh+rKkdM6/L+4039ZacVwOPf1i+V90GcEdo04xYszpci7/OzIzrHEpeAJjRtQDRNJKsKcpGMBbR3/OkIKgcZ9XAePw+XPP6NCMBcNVykqRmpCFTTmta59aU7OYVnZMxLsdG0KQnHaP/aVTKyDOip8ytpYg6wGcojlCPJ+eY5d+XEpCnWK7Q2tO0qklnPoDlmS7s2K3Kdw3N8bWo1MzLmVUa4LiaFcemi0BQ7LIYFWOHLgySSPGw6Z4pzbWrdes1/4bQrVykCDUwyKxm3bkGDxeuCn5Va5dg4YloXnl0qPQGsAC6VnqBA4x19tYnWucFP5YBcIT5BjdNcAjo3uKkkJApSUWsCORswC7874S/mCiyo2YAB/mxkLguQYzJRQr74t8IxWmvKVztPrPMZr45ZLiLP3a4Mt1nM1M9FbG1o22VElrmZScoxD6CRw+AbnDD1EUZdTBSLAklYACQL8QkdAx6DZPyvLKBFnn+YE5uoC9LSqH44GqKfx8zR0vr7u/f3SsW3//wBwMsXu2f/uP/1ra8qTQ4radRr1wJURTRZNb71Zt3llZfLiD8NkLGAeRa8x591ycXqyuWKrJ4ap7mEcsPuaXLcVKr/urW1m7GIIsI0NXM0e34hZRizkbDwC3NA0/r+dYdrGwdeGRu+2tstbL98sbuz/Xxn+/nLF7u7hW2xadyijUerdzgiyhstOkeusAjquk3QUIpFVi8RAdBUbFQD8C7/03Bec8EmF2sx5W+vwus1iNdE5qqBkfTmsJLGVOHA+livvah40rrtiZJY4jBMGXGww4qp1Ue4HsWi1BFZ5kwTBtPqljImNp1T3Lkr49YPlyuy+ur7A4eVNLYwx3bReLd+hbfRsrMsWa1DfPMc6zWXJ4DKDUMhhmsi8txQsAjvQHkYADKrT01JbSwgESV7c2JpYwj9a+J5l8oS4CO13niPnwetbeBljruTMs8GzDMpHhArDd7Viu3Jw7uifHkEDRyGZGq1KyOvjPB8fZ8l2Rqt1t3qcoXFPIl14Q6qp4QDmff4uYRiXOWCcq6oruw1e4FMim9QB3aMw/5GAMB07Z40xW/6vlUo3Ax9p/7UqZexGcojxWpp0ZWvqBvSvLYWq5He/EJR5VCYQTK+ku3+PFbQZLduqQt1t1bpMtS/Eaj0IA2KkPsPFh4tLu3t7Tc3Pnvmsnu0HBjrgGMqKq9Og7R+tLj04Ke7fX3nmhrv7Oxe+eLLz66oaa3SXTQoQvb29lvJaQB9feda2dRVVI4ZtbZW6UHe1LTOhByO0HF+QfBGEPcQBEEQhCcu/3zs/A8CtQt0OqppGQAAAABJRU5ErkJggg=="},8264:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-create-8d06bbcd84075d084212bc3d049dfbbc.png"},5114:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-created-39460fab3f9c3863673be51507d2d22d.png"},5419:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-provisioning-b1a441f0c9dd8db3af090c57bf8b216c.png"},9411:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-template-71f1e521ea8047e899ec3b0f9e48225b.png"},8464:(e,t,n)=>{n.d(t,{Z:()=>a});const a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqUAAAHDCAIAAACS//S/AAAT3klEQVR4nO3dXbqjqBoGULufHmyGlOGei3R7LBUERcXPta5SlhsQ0de/mGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA4/66uwHQke/3O37+fD7jlN/n6T9T0/eVP1VS73L+F5p1RUk/jH8ym3m5XiCev+9uAPRizNRlEi9TtlX5Y7qs1rtUO//tvt/vGS2cdmZhP0w7fLlyp0VBSPIehmEtfVdnOK98qtRm87T/p5FfeGEGAvjn7gZAp87OgJdkzEsWE/on7+GNlhe3Z88KjGbzLG+BZ+6jr94vry0faML1fNh2wZ3y8T53Yc7Vzl/ejGHtvvj4eTY9fx89dVukvPyqNpfPvJw4KqwUHsf5PfwhFVerz8Y3LD81JWUMxV9GHm9YlVSN17ekyUHP9FrFLf0JF5D38IezT+UzX8PrJ2zKF39s9nTKOY1asSPse+heuIW8h1KtTvH7tztBrzxk8Wg9VHH/HnrxiO/Td0LYQy15D8Nw32X8u0xv/w/p4Nx8hK2fZ9xmzVi9y+A797yZ9+nC/6USYvbds9XwLsmPzPt0Vx9WX5bf9n26q8m3WW/J/Mv/2vz+XuYrgqmWzyyrTjV18/uBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENdf11f5/X6vrxQAHu3z+Rz5839ataPWwXYDwEs0OU/++3gRAEDn5D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQ323v2xl53R4ALLV9MZ3zewCIT94DQHz3X89PWb2OMV78H//3+tsBn8+nvNLydi6X9+CiNWnnjf0MQEP9nt+PAfP9fpdhc1f81N5NKW/ndDFXF7lKq3aKeYAY+s37GcEDALs9Ju8HkQ8Ae3Vx//538fn7/Y4fljOUhP3sIvbvT6Z3oGflZ+YfZ16WM51nWU7zg5JUe/Ltv76dAPSsi/P7WdDO/rfwVvT45+PN79Qf/qan5h8/L6en7q+XVLpbqj2Z9t/STgB6dv/5/Sx4lqk/PbVtWFEwztcByLg/75dX3VPzlEiF+u+gYXno8Nwjid+yVF2ij33EA0DG/Xk//HmLuupb40u1f3v8tHh2F+BgaVWmjd/suhvbCcDtusj76f3mzGwHDwUA4LW6eF6vRO0p6exa9+3zN1fYgNvbCUAP+s37MaVWE2v6v78P45Xqcf78xYDa+Wd/NX6elpP6RtxQcLwyXcySkM63v1U7y9sPQM/+ur7Kkgf0AODllie0R0rr9/weAGhF3gNAfPIeAOK7//t4HgQDgLM5vweA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+P65q+Lv93tX1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwLq/7m7A6b7f7zAMn89n9Z9tK5oW+6vopLrOcFKDb++H2Xq5rNLfh+NVH2x/q5Zcth5vWV/lrunP47VsllDbz7dvyBz3990NCGLcGEaP2ypOavC9/bBcL9dotdTH27/Zku/3W1LLNevxgvVVuLwp1/Rn5n+blL+jBx63Q2NJ3gNAfP/c3QBKdXKdc/XMoLxh591PYZ+3rYuzl/fp5RPYq/N+Fl2ze/zL6ZuFrIbZ8r5XVfnTPymM/Gn5ywcXVu/DXXPde/VZillTM89btFovtf3fZJzUlrM5rlYLzzynkl/vmcGwOZ7zTZqVkxqHqeXNz1/7XM6O5d1XVGpi4XrZXelm+fu2i7vui9HWe6/nj2P9Z5ySmp4yzjb7PJtnd/k7rBY+/nP5X1Xn3MvZqvaPyx10YT+0Wi+t6j27nJJxVWvZzmWxJct1ZHlT4zC1vJlxu8O+5c2XVt6fqQ2tvN7j5e/YLlyTC+PV5/dT543m4yXPDsnbNvXKjblhLXftfc6ut7dxmAqPu/TT/61a0s8SrRL2kbw373+Hw6lj87OvX51a/tmN/yRuCmxaHqxUnUtl1td52o6TC66LNj8iPKL/68B3jas+9b++OOK9eT8sdtzTHWU/B93LLTC/Q8/c8L7XuGOdNr6qnzPr61QNx8nbsuQRy3vXuOrQaxf8Jd57/54jfvsFe4feTJ8JAJh67/l91QO9tafjDefvNlN3NGz1FP9nsx8O3kfc/ecXj5Pa6UvTuy3Htbp9e/Z2tNvL708fH28v78Bnif8+3aH++1Sp6YW1zK6lzx6O3V1+uWnVy3o329O2STv6ofCB8H3rZUc5O8bJ6v3gfeOt/FGJsW9XO3nZ/1XtzJeTaU+q/FQ5qe1oWd2OcVu1XvIlnNqfJc+LHFxf5dtFvp/lPdDG7FkqWPWIcXJ2Ix/RCdzI/Xv65dSBEj2PExlPP15xPZ8HOftmBzE8aJxkbkk8onwAAAAAAMJzdxn64Xk9oCMOEeAk8Z/XO/XL5Vc6+zWfB8sv/5r4Se2Zzd+8PVUa1r6jHwqrbvv+iXwtp76x6uzt4veh/H0Pzx23Fwi/gD2Lf34/fdV5h2+VL3R2m4+X33brrW1Pb0d1DQ96Tqp6jNXZdpGavttYzhku2JZTjV+9DvH0cXuB8AvYs/h5DzxFz9+kh6d77/vzgd48KOkf1FT4eW/ez142Phx4z3mT97Gn2jOdOfOS7c1yShpTUv6mg/2ZaU9t+2vbU1LFZeXsWy9N7sv8rlT/ij37/TC7q2g4bnf0Z35QPXHcTqubtic1fVbO8scRVvc/q/35oFcnPV385/WG9O9zrH5eHdM7ppc0prBtq8XuK6ewVSUNyBdysN+aPOS1uqtqtb6OrKAj/VCy3mtXVuqfm4XscHBF50vbUf7u/iyfWNX+4aZxu6w0/7mkrtTnqh0dDb3o/D6/C6sdYan5exupvbXnem174Oz+bJh8x5sxPdF/m9uD565xu3lJY5/C/nznYLvMi/K+aiQtB/d4nXNWYGp6bfn7tCrnbcr7Lb9+a/v/Wet9dm2/od7GbW/tSTm7nb81Pj2Vz0xv0ph9+0/2eVHeV9m8BjDdD6am15bfqp1squq3zPptdVmo1tPXe2/t7609Kf20c3lNfrcd+0/28X084P9mJ1tAGPJ+w7j7S+0HD+4fa//8pGY0L6eVVv2ze/7CAs9ej2ev93Jta+xt3N5VTm/zX6bbhoUU//n81J2hzB2j2fhbPrRcOL2kSctyUs/Vj3+VrzezXIWtOmm5yqen2lNY+6wfUs8Jp+rNlFze/tW10KofCstZFjVzpD1HrrjW9n9haWeP29R/xRi3Y0XfyX362YfVR+tns622OXXZf99yAXAFJ2QAEJywBwAAAAAAAHgX94kB2vL9e4JwiACQ8aLv39d+rXP3F9n32d3OTIGP/iZr7fe8983/8+iOOknVgGw+endbPebb/J73jsFw1/b19O2aG8U/v9+3bYzh0eQF0SXabsOZBj/lPHjs/DNcv34fZ/dPDMxcPN6mP22wTPTPf4bJSt8xGO4aMIEH6lP2S48WP++POzV4aOLIS9+s38AKX0K3+weQ4EH8Pt7rhNyjhVyoGG5fNXf9hiFVdPsFXpT3J71ne/ai6SPl17Zz8/355S/hz7d/9n7szZYv27Nafq2z37Pdqv21N4P3rd/Cl5mn2pNfrlZXVveNt2V7dtc+PXH/XTH+TWkyCDP9vFlFbT+k6t38nHohf+F43lFOfjsaFv02rI2THeV4D/+m+M/rDdnNYLkbGrb2j5kyC8tv0s58+ZnqUhtbpt7axpf0T6ao2vL3FfWze/3uaHPJPIXrvfxzSV2pz00Wdsd4y5RW3pKf1R44XlF+oQqL3dEPhZ2Z/68jm/bu/d5mpYULXrggR8ZPYC86vy9Xu6eb/e0JLYqjVf8cKafn9VtefuoU/OCp+eaR4lTPo3163DOdOPz3aFhXje9nXPVZfq3e2tOJt+f9wZ3j7eXToQtW+ufP3yfNT2/Vngv2oW27LtXgz5/X9jv09P3G9e0f1+l0ysVt6N/b8/5th72cLXVj6C69tSfP9vLz9H64pf2z2xw9H8/dxffxgMh+Rzmzk7/N+SEeef+v8t1Bn+X3Vu/ZLFdsy37Y1zObfzK78lFbxV37jaeMk7Gd0ycnhhMuADylQ+71oufzR5vf30jdBFqdP3PHKFX+Ge3M1J5ahMLneA+2v+Edtdr2lJRzZP1ull/4YGDV+p0+qDwtPzU9057C9V6y4CVdenC8FebE6k5/s/yDa3m16vKVXrXfyNS7HA+ZEmqfz5+Vtq/9qeoy4yQzPTXOV1sFFHHsDK9l8w/D9XzW2cgBInnF9Xz2aXgpHngiOwEAAAAAAAAAAAAAAAAAAAAglvjv28m8zHzz/eSr04fiV3kDQCfe+D7d73+/jzkMw+c/wyLRZ9MB4LlelPdiG4DXekve/87UV3+H0Q/DABDeP3c34GbuwQPwBm85vweAN5P3/zp+Vd99AQC69d68H5+9H3M6f21/Or/n9gEAAAAAAAAAAAAAAAAAAKLp9/dwl99un33r/eCrcK8p53gtmyWM7wNoVeBBte05VWphyzvh7O66zNvGyanlHx9X15juRTtpEjd63vt2Wo3akh19yRt1St7Sc175O975c/ZO9rzCN6tOHSMulXdCjL3k28ZJpvwm78E8Pq42NXnj5/DnT37zcl3n/ThGDVaAciXvDOVt+v19vNlIvX7gnl2jTbEt/UmJp4yTp7STB+k37zctb5XNLn8VbjCrt9w2Jy4Pn6tu3R0vf7qws5kz/VB1hXC1nLGuwvbk55+1OX/7IzP/BfdNj4+3fH9O51n9gYZ8vat9Plw+TjILsq89mY0iU+9q+UNinJT088Hnb8rHeaqdqe1od5NGDizeo+vr+Zume4TlzaryfdZy/uU2MC0/tdGW13u8/Ok9uennTD9UXeJLlTN+Xk5fbU9q/rYu2GfN2l873jb7c3XKcv7aes8eJ1WN2deemWngLWdOlT9OWS0tU9R5gzZj2c5929F3Ypwy3Lpo3OjB5/etdvG9lXNS+Z3cz7u9AR36fD7jHrm2f5r3ZyfjZOmaWOpwwY+YHk59176wEGx5yXtw3q9yrPrTqh867M/V3dZdavvn7PlrNSn/gkHyOyT6TK5mX1Bvh4P/uOnB5TjlxvZwpWh5b+z+POWixdM1OR2f3pqdHc10ftFoyD5wcKqz671ruS4wXemp835Cevb9e95meg8bgHJh8352zSq81PK26ofacs7r/z7PRXb3z/Q8MnM22Wr9nj1Oap1dbz/jthObCxi+B96s3/fpDlvft5nuHFd3lPlgyJSzWfXyD6vKaVj+coZUOcvpQ3EXrZZT2J7MncJ97flkv6x4cHqm3uX8VeMtNf/qgMmP583p+S46b5zM6m3SnulKP1j+kFjvO/rzyHY9VA6Vwu0uX0imPatbZZ9H1XCD3k5KAnjhIvNCxjk3Cns9vzkZfx6nFLyBcc69ur6e35uqi8Adlt+V2ovh8ETGOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADzN/wCwXEkY4Glz7QAAAABJRU5ErkJggg=="},5786:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-install-logs-a0fe1cb2f06bd446319ea8755907dcba.png"},1696:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-operator-install-ead7a27570833aea52fc48bf864e7458.png"},7813:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-operator-pod-5cf9077cbdd41cc2ea98372e615773e3.png"},9573:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-extension-enabled-c4e29279c65407712c74245a906fe8f1.png"},9699:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-extensions-menu-3417b5f0744722377d8b9e1826abc4f8.png"},1318:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-initial-registration-url-yaml-2976a9c6180726ebb308057cb33ae38f.png"},306:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-initial-registration-url-0c8db5dad180464052c36f376b17c8e3.png"},2008:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-initial-registration-yaml-61b7ae494fd22967d770b3124dd1da9b.png"},297:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-iso-create-94c20367fff7dd76b113c5f2e046fd69.png"},3021:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-machine-inventory-status-boot-complete-401945492ded59c3f4f94e8dc7ecc419.png"},3518:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-machine-inventory-status-booting-fba3e4b35fc4b52b43fa92dc00f14d28.png"},8588:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-machine-registered-fa33715b7ace60ba91c3ab12694be684.png"},51:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-osmanagement-dashboard-5ec27221ddfdd9d63f846c6370847cbd.png"},950:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-osmanagement-menu-18bc9bca56db4f66db675cb679e6ada9.png"},1717:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-registration-endpoints-040525e42e8fcfde1c35a85e44b1bc32.png"},5994:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-vm-boot-bios-28b0123c0fbaf64ff7fe1f5634b0f1ae.png"},4948:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-vm-boot-uefi-ca7f800f1c8469b9c1477f78b6ca22e5.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>s});var a=n(7294);const i={},r=a.createContext(i);function s(e){const t=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),a.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8d83cde9.5857bbea.js b/assets/js/8d83cde9.5857bbea.js new file mode 100644 index 000000000..492ae3321 --- /dev/null +++ b/assets/js/8d83cde9.5857bbea.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[3384],{5770:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var t=r(5893),s=r(1151);const o={sidebar_label:"Kubernetes versions",title:""},a=void 0,i={id:"kubernetesversions",title:"",description:"Valid Versions",source:"@site/docs/kubernetesversions.md",sourceDirName:".",slug:"/kubernetesversions",permalink:"/next/kubernetesversions",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Kubernetes versions",title:""},sidebar:"docs",previous:{title:"Elemental Operator Helm Chart",permalink:"/next/elementaloperatorchart-reference"},next:{title:"Smbios",permalink:"/next/smbios"}},c={},l=[{value:"Valid Versions",id:"valid-versions",level:2}];function d(e){const n={code:"code",h2:"h2",p:"p",pre:"pre",strong:"strong",...(0,s.a)(),...e.components},{Head:r}=n;return r||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r,{children:(0,t.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/kubernetesversions"})}),"\n",(0,t.jsx)(n.h2,{id:"valid-versions",children:"Valid Versions"}),"\n",(0,t.jsxs)(n.p,{children:["The list of valid versions for the ",(0,t.jsx)(n.code,{children:"kubernetesVersion"})," field can be determined\nfrom the Rancher metadata using the following commands."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"k3s:"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"curl -sL https://raw.githubusercontent.com/rancher/kontainer-driver-metadata/release-v2.6/data/data.json | jq -r '.k3s.releases[].version'\n"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"rke2:"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"curl -sL https://raw.githubusercontent.com/rancher/kontainer-driver-metadata/release-v2.6/data/data.json | jq -r '.rke2.releases[].version'\n"})})]})}function u(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,r)=>{r.d(n,{Z:()=>i,a:()=>a});var t=r(7294);const s={},o=t.createContext(s);function a(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8d83cde9.6ce3e5b9.js b/assets/js/8d83cde9.6ce3e5b9.js deleted file mode 100644 index bdbf7d4b7..000000000 --- a/assets/js/8d83cde9.6ce3e5b9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[3384],{5770:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=s(5893),t=s(1151);const o={sidebar_label:"Kubernetes versions",title:""},a=void 0,i={id:"kubernetesversions",title:"",description:"Valid Versions",source:"@site/docs/kubernetesversions.md",sourceDirName:".",slug:"/kubernetesversions",permalink:"/next/kubernetesversions",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Kubernetes versions",title:""},sidebar:"docs",previous:{title:"Elemental Operator Helm Chart",permalink:"/next/elementaloperatorchart-reference"},next:{title:"Smbios",permalink:"/next/smbios"}},l={},c=[{value:"Valid Versions",id:"valid-versions",level:2}];function d(e){const n={code:"code",h2:"h2",p:"p",pre:"pre",strong:"strong",...(0,t.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"valid-versions",children:"Valid Versions"}),"\n",(0,r.jsxs)(n.p,{children:["The list of valid versions for the ",(0,r.jsx)(n.code,{children:"kubernetesVersion"})," field can be determined\nfrom the Rancher metadata using the following commands."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"k3s:"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"curl -sL https://raw.githubusercontent.com/rancher/kontainer-driver-metadata/release-v2.6/data/data.json | jq -r '.k3s.releases[].version'\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"rke2:"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"curl -sL https://raw.githubusercontent.com/rancher/kontainer-driver-metadata/release-v2.6/data/data.json | jq -r '.rke2.releases[].version'\n"})})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},1151:(e,n,s)=>{s.d(n,{Z:()=>i,a:()=>a});var r=s(7294);const t={},o=r.createContext(t);function a(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/906c60a4.1e13a403.js b/assets/js/906c60a4.1e13a403.js new file mode 100644 index 000000000..bf5bbcc25 --- /dev/null +++ b/assets/js/906c60a4.1e13a403.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[366],{8266:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var r=t(5893),s=t(1151);const o={sidebar_label:"Rancher upgrades",title:""},a="Troubleshooting Rancher upgrades",i={id:"troubleshooting-rancher-upgrades",title:"",description:"Upgrading to Rancher v2.7.2 will fail if Elemental clusters are defined. The rancher pod gets stuck in a crash loop (see https://github.com/rancher/rancher/issues/41145).",source:"@site/versioned_docs/version-1.2/troubleshooting-rancher-upgrades.md",sourceDirName:".",slug:"/troubleshooting-rancher-upgrades",permalink:"/1.2/troubleshooting-rancher-upgrades",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Rancher upgrades",title:""},sidebar:"docs",previous:{title:"Add a custom certificate",permalink:"/1.2/custom-certificate"},next:{title:"Restore",permalink:"/1.2/troubleshooting-restore"}},c={},l=[];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",p:"p",pre:"pre",...(0,s.a)(),...e.components},{Head:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t,{children:(0,r.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/troubleshooting-rancher-upgrades"})}),"\n",(0,r.jsx)(n.h1,{id:"troubleshooting-rancher-upgrades",children:"Troubleshooting Rancher upgrades"}),"\n",(0,r.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,r.jsxs)(n.p,{children:["Upgrading to Rancher v2.7.2 will fail if Elemental clusters are defined. The rancher pod gets stuck in a crash loop (see ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/rancher/issues/41145",children:"https://github.com/rancher/rancher/issues/41145"}),")."]})}),"\n",(0,r.jsx)(n.p,{children:"Note that the issue is present only if at least one Elemental cluster is defined."}),"\n",(0,r.jsxs)(n.p,{children:["To workaround the issue create an empty ",(0,r.jsx)(n.code,{children:"dynamicschemas.management.cattle.io"})," resource named ",(0,r.jsx)(n.code,{children:"machineinventoryselectortemplate"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f - <{t.d(n,{Z:()=>i,a:()=>a});var r=t(7294);const s={},o=r.createContext(s);function a(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/906c60a4.de82c8fe.js b/assets/js/906c60a4.de82c8fe.js deleted file mode 100644 index 7304f66d6..000000000 --- a/assets/js/906c60a4.de82c8fe.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[366],{8266:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var r=t(5893),s=t(1151);const a={sidebar_label:"Rancher upgrades",title:""},o="Troubleshooting Rancher upgrades",i={id:"troubleshooting-rancher-upgrades",title:"",description:"Upgrading to Rancher v2.7.2 will fail if Elemental clusters are defined. The rancher pod gets stuck in a crash loop (see https://github.com/rancher/rancher/issues/41145).",source:"@site/versioned_docs/version-1.2/troubleshooting-rancher-upgrades.md",sourceDirName:".",slug:"/troubleshooting-rancher-upgrades",permalink:"/1.2/troubleshooting-rancher-upgrades",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Rancher upgrades",title:""},sidebar:"docs",previous:{title:"Add a custom certificate",permalink:"/1.2/custom-certificate"},next:{title:"Restore",permalink:"/1.2/troubleshooting-restore"}},c={},l=[];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"troubleshooting-rancher-upgrades",children:"Troubleshooting Rancher upgrades"}),"\n",(0,r.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,r.jsxs)(n.p,{children:["Upgrading to Rancher v2.7.2 will fail if Elemental clusters are defined. The rancher pod gets stuck in a crash loop (see ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/rancher/issues/41145",children:"https://github.com/rancher/rancher/issues/41145"}),")."]})}),"\n",(0,r.jsx)(n.p,{children:"Note that the issue is present only if at least one Elemental cluster is defined."}),"\n",(0,r.jsxs)(n.p,{children:["To workaround the issue create an empty ",(0,r.jsx)(n.code,{children:"dynamicschemas.management.cattle.io"})," resource named ",(0,r.jsx)(n.code,{children:"machineinventoryselectortemplate"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f - <{t.d(n,{Z:()=>i,a:()=>o});var r=t(7294);const s={},a=r.createContext(s);function o(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/93551644.24080d59.js b/assets/js/93551644.24080d59.js new file mode 100644 index 000000000..a028e3edc --- /dev/null +++ b/assets/js/93551644.24080d59.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4580],{9961:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var o=t(5893),a=t(1151),r=t(4713);const i={sidebar_label:"Smbios",title:""},s=void 0,l={id:"smbios",title:"",description:"Introduction",source:"@site/versioned_docs/version-1.3/smbios.md",sourceDirName:".",slug:"/smbios",permalink:"/smbios",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Smbios",title:""},sidebar:"docs",previous:{title:"Kubernetes versions",permalink:"/kubernetesversions"},next:{title:"Hardware Labels",permalink:"/hardwarelabels"}},c={},d=[{value:"Introduction",id:"introduction",level:2},{value:"How does Elemental uses SMBIOS data?",id:"how-does-elemental-uses-smbios-data",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,a.a)(),...e.components},{CodeBlock:t,Head:i}=n;return t||u("CodeBlock",!0),i||u("Head",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i,{children:(0,o.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/smbios"})}),"\n","\n","\n",(0,o.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,o.jsx)(n.p,{children:"The System Management BIOS (SMBIOS) specification defines data structures (and access methods) that can be used to read management information produced by the BIOS of a computer."}),"\n",(0,o.jsx)(n.p,{children:"This allows us to gather hardware information about the running system and use that as part of our labels."}),"\n",(0,o.jsx)(n.h2,{id:"how-does-elemental-uses-smbios-data",children:"How does Elemental uses SMBIOS data?"}),"\n",(0,o.jsxs)(n.p,{children:["The registration client tries to gather SMBIOS data by running ",(0,o.jsx)(n.code,{children:"dmidecode"})," during the initial registration of the node and that data is\nsent to the registration controller to use on interpolating different fields in the inventory that we create for that node."]}),"\n",(0,o.jsxs)(n.p,{children:["Currently, we support interpolating that data into the ",(0,o.jsx)(n.code,{children:"machineName"})," and the ",(0,o.jsx)(n.code,{children:"machineInventoryLabels"})," of a ",(0,o.jsx)(n.a,{href:"/machineregistration-reference",children:"machineRegistration"})]}),"\n",(0,o.jsx)(n.p,{children:"The interpolation format is as follows:"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"{$KEY/VALUE}"})," and ",(0,o.jsx)(n.code,{children:"${KEY/SUBKEY/VALUE}"})]}),"\n",(0,o.jsxs)(n.p,{children:["This can be mixed with normal strings so ",(0,o.jsx)(n.code,{children:"my-prefix-${KEY/VALUE}"})," would result into the resolved values with ",(0,o.jsx)(n.code,{children:"my-prefix-"})," prefixed"]}),"\n",(0,o.jsx)(n.p,{children:"For example, having the following SMBIOS data:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-console",metastring:"showLineNumbers",children:"System Information\n\tManufacturer: My manufacturer\n\tProduct Name: Awesome PC\n\tVersion: Not Specified\n\tSerial Number: THX1138\n\tFamily: Toretto\n"})}),"\n",(0,o.jsxs)(n.p,{children:["And setting the ",(0,o.jsx)(n.code,{children:"machineName"})," to ",(0,o.jsx)(n.code,{children:"serial-${System Information/Serial Number}"})," would result in the final value of ",(0,o.jsx)(n.code,{children:"serial-THX1138"})]}),"\n",(0,o.jsxs)(n.p,{children:["This is useful to generate automatic names for machines based on their hardware values, for example using the UUID or the Product name.\nOur default ",(0,o.jsx)(n.code,{children:"machineName"})," when the registration values are empty is ",(0,o.jsx)(n.code,{children:'"m-${System Information/UUID}"'}),"."]}),"\n",(0,o.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,o.jsxs)(n.p,{children:["All non-valid characters will be changed into ",(0,o.jsx)(n.code,{children:"-"})," automatically on parse. Valid characters for labels are alphanumeric and ",(0,o.jsx)(n.code,{children:"-"}),",",(0,o.jsx)(n.code,{children:"_"})," and ",(0,o.jsx)(n.code,{children:"."}),"\nFor machineName the constraints are stricter as that value is used for the hostname so valid values are lowercase alphanumeric and ",(0,o.jsx)(n.code,{children:"-"})," only."]})}),"\n",(0,o.jsx)(n.p,{children:"A good use of SMBIOS data is to set up different labels for all your machines and get those values from the hardware directly."}),"\n",(0,o.jsxs)(n.p,{children:["Having your ",(0,o.jsx)(n.code,{children:"machineInventoryLabels"})," on the ",(0,o.jsx)(n.a,{href:"/machineregistration-reference",children:"machineRegistration"})," set to SMBIOS data would allow\nyou to use selectors down the line to select similar machines."]}),"\n",(0,o.jsxs)(n.p,{children:["For example using the following label ",(0,o.jsx)(n.code,{children:'cpuFamily: "${Processor Information/Family}'})," would allow you to use a selector to search for i7 cpus in your machine fleet."]}),"\n",(0,o.jsx)(t,{language:"yaml",title:"registration example with smbios labels",showLineNumbers:!0,children:r.Z})]})}function m(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}function u(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},4713:(e,n,t)=>{t.d(n,{Z:()=>o});const o='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>i});var o=t(7294);const a={},r=o.createContext(a);function i(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/93551644.73cd7e74.js b/assets/js/93551644.73cd7e74.js deleted file mode 100644 index 98d3afdc1..000000000 --- a/assets/js/93551644.73cd7e74.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4580],{9961:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var o=t(5893),a=t(1151),r=t(4713);const i={sidebar_label:"Smbios",title:""},s=void 0,l={id:"smbios",title:"",description:"Introduction",source:"@site/versioned_docs/version-1.3/smbios.md",sourceDirName:".",slug:"/smbios",permalink:"/smbios",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Smbios",title:""},sidebar:"docs",previous:{title:"Kubernetes versions",permalink:"/kubernetesversions"},next:{title:"Hardware Labels",permalink:"/hardwarelabels"}},d={},c=[{value:"Introduction",id:"introduction",level:2},{value:"How does Elemental uses SMBIOS data?",id:"how-does-elemental-uses-smbios-data",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,a.a)(),...e.components},{CodeBlock:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("CodeBlock",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,o.jsx)(n.p,{children:"The System Management BIOS (SMBIOS) specification defines data structures (and access methods) that can be used to read management information produced by the BIOS of a computer."}),"\n",(0,o.jsx)(n.p,{children:"This allows us to gather hardware information about the running system and use that as part of our labels."}),"\n",(0,o.jsx)(n.h2,{id:"how-does-elemental-uses-smbios-data",children:"How does Elemental uses SMBIOS data?"}),"\n",(0,o.jsxs)(n.p,{children:["The registration client tries to gather SMBIOS data by running ",(0,o.jsx)(n.code,{children:"dmidecode"})," during the initial registration of the node and that data is\nsent to the registration controller to use on interpolating different fields in the inventory that we create for that node."]}),"\n",(0,o.jsxs)(n.p,{children:["Currently, we support interpolating that data into the ",(0,o.jsx)(n.code,{children:"machineName"})," and the ",(0,o.jsx)(n.code,{children:"machineInventoryLabels"})," of a ",(0,o.jsx)(n.a,{href:"/machineregistration-reference",children:"machineRegistration"})]}),"\n",(0,o.jsx)(n.p,{children:"The interpolation format is as follows:"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"{$KEY/VALUE}"})," and ",(0,o.jsx)(n.code,{children:"${KEY/SUBKEY/VALUE}"})]}),"\n",(0,o.jsxs)(n.p,{children:["This can be mixed with normal strings so ",(0,o.jsx)(n.code,{children:"my-prefix-${KEY/VALUE}"})," would result into the resolved values with ",(0,o.jsx)(n.code,{children:"my-prefix-"})," prefixed"]}),"\n",(0,o.jsx)(n.p,{children:"For example, having the following SMBIOS data:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-console",metastring:"showLineNumbers",children:"System Information\n\tManufacturer: My manufacturer\n\tProduct Name: Awesome PC\n\tVersion: Not Specified\n\tSerial Number: THX1138\n\tFamily: Toretto\n"})}),"\n",(0,o.jsxs)(n.p,{children:["And setting the ",(0,o.jsx)(n.code,{children:"machineName"})," to ",(0,o.jsx)(n.code,{children:"serial-${System Information/Serial Number}"})," would result in the final value of ",(0,o.jsx)(n.code,{children:"serial-THX1138"})]}),"\n",(0,o.jsxs)(n.p,{children:["This is useful to generate automatic names for machines based on their hardware values, for example using the UUID or the Product name.\nOur default ",(0,o.jsx)(n.code,{children:"machineName"})," when the registration values are empty is ",(0,o.jsx)(n.code,{children:'"m-${System Information/UUID}"'}),"."]}),"\n",(0,o.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,o.jsxs)(n.p,{children:["All non-valid characters will be changed into ",(0,o.jsx)(n.code,{children:"-"})," automatically on parse. Valid characters for labels are alphanumeric and ",(0,o.jsx)(n.code,{children:"-"}),",",(0,o.jsx)(n.code,{children:"_"})," and ",(0,o.jsx)(n.code,{children:"."}),"\nFor machineName the constraints are stricter as that value is used for the hostname so valid values are lowercase alphanumeric and ",(0,o.jsx)(n.code,{children:"-"})," only."]})}),"\n",(0,o.jsx)(n.p,{children:"A good use of SMBIOS data is to set up different labels for all your machines and get those values from the hardware directly."}),"\n",(0,o.jsxs)(n.p,{children:["Having your ",(0,o.jsx)(n.code,{children:"machineInventoryLabels"})," on the ",(0,o.jsx)(n.a,{href:"/machineregistration-reference",children:"machineRegistration"})," set to SMBIOS data would allow\nyou to use selectors down the line to select similar machines."]}),"\n",(0,o.jsxs)(n.p,{children:["For example using the following label ",(0,o.jsx)(n.code,{children:'cpuFamily: "${Processor Information/Family}'})," would allow you to use a selector to search for i7 cpus in your machine fleet."]}),"\n",(0,o.jsx)(t,{language:"yaml",title:"registration example with smbios labels",showLineNumbers:!0,children:r.Z})]})}function m(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},4713:(e,n,t)=>{t.d(n,{Z:()=>o});const o='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>i});var o=t(7294);const a={},r=o.createContext(a);function i(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/98a47304.0f7fffba.js b/assets/js/98a47304.0f7fffba.js new file mode 100644 index 000000000..490534ce7 --- /dev/null +++ b/assets/js/98a47304.0f7fffba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[710],{8953:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var a=t(5893),i=t(1151);const o={sidebar_label:"Inventory Management",title:"",version_badge:"1.3.0"},r=void 0,c={id:"inventory-management",title:"",description:"Inventory Management",source:"@site/versioned_docs/version-1.2/inventory-management.md",sourceDirName:".",slug:"/inventory-management",permalink:"/1.2/inventory-management",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Inventory Management",title:"",version_badge:"1.3.0"},sidebar:"docs",previous:{title:"Hardware Labels",permalink:"/1.2/hardwarelabels"},next:{title:"Backup",permalink:"/1.2/backup"}},s={},l=[{value:"Inventory Management",id:"inventory-management",level:2},{value:"MachineInventory",id:"machineinventory",level:3},{value:"Reference",id:"reference",level:4},{value:"MachineRegistration",id:"machineregistration",level:3},{value:"Reference",id:"reference-1",level:4}];function d(e){const n={br:"br",code:"code",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,i.a)(),...e.components},{Head:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t,{children:(0,a.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/inventory-management"})}),"\n",(0,a.jsx)(n.h2,{id:"inventory-management",children:"Inventory Management"}),"\n",(0,a.jsx)(n.p,{children:"The Elemental operator can hold an inventory of machines and\nthe mapping of the machine to it's configuration and assigned cluster."}),"\n",(0,a.jsx)(n.h3,{id:"machineinventory",children:"MachineInventory"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"MachineInventory"})," holds all the relevant information for a registered machine.",(0,a.jsx)(n.br,{}),"\n","Upon successful registration, the ",(0,a.jsx)(n.code,{children:"MachineInventory"})," will inherit all ",(0,a.jsx)(n.code,{children:"machineInventoryLabels"})," defined in the related ",(0,a.jsx)(n.code,{children:"MachineRegistration"}),".",(0,a.jsx)(n.br,{}),"\n","Additionally, the machine ",(0,a.jsx)(n.code,{children:"annotations"})," will also be updated on each successful registration."]}),"\n",(0,a.jsx)(n.p,{children:"By default, Elemental Teal machines will attempt a registration update every 24 hours to update labels and annotations."}),"\n",(0,a.jsx)(n.h4,{id:"reference",children:"Reference"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventory\nmetadata:\n # Machine annotations can be useful to identify hosts\n annotations:\n elemental.cattle.io/auth: tpm\n elemental.cattle.io/registration-ip: 192.168.122.152\n labels:\n # A label inherited from the MachineRegistration definition\n element: fire\n # Generic SMBIOS labels that are typically populated with\n # the MachineRegister approach\n machineUUID: f266c64b-3972-40e7-9937-3dc4a311436c\n manufacturer: QEMU\n productName: Standard-PC-Q35-ICH9-2009\n serialNumber: Not-Specified\n # Custom labels can be applied to each MachineInventory\n myCustomLabel: foo \n name: m-479ab68e-00ff-4081-a731-5b1a76610289\n # The namespace must match the namespace of the cluster\n # assigned to the clusters.provisioning.cattle.io resource\n namespace: fleet-default\n # A reference to the MachineInventorySelector that links the \n # machine to a Cluster definition\n ownerReferences:\n - apiVersion: elemental.cattle.io/v1beta1\n controller: true\n kind: MachineInventorySelector\n name: fire-machine-selector-qcn7d\n uid: 0a1f751e-4ca9-4a0d-919a-97ba1f434d12\nspec:\n # The hash of the TPM EK public key. This is used if you are\n # using TPM2 to identifiy nodes. Nodes can report their TPM\n # hash by using the MachineRegistration.\n tpmHash: d68795c6192af9922692f050b...\n"})}),"\n",(0,a.jsx)(n.h3,{id:"machineregistration",children:"MachineRegistration"}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"MachineRegistration"})," holds information on how to install and configure all connected Elemental Teal machines."]}),"\n",(0,a.jsxs)(n.p,{children:["It's possible to update the ",(0,a.jsx)(n.code,{children:"spec.machineInventoryLabels"})," and ",(0,a.jsx)(n.code,{children:"spec.machineInventoryAnnotations"})," and this will be applied to all registered machines.\nBy default, Elemental Teal machines will attempt a registration update every 24 hours to update labels and annotations."]}),"\n",(0,a.jsxs)(n.p,{children:["While it's possible to modify the ",(0,a.jsx)(n.code,{children:"spec.config"})," definition, updates to the ",(0,a.jsx)(n.code,{children:"spec.config"})," will be ignored by machines that already completed installation.\nMachines that couldn't complete the installation will try again every 30 minutes by reloading the remote ",(0,a.jsx)(n.code,{children:"MachineRegistration"})," definition. This can be useful to correct ",(0,a.jsx)(n.code,{children:"spec.config"})," mistakes that prevent successful installation (for ex. ",(0,a.jsx)(n.code,{children:"spec.config.elemental.install.device"}),"), without having to create a new ",(0,a.jsx)(n.code,{children:"MachineRegistration"})," and a new ISO."]}),"\n",(0,a.jsx)(n.h4,{id:"reference-1",children:"Reference"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n # The namespace must match the namespace of the cluster\n # assigned to the clusters.provisioning.cattle.io resource\n namespace: fleet-default\nspec:\n # The cloud config that will be used to provision the node\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n # Labels to be added to the created MachineInventory object\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n # Annotations to be added to the created MachineInventory object\n machineInventoryAnnotations: {}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>r});var a=t(7294);const i={},o=a.createContext(i);function r(e){const n=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/98a47304.99903d3a.js b/assets/js/98a47304.99903d3a.js deleted file mode 100644 index 68c23c999..000000000 --- a/assets/js/98a47304.99903d3a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[710],{8953:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var a=t(5893),i=t(1151);const o={sidebar_label:"Inventory Management",title:"",version_badge:"1.3.0"},r=void 0,s={id:"inventory-management",title:"",description:"Inventory Management",source:"@site/versioned_docs/version-1.2/inventory-management.md",sourceDirName:".",slug:"/inventory-management",permalink:"/1.2/inventory-management",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Inventory Management",title:"",version_badge:"1.3.0"},sidebar:"docs",previous:{title:"Hardware Labels",permalink:"/1.2/hardwarelabels"},next:{title:"Backup",permalink:"/1.2/backup"}},c={},l=[{value:"Inventory Management",id:"inventory-management",level:2},{value:"MachineInventory",id:"machineinventory",level:3},{value:"Reference",id:"reference",level:4},{value:"MachineRegistration",id:"machineregistration",level:3},{value:"Reference",id:"reference-1",level:4}];function d(e){const n={br:"br",code:"code",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h2,{id:"inventory-management",children:"Inventory Management"}),"\n",(0,a.jsx)(n.p,{children:"The Elemental operator can hold an inventory of machines and\nthe mapping of the machine to it's configuration and assigned cluster."}),"\n",(0,a.jsx)(n.h3,{id:"machineinventory",children:"MachineInventory"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"MachineInventory"})," holds all the relevant information for a registered machine.",(0,a.jsx)(n.br,{}),"\n","Upon successful registration, the ",(0,a.jsx)(n.code,{children:"MachineInventory"})," will inherit all ",(0,a.jsx)(n.code,{children:"machineInventoryLabels"})," defined in the related ",(0,a.jsx)(n.code,{children:"MachineRegistration"}),".",(0,a.jsx)(n.br,{}),"\n","Additionally, the machine ",(0,a.jsx)(n.code,{children:"annotations"})," will also be updated on each successful registration."]}),"\n",(0,a.jsx)(n.p,{children:"By default, Elemental Teal machines will attempt a registration update every 24 hours to update labels and annotations."}),"\n",(0,a.jsx)(n.h4,{id:"reference",children:"Reference"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventory\nmetadata:\n # Machine annotations can be useful to identify hosts\n annotations:\n elemental.cattle.io/auth: tpm\n elemental.cattle.io/registration-ip: 192.168.122.152\n labels:\n # A label inherited from the MachineRegistration definition\n element: fire\n # Generic SMBIOS labels that are typically populated with\n # the MachineRegister approach\n machineUUID: f266c64b-3972-40e7-9937-3dc4a311436c\n manufacturer: QEMU\n productName: Standard-PC-Q35-ICH9-2009\n serialNumber: Not-Specified\n # Custom labels can be applied to each MachineInventory\n myCustomLabel: foo \n name: m-479ab68e-00ff-4081-a731-5b1a76610289\n # The namespace must match the namespace of the cluster\n # assigned to the clusters.provisioning.cattle.io resource\n namespace: fleet-default\n # A reference to the MachineInventorySelector that links the \n # machine to a Cluster definition\n ownerReferences:\n - apiVersion: elemental.cattle.io/v1beta1\n controller: true\n kind: MachineInventorySelector\n name: fire-machine-selector-qcn7d\n uid: 0a1f751e-4ca9-4a0d-919a-97ba1f434d12\nspec:\n # The hash of the TPM EK public key. This is used if you are\n # using TPM2 to identifiy nodes. Nodes can report their TPM\n # hash by using the MachineRegistration.\n tpmHash: d68795c6192af9922692f050b...\n"})}),"\n",(0,a.jsx)(n.h3,{id:"machineregistration",children:"MachineRegistration"}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"MachineRegistration"})," holds information on how to install and configure all connected Elemental Teal machines."]}),"\n",(0,a.jsxs)(n.p,{children:["It's possible to update the ",(0,a.jsx)(n.code,{children:"spec.machineInventoryLabels"})," and ",(0,a.jsx)(n.code,{children:"spec.machineInventoryAnnotations"})," and this will be applied to all registered machines.\nBy default, Elemental Teal machines will attempt a registration update every 24 hours to update labels and annotations."]}),"\n",(0,a.jsxs)(n.p,{children:["While it's possible to modify the ",(0,a.jsx)(n.code,{children:"spec.config"})," definition, updates to the ",(0,a.jsx)(n.code,{children:"spec.config"})," will be ignored by machines that already completed installation.\nMachines that couldn't complete the installation will try again every 30 minutes by reloading the remote ",(0,a.jsx)(n.code,{children:"MachineRegistration"})," definition. This can be useful to correct ",(0,a.jsx)(n.code,{children:"spec.config"})," mistakes that prevent successful installation (for ex. ",(0,a.jsx)(n.code,{children:"spec.config.elemental.install.device"}),"), without having to create a new ",(0,a.jsx)(n.code,{children:"MachineRegistration"})," and a new ISO."]}),"\n",(0,a.jsx)(n.h4,{id:"reference-1",children:"Reference"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n # The namespace must match the namespace of the cluster\n # assigned to the clusters.provisioning.cattle.io resource\n namespace: fleet-default\nspec:\n # The cloud config that will be used to provision the node\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n # Labels to be added to the created MachineInventory object\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n # Annotations to be added to the created MachineInventory object\n machineInventoryAnnotations: {}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>r});var a=t(7294);const i={},o=a.createContext(i);function r(e){const n=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/99ca7d3f.2c4623ef.js b/assets/js/99ca7d3f.2c4623ef.js deleted file mode 100644 index 4905e591c..000000000 --- a/assets/js/99ca7d3f.2c4623ef.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8963],{7979:(e,t,c)=>{c.r(t),c.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var i=c(5893),n=c(1151);const o={sidebar_label:"Add a custom certificate",title:""},r=void 0,s={id:"custom-certificate",title:"",description:"How to add a custom certificate",source:"@site/versioned_docs/version-1.3/custom-certificate.md",sourceDirName:".",slug:"/custom-certificate",permalink:"/custom-certificate",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Add a custom certificate",title:""},sidebar:"docs",previous:{title:"Include cloud-config from removable devices",permalink:"/removable-device-cloudconfig"},next:{title:"Rancher upgrades",permalink:"/troubleshooting-rancher-upgrades"}},a={},d=[{value:"How to add a custom certificate",id:"how-to-add-a-custom-certificate",level:3}];function l(e){const t={admonition:"admonition",code:"code",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h3,{id:"how-to-add-a-custom-certificate",children:"How to add a custom certificate"}),"\n",(0,i.jsxs)(t.p,{children:["Prerequisite: A certificate in ",(0,i.jsx)(t.code,{children:".pem"})," format"]}),"\n",(0,i.jsx)(t.p,{children:"Goal: Make a custom certificate available system-wide"}),"\n",(0,i.jsx)(t.admonition,{title:"This is for certificates used by system-level services.",type:"note",children:(0,i.jsx)(t.p,{children:"Kubernetes workloads should bring their certificates within the\ncontainer image instead."})}),"\n",(0,i.jsx)(t.p,{children:"In order to install a custom certificate on SLE Micro for Rancher we\nneed to"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["copy the ",(0,i.jsx)(t.code,{children:".pem"})," file to ",(0,i.jsx)(t.code,{children:"/etc/pki/trust/anchors/"})]}),"\n",(0,i.jsxs)(t.li,{children:["run ",(0,i.jsx)(t.code,{children:"update-ca-certificates"})]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["The respective ",(0,i.jsx)(t.code,{children:"cloud-config"})," snippet looks like this:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-yaml",children:"write_files:\n - path: /etc/pki/trust/anchors/my-custom-certificate.pem\n permission: 0444\n content: |-\n -----BEGIN CERTIFICATE-----\n ...\n -----END CERTIFICATE-----\nruncmd:\n - update-ca-certificates\n"})}),"\n",(0,i.jsx)(t.p,{children:"(actual certificate content omitted for brevity reasons)"})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},1151:(e,t,c)=>{c.d(t,{Z:()=>s,a:()=>r});var i=c(7294);const n={},o=i.createContext(n);function r(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/99ca7d3f.911cc353.js b/assets/js/99ca7d3f.911cc353.js new file mode 100644 index 000000000..2da9fbfda --- /dev/null +++ b/assets/js/99ca7d3f.911cc353.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8963],{7979:(e,t,c)=>{c.r(t),c.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var i=c(5893),n=c(1151);const o={sidebar_label:"Add a custom certificate",title:""},r=void 0,s={id:"custom-certificate",title:"",description:"How to add a custom certificate",source:"@site/versioned_docs/version-1.3/custom-certificate.md",sourceDirName:".",slug:"/custom-certificate",permalink:"/custom-certificate",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Add a custom certificate",title:""},sidebar:"docs",previous:{title:"Include cloud-config from removable devices",permalink:"/removable-device-cloudconfig"},next:{title:"Rancher upgrades",permalink:"/troubleshooting-rancher-upgrades"}},a={},d=[{value:"How to add a custom certificate",id:"how-to-add-a-custom-certificate",level:3}];function l(e){const t={admonition:"admonition",code:"code",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.a)(),...e.components},{Head:c}=t;return c||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(c,{children:(0,i.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/custom-certificate"})}),"\n",(0,i.jsx)(t.h3,{id:"how-to-add-a-custom-certificate",children:"How to add a custom certificate"}),"\n",(0,i.jsxs)(t.p,{children:["Prerequisite: A certificate in ",(0,i.jsx)(t.code,{children:".pem"})," format"]}),"\n",(0,i.jsx)(t.p,{children:"Goal: Make a custom certificate available system-wide"}),"\n",(0,i.jsx)(t.admonition,{title:"This is for certificates used by system-level services.",type:"note",children:(0,i.jsx)(t.p,{children:"Kubernetes workloads should bring their certificates within the\ncontainer image instead."})}),"\n",(0,i.jsx)(t.p,{children:"In order to install a custom certificate on SLE Micro for Rancher we\nneed to"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["copy the ",(0,i.jsx)(t.code,{children:".pem"})," file to ",(0,i.jsx)(t.code,{children:"/etc/pki/trust/anchors/"})]}),"\n",(0,i.jsxs)(t.li,{children:["run ",(0,i.jsx)(t.code,{children:"update-ca-certificates"})]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["The respective ",(0,i.jsx)(t.code,{children:"cloud-config"})," snippet looks like this:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-yaml",children:"write_files:\n - path: /etc/pki/trust/anchors/my-custom-certificate.pem\n permission: 0444\n content: |-\n -----BEGIN CERTIFICATE-----\n ...\n -----END CERTIFICATE-----\nruncmd:\n - update-ca-certificates\n"})}),"\n",(0,i.jsx)(t.p,{children:"(actual certificate content omitted for brevity reasons)"})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},1151:(e,t,c)=>{c.d(t,{Z:()=>s,a:()=>r});var i=c(7294);const n={},o=i.createContext(n);function r(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9de08282.a251a46b.js b/assets/js/9de08282.a251a46b.js deleted file mode 100644 index bbefcc4fc..000000000 --- a/assets/js/9de08282.a251a46b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7869],{544:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>c,default:()=>p,frontMatter:()=>l,metadata:()=>d,toc:()=>m});var i=t(5893),a=t(1151),s=t(6506),r=t(8638),o=t(2624);const l={sidebar_label:"Elemental behind proxy",title:""},c=void 0,d={id:"elemental_behind_proxy",title:"",description:"Introduction",source:"@site/docs/elemental_behind_proxy.md",sourceDirName:".",slug:"/elemental_behind_proxy",permalink:"/next/elemental_behind_proxy",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Elemental behind proxy",title:""},sidebar:"docs",previous:{title:"Configure Wi-Fi",permalink:"/next/wifi"},next:{title:"How to use Elemental with Rancher and VMware",permalink:"/next/rancher-vmware"}},h={},m=[{value:"Introduction",id:"introduction",level:2},{value:"Elemental-register",id:"elemental-register",level:2},{value:"Create Elemental cluster",id:"create-elemental-cluster",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components},{CodeBlock:l,TabItem:c,Tabs:d}=n;return l||g("CodeBlock",!0),c||g("TabItem",!0),d||g("Tabs",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsx)(n.p,{children:"In a lot of enterprise environments, servers or VMs running on premises do not have direct Internet access. Instead, the connection to external services is done through a HTTP(S) proxy for security reasons. This tutorial shows you how to set up an Elemental deployment in such an environment."}),"\n",(0,i.jsx)(n.admonition,{title:"important note",type:"caution",children:(0,i.jsxs)(n.p,{children:["This guide will not cover the Rancher installation behind a proxy. It's a different use case and you can find the detailed documentation ",(0,i.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/pages-for-subheaders/rancher-behind-an-http-proxy",children:"here"}),"."]})}),"\n",(0,i.jsx)(n.admonition,{title:"info",type:"info",children:(0,i.jsxs)(n.p,{children:["For this documentation, we assume you are using a SUSE family system (like Elemental Teal), so proxy settings have to be written in ",(0,i.jsx)(n.code,{children:"/etc/sysconfig/proxy"}),"."]})}),"\n",(0,i.jsx)(n.p,{children:"Proxy settings must be configured in the following locations:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Machine Registration Endpoint"}),"\n",(0,i.jsx)(n.li,{children:"SeedImage resource"}),"\n",(0,i.jsx)(n.li,{children:"Elemental cluster configuration"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"elemental-system-agent"})," needs proxy settings to reach the Rancher Manager.\nTo achieve that, you need to fill the cloud-init section of the Machine Registration Endpoint."]}),"\n",(0,i.jsxs)(n.p,{children:["You can do it either with ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/quickstart-ui#add-a-machine-registration-endpoint",children:"UI"})," or ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/quickstart-cli#prepare-your-kubernetes-resources",children:"CLI"}),"."]}),"\n",(0,i.jsxs)(d,{children:[(0,i.jsx)(c,{value:"cliRegistration",label:"CLI",default:!0,children:(0,i.jsx)(l,{language:"yaml",title:"registration.yaml",showLineNumbers:!0,children:s.Z})}),(0,i.jsx)(c,{value:"uiRegistration",label:"UI",default:!0,children:(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Add proxy settings in Machine Registration",src:t(4187).Z+"",width:"668",height:"650"})})})]}),"\n",(0,i.jsx)(n.h2,{id:"elemental-register",children:"Elemental-register"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/architecture/#elemental-register-client",children:"Elemental-register"})," is the first communication endpoint between the new host and Rancher Manager, this is the first place where proxy settings need to be set."]}),"\n",(0,i.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,i.jsx)(n.p,{children:"At the time of writing, it's only possible to configure proxy settings for the ISO with the CLI. The proxy settings aren't implemented in the UI."})}),"\n",(0,i.jsxs)(n.p,{children:["The process happens when you boot your Elemental ISO for the first time, in order to configure the proxy settings you have to include a ",(0,i.jsx)(n.code,{children:"cloud-init"})," definition in the ISO.\nTo do that, you have to create a ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/seedimage-reference/",children:"SeedImage"})," definition."]}),"\n",(0,i.jsx)(l,{language:"yaml",title:"seedimage.yaml",showLineNumbers:!0,children:r.Z}),"\n",(0,i.jsxs)(n.p,{children:["Apply the YAML with ",(0,i.jsx)(n.code,{children:"kubectl"})," and then, print your SeedImage definition to get the URL to download it:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"kubectl apply -f \nkubectl get seedimage -n -o yaml\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Boot the ISO and you should see your new system appears in ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/architecture#machineinventory",children:"Machine inventory"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"create-elemental-cluster",children:"Create Elemental cluster"}),"\n",(0,i.jsx)(n.p,{children:"For this step, you can use either the UI or CLI."}),"\n",(0,i.jsxs)(d,{children:[(0,i.jsxs)(c,{value:"cliCluster",label:"CLI",default:!0,children:[(0,i.jsx)(l,{language:"yaml",title:"cluster.yaml",showLineNumbers:!0,children:o.Z}),(0,i.jsxs)(n.p,{children:["You can see that proxy settings are added below ",(0,i.jsx)(n.code,{children:"agentEnvVars"}),"."]})]}),(0,i.jsx)(c,{value:"uiCluster",label:"UI",default:!0,children:(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Add proxy settings for Elemental cluster",src:t(1894).Z+"",width:"1756",height:"516"})})})]})]})}function p(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}function g(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},2624:(e,n,t)=>{t.d(n,{Z:()=>i});const i="kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: my-cluster\n namespace: fleet-default\nspec:\n agentEnvVars:\n - name: HTTP_PROXY\n value: http://:\n - name: HTTPS_PROXY\n value: https://:\n - name: NO_PROXY\n value: localhost,127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local\n rkeConfig:\n machineGlobalConfig:\n etcd-expose-metrics: false\n profile: null\n machinePools:\n - controlPlaneRole: true\n etcdRole: true\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: my-machine-selector\n name: pool1\n quantity: 1\n unhealthyNodeTimeout: 0s\n workerRole: true\n machineSelectorConfig:\n - config:\n protect-kernel-defaults: false\n registries: {}\n kubernetesVersion: v1.24.8+k3s1\n"},6506:(e,n,t)=>{t.d(n,{Z:()=>i});const i='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n write_files:\n - path: /etc/sysconfig/proxy\n append: true\n content: |\n PROXY_ENABLED="yes"\n HTTP_PROXY=http://:\n HTTPS_PROXY=https://:\n NO_PROXY="localhost, 127.0.0.1"\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n registration:\n emulate-tpm: true\n'},8638:(e,n,t)=>{t.d(n,{Z:()=>i});const i='apiVersion: elemental.cattle.io/v1beta1\nkind: SeedImage\nmetadata:\n name: ...\n namespace: ...\nspec:\n baseImage: https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable:/Teal53/media/iso/elemental-teal.x86_64.iso\n cloud-config:\n write_files:\n - path: /etc/sysconfig/proxy\n append: true\n content: |\n PROXY_ENABLED="yes"\n HTTP_PROXY=http://:\n HTTPS_PROXY=https://:\n NO_PROXY="localhost, 127.0.0.1"\n registrationRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineRegistration\n name: ...\n namespace: ...\n'},1894:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/proxy-settings-cluster-ui-7303e94b634e59942023814ceff5f54f.png"},4187:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/proxy-settings-machine-registration-ui-887aa84b2d739e775e490d74062979fe.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>r});var i=t(7294);const a={},s=i.createContext(a);function r(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9de08282.c2eda208.js b/assets/js/9de08282.c2eda208.js new file mode 100644 index 000000000..dda2d0079 --- /dev/null +++ b/assets/js/9de08282.c2eda208.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7869],{544:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>c,default:()=>p,frontMatter:()=>l,metadata:()=>d,toc:()=>m});var i=t(5893),a=t(1151),s=t(6506),r=t(8638),o=t(2624);const l={sidebar_label:"Elemental behind proxy",title:""},c=void 0,d={id:"elemental_behind_proxy",title:"",description:"Introduction",source:"@site/docs/elemental_behind_proxy.md",sourceDirName:".",slug:"/elemental_behind_proxy",permalink:"/next/elemental_behind_proxy",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Elemental behind proxy",title:""},sidebar:"docs",previous:{title:"Configure Wi-Fi",permalink:"/next/wifi"},next:{title:"How to use Elemental with Rancher and VMware",permalink:"/next/rancher-vmware"}},h={},m=[{value:"Introduction",id:"introduction",level:2},{value:"Elemental-register",id:"elemental-register",level:2},{value:"Create Elemental cluster",id:"create-elemental-cluster",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components},{CodeBlock:l,Head:c,TabItem:d,Tabs:h}=n;return l||g("CodeBlock",!0),c||g("Head",!0),d||g("TabItem",!0),h||g("Tabs",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(c,{children:(0,i.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/elemental_behind_proxy"})}),"\n","\n","\n",(0,i.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsx)(n.p,{children:"In a lot of enterprise environments, servers or VMs running on premises do not have direct Internet access. Instead, the connection to external services is done through a HTTP(S) proxy for security reasons. This tutorial shows you how to set up an Elemental deployment in such an environment."}),"\n",(0,i.jsx)(n.admonition,{title:"important note",type:"caution",children:(0,i.jsxs)(n.p,{children:["This guide will not cover the Rancher installation behind a proxy. It's a different use case and you can find the detailed documentation ",(0,i.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/pages-for-subheaders/rancher-behind-an-http-proxy",children:"here"}),"."]})}),"\n",(0,i.jsx)(n.admonition,{title:"info",type:"info",children:(0,i.jsxs)(n.p,{children:["For this documentation, we assume you are using a SUSE family system (like Elemental Teal), so proxy settings have to be written in ",(0,i.jsx)(n.code,{children:"/etc/sysconfig/proxy"}),"."]})}),"\n",(0,i.jsx)(n.p,{children:"Proxy settings must be configured in the following locations:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Machine Registration Endpoint"}),"\n",(0,i.jsx)(n.li,{children:"SeedImage resource"}),"\n",(0,i.jsx)(n.li,{children:"Elemental cluster configuration"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"elemental-system-agent"})," needs proxy settings to reach the Rancher Manager.\nTo achieve that, you need to fill the cloud-init section of the Machine Registration Endpoint."]}),"\n",(0,i.jsxs)(n.p,{children:["You can do it either with ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/quickstart-ui#add-a-machine-registration-endpoint",children:"UI"})," or ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/quickstart-cli#prepare-your-kubernetes-resources",children:"CLI"}),"."]}),"\n",(0,i.jsxs)(h,{children:[(0,i.jsx)(d,{value:"cliRegistration",label:"CLI",default:!0,children:(0,i.jsx)(l,{language:"yaml",title:"registration.yaml",showLineNumbers:!0,children:s.Z})}),(0,i.jsx)(d,{value:"uiRegistration",label:"UI",default:!0,children:(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Add proxy settings in Machine Registration",src:t(4187).Z+"",width:"668",height:"650"})})})]}),"\n",(0,i.jsx)(n.h2,{id:"elemental-register",children:"Elemental-register"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/architecture/#elemental-register-client",children:"Elemental-register"})," is the first communication endpoint between the new host and Rancher Manager, this is the first place where proxy settings need to be set."]}),"\n",(0,i.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,i.jsx)(n.p,{children:"At the time of writing, it's only possible to configure proxy settings for the ISO with the CLI. The proxy settings aren't implemented in the UI."})}),"\n",(0,i.jsxs)(n.p,{children:["The process happens when you boot your Elemental ISO for the first time, in order to configure the proxy settings you have to include a ",(0,i.jsx)(n.code,{children:"cloud-init"})," definition in the ISO.\nTo do that, you have to create a ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/seedimage-reference/",children:"SeedImage"})," definition."]}),"\n",(0,i.jsx)(l,{language:"yaml",title:"seedimage.yaml",showLineNumbers:!0,children:r.Z}),"\n",(0,i.jsxs)(n.p,{children:["Apply the YAML with ",(0,i.jsx)(n.code,{children:"kubectl"})," and then, print your SeedImage definition to get the URL to download it:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"kubectl apply -f \nkubectl get seedimage -n -o yaml\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Boot the ISO and you should see your new system appears in ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/architecture#machineinventory",children:"Machine inventory"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"create-elemental-cluster",children:"Create Elemental cluster"}),"\n",(0,i.jsx)(n.p,{children:"For this step, you can use either the UI or CLI."}),"\n",(0,i.jsxs)(h,{children:[(0,i.jsxs)(d,{value:"cliCluster",label:"CLI",default:!0,children:[(0,i.jsx)(l,{language:"yaml",title:"cluster.yaml",showLineNumbers:!0,children:o.Z}),(0,i.jsxs)(n.p,{children:["You can see that proxy settings are added below ",(0,i.jsx)(n.code,{children:"agentEnvVars"}),"."]})]}),(0,i.jsx)(d,{value:"uiCluster",label:"UI",default:!0,children:(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Add proxy settings for Elemental cluster",src:t(1894).Z+"",width:"1756",height:"516"})})})]})]})}function p(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}function g(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},2624:(e,n,t)=>{t.d(n,{Z:()=>i});const i="kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: my-cluster\n namespace: fleet-default\nspec:\n agentEnvVars:\n - name: HTTP_PROXY\n value: http://:\n - name: HTTPS_PROXY\n value: https://:\n - name: NO_PROXY\n value: localhost,127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local\n rkeConfig:\n machineGlobalConfig:\n etcd-expose-metrics: false\n profile: null\n machinePools:\n - controlPlaneRole: true\n etcdRole: true\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: my-machine-selector\n name: pool1\n quantity: 1\n unhealthyNodeTimeout: 0s\n workerRole: true\n machineSelectorConfig:\n - config:\n protect-kernel-defaults: false\n registries: {}\n kubernetesVersion: v1.24.8+k3s1\n"},6506:(e,n,t)=>{t.d(n,{Z:()=>i});const i='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n write_files:\n - path: /etc/sysconfig/proxy\n append: true\n content: |\n PROXY_ENABLED="yes"\n HTTP_PROXY=http://:\n HTTPS_PROXY=https://:\n NO_PROXY="localhost, 127.0.0.1"\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n registration:\n emulate-tpm: true\n'},8638:(e,n,t)=>{t.d(n,{Z:()=>i});const i='apiVersion: elemental.cattle.io/v1beta1\nkind: SeedImage\nmetadata:\n name: ...\n namespace: ...\nspec:\n baseImage: https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable:/Teal53/media/iso/elemental-teal.x86_64.iso\n cloud-config:\n write_files:\n - path: /etc/sysconfig/proxy\n append: true\n content: |\n PROXY_ENABLED="yes"\n HTTP_PROXY=http://:\n HTTPS_PROXY=https://:\n NO_PROXY="localhost, 127.0.0.1"\n registrationRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineRegistration\n name: ...\n namespace: ...\n'},1894:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/proxy-settings-cluster-ui-7303e94b634e59942023814ceff5f54f.png"},4187:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/proxy-settings-machine-registration-ui-887aa84b2d739e775e490d74062979fe.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>r});var i=t(7294);const a={},s=i.createContext(a);function r(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9ff227f5.153b5cfb.js b/assets/js/9ff227f5.153b5cfb.js new file mode 100644 index 000000000..937ec1e81 --- /dev/null +++ b/assets/js/9ff227f5.153b5cfb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6859],{3972:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var o=t(5893),l=t(1151),r=t(2070);const i={sidebar_label:"Cluster reference",title:""},s="Cluster reference",a={id:"cluster-reference",title:"",description:"A Cluster definition includes a kubernetesVersion and a list of machinePools to deploy the cluster to.",source:"@site/docs/cluster-reference.md",sourceDirName:".",slug:"/cluster-reference",permalink:"/next/cluster-reference",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Cluster reference",title:""},sidebar:"docs",previous:{title:"MachineInventorySelectorTemplate reference",permalink:"/next/machineinventoryselectortemplate-reference"},next:{title:"SeedImage reference",permalink:"/next/seedimage-reference"}},c={},d=[{value:"rkeConfig.machinePools",id:"rkeconfigmachinepools",level:2},{value:"machinePools Spec Reference",id:"machinepools-spec-reference",level:2},{value:"machineConfigRef Spec Reference",id:"machineconfigref-spec-reference",level:2},{value:"Example",id:"example",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,l.a)(),...e.components},{CodeBlock:t,Details:i,Head:s}=n;return t||p("CodeBlock",!0),i||p("Details",!0),s||p("Head",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s,{children:(0,o.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/cluster-reference"})}),"\n","\n","\n",(0,o.jsx)(n.h1,{id:"cluster-reference",children:"Cluster reference"}),"\n",(0,o.jsxs)(n.p,{children:["A ",(0,o.jsx)(n.code,{children:"Cluster"})," definition includes a ",(0,o.jsx)(n.code,{children:"kubernetesVersion"})," and a list of ",(0,o.jsx)(n.code,{children:"machinePools"})," to deploy the cluster to."]}),"\n",(0,o.jsxs)(n.p,{children:["For how to select a ",(0,o.jsx)(n.code,{children:"kubernetesVersion"})," please check our ",(0,o.jsx)(n.a,{href:"/next/kubernetesversions",children:"Kubernetes Versions"})," page."]}),"\n",(0,o.jsxs)(n.p,{children:["A ",(0,o.jsx)(n.code,{children:"machinePool"})," is a bundle of configuration with a ",(0,o.jsx)(n.code,{children:"ObjectReference"})," so the cluster is deployed to those ",(0,o.jsx)(n.code,{children:"machinePools"}),"\nwith the proper roles (etcd, control-plane, worker) with a quantity (how many nodes to deploy from this pool) and some extra configurations (rolling update config, max unhealthy nodes, etc...)."]}),"\n",(0,o.jsxs)(i,{children:[(0,o.jsx)("summary",{children:"Example"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: ...\n namespace: ...\nspec:\n rkeConfig:\n machinePools:\n - name: ...\n controlPlaneRole: ...\n etcdRole: ...\n workerRole: ...\n quantity: ...\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: ...\n - name: ...\n controlPlaneRole: ...\n etcdRole: ...\n workerRole: ...\n quantity: ...\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: ...\n"})})]}),"\n",(0,o.jsxs)(n.p,{children:["It's also possible to disable cluster components via the ",(0,o.jsx)(n.code,{children:"Cluster"})," object in ",(0,o.jsx)(n.code,{children:"spec.rkeConfig.machineGlobalConfig"}),", for example:"]}),"\n",(0,o.jsxs)(i,{children:[(0,o.jsx)("summary",{children:"Service Disabling Example"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: ...\n namespace: ...\nspec:\n rkeConfig:\n machinePools:\n - name: ...\n controlPlaneRole: ...\n etcdRole: ...\n workerRole: ...\n quantity: ...\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: ...\n machineGlobalConfig:\n disable:\n - servicelb\n - ...\n"})})]}),"\n",(0,o.jsx)(n.h2,{id:"rkeconfigmachinepools",children:"rkeConfig.machinePools"}),"\n",(0,o.jsxs)(n.p,{children:["A list of ",(0,o.jsx)(n.code,{children:"machinePools"}),". A minimum of 1 ",(0,o.jsx)(n.code,{children:"machinePools"})," is required for the cluster to be deployed to."]}),"\n",(0,o.jsx)(n.h2,{id:"machinepools-spec-reference",children:"machinePools Spec Reference"}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Key"}),(0,o.jsx)(n.th,{children:"Type"}),(0,o.jsx)(n.th,{children:"Default value"}),(0,o.jsx)(n.th,{children:"Description"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"controlPlaneRole"}),(0,o.jsx)(n.td,{children:"bool"}),(0,o.jsx)(n.td,{children:"false"}),(0,o.jsx)(n.td,{children:"Set machines in this pool as control-plane"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"etcdRole"}),(0,o.jsx)(n.td,{children:"bool"}),(0,o.jsx)(n.td,{children:"false"}),(0,o.jsx)(n.td,{children:"Set machines in this pool as etcd"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"workerRole"}),(0,o.jsx)(n.td,{children:"bool"}),(0,o.jsx)(n.td,{children:"false"}),(0,o.jsx)(n.td,{children:"Set machines in this pool as worker"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"name"}),(0,o.jsx)(n.td,{children:"string"}),(0,o.jsx)(n.td,{children:"nil"}),(0,o.jsx)(n.td,{children:"Name for this pool"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"quantity"}),(0,o.jsx)(n.td,{children:"int"}),(0,o.jsx)(n.td,{children:"nil"}),(0,o.jsx)(n.td,{children:"Number of machines to deploy from this pool"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"unhealthyNodeTimeout"}),(0,o.jsx)(n.td,{children:"int"}),(0,o.jsx)(n.td,{children:"nil"}),(0,o.jsx)(n.td,{children:"Timeout for unhealthy node health checks"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"machineConfigRef"}),(0,o.jsx)(n.td,{children:"int"}),(0,o.jsx)(n.td,{children:"ObjectReference"}),(0,o.jsx)(n.td,{children:"Reference to an object used to know what nodes are part of this pool"})]})]})]}),"\n",(0,o.jsxs)(n.p,{children:["A minimum of ",(0,o.jsx)(n.code,{children:"quantity"})," set to one is required for this pool to be used.\nBasically translates to how many nodes from this pool are going to be setup for this cluster."]}),"\n",(0,o.jsxs)(i,{children:[(0,o.jsx)("summary",{children:"Example"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: cluster-example\n namespace: example-default\nspec:\n rkeConfig:\n machinePools:\n - name: examplePool \n controlPlaneRole: true\n etcdRole: true\n workerRole: false\n quantity: 3\n unhealthyNodeTimeout: 0s\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: exampleSelector\n"})})]}),"\n",(0,o.jsx)(n.h2,{id:"machineconfigref-spec-reference",children:"machineConfigRef Spec Reference"}),"\n",(0,o.jsxs)(n.p,{children:["A ",(0,o.jsx)(n.code,{children:"machineConfigRef"})," is a generic k8s ",(0,o.jsx)(n.code,{children:"ObjectReference"})," which usually contain a\n",(0,o.jsx)(n.code,{children:"kind"})," ",(0,o.jsx)(n.code,{children:"name"})," and ",(0,o.jsx)(n.code,{children:"apiVersion"})," to point to a different object."]}),"\n",(0,o.jsxs)(n.p,{children:["In Elemental, we set this to a ",(0,o.jsx)(n.a,{href:"/next/machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate"}),".\nThis allows us to point to more than one object by using the selector."]}),"\n",(0,o.jsx)(n.h3,{id:"example",children:"Example"}),"\n",(0,o.jsxs)(n.p,{children:["The example below creates a cluster that uses 2 different ",(0,o.jsx)(n.code,{children:"machinePool"}),"'s to set different nodes to control-plane and workers nodes,\nbased on 2 different ",(0,o.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," that select their nodes based on a ",(0,o.jsx)(n.code,{children:"MachineInventory"})," label (location):"]}),"\n",(0,o.jsxs)(n.admonition,{title:"warning",type:"warning",children:[(0,o.jsx)(n.p,{children:"The labels for the example are manual set labels, they are not set by Elemental automatically.."}),(0,o.jsxs)(n.p,{children:["For automatic labels generated by Elemental please check the ",(0,o.jsx)(n.a,{href:"/next/smbios",children:"SMBIOS"})," page."]})]}),"\n",(0,o.jsx)(t,{language:"yaml",title:"Example of a cluster with more than one machinePool",showLineNumbers:!0,children:r.Z})]})}function m(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}function p(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},2070:(e,n,t)=>{t.d(n,{Z:()=>o});const o="kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: cluster-machinepools\n namespace: fleet-default\nspec:\n rkeConfig:\n machinePools:\n - name: controlPlanePool\n controlPlaneRole: true\n etcdRole: true\n workerRole: false\n quantity: 3\n unhealthyNodeTimeout: 0s\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: selectorControlPlanes\n - name: workersPool\n controlPlaneRole: false\n etcdRole: false\n workerRole: true\n quantity: 1\n unhealthyNodeTimeout: 0s\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: selectorWorkers\n kubernetesVersion: v1.23.7+k3s1\n---\napiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: selectorControlPlanes\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n matchLabels:\n location: server-room-1\n---\napiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: selectorWorkers\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n matchLabels:\n location: server-room-2"},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>i});var o=t(7294);const l={},r=o.createContext(l);function i(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9ff227f5.36665cef.js b/assets/js/9ff227f5.36665cef.js deleted file mode 100644 index f4e70f434..000000000 --- a/assets/js/9ff227f5.36665cef.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6859],{3972:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var o=t(5893),l=t(1151),r=t(2070);const i={sidebar_label:"Cluster reference",title:""},s="Cluster reference",a={id:"cluster-reference",title:"",description:"A Cluster definition includes a kubernetesVersion and a list of machinePools to deploy the cluster to.",source:"@site/docs/cluster-reference.md",sourceDirName:".",slug:"/cluster-reference",permalink:"/next/cluster-reference",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Cluster reference",title:""},sidebar:"docs",previous:{title:"MachineInventorySelectorTemplate reference",permalink:"/next/machineinventoryselectortemplate-reference"},next:{title:"SeedImage reference",permalink:"/next/seedimage-reference"}},c={},d=[{value:"rkeConfig.machinePools",id:"rkeconfigmachinepools",level:2},{value:"machinePools Spec Reference",id:"machinepools-spec-reference",level:2},{value:"machineConfigRef Spec Reference",id:"machineconfigref-spec-reference",level:2},{value:"Example",id:"example",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,l.a)(),...e.components},{CodeBlock:t,Details:i}=n;return t||p("CodeBlock",!0),i||p("Details",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"cluster-reference",children:"Cluster reference"}),"\n",(0,o.jsxs)(n.p,{children:["A ",(0,o.jsx)(n.code,{children:"Cluster"})," definition includes a ",(0,o.jsx)(n.code,{children:"kubernetesVersion"})," and a list of ",(0,o.jsx)(n.code,{children:"machinePools"})," to deploy the cluster to."]}),"\n",(0,o.jsxs)(n.p,{children:["For how to select a ",(0,o.jsx)(n.code,{children:"kubernetesVersion"})," please check our ",(0,o.jsx)(n.a,{href:"/next/kubernetesversions",children:"Kubernetes Versions"})," page."]}),"\n",(0,o.jsxs)(n.p,{children:["A ",(0,o.jsx)(n.code,{children:"machinePool"})," is a bundle of configuration with a ",(0,o.jsx)(n.code,{children:"ObjectReference"})," so the cluster is deployed to those ",(0,o.jsx)(n.code,{children:"machinePools"}),"\nwith the proper roles (etcd, control-plane, worker) with a quantity (how many nodes to deploy from this pool) and some extra configurations (rolling update config, max unhealthy nodes, etc...)."]}),"\n",(0,o.jsxs)(i,{children:[(0,o.jsx)("summary",{children:"Example"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: ...\n namespace: ...\nspec:\n rkeConfig:\n machinePools:\n - name: ...\n controlPlaneRole: ...\n etcdRole: ...\n workerRole: ...\n quantity: ...\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: ...\n - name: ...\n controlPlaneRole: ...\n etcdRole: ...\n workerRole: ...\n quantity: ...\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: ...\n"})})]}),"\n",(0,o.jsxs)(n.p,{children:["It's also possible to disable cluster components via the ",(0,o.jsx)(n.code,{children:"Cluster"})," object in ",(0,o.jsx)(n.code,{children:"spec.rkeConfig.machineGlobalConfig"}),", for example:"]}),"\n",(0,o.jsxs)(i,{children:[(0,o.jsx)("summary",{children:"Service Disabling Example"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: ...\n namespace: ...\nspec:\n rkeConfig:\n machinePools:\n - name: ...\n controlPlaneRole: ...\n etcdRole: ...\n workerRole: ...\n quantity: ...\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: ...\n machineGlobalConfig:\n disable:\n - servicelb\n - ...\n"})})]}),"\n",(0,o.jsx)(n.h2,{id:"rkeconfigmachinepools",children:"rkeConfig.machinePools"}),"\n",(0,o.jsxs)(n.p,{children:["A list of ",(0,o.jsx)(n.code,{children:"machinePools"}),". A minimum of 1 ",(0,o.jsx)(n.code,{children:"machinePools"})," is required for the cluster to be deployed to."]}),"\n",(0,o.jsx)(n.h2,{id:"machinepools-spec-reference",children:"machinePools Spec Reference"}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Key"}),(0,o.jsx)(n.th,{children:"Type"}),(0,o.jsx)(n.th,{children:"Default value"}),(0,o.jsx)(n.th,{children:"Description"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"controlPlaneRole"}),(0,o.jsx)(n.td,{children:"bool"}),(0,o.jsx)(n.td,{children:"false"}),(0,o.jsx)(n.td,{children:"Set machines in this pool as control-plane"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"etcdRole"}),(0,o.jsx)(n.td,{children:"bool"}),(0,o.jsx)(n.td,{children:"false"}),(0,o.jsx)(n.td,{children:"Set machines in this pool as etcd"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"workerRole"}),(0,o.jsx)(n.td,{children:"bool"}),(0,o.jsx)(n.td,{children:"false"}),(0,o.jsx)(n.td,{children:"Set machines in this pool as worker"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"name"}),(0,o.jsx)(n.td,{children:"string"}),(0,o.jsx)(n.td,{children:"nil"}),(0,o.jsx)(n.td,{children:"Name for this pool"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"quantity"}),(0,o.jsx)(n.td,{children:"int"}),(0,o.jsx)(n.td,{children:"nil"}),(0,o.jsx)(n.td,{children:"Number of machines to deploy from this pool"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"unhealthyNodeTimeout"}),(0,o.jsx)(n.td,{children:"int"}),(0,o.jsx)(n.td,{children:"nil"}),(0,o.jsx)(n.td,{children:"Timeout for unhealthy node health checks"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"machineConfigRef"}),(0,o.jsx)(n.td,{children:"int"}),(0,o.jsx)(n.td,{children:"ObjectReference"}),(0,o.jsx)(n.td,{children:"Reference to an object used to know what nodes are part of this pool"})]})]})]}),"\n",(0,o.jsxs)(n.p,{children:["A minimum of ",(0,o.jsx)(n.code,{children:"quantity"})," set to one is required for this pool to be used.\nBasically translates to how many nodes from this pool are going to be setup for this cluster."]}),"\n",(0,o.jsxs)(i,{children:[(0,o.jsx)("summary",{children:"Example"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: cluster-example\n namespace: example-default\nspec:\n rkeConfig:\n machinePools:\n - name: examplePool \n controlPlaneRole: true\n etcdRole: true\n workerRole: false\n quantity: 3\n unhealthyNodeTimeout: 0s\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: exampleSelector\n"})})]}),"\n",(0,o.jsx)(n.h2,{id:"machineconfigref-spec-reference",children:"machineConfigRef Spec Reference"}),"\n",(0,o.jsxs)(n.p,{children:["A ",(0,o.jsx)(n.code,{children:"machineConfigRef"})," is a generic k8s ",(0,o.jsx)(n.code,{children:"ObjectReference"})," which usually contain a\n",(0,o.jsx)(n.code,{children:"kind"})," ",(0,o.jsx)(n.code,{children:"name"})," and ",(0,o.jsx)(n.code,{children:"apiVersion"})," to point to a different object."]}),"\n",(0,o.jsxs)(n.p,{children:["In Elemental, we set this to a ",(0,o.jsx)(n.a,{href:"/next/machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate"}),".\nThis allows us to point to more than one object by using the selector."]}),"\n",(0,o.jsx)(n.h3,{id:"example",children:"Example"}),"\n",(0,o.jsxs)(n.p,{children:["The example below creates a cluster that uses 2 different ",(0,o.jsx)(n.code,{children:"machinePool"}),"'s to set different nodes to control-plane and workers nodes,\nbased on 2 different ",(0,o.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," that select their nodes based on a ",(0,o.jsx)(n.code,{children:"MachineInventory"})," label (location):"]}),"\n",(0,o.jsxs)(n.admonition,{title:"warning",type:"warning",children:[(0,o.jsx)(n.p,{children:"The labels for the example are manual set labels, they are not set by Elemental automatically.."}),(0,o.jsxs)(n.p,{children:["For automatic labels generated by Elemental please check the ",(0,o.jsx)(n.a,{href:"/next/smbios",children:"SMBIOS"})," page."]})]}),"\n",(0,o.jsx)(t,{language:"yaml",title:"Example of a cluster with more than one machinePool",showLineNumbers:!0,children:r.Z})]})}function m(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}function p(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},2070:(e,n,t)=>{t.d(n,{Z:()=>o});const o="kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: cluster-machinepools\n namespace: fleet-default\nspec:\n rkeConfig:\n machinePools:\n - name: controlPlanePool\n controlPlaneRole: true\n etcdRole: true\n workerRole: false\n quantity: 3\n unhealthyNodeTimeout: 0s\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: selectorControlPlanes\n - name: workersPool\n controlPlaneRole: false\n etcdRole: false\n workerRole: true\n quantity: 1\n unhealthyNodeTimeout: 0s\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: selectorWorkers\n kubernetesVersion: v1.23.7+k3s1\n---\napiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: selectorControlPlanes\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n matchLabels:\n location: server-room-1\n---\napiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: selectorWorkers\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n matchLabels:\n location: server-room-2"},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>i});var o=t(7294);const l={},r=o.createContext(l);function i(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a555a233.3b00468c.js b/assets/js/a555a233.3b00468c.js deleted file mode 100644 index 59526827b..000000000 --- a/assets/js/a555a233.3b00468c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8632],{9650:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var s=n(5893),r=n(1151);const o={sidebar_label:"Release Notes",title:""},l="Release Notes",a={id:"release-notes",title:"",description:"The Elemental project stack is made of various components such as the Operator and UI for example.",source:"@site/docs/release-notes.md",sourceDirName:".",slug:"/release-notes",permalink:"/next/release-notes",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Release Notes",title:""},sidebar:"docs",previous:{title:"Reset",permalink:"/next/troubleshooting-reset"}},i={},c=[];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"release-notes",children:"Release Notes"}),"\n",(0,s.jsxs)(t.p,{children:["The Elemental project stack is made of various components such as the ",(0,s.jsx)(t.code,{children:"Operator"})," and ",(0,s.jsx)(t.code,{children:"UI"})," for example."]}),"\n",(0,s.jsx)(t.p,{children:"Each of these components have an independent development lifecycle with its own versioning. Once a new version is ready, meaning it fully integrates with the others components of the Elemental project stack, a release is made."}),"\n",(0,s.jsx)(t.p,{children:"Here's the different components, their latest version and a link to the respective release notes on GitHub:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Name"}),(0,s.jsx)(t.th,{children:"Version"}),(0,s.jsx)(t.th,{children:"Release Notes"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-operator/",children:"Elemental Operator"})}),(0,s.jsx)(t.td,{children:"v1.3.4"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-operator/releases/tag/v1.3.4",children:"Link"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-toolkit/",children:"Elemental Toolkit"})}),(0,s.jsx)(t.td,{children:"v0.11.1"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-toolkit/releases/tag/v0.11.1",children:"Link"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental",children:"Elemental Linux"})}),(0,s.jsx)(t.td,{children:"v1.2.2"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental/releases/tag/v1.2.2",children:"Link"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-ui",children:"Elemental UI"})}),(0,s.jsx)(t.td,{children:"v1.2.0"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-ui/releases/tag/elemental-1.2.0",children:"Link"})})]})]})]}),"\n",(0,s.jsx)(t.admonition,{title:"Information on docs versioning",type:"note",children:(0,s.jsxs)(t.p,{children:["The docs versioning is based on the ",(0,s.jsx)(t.code,{children:"Elemental Operator"}),' component as it\'s the user "entrypoint" to the Elemental project stack.']})})]})}function d(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>l});var s=n(7294);const r={},o=s.createContext(r);function l(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a555a233.d5bb2818.js b/assets/js/a555a233.d5bb2818.js new file mode 100644 index 000000000..1cdebd5ad --- /dev/null +++ b/assets/js/a555a233.d5bb2818.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8632],{9650:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var s=n(5893),r=n(1151);const o={sidebar_label:"Release Notes",title:""},l="Release Notes",a={id:"release-notes",title:"",description:"The Elemental project stack is made of various components such as the Operator and UI for example.",source:"@site/docs/release-notes.md",sourceDirName:".",slug:"/release-notes",permalink:"/next/release-notes",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Release Notes",title:""},sidebar:"docs",previous:{title:"Reset",permalink:"/next/troubleshooting-reset"}},i={},c=[];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.a)(),...e.components},{Head:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n,{children:(0,s.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/release-notes"})}),"\n",(0,s.jsx)(t.h1,{id:"release-notes",children:"Release Notes"}),"\n",(0,s.jsxs)(t.p,{children:["The Elemental project stack is made of various components such as the ",(0,s.jsx)(t.code,{children:"Operator"})," and ",(0,s.jsx)(t.code,{children:"UI"})," for example."]}),"\n",(0,s.jsx)(t.p,{children:"Each of these components have an independent development lifecycle with its own versioning. Once a new version is ready, meaning it fully integrates with the others components of the Elemental project stack, a release is made."}),"\n",(0,s.jsx)(t.p,{children:"Here's the different components, their latest version and a link to the respective release notes on GitHub:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Name"}),(0,s.jsx)(t.th,{children:"Version"}),(0,s.jsx)(t.th,{children:"Release Notes"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-operator/",children:"Elemental Operator"})}),(0,s.jsx)(t.td,{children:"v1.3.4"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-operator/releases/tag/v1.3.4",children:"Link"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-toolkit/",children:"Elemental Toolkit"})}),(0,s.jsx)(t.td,{children:"v0.11.1"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-toolkit/releases/tag/v0.11.1",children:"Link"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental",children:"Elemental Linux"})}),(0,s.jsx)(t.td,{children:"v1.2.2"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental/releases/tag/v1.2.2",children:"Link"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-ui",children:"Elemental UI"})}),(0,s.jsx)(t.td,{children:"v1.2.0"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-ui/releases/tag/elemental-1.2.0",children:"Link"})})]})]})]}),"\n",(0,s.jsx)(t.admonition,{title:"Information on docs versioning",type:"note",children:(0,s.jsxs)(t.p,{children:["The docs versioning is based on the ",(0,s.jsx)(t.code,{children:"Elemental Operator"}),' component as it\'s the user "entrypoint" to the Elemental project stack.']})})]})}function d(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>l});var s=n(7294);const r={},o=s.createContext(r);function l(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a584eeb7.52a1567f.js b/assets/js/a584eeb7.52a1567f.js deleted file mode 100644 index a16c44488..000000000 --- a/assets/js/a584eeb7.52a1567f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6844],{4595:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var r=t(5893),s=t(1151);const a={sidebar_label:"Rancher upgrades",title:""},o="Troubleshooting Rancher upgrades",i={id:"troubleshooting-rancher-upgrades",title:"",description:"Upgrading to Rancher v2.7.2 will fail if Elemental clusters are defined. The rancher pod gets stuck in a crash loop (see https://github.com/rancher/rancher/issues/41145).",source:"@site/docs/troubleshooting-rancher-upgrades.md",sourceDirName:".",slug:"/troubleshooting-rancher-upgrades",permalink:"/next/troubleshooting-rancher-upgrades",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Rancher upgrades",title:""},sidebar:"docs",previous:{title:"Air-Gapped Installation",permalink:"/next/airgap"},next:{title:"Restore",permalink:"/next/troubleshooting-restore"}},c={},l=[];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"troubleshooting-rancher-upgrades",children:"Troubleshooting Rancher upgrades"}),"\n",(0,r.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,r.jsxs)(n.p,{children:["Upgrading to Rancher v2.7.2 will fail if Elemental clusters are defined. The rancher pod gets stuck in a crash loop (see ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/rancher/issues/41145",children:"https://github.com/rancher/rancher/issues/41145"}),")."]})}),"\n",(0,r.jsx)(n.p,{children:"Note that the issue is present only if at least one Elemental cluster is defined."}),"\n",(0,r.jsxs)(n.p,{children:["To workaround the issue create an empty ",(0,r.jsx)(n.code,{children:"dynamicschemas.management.cattle.io"})," resource named ",(0,r.jsx)(n.code,{children:"machineinventoryselectortemplate"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f - <{t.d(n,{Z:()=>i,a:()=>o});var r=t(7294);const s={},a=r.createContext(s);function o(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a584eeb7.f6572b3a.js b/assets/js/a584eeb7.f6572b3a.js new file mode 100644 index 000000000..5b1ea5eaf --- /dev/null +++ b/assets/js/a584eeb7.f6572b3a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6844],{4595:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>l});var r=t(5893),a=t(1151);const s={sidebar_label:"Rancher upgrades",title:""},o="Troubleshooting Rancher upgrades",i={id:"troubleshooting-rancher-upgrades",title:"",description:"Upgrading to Rancher v2.7.2 will fail if Elemental clusters are defined. The rancher pod gets stuck in a crash loop (see https://github.com/rancher/rancher/issues/41145).",source:"@site/docs/troubleshooting-rancher-upgrades.md",sourceDirName:".",slug:"/troubleshooting-rancher-upgrades",permalink:"/next/troubleshooting-rancher-upgrades",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Rancher upgrades",title:""},sidebar:"docs",previous:{title:"Air-Gapped Installation",permalink:"/next/airgap"},next:{title:"Restore",permalink:"/next/troubleshooting-restore"}},c={},l=[];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",p:"p",pre:"pre",...(0,a.a)(),...e.components},{Head:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t,{children:(0,r.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/troubleshooting-rancher-upgrades"})}),"\n",(0,r.jsx)(n.h1,{id:"troubleshooting-rancher-upgrades",children:"Troubleshooting Rancher upgrades"}),"\n",(0,r.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,r.jsxs)(n.p,{children:["Upgrading to Rancher v2.7.2 will fail if Elemental clusters are defined. The rancher pod gets stuck in a crash loop (see ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/rancher/issues/41145",children:"https://github.com/rancher/rancher/issues/41145"}),")."]})}),"\n",(0,r.jsx)(n.p,{children:"Note that the issue is present only if at least one Elemental cluster is defined."}),"\n",(0,r.jsxs)(n.p,{children:["To workaround the issue create an empty ",(0,r.jsx)(n.code,{children:"dynamicschemas.management.cattle.io"})," resource named ",(0,r.jsx)(n.code,{children:"machineinventoryselectortemplate"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f - <{t.d(n,{Z:()=>i,a:()=>o});var r=t(7294);const a={},s=r.createContext(a);function o(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/aa481173.b7eff4da.js b/assets/js/aa481173.b7eff4da.js deleted file mode 100644 index 1641943b5..000000000 --- a/assets/js/aa481173.b7eff4da.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7139],{9527:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var a=n(5893),i=n(1151);const r={sidebar_label:"How to use Elemental with Rancher and VMware",title:""},s="How to use Elemental with Rancher and VMware",l={id:"rancher-vmware",title:"",description:"Excerpt",source:"@site/versioned_docs/version-1.2/rancher-vmware.md",sourceDirName:".",slug:"/rancher-vmware",permalink:"/1.2/rancher-vmware",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"How to use Elemental with Rancher and VMware",title:""},sidebar:"docs",previous:{title:"Elemental behind proxy",permalink:"/1.2/elemental_behind_proxy"},next:{title:"Include cloud-config from removable devices",permalink:"/1.2/removable-device-cloudconfig"}},o={},c=[{value:"Excerpt",id:"excerpt",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"Part 1: Rancher Configuration",id:"part-1-rancher-configuration",level:2},{value:"1.1 Enable the extensions under Rancher configurations menu",id:"11-enable-the-extensions-under-rancher-configurations-menu",level:3},{value:"1.2 Install Elemental Plugin",id:"12-install-elemental-plugin",level:3},{value:"1.3 Install the elemental operator in Rancher cluster",id:"13-install-the-elemental-operator-in-rancher-cluster",level:3},{value:"Part 2: Create the Machine Registration Endpoint",id:"part-2-create-the-machine-registration-endpoint",level:2},{value:"Part 3: Create the ISO",id:"part-3-create-the-iso",level:2},{value:"Part 4: Boot the target device",id:"part-4-boot-the-target-device",level:2},{value:"4.1 Prepare the VM to emulate TPM",id:"41-prepare-the-vm-to-emulate-tpm",level:3},{value:"4.2 Boot the VM with the elemental ISO",id:"42-boot-the-vm-with-the-elemental-iso",level:3},{value:"Part 5: Create a cluster on the machine",id:"part-5-create-a-cluster-on-the-machine",level:2}];function d(e){const t={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h1,{id:"how-to-use-elemental-with-rancher-and-vmware",children:"How to use Elemental with Rancher and VMware"}),"\n",(0,a.jsx)(t.h2,{id:"excerpt",children:"Excerpt"}),"\n",(0,a.jsx)(t.p,{children:"In this document we will see how we can enable elemental support in Rancher and then build iso and test it on a vm in VMware mimicking it for an edge device."}),"\n",(0,a.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsx)(t.li,{children:"Rancher 2.7 or higher installed and running."}),"\n",(0,a.jsx)(t.li,{children:"One Linux machine with docker installed."}),"\n"]}),"\n",(0,a.jsx)(t.h2,{id:"part-1-rancher-configuration",children:"Part 1: Rancher Configuration"}),"\n",(0,a.jsx)(t.h3,{id:"11-enable-the-extensions-under-rancher-configurations-menu",children:"1.1 Enable the extensions under Rancher configurations menu"}),"\n",(0,a.jsx)(t.p,{children:"Click on extensions under the configuration menu and enable it by hitting enable."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Enable extensions in Rancher",src:n(1389).Z+"",width:"323",height:"193"})}),"\n",(0,a.jsx)(t.p,{children:"Once you click on enable a dialogue box will pop up asking for confirmation and it will also notify you that the rancher extensions repository will be enabled, make sure it is checked and then confirm."}),"\n",(0,a.jsx)(t.h3,{id:"12-install-elemental-plugin",children:"1.2 Install Elemental Plugin"}),"\n",(0,a.jsx)(t.p,{children:"After the extensions are enabled under the available tab you should see elemental plugin available for installation."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental extension enabled",src:n(3391).Z+"",width:"770",height:"367"})}),"\n",(0,a.jsx)(t.p,{children:"Click on Install, this will again ask for a confirmation. Click on Install again to continue. Once the installation is finished it will ask to reload the tab. Reload it by hitting reload, post reloading you should see the elemental plugin under the installed tab."}),"\n",(0,a.jsx)(t.h3,{id:"13-install-the-elemental-operator-in-rancher-cluster",children:"1.3 Install the elemental operator in Rancher cluster"}),"\n",(0,a.jsx)(t.p,{children:"The next step is to install the elemental operator in Rancher Cluster. For that connect to the Rancher K8S cluster and enter the below command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental operator install",src:n(8883).Z+"",width:"2100",height:"527"})}),"\n",(0,a.jsx)(t.p,{children:"Once the command is successful validate whether the the pod is running before continuing"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl get pods -n cattle-elemental-system\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental operator pod",src:n(3202).Z+"",width:"817",height:"120"})}),"\n",(0,a.jsx)(t.p,{children:'This will enable the "OS Management" sub menu under the "Global Apps" menu.'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"OS Management menu",src:n(8585).Z+"",width:"433",height:"272"})}),"\n",(0,a.jsx)(t.p,{children:"The OS Management dashboard at this point should have nothing in it."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"OS Management dashboard",src:n(8293).Z+"",width:"2546",height:"913"})}),"\n",(0,a.jsx)(t.p,{children:"At this point we are ready to proceed with the next step, that is to prepare the ISO."}),"\n",(0,a.jsx)(t.h2,{id:"part-2-create-the-machine-registration-endpoint",children:"Part 2: Create the Machine Registration Endpoint"}),"\n",(0,a.jsx)(t.p,{children:"In the OS Management dashboard hit the create registration endpoint button."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"OS Management registration endpoints",src:n(4398).Z+"",width:"757",height:"404"})}),"\n",(0,a.jsx)(t.p,{children:"Now here either you can enter each detail in its respective places or you can edit this as yaml and create the endpoint in one go. Here we will edit this as yaml."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: elemental-cls1\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n registration:\n emulate-tpm: true\n emulated-tpm-seed: 1\n machineName:\n machineInventoryLabels:\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'})}),"\n",(0,a.jsx)(t.p,{children:"Remove the existing content and enter this code snippet and click on save. Remember to modify this as per your need."}),"\n",(0,a.jsxs)(t.admonition,{title:"main options",type:"info",children:[(0,a.jsx)(t.p,{children:'name: elemental-cls1 --\x3e "Change this as per your need"'}),(0,a.jsx)(t.p,{children:'device: /dev/sda --\x3e Make sure your target device is "sda" otherwise find out and change the naming convention here, for example in raspberry pi it could be "mmblk---"'}),(0,a.jsx)(t.p,{children:"emulate-tpm: true --\x3e Use this only if your target device doesnt have a tpm device and you have a way of emulating tpm like in VMware or KVM"}),(0,a.jsx)(t.p,{children:"emulated-tpm-seed: 1 --\x3e increase this by 1 for every new machine. --\x3e If this is not given each machine will recieve the same tpm hash so at any point in time regardless of how many machines you boot it wont show up under the machine inventory."})]}),"\n",(0,a.jsx)(t.admonition,{title:"attention",type:"danger",children:(0,a.jsx)(t.p,{children:"Emulate TPM is only for non-production usage like for testing as it beats the purpose of security. So in production usage use the code above without the emulate-tpm and emulate-tpm-seed"})}),"\n",(0,a.jsx)(t.p,{children:"Once you create the machine registration end point it should show up as active."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Machine registered in Registration Endpoints",src:n(5582).Z+"",width:"559",height:"464"})}),"\n",(0,a.jsx)(t.p,{children:"Next click on it to view the registration url and download the initial-registration yaml."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Initial registration URL",src:n(4842).Z+"",width:"1454",height:"611"})}),"\n",(0,a.jsx)(t.p,{children:'Hit the download button, this will download the "initial-registration.yaml" file on to your local system.'}),"\n",(0,a.jsx)(t.p,{children:"The registration yaml looks something like this:"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Example of initial registration YAML",src:n(5362).Z+"",width:"947",height:"384"})}),"\n",(0,a.jsx)(t.p,{children:"We will use this file and inject its content into our vanilla elemental iso."}),"\n",(0,a.jsx)(t.h2,{id:"part-3-create-the-iso",children:"Part 3: Create the ISO"}),"\n",(0,a.jsx)(t.p,{children:"Make sure you have initial-registration.yaml in the system where you will create the iso in this we will use a Linux vm."}),"\n",(0,a.jsx)(t.p,{children:"Create a directory to keep everything:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"mkdir /home/tux/elemental-demo && cd /home/tux/elemental-demo\n"})}),"\n",(0,a.jsx)(t.p,{children:"Create a file and copy the contents of the initial-registration.yaml in it."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"vim initial-registration.yaml\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create file with initial registration YAML",src:n(1158).Z+"",width:"1105",height:"441"})}),"\n",(0,a.jsx)(t.p,{children:"Next download the script to download the iso and inject the registration.yaml in the iso and make it executable"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://raw.githubusercontent.com/rancher/elemental/main/.github/elemental-iso-add-registration && chmod +x elemental-iso-add-registration\n"})}),"\n",(0,a.jsx)(t.p,{children:"Next execute the script and pass the initial-registration.yaml as an argument"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"./elemental-iso-add-registration initial-registration.yaml\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create ISO with the initial registration options",src:n(247).Z+"",width:"1654",height:"1206"})}),"\n",(0,a.jsx)(t.p,{children:"This command will download the vanilla iso and inject it with the parameters of initial-registration.yaml and create a final iso for you to boot your end device."}),"\n",(0,a.jsxs)(t.admonition,{type:"note",children:[(0,a.jsx)(t.p,{children:"If you would like to download the vanilla ISO and reuse it later to create additional ISO's, then you can download the iso separately using the below command and then pass the local file path as an argument to the script"}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable:/Teal53/media/iso/elemental-teal.x86_64.iso \n\n./elemental-iso-add-registration initial-registration.yaml /home/elemental-iso/elemental-teal.x86_64.iso\n"})})]}),"\n",(0,a.jsx)(t.h2,{id:"part-4-boot-the-target-device",children:"Part 4: Boot the target device"}),"\n",(0,a.jsx)(t.p,{children:"Now ideally you would just burn the iso to a usb drive and boot your edge device using the usb device and once it boots and become active in Rancher under machine inventory you can select and create a cluster from it, however here we will use a vm to mimic an edge device for testing."}),"\n",(0,a.jsx)(t.h3,{id:"41-prepare-the-vm-to-emulate-tpm",children:"4.1 Prepare the VM to emulate TPM"}),"\n",(0,a.jsx)(t.p,{children:"In VMware workstation create a vm the way you would do normally, make sure to give the HDD size at least 40 GB."}),"\n",(0,a.jsx)(t.p,{children:'Now edit the machine settings and go to the "Options" tab. The very last option would be "Advanced".'}),"\n",(0,a.jsx)(t.p,{children:'Click on "advanced" and on the right window pane change the firmware type from "BIOS" to "UEFI" and check the "Enable secure boot" option as follow:'}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Default settings with BIOS selected"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"VM boot options with BIOS",src:n(5655).Z+"",width:"709",height:"218"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Updated settings with UEFI selected and secure boot enabled"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"VM boot options with UEFI",src:n(6088).Z+"",width:"684",height:"208"})}),"\n",(0,a.jsx)(t.p,{children:'Now on the same "Options" tab click on the "Access Control" option and click on "Encrypt" on the right side.'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Access control menu",src:n(4592).Z+"",width:"242",height:"28"})}),"\n",(0,a.jsx)(t.p,{children:'This will ask you to enter a password to encrypt the machine. Enter a password and click on "Encrypt"'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Access control encryption credentials",src:n(2426).Z+"",width:"352",height:"431"})}),"\n",(0,a.jsx)(t.p,{children:'This is important to add the TPM Hardware. Next go back to the Hardware options and click on "Add"'}),"\n",(0,a.jsx)(t.p,{children:'And add the TPM (Trusted Platform Module) hardware and click on "Finish"'}),"\n",(0,a.jsx)(t.p,{children:"Now with the completion of this step our VM is ready."}),"\n",(0,a.jsx)(t.h3,{id:"42-boot-the-vm-with-the-elemental-iso",children:"4.2 Boot the VM with the elemental ISO"}),"\n",(0,a.jsx)(t.p,{children:"Next add the ISO that we created earlier in the VM and boot it up."}),"\n",(0,a.jsx)(t.p,{children:"It should boot up with the ISO and start installing Elemental:"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental OS install grub menu",src:n(2689).Z+"",width:"677",height:"451"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental OS install logs",src:n(4977).Z+"",width:"1052",height:"281"})}),"\n",(0,a.jsx)(t.p,{children:"And once it is complete it will reboot the VM and it should show up as active under the machine inventory in Rancher as follow:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Machine inventory status while booting"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Machine inventory status during boot",src:n(8951).Z+"",width:"612",height:"159"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Machine inventory status after boot completed"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Machine inventory status after boot complete",src:n(4604).Z+"",width:"622",height:"112"})}),"\n",(0,a.jsx)(t.h2,{id:"part-5-create-a-cluster-on-the-machine",children:"Part 5: Create a cluster on the machine"}),"\n",(0,a.jsx)(t.p,{children:'Once the machine shows up as active, select it and hit "Create Elemental Cluster".'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create Elemental cluster",src:n(7966).Z+"",width:"811",height:"398"})}),"\n",(0,a.jsx)(t.p,{children:"At this stage you get a pretty familiar page of creating a cluster in Rancher."}),"\n",(0,a.jsx)(t.p,{children:'Give the cluster a name select the Kubernetes version and hit "Create".'}),"\n",(0,a.jsx)(t.p,{children:"For this we have selected to create a K3S cluster."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental cluster configuration",src:n(5067).Z+"",width:"2294",height:"1224"})}),"\n",(0,a.jsx)(t.p,{children:"Now under the Cluster Management page the cluster should show up as creating:"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental cluster provisioning",src:n(985).Z+"",width:"793",height:"279"})}),"\n",(0,a.jsx)(t.p,{children:'And once the cluster is fully provisioned it should be active with provider type as "Elemental".'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental cluster created",src:n(4957).Z+"",width:"2279",height:"242"})}),"\n",(0,a.jsx)(t.p,{children:"Now you can start deploying application on this cluster the normal way."})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},2426:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-access-control-encrypt-60a89768dd80961e42f48b1717f607cb.png"},4592:(e,t,n)=>{n.d(t,{Z:()=>a});const a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPIAAAAcCAIAAADURHUBAAAGgklEQVR4nO2bQWwaRxSG/21SUCwtlaotXZWTLUhpiOEMPtmqrAIXR5Ecu4rk9rI0J7Aqt6VKpCiKiqo0Ak6tuSStrJpEiuKLQXId+2SqqifcotIuik9IGG8ii5XsQGzRA+yyu2CDE7Ax2e/E23lv5s2bp5k3C+BWIFQ+gE8mmdab2KAd9iArCvYgywbtYGKy1hgD4ZGgyVSNKjYVVZmKtLFOv9Zh1U4c2l7Tg2Bb7bnaeoCtYkSVU8hZtAmjL8HCYSKmK6I9yBqNxl+CDhNBALAzjB0AnLOs8KiilPgQ01Uje5BNGAH4bjCEi4jYg2zCZwSATMhhmv4dMBH/xMpjcn0jah0ysbITmX8r3twYJCp6wtCAUeiZYYCP5M5IbFVOP8StQOjGN96Gbc5PPYdYxn+d7YxLKiqvy2G7tZq4KqeUt07aARWV9qOmtUoP0oYrI+FPv34nKiptpHFam67dO9yM/fHzDjijotIeDtytD0ncpkmvonKyvEptrW7VKl1Ok9r6Da1GaIqdxFSQS5y0I73D8Ya0+ZXxKNWIJjQ94AU3dAze2wzlCbL6OZUl5viWrE5hvrIBM1afmpZKwKH+n9TUujKkbX3BR+vc4OMgx+l29lqPY7S/PAGPP03404Q/7YGO6eyAJ0qeZy2GUIdD2mMc/QXf+vKj7LsgiMsfPFNs5A4riVR2QT8wY9X4ciUAABkLGJwAgHg07UrKxU2K9VJGACiGwxu+HByj/WvDWgDIc0NBDnJR2A804xaEw9mIMG5kLgsAtNgb7/FnIzTFTmJxi/JaxNE1oUnKqMdagMqkeLxXXNyivBZBWWp75KB0lOLtFax9TPqkJ5LSYcnUxK1dplYMhzd8qI8JZGu0ypksEMKydWF64PyKqEP9F+XdI1oWpFMvmsvHXdcpFlTiAJDnOh+rKkdM6/L+4039ZacVwOPf1i+V90GcEdo04xYszpci7/OzIzrHEpeAJjRtQDRNJKsKcpGMBbR3/OkIKgcZ9XAePw+XPP6NCMBcNVykqRmpCFTTmta59aU7OYVnZMxLsdG0KQnHaP/aVTKyDOip8ytpYg6wGcojlCPJ+eY5d+XEpCnWK7Q2tO0qklnPoDlmS7s2K3Kdw3N8bWo1MzLmVUa4LiaFcemi0BQ7LIYFWOHLgySSPGw6Z4pzbWrdes1/4bQrVykCDUwyKxm3bkGDxeuCn5Va5dg4YloXnl0qPQGsAC6VnqBA4x19tYnWucFP5YBcIT5BjdNcAjo3uKkkJApSUWsCORswC7874S/mCiyo2YAB/mxkLguQYzJRQr74t8IxWmvKVztPrPMZr45ZLiLP3a4Mt1nM1M9FbG1o22VElrmZScoxD6CRw+AbnDD1EUZdTBSLAklYACQL8QkdAx6DZPyvLKBFnn+YE5uoC9LSqH44GqKfx8zR0vr7u/f3SsW3//wBwMsXu2f/uP/1ra8qTQ4radRr1wJURTRZNb71Zt3llZfLiD8NkLGAeRa8x591ycXqyuWKrJ4ap7mEcsPuaXLcVKr/urW1m7GIIsI0NXM0e34hZRizkbDwC3NA0/r+dYdrGwdeGRu+2tstbL98sbuz/Xxn+/nLF7u7hW2xadyijUerdzgiyhstOkeusAjquk3QUIpFVi8RAdBUbFQD8C7/03Bec8EmF2sx5W+vwus1iNdE5qqBkfTmsJLGVOHA+livvah40rrtiZJY4jBMGXGww4qp1Ue4HsWi1BFZ5kwTBtPqljImNp1T3Lkr49YPlyuy+ur7A4eVNLYwx3bReLd+hbfRsrMsWa1DfPMc6zWXJ4DKDUMhhmsi8txQsAjvQHkYADKrT01JbSwgESV7c2JpYwj9a+J5l8oS4CO13niPnwetbeBljruTMs8GzDMpHhArDd7Viu3Jw7uifHkEDRyGZGq1KyOvjPB8fZ8l2Rqt1t3qcoXFPIl14Q6qp4QDmff4uYRiXOWCcq6oruw1e4FMim9QB3aMw/5GAMB07Z40xW/6vlUo3Ax9p/7UqZexGcojxWpp0ZWvqBvSvLYWq5He/EJR5VCYQTK+ku3+PFbQZLduqQt1t1bpMtS/Eaj0IA2KkPsPFh4tLu3t7Tc3Pnvmsnu0HBjrgGMqKq9Og7R+tLj04Ke7fX3nmhrv7Oxe+eLLz66oaa3SXTQoQvb29lvJaQB9feda2dRVVI4ZtbZW6UHe1LTOhByO0HF+QfBGEPcQBEEQhCcu/3zs/A8CtQt0OqppGQAAAABJRU5ErkJggg=="},7966:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-create-8d06bbcd84075d084212bc3d049dfbbc.png"},4957:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-created-39460fab3f9c3863673be51507d2d22d.png"},985:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-provisioning-b1a441f0c9dd8db3af090c57bf8b216c.png"},5067:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-template-71f1e521ea8047e899ec3b0f9e48225b.png"},2689:(e,t,n)=>{n.d(t,{Z:()=>a});const a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqUAAAHDCAIAAACS//S/AAAT3klEQVR4nO3dXbqjqBoGULufHmyGlOGei3R7LBUERcXPta5SlhsQ0de/mGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA4/66uwHQke/3O37+fD7jlN/n6T9T0/eVP1VS73L+F5p1RUk/jH8ym3m5XiCev+9uAPRizNRlEi9TtlX5Y7qs1rtUO//tvt/vGS2cdmZhP0w7fLlyp0VBSPIehmEtfVdnOK98qtRm87T/p5FfeGEGAvjn7gZAp87OgJdkzEsWE/on7+GNlhe3Z88KjGbzLG+BZ+6jr94vry0faML1fNh2wZ3y8T53Yc7Vzl/ejGHtvvj4eTY9fx89dVukvPyqNpfPvJw4KqwUHsf5PfwhFVerz8Y3LD81JWUMxV9GHm9YlVSN17ekyUHP9FrFLf0JF5D38IezT+UzX8PrJ2zKF39s9nTKOY1asSPse+heuIW8h1KtTvH7tztBrzxk8Wg9VHH/HnrxiO/Td0LYQy15D8Nw32X8u0xv/w/p4Nx8hK2fZ9xmzVi9y+A797yZ9+nC/6USYvbds9XwLsmPzPt0Vx9WX5bf9n26q8m3WW/J/Mv/2vz+XuYrgqmWzyyrTjV18/uBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENdf11f5/X6vrxQAHu3z+Rz5839ataPWwXYDwEs0OU/++3gRAEDn5D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQ323v2xl53R4ALLV9MZ3zewCIT94DQHz3X89PWb2OMV78H//3+tsBn8+nvNLydi6X9+CiNWnnjf0MQEP9nt+PAfP9fpdhc1f81N5NKW/ndDFXF7lKq3aKeYAY+s37GcEDALs9Ju8HkQ8Ae3Vx//538fn7/Y4fljOUhP3sIvbvT6Z3oGflZ+YfZ16WM51nWU7zg5JUe/Ltv76dAPSsi/P7WdDO/rfwVvT45+PN79Qf/qan5h8/L6en7q+XVLpbqj2Z9t/STgB6dv/5/Sx4lqk/PbVtWFEwztcByLg/75dX3VPzlEiF+u+gYXno8Nwjid+yVF2ij33EA0DG/Xk//HmLuupb40u1f3v8tHh2F+BgaVWmjd/suhvbCcDtusj76f3mzGwHDwUA4LW6eF6vRO0p6exa9+3zN1fYgNvbCUAP+s37MaVWE2v6v78P45Xqcf78xYDa+Wd/NX6elpP6RtxQcLwyXcySkM63v1U7y9sPQM/+ur7Kkgf0AODllie0R0rr9/weAGhF3gNAfPIeAOK7//t4HgQDgLM5vweA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+P65q+Lv93tX1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwLq/7m7A6b7f7zAMn89n9Z9tK5oW+6vopLrOcFKDb++H2Xq5rNLfh+NVH2x/q5Zcth5vWV/lrunP47VsllDbz7dvyBz3990NCGLcGEaP2ypOavC9/bBcL9dotdTH27/Zku/3W1LLNevxgvVVuLwp1/Rn5n+blL+jBx63Q2NJ3gNAfP/c3QBKdXKdc/XMoLxh591PYZ+3rYuzl/fp5RPYq/N+Fl2ze/zL6ZuFrIbZ8r5XVfnTPymM/Gn5ywcXVu/DXXPde/VZillTM89btFovtf3fZJzUlrM5rlYLzzynkl/vmcGwOZ7zTZqVkxqHqeXNz1/7XM6O5d1XVGpi4XrZXelm+fu2i7vui9HWe6/nj2P9Z5ySmp4yzjb7PJtnd/k7rBY+/nP5X1Xn3MvZqvaPyx10YT+0Wi+t6j27nJJxVWvZzmWxJct1ZHlT4zC1vJlxu8O+5c2XVt6fqQ2tvN7j5e/YLlyTC+PV5/dT543m4yXPDsnbNvXKjblhLXftfc6ut7dxmAqPu/TT/61a0s8SrRL2kbw373+Hw6lj87OvX51a/tmN/yRuCmxaHqxUnUtl1td52o6TC66LNj8iPKL/68B3jas+9b++OOK9eT8sdtzTHWU/B93LLTC/Q8/c8L7XuGOdNr6qnzPr61QNx8nbsuQRy3vXuOrQaxf8Jd57/54jfvsFe4feTJ8JAJh67/l91QO9tafjDefvNlN3NGz1FP9nsx8O3kfc/ecXj5Pa6UvTuy3Htbp9e/Z2tNvL708fH28v78Bnif8+3aH++1Sp6YW1zK6lzx6O3V1+uWnVy3o329O2STv6ofCB8H3rZUc5O8bJ6v3gfeOt/FGJsW9XO3nZ/1XtzJeTaU+q/FQ5qe1oWd2OcVu1XvIlnNqfJc+LHFxf5dtFvp/lPdDG7FkqWPWIcXJ2Ix/RCdzI/Xv65dSBEj2PExlPP15xPZ8HOftmBzE8aJxkbkk8onwAAAAAAMJzdxn64Xk9oCMOEeAk8Z/XO/XL5Vc6+zWfB8sv/5r4Se2Zzd+8PVUa1r6jHwqrbvv+iXwtp76x6uzt4veh/H0Pzx23Fwi/gD2Lf34/fdV5h2+VL3R2m4+X33brrW1Pb0d1DQ96Tqp6jNXZdpGavttYzhku2JZTjV+9DvH0cXuB8AvYs/h5DzxFz9+kh6d77/vzgd48KOkf1FT4eW/ez142Phx4z3mT97Gn2jOdOfOS7c1yShpTUv6mg/2ZaU9t+2vbU1LFZeXsWy9N7sv8rlT/ij37/TC7q2g4bnf0Z35QPXHcTqubtic1fVbO8scRVvc/q/35oFcnPV385/WG9O9zrH5eHdM7ppc0prBtq8XuK6ewVSUNyBdysN+aPOS1uqtqtb6OrKAj/VCy3mtXVuqfm4XscHBF50vbUf7u/iyfWNX+4aZxu6w0/7mkrtTnqh0dDb3o/D6/C6sdYan5exupvbXnem174Oz+bJh8x5sxPdF/m9uD565xu3lJY5/C/nznYLvMi/K+aiQtB/d4nXNWYGp6bfn7tCrnbcr7Lb9+a/v/Wet9dm2/od7GbW/tSTm7nb81Pj2Vz0xv0ph9+0/2eVHeV9m8BjDdD6am15bfqp1squq3zPptdVmo1tPXe2/t7609Kf20c3lNfrcd+0/28X084P9mJ1tAGPJ+w7j7S+0HD+4fa//8pGY0L6eVVv2ze/7CAs9ej2ev93Jta+xt3N5VTm/zX6bbhoUU//n81J2hzB2j2fhbPrRcOL2kSctyUs/Vj3+VrzezXIWtOmm5yqen2lNY+6wfUs8Jp+rNlFze/tW10KofCstZFjVzpD1HrrjW9n9haWeP29R/xRi3Y0XfyX362YfVR+tns622OXXZf99yAXAFJ2QAEJywBwAAAAAAAHgX94kB2vL9e4JwiACQ8aLv39d+rXP3F9n32d3OTIGP/iZr7fe8983/8+iOOknVgGw+endbPebb/J73jsFw1/b19O2aG8U/v9+3bYzh0eQF0SXabsOZBj/lPHjs/DNcv34fZ/dPDMxcPN6mP22wTPTPf4bJSt8xGO4aMIEH6lP2S48WP++POzV4aOLIS9+s38AKX0K3+weQ4EH8Pt7rhNyjhVyoGG5fNXf9hiFVdPsFXpT3J71ne/ai6SPl17Zz8/355S/hz7d/9n7szZYv27Nafq2z37Pdqv21N4P3rd/Cl5mn2pNfrlZXVveNt2V7dtc+PXH/XTH+TWkyCDP9vFlFbT+k6t38nHohf+F43lFOfjsaFv02rI2THeV4D/+m+M/rDdnNYLkbGrb2j5kyC8tv0s58+ZnqUhtbpt7axpf0T6ao2vL3FfWze/3uaHPJPIXrvfxzSV2pz00Wdsd4y5RW3pKf1R44XlF+oQqL3dEPhZ2Z/68jm/bu/d5mpYULXrggR8ZPYC86vy9Xu6eb/e0JLYqjVf8cKafn9VtefuoU/OCp+eaR4lTPo3163DOdOPz3aFhXje9nXPVZfq3e2tOJt+f9wZ3j7eXToQtW+ufP3yfNT2/Vngv2oW27LtXgz5/X9jv09P3G9e0f1+l0ysVt6N/b8/5th72cLXVj6C69tSfP9vLz9H64pf2z2xw9H8/dxffxgMh+Rzmzk7/N+SEeef+v8t1Bn+X3Vu/ZLFdsy37Y1zObfzK78lFbxV37jaeMk7Gd0ycnhhMuADylQ+71oufzR5vf30jdBFqdP3PHKFX+Ge3M1J5ahMLneA+2v+Edtdr2lJRzZP1ull/4YGDV+p0+qDwtPzU9057C9V6y4CVdenC8FebE6k5/s/yDa3m16vKVXrXfyNS7HA+ZEmqfz5+Vtq/9qeoy4yQzPTXOV1sFFHHsDK9l8w/D9XzW2cgBInnF9Xz2aXgpHngiOwEAAAAAAAAAAAAAAAAAAAAglvjv28m8zHzz/eSr04fiV3kDQCfe+D7d73+/jzkMw+c/wyLRZ9MB4LlelPdiG4DXekve/87UV3+H0Q/DABDeP3c34GbuwQPwBm85vweAN5P3/zp+Vd99AQC69d68H5+9H3M6f21/Or/n9gEAAAAAAAAAAAAAAAAAAKLp9/dwl99un33r/eCrcK8p53gtmyWM7wNoVeBBte05VWphyzvh7O66zNvGyanlHx9X15juRTtpEjd63vt2Wo3akh19yRt1St7Sc175O975c/ZO9rzCN6tOHSMulXdCjL3k28ZJpvwm78E8Pq42NXnj5/DnT37zcl3n/ThGDVaAciXvDOVt+v19vNlIvX7gnl2jTbEt/UmJp4yTp7STB+k37zctb5XNLn8VbjCrt9w2Jy4Pn6tu3R0vf7qws5kz/VB1hXC1nLGuwvbk55+1OX/7IzP/BfdNj4+3fH9O51n9gYZ8vat9Plw+TjILsq89mY0iU+9q+UNinJT088Hnb8rHeaqdqe1od5NGDizeo+vr+Zume4TlzaryfdZy/uU2MC0/tdGW13u8/Ok9uennTD9UXeJLlTN+Xk5fbU9q/rYu2GfN2l873jb7c3XKcv7aes8eJ1WN2deemWngLWdOlT9OWS0tU9R5gzZj2c5929F3Ypwy3Lpo3OjB5/etdvG9lXNS+Z3cz7u9AR36fD7jHrm2f5r3ZyfjZOmaWOpwwY+YHk59176wEGx5yXtw3q9yrPrTqh867M/V3dZdavvn7PlrNSn/gkHyOyT6TK5mX1Bvh4P/uOnB5TjlxvZwpWh5b+z+POWixdM1OR2f3pqdHc10ftFoyD5wcKqz671ruS4wXemp835Cevb9e95meg8bgHJh8352zSq81PK26ofacs7r/z7PRXb3z/Q8MnM22Wr9nj1Oap1dbz/jthObCxi+B96s3/fpDlvft5nuHFd3lPlgyJSzWfXyD6vKaVj+coZUOcvpQ3EXrZZT2J7MncJ97flkv6x4cHqm3uX8VeMtNf/qgMmP583p+S46b5zM6m3SnulKP1j+kFjvO/rzyHY9VA6Vwu0uX0imPatbZZ9H1XCD3k5KAnjhIvNCxjk3Cns9vzkZfx6nFLyBcc69ur6e35uqi8Adlt+V2ovh8ETGOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADzN/wCwXEkY4Glz7QAAAABJRU5ErkJggg=="},4977:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-install-logs-a0fe1cb2f06bd446319ea8755907dcba.png"},8883:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-operator-install-ead7a27570833aea52fc48bf864e7458.png"},3202:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-operator-pod-5cf9077cbdd41cc2ea98372e615773e3.png"},3391:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-extension-enabled-c4e29279c65407712c74245a906fe8f1.png"},1389:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-extensions-menu-3417b5f0744722377d8b9e1826abc4f8.png"},5362:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-initial-registration-url-yaml-2976a9c6180726ebb308057cb33ae38f.png"},4842:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-initial-registration-url-0c8db5dad180464052c36f376b17c8e3.png"},1158:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-initial-registration-yaml-61b7ae494fd22967d770b3124dd1da9b.png"},247:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-iso-create-94c20367fff7dd76b113c5f2e046fd69.png"},4604:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-machine-inventory-status-boot-complete-401945492ded59c3f4f94e8dc7ecc419.png"},8951:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-machine-inventory-status-booting-fba3e4b35fc4b52b43fa92dc00f14d28.png"},5582:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-machine-registered-fa33715b7ace60ba91c3ab12694be684.png"},8293:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-osmanagement-dashboard-5ec27221ddfdd9d63f846c6370847cbd.png"},8585:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-osmanagement-menu-18bc9bca56db4f66db675cb679e6ada9.png"},4398:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-registration-endpoints-040525e42e8fcfde1c35a85e44b1bc32.png"},5655:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-vm-boot-bios-28b0123c0fbaf64ff7fe1f5634b0f1ae.png"},6088:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-vm-boot-uefi-ca7f800f1c8469b9c1477f78b6ca22e5.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>s});var a=n(7294);const i={},r=a.createContext(i);function s(e){const t=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),a.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/aa481173.f471fe49.js b/assets/js/aa481173.f471fe49.js new file mode 100644 index 000000000..e1216fcfd --- /dev/null +++ b/assets/js/aa481173.f471fe49.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7139],{9527:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var a=n(5893),i=n(1151);const r={sidebar_label:"How to use Elemental with Rancher and VMware",title:""},s="How to use Elemental with Rancher and VMware",l={id:"rancher-vmware",title:"",description:"Excerpt",source:"@site/versioned_docs/version-1.2/rancher-vmware.md",sourceDirName:".",slug:"/rancher-vmware",permalink:"/1.2/rancher-vmware",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"How to use Elemental with Rancher and VMware",title:""},sidebar:"docs",previous:{title:"Elemental behind proxy",permalink:"/1.2/elemental_behind_proxy"},next:{title:"Include cloud-config from removable devices",permalink:"/1.2/removable-device-cloudconfig"}},o={},c=[{value:"Excerpt",id:"excerpt",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"Part 1: Rancher Configuration",id:"part-1-rancher-configuration",level:2},{value:"1.1 Enable the extensions under Rancher configurations menu",id:"11-enable-the-extensions-under-rancher-configurations-menu",level:3},{value:"1.2 Install Elemental Plugin",id:"12-install-elemental-plugin",level:3},{value:"1.3 Install the elemental operator in Rancher cluster",id:"13-install-the-elemental-operator-in-rancher-cluster",level:3},{value:"Part 2: Create the Machine Registration Endpoint",id:"part-2-create-the-machine-registration-endpoint",level:2},{value:"Part 3: Create the ISO",id:"part-3-create-the-iso",level:2},{value:"Part 4: Boot the target device",id:"part-4-boot-the-target-device",level:2},{value:"4.1 Prepare the VM to emulate TPM",id:"41-prepare-the-vm-to-emulate-tpm",level:3},{value:"4.2 Boot the VM with the elemental ISO",id:"42-boot-the-vm-with-the-elemental-iso",level:3},{value:"Part 5: Create a cluster on the machine",id:"part-5-create-a-cluster-on-the-machine",level:2}];function d(e){const t={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components},{Head:r}=t;return r||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(r,{children:(0,a.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/rancher-vmware"})}),"\n",(0,a.jsx)(t.h1,{id:"how-to-use-elemental-with-rancher-and-vmware",children:"How to use Elemental with Rancher and VMware"}),"\n",(0,a.jsx)(t.h2,{id:"excerpt",children:"Excerpt"}),"\n",(0,a.jsx)(t.p,{children:"In this document we will see how we can enable elemental support in Rancher and then build iso and test it on a vm in VMware mimicking it for an edge device."}),"\n",(0,a.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsx)(t.li,{children:"Rancher 2.7 or higher installed and running."}),"\n",(0,a.jsx)(t.li,{children:"One Linux machine with docker installed."}),"\n"]}),"\n",(0,a.jsx)(t.h2,{id:"part-1-rancher-configuration",children:"Part 1: Rancher Configuration"}),"\n",(0,a.jsx)(t.h3,{id:"11-enable-the-extensions-under-rancher-configurations-menu",children:"1.1 Enable the extensions under Rancher configurations menu"}),"\n",(0,a.jsx)(t.p,{children:"Click on extensions under the configuration menu and enable it by hitting enable."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Enable extensions in Rancher",src:n(1389).Z+"",width:"323",height:"193"})}),"\n",(0,a.jsx)(t.p,{children:"Once you click on enable a dialogue box will pop up asking for confirmation and it will also notify you that the rancher extensions repository will be enabled, make sure it is checked and then confirm."}),"\n",(0,a.jsx)(t.h3,{id:"12-install-elemental-plugin",children:"1.2 Install Elemental Plugin"}),"\n",(0,a.jsx)(t.p,{children:"After the extensions are enabled under the available tab you should see elemental plugin available for installation."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental extension enabled",src:n(3391).Z+"",width:"770",height:"367"})}),"\n",(0,a.jsx)(t.p,{children:"Click on Install, this will again ask for a confirmation. Click on Install again to continue. Once the installation is finished it will ask to reload the tab. Reload it by hitting reload, post reloading you should see the elemental plugin under the installed tab."}),"\n",(0,a.jsx)(t.h3,{id:"13-install-the-elemental-operator-in-rancher-cluster",children:"1.3 Install the elemental operator in Rancher cluster"}),"\n",(0,a.jsx)(t.p,{children:"The next step is to install the elemental operator in Rancher Cluster. For that connect to the Rancher K8S cluster and enter the below command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental operator install",src:n(8883).Z+"",width:"2100",height:"527"})}),"\n",(0,a.jsx)(t.p,{children:"Once the command is successful validate whether the the pod is running before continuing"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl get pods -n cattle-elemental-system\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental operator pod",src:n(3202).Z+"",width:"817",height:"120"})}),"\n",(0,a.jsx)(t.p,{children:'This will enable the "OS Management" sub menu under the "Global Apps" menu.'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"OS Management menu",src:n(8585).Z+"",width:"433",height:"272"})}),"\n",(0,a.jsx)(t.p,{children:"The OS Management dashboard at this point should have nothing in it."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"OS Management dashboard",src:n(8293).Z+"",width:"2546",height:"913"})}),"\n",(0,a.jsx)(t.p,{children:"At this point we are ready to proceed with the next step, that is to prepare the ISO."}),"\n",(0,a.jsx)(t.h2,{id:"part-2-create-the-machine-registration-endpoint",children:"Part 2: Create the Machine Registration Endpoint"}),"\n",(0,a.jsx)(t.p,{children:"In the OS Management dashboard hit the create registration endpoint button."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"OS Management registration endpoints",src:n(4398).Z+"",width:"757",height:"404"})}),"\n",(0,a.jsx)(t.p,{children:"Now here either you can enter each detail in its respective places or you can edit this as yaml and create the endpoint in one go. Here we will edit this as yaml."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: elemental-cls1\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n registration:\n emulate-tpm: true\n emulated-tpm-seed: 1\n machineName:\n machineInventoryLabels:\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'})}),"\n",(0,a.jsx)(t.p,{children:"Remove the existing content and enter this code snippet and click on save. Remember to modify this as per your need."}),"\n",(0,a.jsxs)(t.admonition,{title:"main options",type:"info",children:[(0,a.jsx)(t.p,{children:'name: elemental-cls1 --\x3e "Change this as per your need"'}),(0,a.jsx)(t.p,{children:'device: /dev/sda --\x3e Make sure your target device is "sda" otherwise find out and change the naming convention here, for example in raspberry pi it could be "mmblk---"'}),(0,a.jsx)(t.p,{children:"emulate-tpm: true --\x3e Use this only if your target device doesnt have a tpm device and you have a way of emulating tpm like in VMware or KVM"}),(0,a.jsx)(t.p,{children:"emulated-tpm-seed: 1 --\x3e increase this by 1 for every new machine. --\x3e If this is not given each machine will recieve the same tpm hash so at any point in time regardless of how many machines you boot it wont show up under the machine inventory."})]}),"\n",(0,a.jsx)(t.admonition,{title:"attention",type:"danger",children:(0,a.jsx)(t.p,{children:"Emulate TPM is only for non-production usage like for testing as it beats the purpose of security. So in production usage use the code above without the emulate-tpm and emulate-tpm-seed"})}),"\n",(0,a.jsx)(t.p,{children:"Once you create the machine registration end point it should show up as active."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Machine registered in Registration Endpoints",src:n(5582).Z+"",width:"559",height:"464"})}),"\n",(0,a.jsx)(t.p,{children:"Next click on it to view the registration url and download the initial-registration yaml."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Initial registration URL",src:n(4842).Z+"",width:"1454",height:"611"})}),"\n",(0,a.jsx)(t.p,{children:'Hit the download button, this will download the "initial-registration.yaml" file on to your local system.'}),"\n",(0,a.jsx)(t.p,{children:"The registration yaml looks something like this:"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Example of initial registration YAML",src:n(5362).Z+"",width:"947",height:"384"})}),"\n",(0,a.jsx)(t.p,{children:"We will use this file and inject its content into our vanilla elemental iso."}),"\n",(0,a.jsx)(t.h2,{id:"part-3-create-the-iso",children:"Part 3: Create the ISO"}),"\n",(0,a.jsx)(t.p,{children:"Make sure you have initial-registration.yaml in the system where you will create the iso in this we will use a Linux vm."}),"\n",(0,a.jsx)(t.p,{children:"Create a directory to keep everything:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"mkdir /home/tux/elemental-demo && cd /home/tux/elemental-demo\n"})}),"\n",(0,a.jsx)(t.p,{children:"Create a file and copy the contents of the initial-registration.yaml in it."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"vim initial-registration.yaml\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create file with initial registration YAML",src:n(1158).Z+"",width:"1105",height:"441"})}),"\n",(0,a.jsx)(t.p,{children:"Next download the script to download the iso and inject the registration.yaml in the iso and make it executable"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://raw.githubusercontent.com/rancher/elemental/main/.github/elemental-iso-add-registration && chmod +x elemental-iso-add-registration\n"})}),"\n",(0,a.jsx)(t.p,{children:"Next execute the script and pass the initial-registration.yaml as an argument"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"./elemental-iso-add-registration initial-registration.yaml\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create ISO with the initial registration options",src:n(247).Z+"",width:"1654",height:"1206"})}),"\n",(0,a.jsx)(t.p,{children:"This command will download the vanilla iso and inject it with the parameters of initial-registration.yaml and create a final iso for you to boot your end device."}),"\n",(0,a.jsxs)(t.admonition,{type:"note",children:[(0,a.jsx)(t.p,{children:"If you would like to download the vanilla ISO and reuse it later to create additional ISO's, then you can download the iso separately using the below command and then pass the local file path as an argument to the script"}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable:/Teal53/media/iso/elemental-teal.x86_64.iso \n\n./elemental-iso-add-registration initial-registration.yaml /home/elemental-iso/elemental-teal.x86_64.iso\n"})})]}),"\n",(0,a.jsx)(t.h2,{id:"part-4-boot-the-target-device",children:"Part 4: Boot the target device"}),"\n",(0,a.jsx)(t.p,{children:"Now ideally you would just burn the iso to a usb drive and boot your edge device using the usb device and once it boots and become active in Rancher under machine inventory you can select and create a cluster from it, however here we will use a vm to mimic an edge device for testing."}),"\n",(0,a.jsx)(t.h3,{id:"41-prepare-the-vm-to-emulate-tpm",children:"4.1 Prepare the VM to emulate TPM"}),"\n",(0,a.jsx)(t.p,{children:"In VMware workstation create a vm the way you would do normally, make sure to give the HDD size at least 40 GB."}),"\n",(0,a.jsx)(t.p,{children:'Now edit the machine settings and go to the "Options" tab. The very last option would be "Advanced".'}),"\n",(0,a.jsx)(t.p,{children:'Click on "advanced" and on the right window pane change the firmware type from "BIOS" to "UEFI" and check the "Enable secure boot" option as follow:'}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Default settings with BIOS selected"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"VM boot options with BIOS",src:n(5655).Z+"",width:"709",height:"218"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Updated settings with UEFI selected and secure boot enabled"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"VM boot options with UEFI",src:n(6088).Z+"",width:"684",height:"208"})}),"\n",(0,a.jsx)(t.p,{children:'Now on the same "Options" tab click on the "Access Control" option and click on "Encrypt" on the right side.'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Access control menu",src:n(4592).Z+"",width:"242",height:"28"})}),"\n",(0,a.jsx)(t.p,{children:'This will ask you to enter a password to encrypt the machine. Enter a password and click on "Encrypt"'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Access control encryption credentials",src:n(2426).Z+"",width:"352",height:"431"})}),"\n",(0,a.jsx)(t.p,{children:'This is important to add the TPM Hardware. Next go back to the Hardware options and click on "Add"'}),"\n",(0,a.jsx)(t.p,{children:'And add the TPM (Trusted Platform Module) hardware and click on "Finish"'}),"\n",(0,a.jsx)(t.p,{children:"Now with the completion of this step our VM is ready."}),"\n",(0,a.jsx)(t.h3,{id:"42-boot-the-vm-with-the-elemental-iso",children:"4.2 Boot the VM with the elemental ISO"}),"\n",(0,a.jsx)(t.p,{children:"Next add the ISO that we created earlier in the VM and boot it up."}),"\n",(0,a.jsx)(t.p,{children:"It should boot up with the ISO and start installing Elemental:"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental OS install grub menu",src:n(2689).Z+"",width:"677",height:"451"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental OS install logs",src:n(4977).Z+"",width:"1052",height:"281"})}),"\n",(0,a.jsx)(t.p,{children:"And once it is complete it will reboot the VM and it should show up as active under the machine inventory in Rancher as follow:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Machine inventory status while booting"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Machine inventory status during boot",src:n(8951).Z+"",width:"612",height:"159"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Machine inventory status after boot completed"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Machine inventory status after boot complete",src:n(4604).Z+"",width:"622",height:"112"})}),"\n",(0,a.jsx)(t.h2,{id:"part-5-create-a-cluster-on-the-machine",children:"Part 5: Create a cluster on the machine"}),"\n",(0,a.jsx)(t.p,{children:'Once the machine shows up as active, select it and hit "Create Elemental Cluster".'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create Elemental cluster",src:n(7966).Z+"",width:"811",height:"398"})}),"\n",(0,a.jsx)(t.p,{children:"At this stage you get a pretty familiar page of creating a cluster in Rancher."}),"\n",(0,a.jsx)(t.p,{children:'Give the cluster a name select the Kubernetes version and hit "Create".'}),"\n",(0,a.jsx)(t.p,{children:"For this we have selected to create a K3S cluster."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental cluster configuration",src:n(5067).Z+"",width:"2294",height:"1224"})}),"\n",(0,a.jsx)(t.p,{children:"Now under the Cluster Management page the cluster should show up as creating:"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental cluster provisioning",src:n(985).Z+"",width:"793",height:"279"})}),"\n",(0,a.jsx)(t.p,{children:'And once the cluster is fully provisioned it should be active with provider type as "Elemental".'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental cluster created",src:n(4957).Z+"",width:"2279",height:"242"})}),"\n",(0,a.jsx)(t.p,{children:"Now you can start deploying application on this cluster the normal way."})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},2426:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-access-control-encrypt-60a89768dd80961e42f48b1717f607cb.png"},4592:(e,t,n)=>{n.d(t,{Z:()=>a});const a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPIAAAAcCAIAAADURHUBAAAGgklEQVR4nO2bQWwaRxSG/21SUCwtlaotXZWTLUhpiOEMPtmqrAIXR5Ecu4rk9rI0J7Aqt6VKpCiKiqo0Ak6tuSStrJpEiuKLQXId+2SqqifcotIuik9IGG8ii5XsQGzRA+yyu2CDE7Ax2e/E23lv5s2bp5k3C+BWIFQ+gE8mmdab2KAd9iArCvYgywbtYGKy1hgD4ZGgyVSNKjYVVZmKtLFOv9Zh1U4c2l7Tg2Bb7bnaeoCtYkSVU8hZtAmjL8HCYSKmK6I9yBqNxl+CDhNBALAzjB0AnLOs8KiilPgQ01Uje5BNGAH4bjCEi4jYg2zCZwSATMhhmv4dMBH/xMpjcn0jah0ysbITmX8r3twYJCp6wtCAUeiZYYCP5M5IbFVOP8StQOjGN96Gbc5PPYdYxn+d7YxLKiqvy2G7tZq4KqeUt07aARWV9qOmtUoP0oYrI+FPv34nKiptpHFam67dO9yM/fHzDjijotIeDtytD0ncpkmvonKyvEptrW7VKl1Ok9r6Da1GaIqdxFSQS5y0I73D8Ya0+ZXxKNWIJjQ94AU3dAze2wzlCbL6OZUl5viWrE5hvrIBM1afmpZKwKH+n9TUujKkbX3BR+vc4OMgx+l29lqPY7S/PAGPP03404Q/7YGO6eyAJ0qeZy2GUIdD2mMc/QXf+vKj7LsgiMsfPFNs5A4riVR2QT8wY9X4ciUAABkLGJwAgHg07UrKxU2K9VJGACiGwxu+HByj/WvDWgDIc0NBDnJR2A804xaEw9mIMG5kLgsAtNgb7/FnIzTFTmJxi/JaxNE1oUnKqMdagMqkeLxXXNyivBZBWWp75KB0lOLtFax9TPqkJ5LSYcnUxK1dplYMhzd8qI8JZGu0ypksEMKydWF64PyKqEP9F+XdI1oWpFMvmsvHXdcpFlTiAJDnOh+rKkdM6/L+4039ZacVwOPf1i+V90GcEdo04xYszpci7/OzIzrHEpeAJjRtQDRNJKsKcpGMBbR3/OkIKgcZ9XAePw+XPP6NCMBcNVykqRmpCFTTmta59aU7OYVnZMxLsdG0KQnHaP/aVTKyDOip8ytpYg6wGcojlCPJ+eY5d+XEpCnWK7Q2tO0qklnPoDlmS7s2K3Kdw3N8bWo1MzLmVUa4LiaFcemi0BQ7LIYFWOHLgySSPGw6Z4pzbWrdes1/4bQrVykCDUwyKxm3bkGDxeuCn5Va5dg4YloXnl0qPQGsAC6VnqBA4x19tYnWucFP5YBcIT5BjdNcAjo3uKkkJApSUWsCORswC7874S/mCiyo2YAB/mxkLguQYzJRQr74t8IxWmvKVztPrPMZr45ZLiLP3a4Mt1nM1M9FbG1o22VElrmZScoxD6CRw+AbnDD1EUZdTBSLAklYACQL8QkdAx6DZPyvLKBFnn+YE5uoC9LSqH44GqKfx8zR0vr7u/f3SsW3//wBwMsXu2f/uP/1ra8qTQ4radRr1wJURTRZNb71Zt3llZfLiD8NkLGAeRa8x591ycXqyuWKrJ4ap7mEcsPuaXLcVKr/urW1m7GIIsI0NXM0e34hZRizkbDwC3NA0/r+dYdrGwdeGRu+2tstbL98sbuz/Xxn+/nLF7u7hW2xadyijUerdzgiyhstOkeusAjquk3QUIpFVi8RAdBUbFQD8C7/03Bec8EmF2sx5W+vwus1iNdE5qqBkfTmsJLGVOHA+livvah40rrtiZJY4jBMGXGww4qp1Ue4HsWi1BFZ5kwTBtPqljImNp1T3Lkr49YPlyuy+ur7A4eVNLYwx3bReLd+hbfRsrMsWa1DfPMc6zWXJ4DKDUMhhmsi8txQsAjvQHkYADKrT01JbSwgESV7c2JpYwj9a+J5l8oS4CO13niPnwetbeBljruTMs8GzDMpHhArDd7Viu3Jw7uifHkEDRyGZGq1KyOvjPB8fZ8l2Rqt1t3qcoXFPIl14Q6qp4QDmff4uYRiXOWCcq6oruw1e4FMim9QB3aMw/5GAMB07Z40xW/6vlUo3Ax9p/7UqZexGcojxWpp0ZWvqBvSvLYWq5He/EJR5VCYQTK+ku3+PFbQZLduqQt1t1bpMtS/Eaj0IA2KkPsPFh4tLu3t7Tc3Pnvmsnu0HBjrgGMqKq9Og7R+tLj04Ke7fX3nmhrv7Oxe+eLLz66oaa3SXTQoQvb29lvJaQB9feda2dRVVI4ZtbZW6UHe1LTOhByO0HF+QfBGEPcQBEEQhCcu/3zs/A8CtQt0OqppGQAAAABJRU5ErkJggg=="},7966:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-create-8d06bbcd84075d084212bc3d049dfbbc.png"},4957:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-created-39460fab3f9c3863673be51507d2d22d.png"},985:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-provisioning-b1a441f0c9dd8db3af090c57bf8b216c.png"},5067:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-template-71f1e521ea8047e899ec3b0f9e48225b.png"},2689:(e,t,n)=>{n.d(t,{Z:()=>a});const a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqUAAAHDCAIAAACS//S/AAAT3klEQVR4nO3dXbqjqBoGULufHmyGlOGei3R7LBUERcXPta5SlhsQ0de/mGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA4/66uwHQke/3O37+fD7jlN/n6T9T0/eVP1VS73L+F5p1RUk/jH8ym3m5XiCev+9uAPRizNRlEi9TtlX5Y7qs1rtUO//tvt/vGS2cdmZhP0w7fLlyp0VBSPIehmEtfVdnOK98qtRm87T/p5FfeGEGAvjn7gZAp87OgJdkzEsWE/on7+GNlhe3Z88KjGbzLG+BZ+6jr94vry0faML1fNh2wZ3y8T53Yc7Vzl/ejGHtvvj4eTY9fx89dVukvPyqNpfPvJw4KqwUHsf5PfwhFVerz8Y3LD81JWUMxV9GHm9YlVSN17ekyUHP9FrFLf0JF5D38IezT+UzX8PrJ2zKF39s9nTKOY1asSPse+heuIW8h1KtTvH7tztBrzxk8Wg9VHH/HnrxiO/Td0LYQy15D8Nw32X8u0xv/w/p4Nx8hK2fZ9xmzVi9y+A797yZ9+nC/6USYvbds9XwLsmPzPt0Vx9WX5bf9n26q8m3WW/J/Mv/2vz+XuYrgqmWzyyrTjV18/uBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENdf11f5/X6vrxQAHu3z+Rz5839ataPWwXYDwEs0OU/++3gRAEDn5D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQ323v2xl53R4ALLV9MZ3zewCIT94DQHz3X89PWb2OMV78H//3+tsBn8+nvNLydi6X9+CiNWnnjf0MQEP9nt+PAfP9fpdhc1f81N5NKW/ndDFXF7lKq3aKeYAY+s37GcEDALs9Ju8HkQ8Ae3Vx//538fn7/Y4fljOUhP3sIvbvT6Z3oGflZ+YfZ16WM51nWU7zg5JUe/Ltv76dAPSsi/P7WdDO/rfwVvT45+PN79Qf/qan5h8/L6en7q+XVLpbqj2Z9t/STgB6dv/5/Sx4lqk/PbVtWFEwztcByLg/75dX3VPzlEiF+u+gYXno8Nwjid+yVF2ij33EA0DG/Xk//HmLuupb40u1f3v8tHh2F+BgaVWmjd/suhvbCcDtusj76f3mzGwHDwUA4LW6eF6vRO0p6exa9+3zN1fYgNvbCUAP+s37MaVWE2v6v78P45Xqcf78xYDa+Wd/NX6elpP6RtxQcLwyXcySkM63v1U7y9sPQM/+ur7Kkgf0AODllie0R0rr9/weAGhF3gNAfPIeAOK7//t4HgQDgLM5vweA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+P65q+Lv93tX1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwLq/7m7A6b7f7zAMn89n9Z9tK5oW+6vopLrOcFKDb++H2Xq5rNLfh+NVH2x/q5Zcth5vWV/lrunP47VsllDbz7dvyBz3990NCGLcGEaP2ypOavC9/bBcL9dotdTH27/Zku/3W1LLNevxgvVVuLwp1/Rn5n+blL+jBx63Q2NJ3gNAfP/c3QBKdXKdc/XMoLxh591PYZ+3rYuzl/fp5RPYq/N+Fl2ze/zL6ZuFrIbZ8r5XVfnTPymM/Gn5ywcXVu/DXXPde/VZillTM89btFovtf3fZJzUlrM5rlYLzzynkl/vmcGwOZ7zTZqVkxqHqeXNz1/7XM6O5d1XVGpi4XrZXelm+fu2i7vui9HWe6/nj2P9Z5ySmp4yzjb7PJtnd/k7rBY+/nP5X1Xn3MvZqvaPyx10YT+0Wi+t6j27nJJxVWvZzmWxJct1ZHlT4zC1vJlxu8O+5c2XVt6fqQ2tvN7j5e/YLlyTC+PV5/dT543m4yXPDsnbNvXKjblhLXftfc6ut7dxmAqPu/TT/61a0s8SrRL2kbw373+Hw6lj87OvX51a/tmN/yRuCmxaHqxUnUtl1td52o6TC66LNj8iPKL/68B3jas+9b++OOK9eT8sdtzTHWU/B93LLTC/Q8/c8L7XuGOdNr6qnzPr61QNx8nbsuQRy3vXuOrQaxf8Jd57/54jfvsFe4feTJ8JAJh67/l91QO9tafjDefvNlN3NGz1FP9nsx8O3kfc/ecXj5Pa6UvTuy3Htbp9e/Z2tNvL708fH28v78Bnif8+3aH++1Sp6YW1zK6lzx6O3V1+uWnVy3o329O2STv6ofCB8H3rZUc5O8bJ6v3gfeOt/FGJsW9XO3nZ/1XtzJeTaU+q/FQ5qe1oWd2OcVu1XvIlnNqfJc+LHFxf5dtFvp/lPdDG7FkqWPWIcXJ2Ix/RCdzI/Xv65dSBEj2PExlPP15xPZ8HOftmBzE8aJxkbkk8onwAAAAAAMJzdxn64Xk9oCMOEeAk8Z/XO/XL5Vc6+zWfB8sv/5r4Se2Zzd+8PVUa1r6jHwqrbvv+iXwtp76x6uzt4veh/H0Pzx23Fwi/gD2Lf34/fdV5h2+VL3R2m4+X33brrW1Pb0d1DQ96Tqp6jNXZdpGavttYzhku2JZTjV+9DvH0cXuB8AvYs/h5DzxFz9+kh6d77/vzgd48KOkf1FT4eW/ez142Phx4z3mT97Gn2jOdOfOS7c1yShpTUv6mg/2ZaU9t+2vbU1LFZeXsWy9N7sv8rlT/ij37/TC7q2g4bnf0Z35QPXHcTqubtic1fVbO8scRVvc/q/35oFcnPV385/WG9O9zrH5eHdM7ppc0prBtq8XuK6ewVSUNyBdysN+aPOS1uqtqtb6OrKAj/VCy3mtXVuqfm4XscHBF50vbUf7u/iyfWNX+4aZxu6w0/7mkrtTnqh0dDb3o/D6/C6sdYan5exupvbXnem174Oz+bJh8x5sxPdF/m9uD565xu3lJY5/C/nznYLvMi/K+aiQtB/d4nXNWYGp6bfn7tCrnbcr7Lb9+a/v/Wet9dm2/od7GbW/tSTm7nb81Pj2Vz0xv0ph9+0/2eVHeV9m8BjDdD6am15bfqp1squq3zPptdVmo1tPXe2/t7609Kf20c3lNfrcd+0/28X084P9mJ1tAGPJ+w7j7S+0HD+4fa//8pGY0L6eVVv2ze/7CAs9ej2ev93Jta+xt3N5VTm/zX6bbhoUU//n81J2hzB2j2fhbPrRcOL2kSctyUs/Vj3+VrzezXIWtOmm5yqen2lNY+6wfUs8Jp+rNlFze/tW10KofCstZFjVzpD1HrrjW9n9haWeP29R/xRi3Y0XfyX362YfVR+tns622OXXZf99yAXAFJ2QAEJywBwAAAAAAAHgX94kB2vL9e4JwiACQ8aLv39d+rXP3F9n32d3OTIGP/iZr7fe8983/8+iOOknVgGw+endbPebb/J73jsFw1/b19O2aG8U/v9+3bYzh0eQF0SXabsOZBj/lPHjs/DNcv34fZ/dPDMxcPN6mP22wTPTPf4bJSt8xGO4aMIEH6lP2S48WP++POzV4aOLIS9+s38AKX0K3+weQ4EH8Pt7rhNyjhVyoGG5fNXf9hiFVdPsFXpT3J71ne/ai6SPl17Zz8/355S/hz7d/9n7szZYv27Nafq2z37Pdqv21N4P3rd/Cl5mn2pNfrlZXVveNt2V7dtc+PXH/XTH+TWkyCDP9vFlFbT+k6t38nHohf+F43lFOfjsaFv02rI2THeV4D/+m+M/rDdnNYLkbGrb2j5kyC8tv0s58+ZnqUhtbpt7axpf0T6ao2vL3FfWze/3uaHPJPIXrvfxzSV2pz00Wdsd4y5RW3pKf1R44XlF+oQqL3dEPhZ2Z/68jm/bu/d5mpYULXrggR8ZPYC86vy9Xu6eb/e0JLYqjVf8cKafn9VtefuoU/OCp+eaR4lTPo3163DOdOPz3aFhXje9nXPVZfq3e2tOJt+f9wZ3j7eXToQtW+ufP3yfNT2/Vngv2oW27LtXgz5/X9jv09P3G9e0f1+l0ysVt6N/b8/5th72cLXVj6C69tSfP9vLz9H64pf2z2xw9H8/dxffxgMh+Rzmzk7/N+SEeef+v8t1Bn+X3Vu/ZLFdsy37Y1zObfzK78lFbxV37jaeMk7Gd0ycnhhMuADylQ+71oufzR5vf30jdBFqdP3PHKFX+Ge3M1J5ahMLneA+2v+Edtdr2lJRzZP1ull/4YGDV+p0+qDwtPzU9057C9V6y4CVdenC8FebE6k5/s/yDa3m16vKVXrXfyNS7HA+ZEmqfz5+Vtq/9qeoy4yQzPTXOV1sFFHHsDK9l8w/D9XzW2cgBInnF9Xz2aXgpHngiOwEAAAAAAAAAAAAAAAAAAAAglvjv28m8zHzz/eSr04fiV3kDQCfe+D7d73+/jzkMw+c/wyLRZ9MB4LlelPdiG4DXekve/87UV3+H0Q/DABDeP3c34GbuwQPwBm85vweAN5P3/zp+Vd99AQC69d68H5+9H3M6f21/Or/n9gEAAAAAAAAAAAAAAAAAAKLp9/dwl99un33r/eCrcK8p53gtmyWM7wNoVeBBte05VWphyzvh7O66zNvGyanlHx9X15juRTtpEjd63vt2Wo3akh19yRt1St7Sc175O975c/ZO9rzCN6tOHSMulXdCjL3k28ZJpvwm78E8Pq42NXnj5/DnT37zcl3n/ThGDVaAciXvDOVt+v19vNlIvX7gnl2jTbEt/UmJp4yTp7STB+k37zctb5XNLn8VbjCrt9w2Jy4Pn6tu3R0vf7qws5kz/VB1hXC1nLGuwvbk55+1OX/7IzP/BfdNj4+3fH9O51n9gYZ8vat9Plw+TjILsq89mY0iU+9q+UNinJT088Hnb8rHeaqdqe1od5NGDizeo+vr+Zume4TlzaryfdZy/uU2MC0/tdGW13u8/Ok9uennTD9UXeJLlTN+Xk5fbU9q/rYu2GfN2l873jb7c3XKcv7aes8eJ1WN2deemWngLWdOlT9OWS0tU9R5gzZj2c5929F3Ypwy3Lpo3OjB5/etdvG9lXNS+Z3cz7u9AR36fD7jHrm2f5r3ZyfjZOmaWOpwwY+YHk59176wEGx5yXtw3q9yrPrTqh867M/V3dZdavvn7PlrNSn/gkHyOyT6TK5mX1Bvh4P/uOnB5TjlxvZwpWh5b+z+POWixdM1OR2f3pqdHc10ftFoyD5wcKqz671ruS4wXemp835Cevb9e95meg8bgHJh8352zSq81PK26ofacs7r/z7PRXb3z/Q8MnM22Wr9nj1Oap1dbz/jthObCxi+B96s3/fpDlvft5nuHFd3lPlgyJSzWfXyD6vKaVj+coZUOcvpQ3EXrZZT2J7MncJ97flkv6x4cHqm3uX8VeMtNf/qgMmP583p+S46b5zM6m3SnulKP1j+kFjvO/rzyHY9VA6Vwu0uX0imPatbZZ9H1XCD3k5KAnjhIvNCxjk3Cns9vzkZfx6nFLyBcc69ur6e35uqi8Adlt+V2ovh8ETGOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADzN/wCwXEkY4Glz7QAAAABJRU5ErkJggg=="},4977:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-install-logs-a0fe1cb2f06bd446319ea8755907dcba.png"},8883:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-operator-install-ead7a27570833aea52fc48bf864e7458.png"},3202:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-operator-pod-5cf9077cbdd41cc2ea98372e615773e3.png"},3391:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-extension-enabled-c4e29279c65407712c74245a906fe8f1.png"},1389:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-extensions-menu-3417b5f0744722377d8b9e1826abc4f8.png"},5362:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-initial-registration-url-yaml-2976a9c6180726ebb308057cb33ae38f.png"},4842:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-initial-registration-url-0c8db5dad180464052c36f376b17c8e3.png"},1158:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-initial-registration-yaml-61b7ae494fd22967d770b3124dd1da9b.png"},247:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-iso-create-94c20367fff7dd76b113c5f2e046fd69.png"},4604:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-machine-inventory-status-boot-complete-401945492ded59c3f4f94e8dc7ecc419.png"},8951:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-machine-inventory-status-booting-fba3e4b35fc4b52b43fa92dc00f14d28.png"},5582:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-machine-registered-fa33715b7ace60ba91c3ab12694be684.png"},8293:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-osmanagement-dashboard-5ec27221ddfdd9d63f846c6370847cbd.png"},8585:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-osmanagement-menu-18bc9bca56db4f66db675cb679e6ada9.png"},4398:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-registration-endpoints-040525e42e8fcfde1c35a85e44b1bc32.png"},5655:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-vm-boot-bios-28b0123c0fbaf64ff7fe1f5634b0f1ae.png"},6088:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-vm-boot-uefi-ca7f800f1c8469b9c1477f78b6ca22e5.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>s});var a=n(7294);const i={},r=a.createContext(i);function s(e){const t=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),a.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/aa67c710.115ad5fd.js b/assets/js/aa67c710.115ad5fd.js deleted file mode 100644 index 911417ec8..000000000 --- a/assets/js/aa67c710.115ad5fd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[360],{3500:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>l,metadata:()=>a,toc:()=>d});var n=t(5893),s=t(1151);const l={sidebar_label:"Elemental Operator Helm Chart",title:""},i="Elemental Operator Helm Chart",a={id:"elementaloperatorchart-reference",title:"",description:"The is responsible for managing the Elemental versions and maintaining a machine inventory to assist with edge or bare metal installations.",source:"@site/docs/elementaloperatorchart-reference.md",sourceDirName:".",slug:"/elementaloperatorchart-reference",permalink:"/next/elementaloperatorchart-reference",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Elemental Operator Helm Chart",title:""},sidebar:"docs",previous:{title:"SeedImage reference",permalink:"/next/seedimage-reference"},next:{title:"Kubernetes versions",permalink:"/next/kubernetesversions"}},c={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Get Helm chart info",id:"get-helm-chart-info",level:2},{value:"Install Chart",id:"install-chart",level:2},{value:"Uninstall Chart",id:"uninstall-chart",level:2},{value:"Upgrading Chart",id:"upgrading-chart",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Values",id:"values",level:2}];function o(e){const r={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components},{Vars:t}=r;return t||function(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Vars",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(r.h1,{id:"elemental-operator-helm-chart",children:"Elemental Operator Helm Chart"}),"\n",(0,n.jsxs)(r.p,{children:["The ",(0,n.jsx)(t,{name:"elemental_operator_name",link:"elemental_operator_url"})," is responsible for managing the Elemental versions and maintaining a machine inventory to assist with edge or bare metal installations."]}),"\n",(0,n.jsxs)(r.p,{children:["The associated chart bootstraps an elemental-operator deployment on the ",(0,n.jsx)(r.a,{href:"https://rancher.com/docs/rancher/v2.6/",children:"Rancher Manager v2.6"})," cluster using the ",(0,n.jsx)(r.a,{href:"https://helm.sh",children:"Helm"})," package manager."]}),"\n",(0,n.jsx)(r.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsx)(r.li,{children:"Rancher Manager version v2.6"}),"\n",(0,n.jsx)(r.li,{children:"Helm client version v3.8.0+"}),"\n"]}),"\n",(0,n.jsx)(r.h2,{id:"get-helm-chart-info",children:"Get Helm chart info"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm pull oci://registry.suse.com/rancher/elemental-operator-chart\nhelm show all oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,n.jsx)(r.h2,{id:"install-chart",children:"Install Chart"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm install --create-namespace -n cattle-elemental-system elemental-operator-crds \\\n oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm install --create-namespace -n cattle-elemental-system elemental-operator \\\n oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,n.jsx)(r.p,{children:"The command deploys elemental-operator on the Kubernetes cluster in the default configuration."}),"\n",(0,n.jsx)(r.p,{children:(0,n.jsxs)(r.em,{children:["See ",(0,n.jsx)(r.a,{href:"#configuration",children:"configuration"})," below."]})}),"\n",(0,n.jsx)(r.p,{children:(0,n.jsxs)(r.em,{children:["See ",(0,n.jsx)(r.a,{href:"https://helm.sh/docs/helm/helm_install/",children:"helm install"})," for command documentation."]})}),"\n",(0,n.jsx)(r.h2,{id:"uninstall-chart",children:"Uninstall Chart"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm uninstall -n cattle-elemental-system elemental-operator\n"})}),"\n",(0,n.jsx)(r.p,{children:"This removes all the Kubernetes components associated with the chart and deletes the release."}),"\n",(0,n.jsx)(r.p,{children:(0,n.jsxs)(r.em,{children:["See ",(0,n.jsx)(r.a,{href:"https://helm.sh/docs/helm/helm_uninstall/",children:"helm uninstall"})," for command documentation."]})}),"\n",(0,n.jsx)(r.h2,{id:"upgrading-chart",children:"Upgrading Chart"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm upgrade -n cattle-elemental-system \\\n --install elemental-operator \\\n oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,n.jsx)(r.p,{children:(0,n.jsxs)(r.em,{children:["See ",(0,n.jsx)(r.a,{href:"https://helm.sh/docs/helm/helm_upgrade/",children:"helm upgrade"})," for command documentation."]})}),"\n",(0,n.jsx)(r.h2,{id:"configuration",children:"Configuration"}),"\n",(0,n.jsxs)(r.p,{children:["See ",(0,n.jsx)(r.a,{href:"https://helm.sh/docs/intro/using_helm/#customizing-the-chart-before-installing",children:"Customizing the Chart Before Installing"}),". To see all configurable options with detailed comments, visit the chart's ",(0,n.jsx)(r.a,{href:"#values",children:"values"}),", or run these configuration commands:"]}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm show values oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,n.jsx)(r.h2,{id:"values",children:"Values"}),"\n",(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Key"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Default"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"image.empty"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"rancher/pause:3.1"})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"image.repository"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"registry.suse.com/rancher/elemental-operator-chart"})}),(0,n.jsx)(r.td,{children:"Source image for elemental-operator with repository name"})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"image.tag"}),(0,n.jsx)(r.td,{children:"tag"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:'""'})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"image.imagePullPolicy"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"IfNotPresent"})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"noProxy"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:'`127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local"'}),(0,n.jsx)(r.td,{children:"Comma separated list of domains or ip addresses that will not use the proxy"})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"global.cattle.systemDefaultRegistry"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:'""'})}),(0,n.jsx)(r.td,{children:"Default container registry name"})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"sync_interval"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:'"60m"'})}),(0,n.jsx)(r.td,{children:"Default sync interval for upgrade channel"})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"sync_namespaces"}),(0,n.jsx)(r.td,{children:"list"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"[]"})}),(0,n.jsx)(r.td,{children:"Namespace the operator will watch for, leave empty for all"})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"debug"}),(0,n.jsx)(r.td,{children:"bool"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"false"})}),(0,n.jsx)(r.td,{children:"Enable debug output for operator"})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"nodeSelector.kubernetes.io/os"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"linux"})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"tolerations"}),(0,n.jsx)(r.td,{children:"object"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"{}"})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"tolerations.key"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"cattle.io/os"})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"tolerations.operator"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:'"Equal"'})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"tolerations.value"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:'"linux"'})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"tolerations.effect"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"NoSchedule"})}),(0,n.jsx)(r.td,{})]})]})]})]})}function h(e={}){const{wrapper:r}={...(0,s.a)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(o,{...e})}):o(e)}},1151:(e,r,t)=>{t.d(r,{Z:()=>a,a:()=>i});var n=t(7294);const s={},l=n.createContext(s);function i(e){const r=n.useContext(l);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(l.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/aa67c710.7943bc71.js b/assets/js/aa67c710.7943bc71.js new file mode 100644 index 000000000..32efa0309 --- /dev/null +++ b/assets/js/aa67c710.7943bc71.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[360],{3500:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>l,metadata:()=>a,toc:()=>d});var t=n(5893),s=n(1151);const l={sidebar_label:"Elemental Operator Helm Chart",title:""},i="Elemental Operator Helm Chart",a={id:"elementaloperatorchart-reference",title:"",description:"The is responsible for managing the Elemental versions and maintaining a machine inventory to assist with edge or bare metal installations.",source:"@site/docs/elementaloperatorchart-reference.md",sourceDirName:".",slug:"/elementaloperatorchart-reference",permalink:"/next/elementaloperatorchart-reference",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Elemental Operator Helm Chart",title:""},sidebar:"docs",previous:{title:"SeedImage reference",permalink:"/next/seedimage-reference"},next:{title:"Kubernetes versions",permalink:"/next/kubernetesversions"}},c={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Get Helm chart info",id:"get-helm-chart-info",level:2},{value:"Install Chart",id:"install-chart",level:2},{value:"Uninstall Chart",id:"uninstall-chart",level:2},{value:"Upgrading Chart",id:"upgrading-chart",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Values",id:"values",level:2}];function o(e){const r={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components},{Head:n,Vars:l}=r;return n||m("Head",!0),l||m("Vars",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n,{children:(0,t.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/elementaloperatorchart-reference"})}),"\n",(0,t.jsx)(r.h1,{id:"elemental-operator-helm-chart",children:"Elemental Operator Helm Chart"}),"\n",(0,t.jsxs)(r.p,{children:["The ",(0,t.jsx)(l,{name:"elemental_operator_name",link:"elemental_operator_url"})," is responsible for managing the Elemental versions and maintaining a machine inventory to assist with edge or bare metal installations."]}),"\n",(0,t.jsxs)(r.p,{children:["The associated chart bootstraps an elemental-operator deployment on the ",(0,t.jsx)(r.a,{href:"https://rancher.com/docs/rancher/v2.6/",children:"Rancher Manager v2.6"})," cluster using the ",(0,t.jsx)(r.a,{href:"https://helm.sh",children:"Helm"})," package manager."]}),"\n",(0,t.jsx)(r.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsx)(r.li,{children:"Rancher Manager version v2.6"}),"\n",(0,t.jsx)(r.li,{children:"Helm client version v3.8.0+"}),"\n"]}),"\n",(0,t.jsx)(r.h2,{id:"get-helm-chart-info",children:"Get Helm chart info"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm pull oci://registry.suse.com/rancher/elemental-operator-chart\nhelm show all oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,t.jsx)(r.h2,{id:"install-chart",children:"Install Chart"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm install --create-namespace -n cattle-elemental-system elemental-operator-crds \\\n oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm install --create-namespace -n cattle-elemental-system elemental-operator \\\n oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,t.jsx)(r.p,{children:"The command deploys elemental-operator on the Kubernetes cluster in the default configuration."}),"\n",(0,t.jsx)(r.p,{children:(0,t.jsxs)(r.em,{children:["See ",(0,t.jsx)(r.a,{href:"#configuration",children:"configuration"})," below."]})}),"\n",(0,t.jsx)(r.p,{children:(0,t.jsxs)(r.em,{children:["See ",(0,t.jsx)(r.a,{href:"https://helm.sh/docs/helm/helm_install/",children:"helm install"})," for command documentation."]})}),"\n",(0,t.jsx)(r.h2,{id:"uninstall-chart",children:"Uninstall Chart"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm uninstall -n cattle-elemental-system elemental-operator\n"})}),"\n",(0,t.jsx)(r.p,{children:"This removes all the Kubernetes components associated with the chart and deletes the release."}),"\n",(0,t.jsx)(r.p,{children:(0,t.jsxs)(r.em,{children:["See ",(0,t.jsx)(r.a,{href:"https://helm.sh/docs/helm/helm_uninstall/",children:"helm uninstall"})," for command documentation."]})}),"\n",(0,t.jsx)(r.h2,{id:"upgrading-chart",children:"Upgrading Chart"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm upgrade -n cattle-elemental-system \\\n --install elemental-operator \\\n oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,t.jsx)(r.p,{children:(0,t.jsxs)(r.em,{children:["See ",(0,t.jsx)(r.a,{href:"https://helm.sh/docs/helm/helm_upgrade/",children:"helm upgrade"})," for command documentation."]})}),"\n",(0,t.jsx)(r.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsxs)(r.p,{children:["See ",(0,t.jsx)(r.a,{href:"https://helm.sh/docs/intro/using_helm/#customizing-the-chart-before-installing",children:"Customizing the Chart Before Installing"}),". To see all configurable options with detailed comments, visit the chart's ",(0,t.jsx)(r.a,{href:"#values",children:"values"}),", or run these configuration commands:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm show values oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,t.jsx)(r.h2,{id:"values",children:"Values"}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Key"}),(0,t.jsx)(r.th,{children:"Type"}),(0,t.jsx)(r.th,{children:"Default"}),(0,t.jsx)(r.th,{children:"Description"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"image.empty"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"rancher/pause:3.1"})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"image.repository"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"registry.suse.com/rancher/elemental-operator-chart"})}),(0,t.jsx)(r.td,{children:"Source image for elemental-operator with repository name"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"image.tag"}),(0,t.jsx)(r.td,{children:"tag"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:'""'})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"image.imagePullPolicy"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"IfNotPresent"})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"noProxy"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:'`127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local"'}),(0,t.jsx)(r.td,{children:"Comma separated list of domains or ip addresses that will not use the proxy"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"global.cattle.systemDefaultRegistry"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:'""'})}),(0,t.jsx)(r.td,{children:"Default container registry name"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"sync_interval"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:'"60m"'})}),(0,t.jsx)(r.td,{children:"Default sync interval for upgrade channel"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"sync_namespaces"}),(0,t.jsx)(r.td,{children:"list"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"[]"})}),(0,t.jsx)(r.td,{children:"Namespace the operator will watch for, leave empty for all"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"debug"}),(0,t.jsx)(r.td,{children:"bool"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"false"})}),(0,t.jsx)(r.td,{children:"Enable debug output for operator"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"nodeSelector.kubernetes.io/os"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"linux"})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"tolerations"}),(0,t.jsx)(r.td,{children:"object"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"{}"})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"tolerations.key"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"cattle.io/os"})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"tolerations.operator"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:'"Equal"'})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"tolerations.value"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:'"linux"'})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"tolerations.effect"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"NoSchedule"})}),(0,t.jsx)(r.td,{})]})]})]})]})}function h(e={}){const{wrapper:r}={...(0,s.a)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(o,{...e})}):o(e)}function m(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,r,n)=>{n.d(r,{Z:()=>a,a:()=>i});var t=n(7294);const s={},l=t.createContext(s);function i(e){const r=t.useContext(l);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),t.createElement(l.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/aba5156d.11ba512e.js b/assets/js/aba5156d.11ba512e.js deleted file mode 100644 index a24cbcd6b..000000000 --- a/assets/js/aba5156d.11ba512e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8531],{344:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>s,contentTitle:()=>r,default:()=>h,frontMatter:()=>c,metadata:()=>a,toc:()=>l});var t=i(5893),o=i(1151);const c={sidebar_label:"Configure Wi-Fi",title:""},r=void 0,a={id:"wifi",title:"",description:"How to configure Wi-Fi",source:"@site/versioned_docs/version-1.3/wifi.md",sourceDirName:".",slug:"/wifi",permalink:"/wifi",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Configure Wi-Fi",title:""},sidebar:"docs",previous:{title:"Restore",permalink:"/restore"},next:{title:"Elemental behind proxy",permalink:"/elemental_behind_proxy"}},s={},l=[{value:"How to configure Wi-Fi",id:"how-to-configure-wi-fi",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h3:"h3",p:"p",pre:"pre",...(0,o.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h3,{id:"how-to-configure-wi-fi",children:"How to configure Wi-Fi"}),"\n",(0,t.jsxs)(n.admonition,{title:"important note",type:"caution",children:[(0,t.jsx)(n.p,{children:"This guide describes how to configure Wi-Fi on a freshly installed operating system.\nFor some reasons, like no wired network connection availabe, you may want to also use Wi-Fi when you boot from the ISO."}),(0,t.jsxs)(n.p,{children:["This is possible by using a cloud-config definition in the ",(0,t.jsx)(n.a,{href:"https://elemental.docs.rancher.com/seedimage-reference/",children:"SeedImage"})," resource.\nYou can refer to the same instructions as below on how to create it."]})]}),"\n",(0,t.jsx)(n.admonition,{title:"info",type:"info",children:(0,t.jsxs)(n.p,{children:["The information on this page is just a specific use case of using cloud-config. For more generic info on how to create arbitrary files check our ",(0,t.jsx)(n.a,{href:"/cloud-config-reference",children:"cloud-config"})," page"]})}),"\n",(0,t.jsxs)(n.p,{children:["Elemental Teal currently uses ",(0,t.jsx)(n.a,{href:"https://networkmanager.dev/",children:"NetworkManager"})," to manage network connections."]}),"\n",(0,t.jsxs)(n.p,{children:["In order to add Wi-Fi to your node, your registration should include a configuration in the ",(0,t.jsx)(n.a,{href:"/cloud-config-reference",children:"cloud-config"})," section to write a\n",(0,t.jsx)(n.code,{children:".connection"})," file so NetworkManager can connect to the Wi-Fi."]}),"\n",(0,t.jsxs)(n.p,{children:["A ",(0,t.jsx)(n.code,{children:".connection"})," file is a connection configuration file for NetworkManager.\nThe connection files are stored under ",(0,t.jsx)(n.code,{children:"/etc/NetworkManager/system-connections/"})," and can include ethernet, Wi-Fi, VPN and more."]}),"\n",(0,t.jsxs)(n.p,{children:["For example for a network with the SSID ",(0,t.jsx)(n.code,{children:"testSSID"})," and the WPA-PSK key ",(0,t.jsx)(n.code,{children:"123456789"})," and using the interface ",(0,t.jsx)(n.code,{children:"wlan0"})," you would write the following ",(0,t.jsx)(n.code,{children:".connection"})," file:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[connection]\nid=testConnection\ntype=wifi\ninterface-name=wlan0\npermissions=\ntimestamp=1671549641\n\n[wifi]\nmac-address-blacklist=\nmode=infrastructure\nssid=testSSID\n\n[wifi-security]\nkey-mgmt=wpa-psk\npsk=123456789\n\n[ipv4]\ndns-search=\nmethod=auto\n\n[ipv6]\naddr-gen-mode=stable-privacy\ndns-search=\nmethod=auto\n\n[proxy]\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["To see all the configurations available for NetworkManager check ",(0,t.jsx)(n.a,{href:"https://networkmanager.dev/docs/api/latest/nm-settings-nmcli.html",children:"nm-settings"}),"\nwhich includes the format of the connection file and all the different options you can use."]})}),"\n",(0,t.jsxs)(n.p,{children:["Which we should encode to base64 and paste in the content in our ",(0,t.jsx)(n.a,{href:"/machineregistration-reference",children:"registration"})," cloud-config section as such:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:'title="wifi cloud config" showLineNumbers',children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineName: name\n config:\n cloud-config:\n write_files:\n - encoding: b64\n content: W2Nvbm5lY3Rpb25dCmlkPXRlc3RDb25uZWN0aW9uCnR5cGU9d2lmaQppbnRlcmZhY2UtbmFtZT13bGFuMApwZXJtaXNzaW9ucz0KdGltZXN0YW1wPTE2NzE1NDk2NDEKClt3aWZpXQptYWMtYWRkcmVzcy1ibGFja2xpc3Q9Cm1vZGU9aW5mcmFzdHJ1Y3R1cmUKc3NpZD10ZXN0Cgpbd2lmaS1zZWN1cml0eV0Ka2V5LW1nbXQ9bm9uZQp3ZXAta2V5LXR5cGU9MQp3ZXAta2V5MD0xMjM0NTY3ODkxCgpbaXB2NF0KZG5zLXNlYXJjaD0KbWV0aG9kPWF1dG8KCltpcHY2XQphZGRyLWdlbi1tb2RlPXN0YWJsZS1wcml2YWN5CmRucy1zZWFyY2g9Cm1ldGhvZD1hdXRvCgpbcHJveHldCg==\n path: /etc/NetworkManager/system-connections/wifi1.connection\n"})}),"\n",(0,t.jsxs)(n.p,{children:["This would get the ",(0,t.jsx)(n.code,{children:"/etc/NetworkManager/system-connections/wifi1.connection"})," file deployed on the node during installation with the connection content and NetworkManager would\nread and enable the connection on boot."]})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>a,a:()=>r});var t=i(7294);const o={},c=t.createContext(o);function r(e){const n=t.useContext(c);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),t.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/aba5156d.6e6090a6.js b/assets/js/aba5156d.6e6090a6.js new file mode 100644 index 000000000..31d24dbac --- /dev/null +++ b/assets/js/aba5156d.6e6090a6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[8531],{344:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>s,contentTitle:()=>r,default:()=>h,frontMatter:()=>c,metadata:()=>a,toc:()=>l});var i=o(5893),t=o(1151);const c={sidebar_label:"Configure Wi-Fi",title:""},r=void 0,a={id:"wifi",title:"",description:"How to configure Wi-Fi",source:"@site/versioned_docs/version-1.3/wifi.md",sourceDirName:".",slug:"/wifi",permalink:"/wifi",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Configure Wi-Fi",title:""},sidebar:"docs",previous:{title:"Restore",permalink:"/restore"},next:{title:"Elemental behind proxy",permalink:"/elemental_behind_proxy"}},s={},l=[{value:"How to configure Wi-Fi",id:"how-to-configure-wi-fi",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h3:"h3",p:"p",pre:"pre",...(0,t.a)(),...e.components},{Head:o}=n;return o||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o,{children:(0,i.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/wifi"})}),"\n",(0,i.jsx)(n.h3,{id:"how-to-configure-wi-fi",children:"How to configure Wi-Fi"}),"\n",(0,i.jsxs)(n.admonition,{title:"important note",type:"caution",children:[(0,i.jsx)(n.p,{children:"This guide describes how to configure Wi-Fi on a freshly installed operating system.\nFor some reasons, like no wired network connection availabe, you may want to also use Wi-Fi when you boot from the ISO."}),(0,i.jsxs)(n.p,{children:["This is possible by using a cloud-config definition in the ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/seedimage-reference/",children:"SeedImage"})," resource.\nYou can refer to the same instructions as below on how to create it."]})]}),"\n",(0,i.jsx)(n.admonition,{title:"info",type:"info",children:(0,i.jsxs)(n.p,{children:["The information on this page is just a specific use case of using cloud-config. For more generic info on how to create arbitrary files check our ",(0,i.jsx)(n.a,{href:"/cloud-config-reference",children:"cloud-config"})," page"]})}),"\n",(0,i.jsxs)(n.p,{children:["Elemental Teal currently uses ",(0,i.jsx)(n.a,{href:"https://networkmanager.dev/",children:"NetworkManager"})," to manage network connections."]}),"\n",(0,i.jsxs)(n.p,{children:["In order to add Wi-Fi to your node, your registration should include a configuration in the ",(0,i.jsx)(n.a,{href:"/cloud-config-reference",children:"cloud-config"})," section to write a\n",(0,i.jsx)(n.code,{children:".connection"})," file so NetworkManager can connect to the Wi-Fi."]}),"\n",(0,i.jsxs)(n.p,{children:["A ",(0,i.jsx)(n.code,{children:".connection"})," file is a connection configuration file for NetworkManager.\nThe connection files are stored under ",(0,i.jsx)(n.code,{children:"/etc/NetworkManager/system-connections/"})," and can include ethernet, Wi-Fi, VPN and more."]}),"\n",(0,i.jsxs)(n.p,{children:["For example for a network with the SSID ",(0,i.jsx)(n.code,{children:"testSSID"})," and the WPA-PSK key ",(0,i.jsx)(n.code,{children:"123456789"})," and using the interface ",(0,i.jsx)(n.code,{children:"wlan0"})," you would write the following ",(0,i.jsx)(n.code,{children:".connection"})," file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[connection]\nid=testConnection\ntype=wifi\ninterface-name=wlan0\npermissions=\ntimestamp=1671549641\n\n[wifi]\nmac-address-blacklist=\nmode=infrastructure\nssid=testSSID\n\n[wifi-security]\nkey-mgmt=wpa-psk\npsk=123456789\n\n[ipv4]\ndns-search=\nmethod=auto\n\n[ipv6]\naddr-gen-mode=stable-privacy\ndns-search=\nmethod=auto\n\n[proxy]\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["To see all the configurations available for NetworkManager check ",(0,i.jsx)(n.a,{href:"https://networkmanager.dev/docs/api/latest/nm-settings-nmcli.html",children:"nm-settings"}),"\nwhich includes the format of the connection file and all the different options you can use."]})}),"\n",(0,i.jsxs)(n.p,{children:["Which we should encode to base64 and paste in the content in our ",(0,i.jsx)(n.a,{href:"/machineregistration-reference",children:"registration"})," cloud-config section as such:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="wifi cloud config" showLineNumbers',children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineName: name\n config:\n cloud-config:\n write_files:\n - encoding: b64\n content: W2Nvbm5lY3Rpb25dCmlkPXRlc3RDb25uZWN0aW9uCnR5cGU9d2lmaQppbnRlcmZhY2UtbmFtZT13bGFuMApwZXJtaXNzaW9ucz0KdGltZXN0YW1wPTE2NzE1NDk2NDEKClt3aWZpXQptYWMtYWRkcmVzcy1ibGFja2xpc3Q9Cm1vZGU9aW5mcmFzdHJ1Y3R1cmUKc3NpZD10ZXN0Cgpbd2lmaS1zZWN1cml0eV0Ka2V5LW1nbXQ9bm9uZQp3ZXAta2V5LXR5cGU9MQp3ZXAta2V5MD0xMjM0NTY3ODkxCgpbaXB2NF0KZG5zLXNlYXJjaD0KbWV0aG9kPWF1dG8KCltpcHY2XQphZGRyLWdlbi1tb2RlPXN0YWJsZS1wcml2YWN5CmRucy1zZWFyY2g9Cm1ldGhvZD1hdXRvCgpbcHJveHldCg==\n path: /etc/NetworkManager/system-connections/wifi1.connection\n"})}),"\n",(0,i.jsxs)(n.p,{children:["This would get the ",(0,i.jsx)(n.code,{children:"/etc/NetworkManager/system-connections/wifi1.connection"})," file deployed on the node during installation with the connection content and NetworkManager would\nread and enable the connection on boot."]})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,n,o)=>{o.d(n,{Z:()=>a,a:()=>r});var i=o(7294);const t={},c=i.createContext(t);function r(e){const n=i.useContext(c);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),i.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/acc249a7.afd79e0a.js b/assets/js/acc249a7.afd79e0a.js new file mode 100644 index 000000000..07881f171 --- /dev/null +++ b/assets/js/acc249a7.afd79e0a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[98],{5796:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var a=n(5893),i=n(1151);const r={sidebar_label:"How to use Elemental with Rancher and VMware",title:""},s="How to use Elemental with Rancher and VMware",l={id:"rancher-vmware",title:"",description:"Excerpt",source:"@site/versioned_docs/version-1.3/rancher-vmware.md",sourceDirName:".",slug:"/rancher-vmware",permalink:"/rancher-vmware",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"How to use Elemental with Rancher and VMware",title:""},sidebar:"docs",previous:{title:"Elemental behind proxy",permalink:"/elemental_behind_proxy"},next:{title:"Include cloud-config from removable devices",permalink:"/removable-device-cloudconfig"}},o={},c=[{value:"Excerpt",id:"excerpt",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"Part 1: Rancher Configuration",id:"part-1-rancher-configuration",level:2},{value:"1.1 Enable the extensions under Rancher configurations menu",id:"11-enable-the-extensions-under-rancher-configurations-menu",level:3},{value:"1.2 Install Elemental Plugin",id:"12-install-elemental-plugin",level:3},{value:"1.3 Install the elemental operator in Rancher cluster",id:"13-install-the-elemental-operator-in-rancher-cluster",level:3},{value:"Part 2: Create the Machine Registration Endpoint",id:"part-2-create-the-machine-registration-endpoint",level:2},{value:"Part 3: Create the ISO",id:"part-3-create-the-iso",level:2},{value:"Part 4: Boot the target device",id:"part-4-boot-the-target-device",level:2},{value:"4.1 Prepare the VM to emulate TPM",id:"41-prepare-the-vm-to-emulate-tpm",level:3},{value:"4.2 Boot the VM with the elemental ISO",id:"42-boot-the-vm-with-the-elemental-iso",level:3},{value:"Part 5: Create a cluster on the machine",id:"part-5-create-a-cluster-on-the-machine",level:2}];function d(e){const t={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components},{Head:r}=t;return r||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(r,{children:(0,a.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/rancher-vmware"})}),"\n",(0,a.jsx)(t.h1,{id:"how-to-use-elemental-with-rancher-and-vmware",children:"How to use Elemental with Rancher and VMware"}),"\n",(0,a.jsx)(t.h2,{id:"excerpt",children:"Excerpt"}),"\n",(0,a.jsx)(t.p,{children:"In this document we will see how we can enable elemental support in Rancher and then build iso and test it on a vm in VMware mimicking it for an edge device."}),"\n",(0,a.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsx)(t.li,{children:"Rancher 2.7 or higher installed and running."}),"\n",(0,a.jsx)(t.li,{children:"One Linux machine with docker installed."}),"\n"]}),"\n",(0,a.jsx)(t.h2,{id:"part-1-rancher-configuration",children:"Part 1: Rancher Configuration"}),"\n",(0,a.jsx)(t.h3,{id:"11-enable-the-extensions-under-rancher-configurations-menu",children:"1.1 Enable the extensions under Rancher configurations menu"}),"\n",(0,a.jsx)(t.p,{children:"Click on extensions under the configuration menu and enable it by hitting enable."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Enable extensions in Rancher",src:n(1663).Z+"",width:"323",height:"193"})}),"\n",(0,a.jsx)(t.p,{children:"Once you click on enable a dialogue box will pop up asking for confirmation and it will also notify you that the rancher extensions repository will be enabled, make sure it is checked and then confirm."}),"\n",(0,a.jsx)(t.h3,{id:"12-install-elemental-plugin",children:"1.2 Install Elemental Plugin"}),"\n",(0,a.jsx)(t.p,{children:"After the extensions are enabled under the available tab you should see elemental plugin available for installation."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental extension enabled",src:n(5550).Z+"",width:"770",height:"367"})}),"\n",(0,a.jsx)(t.p,{children:"Click on Install, this will again ask for a confirmation. Click on Install again to continue. Once the installation is finished it will ask to reload the tab. Reload it by hitting reload, post reloading you should see the elemental plugin under the installed tab."}),"\n",(0,a.jsx)(t.h3,{id:"13-install-the-elemental-operator-in-rancher-cluster",children:"1.3 Install the elemental operator in Rancher cluster"}),"\n",(0,a.jsx)(t.p,{children:"The next step is to install the elemental operator in Rancher Cluster. For that connect to the Rancher K8S cluster and enter the below command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental operator install",src:n(3667).Z+"",width:"2100",height:"527"})}),"\n",(0,a.jsx)(t.p,{children:"Once the command is successful validate whether the the pod is running before continuing"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl get pods -n cattle-elemental-system\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental operator pod",src:n(9609).Z+"",width:"817",height:"120"})}),"\n",(0,a.jsx)(t.p,{children:'This will enable the "OS Management" sub menu under the "Global Apps" menu.'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"OS Management menu",src:n(6651).Z+"",width:"433",height:"272"})}),"\n",(0,a.jsx)(t.p,{children:"The OS Management dashboard at this point should have nothing in it."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"OS Management dashboard",src:n(3714).Z+"",width:"2546",height:"913"})}),"\n",(0,a.jsx)(t.p,{children:"At this point we are ready to proceed with the next step, that is to prepare the ISO."}),"\n",(0,a.jsx)(t.h2,{id:"part-2-create-the-machine-registration-endpoint",children:"Part 2: Create the Machine Registration Endpoint"}),"\n",(0,a.jsx)(t.p,{children:"In the OS Management dashboard hit the create registration endpoint button."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"OS Management registration endpoints",src:n(9230).Z+"",width:"757",height:"404"})}),"\n",(0,a.jsx)(t.p,{children:"Now here either you can enter each detail in its respective places or you can edit this as yaml and create the endpoint in one go. Here we will edit this as yaml."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: elemental-cls1\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n registration:\n emulate-tpm: true\n emulated-tpm-seed: 1\n machineName:\n machineInventoryLabels:\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'})}),"\n",(0,a.jsx)(t.p,{children:"Remove the existing content and enter this code snippet and click on save. Remember to modify this as per your need."}),"\n",(0,a.jsxs)(t.admonition,{title:"main options",type:"info",children:[(0,a.jsx)(t.p,{children:'name: elemental-cls1 --\x3e "Change this as per your need"'}),(0,a.jsx)(t.p,{children:'device: /dev/sda --\x3e Make sure your target device is "sda" otherwise find out and change the naming convention here, for example in raspberry pi it could be "mmblk---"'}),(0,a.jsx)(t.p,{children:"emulate-tpm: true --\x3e Use this only if your target device doesnt have a tpm device and you have a way of emulating tpm like in VMware or KVM"}),(0,a.jsx)(t.p,{children:"emulated-tpm-seed: 1 --\x3e increase this by 1 for every new machine. --\x3e If this is not given each machine will recieve the same tpm hash so at any point in time regardless of how many machines you boot it wont show up under the machine inventory."})]}),"\n",(0,a.jsx)(t.admonition,{title:"attention",type:"danger",children:(0,a.jsx)(t.p,{children:"Emulate TPM is only for non-production usage like for testing as it beats the purpose of security. So in production usage use the code above without the emulate-tpm and emulate-tpm-seed"})}),"\n",(0,a.jsx)(t.p,{children:"Once you create the machine registration end point it should show up as active."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Machine registered in Registration Endpoints",src:n(1314).Z+"",width:"559",height:"464"})}),"\n",(0,a.jsx)(t.p,{children:"Next click on it to view the registration url and download the initial-registration yaml."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Initial registration URL",src:n(1325).Z+"",width:"1454",height:"611"})}),"\n",(0,a.jsx)(t.p,{children:'Hit the download button, this will download the "initial-registration.yaml" file on to your local system.'}),"\n",(0,a.jsx)(t.p,{children:"The registration yaml looks something like this:"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Example of initial registration YAML",src:n(5832).Z+"",width:"947",height:"384"})}),"\n",(0,a.jsx)(t.p,{children:"We will use this file and inject its content into our vanilla elemental iso."}),"\n",(0,a.jsx)(t.h2,{id:"part-3-create-the-iso",children:"Part 3: Create the ISO"}),"\n",(0,a.jsx)(t.p,{children:"Make sure you have initial-registration.yaml in the system where you will create the iso in this we will use a Linux vm."}),"\n",(0,a.jsx)(t.p,{children:"Create a directory to keep everything:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"mkdir /home/tux/elemental-demo && cd /home/tux/elemental-demo\n"})}),"\n",(0,a.jsx)(t.p,{children:"Create a file and copy the contents of the initial-registration.yaml in it."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"vim initial-registration.yaml\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create file with initial registration YAML",src:n(4953).Z+"",width:"1105",height:"441"})}),"\n",(0,a.jsx)(t.p,{children:"Next download the script to download the iso and inject the registration.yaml in the iso and make it executable"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://raw.githubusercontent.com/rancher/elemental/main/.github/elemental-iso-add-registration && chmod +x elemental-iso-add-registration\n"})}),"\n",(0,a.jsx)(t.p,{children:"Next execute the script and pass the initial-registration.yaml as an argument"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"./elemental-iso-add-registration initial-registration.yaml\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create ISO with the initial registration options",src:n(5790).Z+"",width:"1654",height:"1206"})}),"\n",(0,a.jsx)(t.p,{children:"This command will download the vanilla iso and inject it with the parameters of initial-registration.yaml and create a final iso for you to boot your end device."}),"\n",(0,a.jsxs)(t.admonition,{type:"note",children:[(0,a.jsx)(t.p,{children:"If you would like to download the vanilla ISO and reuse it later to create additional ISO's, then you can download the iso separately using the below command and then pass the local file path as an argument to the script"}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable:/Teal53/media/iso/elemental-teal.x86_64.iso \n\n./elemental-iso-add-registration initial-registration.yaml /home/elemental-iso/elemental-teal.x86_64.iso\n"})})]}),"\n",(0,a.jsx)(t.h2,{id:"part-4-boot-the-target-device",children:"Part 4: Boot the target device"}),"\n",(0,a.jsx)(t.p,{children:"Now ideally you would just burn the iso to a usb drive and boot your edge device using the usb device and once it boots and become active in Rancher under machine inventory you can select and create a cluster from it, however here we will use a vm to mimic an edge device for testing."}),"\n",(0,a.jsx)(t.h3,{id:"41-prepare-the-vm-to-emulate-tpm",children:"4.1 Prepare the VM to emulate TPM"}),"\n",(0,a.jsx)(t.p,{children:"In VMware workstation create a vm the way you would do normally, make sure to give the HDD size at least 40 GB."}),"\n",(0,a.jsx)(t.p,{children:'Now edit the machine settings and go to the "Options" tab. The very last option would be "Advanced".'}),"\n",(0,a.jsx)(t.p,{children:'Click on "advanced" and on the right window pane change the firmware type from "BIOS" to "UEFI" and check the "Enable secure boot" option as follow:'}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Default settings with BIOS selected"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"VM boot options with BIOS",src:n(9199).Z+"",width:"709",height:"218"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Updated settings with UEFI selected and secure boot enabled"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"VM boot options with UEFI",src:n(7812).Z+"",width:"684",height:"208"})}),"\n",(0,a.jsx)(t.p,{children:'Now on the same "Options" tab click on the "Access Control" option and click on "Encrypt" on the right side.'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Access control menu",src:n(3938).Z+"",width:"242",height:"28"})}),"\n",(0,a.jsx)(t.p,{children:'This will ask you to enter a password to encrypt the machine. Enter a password and click on "Encrypt"'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Access control encryption credentials",src:n(8546).Z+"",width:"352",height:"431"})}),"\n",(0,a.jsx)(t.p,{children:'This is important to add the TPM Hardware. Next go back to the Hardware options and click on "Add"'}),"\n",(0,a.jsx)(t.p,{children:'And add the TPM (Trusted Platform Module) hardware and click on "Finish"'}),"\n",(0,a.jsx)(t.p,{children:"Now with the completion of this step our VM is ready."}),"\n",(0,a.jsx)(t.h3,{id:"42-boot-the-vm-with-the-elemental-iso",children:"4.2 Boot the VM with the elemental ISO"}),"\n",(0,a.jsx)(t.p,{children:"Next add the ISO that we created earlier in the VM and boot it up."}),"\n",(0,a.jsx)(t.p,{children:"It should boot up with the ISO and start installing Elemental:"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental OS install grub menu",src:n(5017).Z+"",width:"677",height:"451"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental OS install logs",src:n(454).Z+"",width:"1052",height:"281"})}),"\n",(0,a.jsx)(t.p,{children:"And once it is complete it will reboot the VM and it should show up as active under the machine inventory in Rancher as follow:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Machine inventory status while booting"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Machine inventory status during boot",src:n(4578).Z+"",width:"612",height:"159"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Machine inventory status after boot completed"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Machine inventory status after boot complete",src:n(8571).Z+"",width:"622",height:"112"})}),"\n",(0,a.jsx)(t.h2,{id:"part-5-create-a-cluster-on-the-machine",children:"Part 5: Create a cluster on the machine"}),"\n",(0,a.jsx)(t.p,{children:'Once the machine shows up as active, select it and hit "Create Elemental Cluster".'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create Elemental cluster",src:n(7719).Z+"",width:"811",height:"398"})}),"\n",(0,a.jsx)(t.p,{children:"At this stage you get a pretty familiar page of creating a cluster in Rancher."}),"\n",(0,a.jsx)(t.p,{children:'Give the cluster a name select the Kubernetes version and hit "Create".'}),"\n",(0,a.jsx)(t.p,{children:"For this we have selected to create a K3S cluster."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental cluster configuration",src:n(521).Z+"",width:"2294",height:"1224"})}),"\n",(0,a.jsx)(t.p,{children:"Now under the Cluster Management page the cluster should show up as creating:"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental cluster provisioning",src:n(6401).Z+"",width:"793",height:"279"})}),"\n",(0,a.jsx)(t.p,{children:'And once the cluster is fully provisioned it should be active with provider type as "Elemental".'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental cluster created",src:n(9132).Z+"",width:"2279",height:"242"})}),"\n",(0,a.jsx)(t.p,{children:"Now you can start deploying application on this cluster the normal way."})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8546:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-access-control-encrypt-60a89768dd80961e42f48b1717f607cb.png"},3938:(e,t,n)=>{n.d(t,{Z:()=>a});const a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPIAAAAcCAIAAADURHUBAAAGgklEQVR4nO2bQWwaRxSG/21SUCwtlaotXZWTLUhpiOEMPtmqrAIXR5Ecu4rk9rI0J7Aqt6VKpCiKiqo0Ak6tuSStrJpEiuKLQXId+2SqqifcotIuik9IGG8ii5XsQGzRA+yyu2CDE7Ax2e/E23lv5s2bp5k3C+BWIFQ+gE8mmdab2KAd9iArCvYgywbtYGKy1hgD4ZGgyVSNKjYVVZmKtLFOv9Zh1U4c2l7Tg2Bb7bnaeoCtYkSVU8hZtAmjL8HCYSKmK6I9yBqNxl+CDhNBALAzjB0AnLOs8KiilPgQ01Uje5BNGAH4bjCEi4jYg2zCZwSATMhhmv4dMBH/xMpjcn0jah0ysbITmX8r3twYJCp6wtCAUeiZYYCP5M5IbFVOP8StQOjGN96Gbc5PPYdYxn+d7YxLKiqvy2G7tZq4KqeUt07aARWV9qOmtUoP0oYrI+FPv34nKiptpHFam67dO9yM/fHzDjijotIeDtytD0ncpkmvonKyvEptrW7VKl1Ok9r6Da1GaIqdxFSQS5y0I73D8Ya0+ZXxKNWIJjQ94AU3dAze2wzlCbL6OZUl5viWrE5hvrIBM1afmpZKwKH+n9TUujKkbX3BR+vc4OMgx+l29lqPY7S/PAGPP03404Q/7YGO6eyAJ0qeZy2GUIdD2mMc/QXf+vKj7LsgiMsfPFNs5A4riVR2QT8wY9X4ciUAABkLGJwAgHg07UrKxU2K9VJGACiGwxu+HByj/WvDWgDIc0NBDnJR2A804xaEw9mIMG5kLgsAtNgb7/FnIzTFTmJxi/JaxNE1oUnKqMdagMqkeLxXXNyivBZBWWp75KB0lOLtFax9TPqkJ5LSYcnUxK1dplYMhzd8qI8JZGu0ypksEMKydWF64PyKqEP9F+XdI1oWpFMvmsvHXdcpFlTiAJDnOh+rKkdM6/L+4039ZacVwOPf1i+V90GcEdo04xYszpci7/OzIzrHEpeAJjRtQDRNJKsKcpGMBbR3/OkIKgcZ9XAePw+XPP6NCMBcNVykqRmpCFTTmta59aU7OYVnZMxLsdG0KQnHaP/aVTKyDOip8ytpYg6wGcojlCPJ+eY5d+XEpCnWK7Q2tO0qklnPoDlmS7s2K3Kdw3N8bWo1MzLmVUa4LiaFcemi0BQ7LIYFWOHLgySSPGw6Z4pzbWrdes1/4bQrVykCDUwyKxm3bkGDxeuCn5Va5dg4YloXnl0qPQGsAC6VnqBA4x19tYnWucFP5YBcIT5BjdNcAjo3uKkkJApSUWsCORswC7874S/mCiyo2YAB/mxkLguQYzJRQr74t8IxWmvKVztPrPMZr45ZLiLP3a4Mt1nM1M9FbG1o22VElrmZScoxD6CRw+AbnDD1EUZdTBSLAklYACQL8QkdAx6DZPyvLKBFnn+YE5uoC9LSqH44GqKfx8zR0vr7u/f3SsW3//wBwMsXu2f/uP/1ra8qTQ4radRr1wJURTRZNb71Zt3llZfLiD8NkLGAeRa8x591ycXqyuWKrJ4ap7mEcsPuaXLcVKr/urW1m7GIIsI0NXM0e34hZRizkbDwC3NA0/r+dYdrGwdeGRu+2tstbL98sbuz/Xxn+/nLF7u7hW2xadyijUerdzgiyhstOkeusAjquk3QUIpFVi8RAdBUbFQD8C7/03Bec8EmF2sx5W+vwus1iNdE5qqBkfTmsJLGVOHA+livvah40rrtiZJY4jBMGXGww4qp1Ue4HsWi1BFZ5kwTBtPqljImNp1T3Lkr49YPlyuy+ur7A4eVNLYwx3bReLd+hbfRsrMsWa1DfPMc6zWXJ4DKDUMhhmsi8txQsAjvQHkYADKrT01JbSwgESV7c2JpYwj9a+J5l8oS4CO13niPnwetbeBljruTMs8GzDMpHhArDd7Viu3Jw7uifHkEDRyGZGq1KyOvjPB8fZ8l2Rqt1t3qcoXFPIl14Q6qp4QDmff4uYRiXOWCcq6oruw1e4FMim9QB3aMw/5GAMB07Z40xW/6vlUo3Ax9p/7UqZexGcojxWpp0ZWvqBvSvLYWq5He/EJR5VCYQTK+ku3+PFbQZLduqQt1t1bpMtS/Eaj0IA2KkPsPFh4tLu3t7Tc3Pnvmsnu0HBjrgGMqKq9Og7R+tLj04Ke7fX3nmhrv7Oxe+eLLz66oaa3SXTQoQvb29lvJaQB9feda2dRVVI4ZtbZW6UHe1LTOhByO0HF+QfBGEPcQBEEQhCcu/3zs/A8CtQt0OqppGQAAAABJRU5ErkJggg=="},7719:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-create-8d06bbcd84075d084212bc3d049dfbbc.png"},9132:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-created-39460fab3f9c3863673be51507d2d22d.png"},6401:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-provisioning-b1a441f0c9dd8db3af090c57bf8b216c.png"},521:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-template-71f1e521ea8047e899ec3b0f9e48225b.png"},5017:(e,t,n)=>{n.d(t,{Z:()=>a});const a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqUAAAHDCAIAAACS//S/AAAT3klEQVR4nO3dXbqjqBoGULufHmyGlOGei3R7LBUERcXPta5SlhsQ0de/mGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA4/66uwHQke/3O37+fD7jlN/n6T9T0/eVP1VS73L+F5p1RUk/jH8ym3m5XiCev+9uAPRizNRlEi9TtlX5Y7qs1rtUO//tvt/vGS2cdmZhP0w7fLlyp0VBSPIehmEtfVdnOK98qtRm87T/p5FfeGEGAvjn7gZAp87OgJdkzEsWE/on7+GNlhe3Z88KjGbzLG+BZ+6jr94vry0faML1fNh2wZ3y8T53Yc7Vzl/ejGHtvvj4eTY9fx89dVukvPyqNpfPvJw4KqwUHsf5PfwhFVerz8Y3LD81JWUMxV9GHm9YlVSN17ekyUHP9FrFLf0JF5D38IezT+UzX8PrJ2zKF39s9nTKOY1asSPse+heuIW8h1KtTvH7tztBrzxk8Wg9VHH/HnrxiO/Td0LYQy15D8Nw32X8u0xv/w/p4Nx8hK2fZ9xmzVi9y+A797yZ9+nC/6USYvbds9XwLsmPzPt0Vx9WX5bf9n26q8m3WW/J/Mv/2vz+XuYrgqmWzyyrTjV18/uBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENdf11f5/X6vrxQAHu3z+Rz5839ataPWwXYDwEs0OU/++3gRAEDn5D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQ323v2xl53R4ALLV9MZ3zewCIT94DQHz3X89PWb2OMV78H//3+tsBn8+nvNLydi6X9+CiNWnnjf0MQEP9nt+PAfP9fpdhc1f81N5NKW/ndDFXF7lKq3aKeYAY+s37GcEDALs9Ju8HkQ8Ae3Vx//538fn7/Y4fljOUhP3sIvbvT6Z3oGflZ+YfZ16WM51nWU7zg5JUe/Ltv76dAPSsi/P7WdDO/rfwVvT45+PN79Qf/qan5h8/L6en7q+XVLpbqj2Z9t/STgB6dv/5/Sx4lqk/PbVtWFEwztcByLg/75dX3VPzlEiF+u+gYXno8Nwjid+yVF2ij33EA0DG/Xk//HmLuupb40u1f3v8tHh2F+BgaVWmjd/suhvbCcDtusj76f3mzGwHDwUA4LW6eF6vRO0p6exa9+3zN1fYgNvbCUAP+s37MaVWE2v6v78P45Xqcf78xYDa+Wd/NX6elpP6RtxQcLwyXcySkM63v1U7y9sPQM/+ur7Kkgf0AODllie0R0rr9/weAGhF3gNAfPIeAOK7//t4HgQDgLM5vweA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+P65q+Lv93tX1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwLq/7m7A6b7f7zAMn89n9Z9tK5oW+6vopLrOcFKDb++H2Xq5rNLfh+NVH2x/q5Zcth5vWV/lrunP47VsllDbz7dvyBz3990NCGLcGEaP2ypOavC9/bBcL9dotdTH27/Zku/3W1LLNevxgvVVuLwp1/Rn5n+blL+jBx63Q2NJ3gNAfP/c3QBKdXKdc/XMoLxh591PYZ+3rYuzl/fp5RPYq/N+Fl2ze/zL6ZuFrIbZ8r5XVfnTPymM/Gn5ywcXVu/DXXPde/VZillTM89btFovtf3fZJzUlrM5rlYLzzynkl/vmcGwOZ7zTZqVkxqHqeXNz1/7XM6O5d1XVGpi4XrZXelm+fu2i7vui9HWe6/nj2P9Z5ySmp4yzjb7PJtnd/k7rBY+/nP5X1Xn3MvZqvaPyx10YT+0Wi+t6j27nJJxVWvZzmWxJct1ZHlT4zC1vJlxu8O+5c2XVt6fqQ2tvN7j5e/YLlyTC+PV5/dT543m4yXPDsnbNvXKjblhLXftfc6ut7dxmAqPu/TT/61a0s8SrRL2kbw373+Hw6lj87OvX51a/tmN/yRuCmxaHqxUnUtl1td52o6TC66LNj8iPKL/68B3jas+9b++OOK9eT8sdtzTHWU/B93LLTC/Q8/c8L7XuGOdNr6qnzPr61QNx8nbsuQRy3vXuOrQaxf8Jd57/54jfvsFe4feTJ8JAJh67/l91QO9tafjDefvNlN3NGz1FP9nsx8O3kfc/ecXj5Pa6UvTuy3Htbp9e/Z2tNvL708fH28v78Bnif8+3aH++1Sp6YW1zK6lzx6O3V1+uWnVy3o329O2STv6ofCB8H3rZUc5O8bJ6v3gfeOt/FGJsW9XO3nZ/1XtzJeTaU+q/FQ5qe1oWd2OcVu1XvIlnNqfJc+LHFxf5dtFvp/lPdDG7FkqWPWIcXJ2Ix/RCdzI/Xv65dSBEj2PExlPP15xPZ8HOftmBzE8aJxkbkk8onwAAAAAAMJzdxn64Xk9oCMOEeAk8Z/XO/XL5Vc6+zWfB8sv/5r4Se2Zzd+8PVUa1r6jHwqrbvv+iXwtp76x6uzt4veh/H0Pzx23Fwi/gD2Lf34/fdV5h2+VL3R2m4+X33brrW1Pb0d1DQ96Tqp6jNXZdpGavttYzhku2JZTjV+9DvH0cXuB8AvYs/h5DzxFz9+kh6d77/vzgd48KOkf1FT4eW/ez142Phx4z3mT97Gn2jOdOfOS7c1yShpTUv6mg/2ZaU9t+2vbU1LFZeXsWy9N7sv8rlT/ij37/TC7q2g4bnf0Z35QPXHcTqubtic1fVbO8scRVvc/q/35oFcnPV385/WG9O9zrH5eHdM7ppc0prBtq8XuK6ewVSUNyBdysN+aPOS1uqtqtb6OrKAj/VCy3mtXVuqfm4XscHBF50vbUf7u/iyfWNX+4aZxu6w0/7mkrtTnqh0dDb3o/D6/C6sdYan5exupvbXnem174Oz+bJh8x5sxPdF/m9uD565xu3lJY5/C/nznYLvMi/K+aiQtB/d4nXNWYGp6bfn7tCrnbcr7Lb9+a/v/Wet9dm2/od7GbW/tSTm7nb81Pj2Vz0xv0ph9+0/2eVHeV9m8BjDdD6am15bfqp1squq3zPptdVmo1tPXe2/t7609Kf20c3lNfrcd+0/28X084P9mJ1tAGPJ+w7j7S+0HD+4fa//8pGY0L6eVVv2ze/7CAs9ej2ev93Jta+xt3N5VTm/zX6bbhoUU//n81J2hzB2j2fhbPrRcOL2kSctyUs/Vj3+VrzezXIWtOmm5yqen2lNY+6wfUs8Jp+rNlFze/tW10KofCstZFjVzpD1HrrjW9n9haWeP29R/xRi3Y0XfyX362YfVR+tns622OXXZf99yAXAFJ2QAEJywBwAAAAAAAHgX94kB2vL9e4JwiACQ8aLv39d+rXP3F9n32d3OTIGP/iZr7fe8983/8+iOOknVgGw+endbPebb/J73jsFw1/b19O2aG8U/v9+3bYzh0eQF0SXabsOZBj/lPHjs/DNcv34fZ/dPDMxcPN6mP22wTPTPf4bJSt8xGO4aMIEH6lP2S48WP++POzV4aOLIS9+s38AKX0K3+weQ4EH8Pt7rhNyjhVyoGG5fNXf9hiFVdPsFXpT3J71ne/ai6SPl17Zz8/355S/hz7d/9n7szZYv27Nafq2z37Pdqv21N4P3rd/Cl5mn2pNfrlZXVveNt2V7dtc+PXH/XTH+TWkyCDP9vFlFbT+k6t38nHohf+F43lFOfjsaFv02rI2THeV4D/+m+M/rDdnNYLkbGrb2j5kyC8tv0s58+ZnqUhtbpt7axpf0T6ao2vL3FfWze/3uaHPJPIXrvfxzSV2pz00Wdsd4y5RW3pKf1R44XlF+oQqL3dEPhZ2Z/68jm/bu/d5mpYULXrggR8ZPYC86vy9Xu6eb/e0JLYqjVf8cKafn9VtefuoU/OCp+eaR4lTPo3163DOdOPz3aFhXje9nXPVZfq3e2tOJt+f9wZ3j7eXToQtW+ufP3yfNT2/Vngv2oW27LtXgz5/X9jv09P3G9e0f1+l0ysVt6N/b8/5th72cLXVj6C69tSfP9vLz9H64pf2z2xw9H8/dxffxgMh+Rzmzk7/N+SEeef+v8t1Bn+X3Vu/ZLFdsy37Y1zObfzK78lFbxV37jaeMk7Gd0ycnhhMuADylQ+71oufzR5vf30jdBFqdP3PHKFX+Ge3M1J5ahMLneA+2v+Edtdr2lJRzZP1ull/4YGDV+p0+qDwtPzU9057C9V6y4CVdenC8FebE6k5/s/yDa3m16vKVXrXfyNS7HA+ZEmqfz5+Vtq/9qeoy4yQzPTXOV1sFFHHsDK9l8w/D9XzW2cgBInnF9Xz2aXgpHngiOwEAAAAAAAAAAAAAAAAAAAAglvjv28m8zHzz/eSr04fiV3kDQCfe+D7d73+/jzkMw+c/wyLRZ9MB4LlelPdiG4DXekve/87UV3+H0Q/DABDeP3c34GbuwQPwBm85vweAN5P3/zp+Vd99AQC69d68H5+9H3M6f21/Or/n9gEAAAAAAAAAAAAAAAAAAKLp9/dwl99un33r/eCrcK8p53gtmyWM7wNoVeBBte05VWphyzvh7O66zNvGyanlHx9X15juRTtpEjd63vt2Wo3akh19yRt1St7Sc175O975c/ZO9rzCN6tOHSMulXdCjL3k28ZJpvwm78E8Pq42NXnj5/DnT37zcl3n/ThGDVaAciXvDOVt+v19vNlIvX7gnl2jTbEt/UmJp4yTp7STB+k37zctb5XNLn8VbjCrt9w2Jy4Pn6tu3R0vf7qws5kz/VB1hXC1nLGuwvbk55+1OX/7IzP/BfdNj4+3fH9O51n9gYZ8vat9Plw+TjILsq89mY0iU+9q+UNinJT088Hnb8rHeaqdqe1od5NGDizeo+vr+Zume4TlzaryfdZy/uU2MC0/tdGW13u8/Ok9uennTD9UXeJLlTN+Xk5fbU9q/rYu2GfN2l873jb7c3XKcv7aes8eJ1WN2deemWngLWdOlT9OWS0tU9R5gzZj2c5929F3Ypwy3Lpo3OjB5/etdvG9lXNS+Z3cz7u9AR36fD7jHrm2f5r3ZyfjZOmaWOpwwY+YHk59176wEGx5yXtw3q9yrPrTqh867M/V3dZdavvn7PlrNSn/gkHyOyT6TK5mX1Bvh4P/uOnB5TjlxvZwpWh5b+z+POWixdM1OR2f3pqdHc10ftFoyD5wcKqz671ruS4wXemp835Cevb9e95meg8bgHJh8352zSq81PK26ofacs7r/z7PRXb3z/Q8MnM22Wr9nj1Oap1dbz/jthObCxi+B96s3/fpDlvft5nuHFd3lPlgyJSzWfXyD6vKaVj+coZUOcvpQ3EXrZZT2J7MncJ97flkv6x4cHqm3uX8VeMtNf/qgMmP583p+S46b5zM6m3SnulKP1j+kFjvO/rzyHY9VA6Vwu0uX0imPatbZZ9H1XCD3k5KAnjhIvNCxjk3Cns9vzkZfx6nFLyBcc69ur6e35uqi8Adlt+V2ovh8ETGOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADzN/wCwXEkY4Glz7QAAAABJRU5ErkJggg=="},454:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-install-logs-a0fe1cb2f06bd446319ea8755907dcba.png"},3667:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-operator-install-ead7a27570833aea52fc48bf864e7458.png"},9609:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-operator-pod-5cf9077cbdd41cc2ea98372e615773e3.png"},5550:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-extension-enabled-c4e29279c65407712c74245a906fe8f1.png"},1663:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-extensions-menu-3417b5f0744722377d8b9e1826abc4f8.png"},5832:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-initial-registration-url-yaml-2976a9c6180726ebb308057cb33ae38f.png"},1325:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-initial-registration-url-0c8db5dad180464052c36f376b17c8e3.png"},4953:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-initial-registration-yaml-61b7ae494fd22967d770b3124dd1da9b.png"},5790:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-iso-create-94c20367fff7dd76b113c5f2e046fd69.png"},8571:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-machine-inventory-status-boot-complete-401945492ded59c3f4f94e8dc7ecc419.png"},4578:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-machine-inventory-status-booting-fba3e4b35fc4b52b43fa92dc00f14d28.png"},1314:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-machine-registered-fa33715b7ace60ba91c3ab12694be684.png"},3714:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-osmanagement-dashboard-5ec27221ddfdd9d63f846c6370847cbd.png"},6651:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-osmanagement-menu-18bc9bca56db4f66db675cb679e6ada9.png"},9230:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-registration-endpoints-040525e42e8fcfde1c35a85e44b1bc32.png"},9199:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-vm-boot-bios-28b0123c0fbaf64ff7fe1f5634b0f1ae.png"},7812:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-vm-boot-uefi-ca7f800f1c8469b9c1477f78b6ca22e5.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>s});var a=n(7294);const i={},r=a.createContext(i);function s(e){const t=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),a.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/acc249a7.cc1e5360.js b/assets/js/acc249a7.cc1e5360.js deleted file mode 100644 index 8c8028332..000000000 --- a/assets/js/acc249a7.cc1e5360.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[98],{5796:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var a=n(5893),i=n(1151);const r={sidebar_label:"How to use Elemental with Rancher and VMware",title:""},s="How to use Elemental with Rancher and VMware",l={id:"rancher-vmware",title:"",description:"Excerpt",source:"@site/versioned_docs/version-1.3/rancher-vmware.md",sourceDirName:".",slug:"/rancher-vmware",permalink:"/rancher-vmware",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"How to use Elemental with Rancher and VMware",title:""},sidebar:"docs",previous:{title:"Elemental behind proxy",permalink:"/elemental_behind_proxy"},next:{title:"Include cloud-config from removable devices",permalink:"/removable-device-cloudconfig"}},o={},c=[{value:"Excerpt",id:"excerpt",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"Part 1: Rancher Configuration",id:"part-1-rancher-configuration",level:2},{value:"1.1 Enable the extensions under Rancher configurations menu",id:"11-enable-the-extensions-under-rancher-configurations-menu",level:3},{value:"1.2 Install Elemental Plugin",id:"12-install-elemental-plugin",level:3},{value:"1.3 Install the elemental operator in Rancher cluster",id:"13-install-the-elemental-operator-in-rancher-cluster",level:3},{value:"Part 2: Create the Machine Registration Endpoint",id:"part-2-create-the-machine-registration-endpoint",level:2},{value:"Part 3: Create the ISO",id:"part-3-create-the-iso",level:2},{value:"Part 4: Boot the target device",id:"part-4-boot-the-target-device",level:2},{value:"4.1 Prepare the VM to emulate TPM",id:"41-prepare-the-vm-to-emulate-tpm",level:3},{value:"4.2 Boot the VM with the elemental ISO",id:"42-boot-the-vm-with-the-elemental-iso",level:3},{value:"Part 5: Create a cluster on the machine",id:"part-5-create-a-cluster-on-the-machine",level:2}];function d(e){const t={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h1,{id:"how-to-use-elemental-with-rancher-and-vmware",children:"How to use Elemental with Rancher and VMware"}),"\n",(0,a.jsx)(t.h2,{id:"excerpt",children:"Excerpt"}),"\n",(0,a.jsx)(t.p,{children:"In this document we will see how we can enable elemental support in Rancher and then build iso and test it on a vm in VMware mimicking it for an edge device."}),"\n",(0,a.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsx)(t.li,{children:"Rancher 2.7 or higher installed and running."}),"\n",(0,a.jsx)(t.li,{children:"One Linux machine with docker installed."}),"\n"]}),"\n",(0,a.jsx)(t.h2,{id:"part-1-rancher-configuration",children:"Part 1: Rancher Configuration"}),"\n",(0,a.jsx)(t.h3,{id:"11-enable-the-extensions-under-rancher-configurations-menu",children:"1.1 Enable the extensions under Rancher configurations menu"}),"\n",(0,a.jsx)(t.p,{children:"Click on extensions under the configuration menu and enable it by hitting enable."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Enable extensions in Rancher",src:n(1663).Z+"",width:"323",height:"193"})}),"\n",(0,a.jsx)(t.p,{children:"Once you click on enable a dialogue box will pop up asking for confirmation and it will also notify you that the rancher extensions repository will be enabled, make sure it is checked and then confirm."}),"\n",(0,a.jsx)(t.h3,{id:"12-install-elemental-plugin",children:"1.2 Install Elemental Plugin"}),"\n",(0,a.jsx)(t.p,{children:"After the extensions are enabled under the available tab you should see elemental plugin available for installation."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental extension enabled",src:n(5550).Z+"",width:"770",height:"367"})}),"\n",(0,a.jsx)(t.p,{children:"Click on Install, this will again ask for a confirmation. Click on Install again to continue. Once the installation is finished it will ask to reload the tab. Reload it by hitting reload, post reloading you should see the elemental plugin under the installed tab."}),"\n",(0,a.jsx)(t.h3,{id:"13-install-the-elemental-operator-in-rancher-cluster",children:"1.3 Install the elemental operator in Rancher cluster"}),"\n",(0,a.jsx)(t.p,{children:"The next step is to install the elemental operator in Rancher Cluster. For that connect to the Rancher K8S cluster and enter the below command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental operator install",src:n(3667).Z+"",width:"2100",height:"527"})}),"\n",(0,a.jsx)(t.p,{children:"Once the command is successful validate whether the the pod is running before continuing"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl get pods -n cattle-elemental-system\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental operator pod",src:n(9609).Z+"",width:"817",height:"120"})}),"\n",(0,a.jsx)(t.p,{children:'This will enable the "OS Management" sub menu under the "Global Apps" menu.'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"OS Management menu",src:n(6651).Z+"",width:"433",height:"272"})}),"\n",(0,a.jsx)(t.p,{children:"The OS Management dashboard at this point should have nothing in it."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"OS Management dashboard",src:n(3714).Z+"",width:"2546",height:"913"})}),"\n",(0,a.jsx)(t.p,{children:"At this point we are ready to proceed with the next step, that is to prepare the ISO."}),"\n",(0,a.jsx)(t.h2,{id:"part-2-create-the-machine-registration-endpoint",children:"Part 2: Create the Machine Registration Endpoint"}),"\n",(0,a.jsx)(t.p,{children:"In the OS Management dashboard hit the create registration endpoint button."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"OS Management registration endpoints",src:n(9230).Z+"",width:"757",height:"404"})}),"\n",(0,a.jsx)(t.p,{children:"Now here either you can enter each detail in its respective places or you can edit this as yaml and create the endpoint in one go. Here we will edit this as yaml."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: elemental-cls1\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n registration:\n emulate-tpm: true\n emulated-tpm-seed: 1\n machineName:\n machineInventoryLabels:\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'})}),"\n",(0,a.jsx)(t.p,{children:"Remove the existing content and enter this code snippet and click on save. Remember to modify this as per your need."}),"\n",(0,a.jsxs)(t.admonition,{title:"main options",type:"info",children:[(0,a.jsx)(t.p,{children:'name: elemental-cls1 --\x3e "Change this as per your need"'}),(0,a.jsx)(t.p,{children:'device: /dev/sda --\x3e Make sure your target device is "sda" otherwise find out and change the naming convention here, for example in raspberry pi it could be "mmblk---"'}),(0,a.jsx)(t.p,{children:"emulate-tpm: true --\x3e Use this only if your target device doesnt have a tpm device and you have a way of emulating tpm like in VMware or KVM"}),(0,a.jsx)(t.p,{children:"emulated-tpm-seed: 1 --\x3e increase this by 1 for every new machine. --\x3e If this is not given each machine will recieve the same tpm hash so at any point in time regardless of how many machines you boot it wont show up under the machine inventory."})]}),"\n",(0,a.jsx)(t.admonition,{title:"attention",type:"danger",children:(0,a.jsx)(t.p,{children:"Emulate TPM is only for non-production usage like for testing as it beats the purpose of security. So in production usage use the code above without the emulate-tpm and emulate-tpm-seed"})}),"\n",(0,a.jsx)(t.p,{children:"Once you create the machine registration end point it should show up as active."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Machine registered in Registration Endpoints",src:n(1314).Z+"",width:"559",height:"464"})}),"\n",(0,a.jsx)(t.p,{children:"Next click on it to view the registration url and download the initial-registration yaml."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Initial registration URL",src:n(1325).Z+"",width:"1454",height:"611"})}),"\n",(0,a.jsx)(t.p,{children:'Hit the download button, this will download the "initial-registration.yaml" file on to your local system.'}),"\n",(0,a.jsx)(t.p,{children:"The registration yaml looks something like this:"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Example of initial registration YAML",src:n(5832).Z+"",width:"947",height:"384"})}),"\n",(0,a.jsx)(t.p,{children:"We will use this file and inject its content into our vanilla elemental iso."}),"\n",(0,a.jsx)(t.h2,{id:"part-3-create-the-iso",children:"Part 3: Create the ISO"}),"\n",(0,a.jsx)(t.p,{children:"Make sure you have initial-registration.yaml in the system where you will create the iso in this we will use a Linux vm."}),"\n",(0,a.jsx)(t.p,{children:"Create a directory to keep everything:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"mkdir /home/tux/elemental-demo && cd /home/tux/elemental-demo\n"})}),"\n",(0,a.jsx)(t.p,{children:"Create a file and copy the contents of the initial-registration.yaml in it."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"vim initial-registration.yaml\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create file with initial registration YAML",src:n(4953).Z+"",width:"1105",height:"441"})}),"\n",(0,a.jsx)(t.p,{children:"Next download the script to download the iso and inject the registration.yaml in the iso and make it executable"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://raw.githubusercontent.com/rancher/elemental/main/.github/elemental-iso-add-registration && chmod +x elemental-iso-add-registration\n"})}),"\n",(0,a.jsx)(t.p,{children:"Next execute the script and pass the initial-registration.yaml as an argument"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"./elemental-iso-add-registration initial-registration.yaml\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create ISO with the initial registration options",src:n(5790).Z+"",width:"1654",height:"1206"})}),"\n",(0,a.jsx)(t.p,{children:"This command will download the vanilla iso and inject it with the parameters of initial-registration.yaml and create a final iso for you to boot your end device."}),"\n",(0,a.jsxs)(t.admonition,{type:"note",children:[(0,a.jsx)(t.p,{children:"If you would like to download the vanilla ISO and reuse it later to create additional ISO's, then you can download the iso separately using the below command and then pass the local file path as an argument to the script"}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable:/Teal53/media/iso/elemental-teal.x86_64.iso \n\n./elemental-iso-add-registration initial-registration.yaml /home/elemental-iso/elemental-teal.x86_64.iso\n"})})]}),"\n",(0,a.jsx)(t.h2,{id:"part-4-boot-the-target-device",children:"Part 4: Boot the target device"}),"\n",(0,a.jsx)(t.p,{children:"Now ideally you would just burn the iso to a usb drive and boot your edge device using the usb device and once it boots and become active in Rancher under machine inventory you can select and create a cluster from it, however here we will use a vm to mimic an edge device for testing."}),"\n",(0,a.jsx)(t.h3,{id:"41-prepare-the-vm-to-emulate-tpm",children:"4.1 Prepare the VM to emulate TPM"}),"\n",(0,a.jsx)(t.p,{children:"In VMware workstation create a vm the way you would do normally, make sure to give the HDD size at least 40 GB."}),"\n",(0,a.jsx)(t.p,{children:'Now edit the machine settings and go to the "Options" tab. The very last option would be "Advanced".'}),"\n",(0,a.jsx)(t.p,{children:'Click on "advanced" and on the right window pane change the firmware type from "BIOS" to "UEFI" and check the "Enable secure boot" option as follow:'}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Default settings with BIOS selected"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"VM boot options with BIOS",src:n(9199).Z+"",width:"709",height:"218"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Updated settings with UEFI selected and secure boot enabled"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"VM boot options with UEFI",src:n(7812).Z+"",width:"684",height:"208"})}),"\n",(0,a.jsx)(t.p,{children:'Now on the same "Options" tab click on the "Access Control" option and click on "Encrypt" on the right side.'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Access control menu",src:n(3938).Z+"",width:"242",height:"28"})}),"\n",(0,a.jsx)(t.p,{children:'This will ask you to enter a password to encrypt the machine. Enter a password and click on "Encrypt"'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Access control encryption credentials",src:n(8546).Z+"",width:"352",height:"431"})}),"\n",(0,a.jsx)(t.p,{children:'This is important to add the TPM Hardware. Next go back to the Hardware options and click on "Add"'}),"\n",(0,a.jsx)(t.p,{children:'And add the TPM (Trusted Platform Module) hardware and click on "Finish"'}),"\n",(0,a.jsx)(t.p,{children:"Now with the completion of this step our VM is ready."}),"\n",(0,a.jsx)(t.h3,{id:"42-boot-the-vm-with-the-elemental-iso",children:"4.2 Boot the VM with the elemental ISO"}),"\n",(0,a.jsx)(t.p,{children:"Next add the ISO that we created earlier in the VM and boot it up."}),"\n",(0,a.jsx)(t.p,{children:"It should boot up with the ISO and start installing Elemental:"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental OS install grub menu",src:n(5017).Z+"",width:"677",height:"451"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental OS install logs",src:n(454).Z+"",width:"1052",height:"281"})}),"\n",(0,a.jsx)(t.p,{children:"And once it is complete it will reboot the VM and it should show up as active under the machine inventory in Rancher as follow:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Machine inventory status while booting"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Machine inventory status during boot",src:n(4578).Z+"",width:"612",height:"159"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Machine inventory status after boot completed"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Machine inventory status after boot complete",src:n(8571).Z+"",width:"622",height:"112"})}),"\n",(0,a.jsx)(t.h2,{id:"part-5-create-a-cluster-on-the-machine",children:"Part 5: Create a cluster on the machine"}),"\n",(0,a.jsx)(t.p,{children:'Once the machine shows up as active, select it and hit "Create Elemental Cluster".'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create Elemental cluster",src:n(7719).Z+"",width:"811",height:"398"})}),"\n",(0,a.jsx)(t.p,{children:"At this stage you get a pretty familiar page of creating a cluster in Rancher."}),"\n",(0,a.jsx)(t.p,{children:'Give the cluster a name select the Kubernetes version and hit "Create".'}),"\n",(0,a.jsx)(t.p,{children:"For this we have selected to create a K3S cluster."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental cluster configuration",src:n(521).Z+"",width:"2294",height:"1224"})}),"\n",(0,a.jsx)(t.p,{children:"Now under the Cluster Management page the cluster should show up as creating:"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental cluster provisioning",src:n(6401).Z+"",width:"793",height:"279"})}),"\n",(0,a.jsx)(t.p,{children:'And once the cluster is fully provisioned it should be active with provider type as "Elemental".'}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Elemental cluster created",src:n(9132).Z+"",width:"2279",height:"242"})}),"\n",(0,a.jsx)(t.p,{children:"Now you can start deploying application on this cluster the normal way."})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8546:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-access-control-encrypt-60a89768dd80961e42f48b1717f607cb.png"},3938:(e,t,n)=>{n.d(t,{Z:()=>a});const a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPIAAAAcCAIAAADURHUBAAAGgklEQVR4nO2bQWwaRxSG/21SUCwtlaotXZWTLUhpiOEMPtmqrAIXR5Ecu4rk9rI0J7Aqt6VKpCiKiqo0Ak6tuSStrJpEiuKLQXId+2SqqifcotIuik9IGG8ii5XsQGzRA+yyu2CDE7Ax2e/E23lv5s2bp5k3C+BWIFQ+gE8mmdab2KAd9iArCvYgywbtYGKy1hgD4ZGgyVSNKjYVVZmKtLFOv9Zh1U4c2l7Tg2Bb7bnaeoCtYkSVU8hZtAmjL8HCYSKmK6I9yBqNxl+CDhNBALAzjB0AnLOs8KiilPgQ01Uje5BNGAH4bjCEi4jYg2zCZwSATMhhmv4dMBH/xMpjcn0jah0ysbITmX8r3twYJCp6wtCAUeiZYYCP5M5IbFVOP8StQOjGN96Gbc5PPYdYxn+d7YxLKiqvy2G7tZq4KqeUt07aARWV9qOmtUoP0oYrI+FPv34nKiptpHFam67dO9yM/fHzDjijotIeDtytD0ncpkmvonKyvEptrW7VKl1Ok9r6Da1GaIqdxFSQS5y0I73D8Ya0+ZXxKNWIJjQ94AU3dAze2wzlCbL6OZUl5viWrE5hvrIBM1afmpZKwKH+n9TUujKkbX3BR+vc4OMgx+l29lqPY7S/PAGPP03404Q/7YGO6eyAJ0qeZy2GUIdD2mMc/QXf+vKj7LsgiMsfPFNs5A4riVR2QT8wY9X4ciUAABkLGJwAgHg07UrKxU2K9VJGACiGwxu+HByj/WvDWgDIc0NBDnJR2A804xaEw9mIMG5kLgsAtNgb7/FnIzTFTmJxi/JaxNE1oUnKqMdagMqkeLxXXNyivBZBWWp75KB0lOLtFax9TPqkJ5LSYcnUxK1dplYMhzd8qI8JZGu0ypksEMKydWF64PyKqEP9F+XdI1oWpFMvmsvHXdcpFlTiAJDnOh+rKkdM6/L+4039ZacVwOPf1i+V90GcEdo04xYszpci7/OzIzrHEpeAJjRtQDRNJKsKcpGMBbR3/OkIKgcZ9XAePw+XPP6NCMBcNVykqRmpCFTTmta59aU7OYVnZMxLsdG0KQnHaP/aVTKyDOip8ytpYg6wGcojlCPJ+eY5d+XEpCnWK7Q2tO0qklnPoDlmS7s2K3Kdw3N8bWo1MzLmVUa4LiaFcemi0BQ7LIYFWOHLgySSPGw6Z4pzbWrdes1/4bQrVykCDUwyKxm3bkGDxeuCn5Va5dg4YloXnl0qPQGsAC6VnqBA4x19tYnWucFP5YBcIT5BjdNcAjo3uKkkJApSUWsCORswC7874S/mCiyo2YAB/mxkLguQYzJRQr74t8IxWmvKVztPrPMZr45ZLiLP3a4Mt1nM1M9FbG1o22VElrmZScoxD6CRw+AbnDD1EUZdTBSLAklYACQL8QkdAx6DZPyvLKBFnn+YE5uoC9LSqH44GqKfx8zR0vr7u/f3SsW3//wBwMsXu2f/uP/1ra8qTQ4radRr1wJURTRZNb71Zt3llZfLiD8NkLGAeRa8x591ycXqyuWKrJ4ap7mEcsPuaXLcVKr/urW1m7GIIsI0NXM0e34hZRizkbDwC3NA0/r+dYdrGwdeGRu+2tstbL98sbuz/Xxn+/nLF7u7hW2xadyijUerdzgiyhstOkeusAjquk3QUIpFVi8RAdBUbFQD8C7/03Bec8EmF2sx5W+vwus1iNdE5qqBkfTmsJLGVOHA+livvah40rrtiZJY4jBMGXGww4qp1Ue4HsWi1BFZ5kwTBtPqljImNp1T3Lkr49YPlyuy+ur7A4eVNLYwx3bReLd+hbfRsrMsWa1DfPMc6zWXJ4DKDUMhhmsi8txQsAjvQHkYADKrT01JbSwgESV7c2JpYwj9a+J5l8oS4CO13niPnwetbeBljruTMs8GzDMpHhArDd7Viu3Jw7uifHkEDRyGZGq1KyOvjPB8fZ8l2Rqt1t3qcoXFPIl14Q6qp4QDmff4uYRiXOWCcq6oruw1e4FMim9QB3aMw/5GAMB07Z40xW/6vlUo3Ax9p/7UqZexGcojxWpp0ZWvqBvSvLYWq5He/EJR5VCYQTK+ku3+PFbQZLduqQt1t1bpMtS/Eaj0IA2KkPsPFh4tLu3t7Tc3Pnvmsnu0HBjrgGMqKq9Og7R+tLj04Ke7fX3nmhrv7Oxe+eLLz66oaa3SXTQoQvb29lvJaQB9feda2dRVVI4ZtbZW6UHe1LTOhByO0HF+QfBGEPcQBEEQhCcu/3zs/A8CtQt0OqppGQAAAABJRU5ErkJggg=="},7719:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-create-8d06bbcd84075d084212bc3d049dfbbc.png"},9132:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-created-39460fab3f9c3863673be51507d2d22d.png"},6401:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-provisioning-b1a441f0c9dd8db3af090c57bf8b216c.png"},521:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-cluster-template-71f1e521ea8047e899ec3b0f9e48225b.png"},5017:(e,t,n)=>{n.d(t,{Z:()=>a});const a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqUAAAHDCAIAAACS//S/AAAT3klEQVR4nO3dXbqjqBoGULufHmyGlOGei3R7LBUERcXPta5SlhsQ0de/mGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA4/66uwHQke/3O37+fD7jlN/n6T9T0/eVP1VS73L+F5p1RUk/jH8ym3m5XiCev+9uAPRizNRlEi9TtlX5Y7qs1rtUO//tvt/vGS2cdmZhP0w7fLlyp0VBSPIehmEtfVdnOK98qtRm87T/p5FfeGEGAvjn7gZAp87OgJdkzEsWE/on7+GNlhe3Z88KjGbzLG+BZ+6jr94vry0faML1fNh2wZ3y8T53Yc7Vzl/ejGHtvvj4eTY9fx89dVukvPyqNpfPvJw4KqwUHsf5PfwhFVerz8Y3LD81JWUMxV9GHm9YlVSN17ekyUHP9FrFLf0JF5D38IezT+UzX8PrJ2zKF39s9nTKOY1asSPse+heuIW8h1KtTvH7tztBrzxk8Wg9VHH/HnrxiO/Td0LYQy15D8Nw32X8u0xv/w/p4Nx8hK2fZ9xmzVi9y+A797yZ9+nC/6USYvbds9XwLsmPzPt0Vx9WX5bf9n26q8m3WW/J/Mv/2vz+XuYrgqmWzyyrTjV18/uBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENdf11f5/X6vrxQAHu3z+Rz5839ataPWwXYDwEs0OU/++3gRAEDn5D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQ323v2xl53R4ALLV9MZ3zewCIT94DQHz3X89PWb2OMV78H//3+tsBn8+nvNLydi6X9+CiNWnnjf0MQEP9nt+PAfP9fpdhc1f81N5NKW/ndDFXF7lKq3aKeYAY+s37GcEDALs9Ju8HkQ8Ae3Vx//538fn7/Y4fljOUhP3sIvbvT6Z3oGflZ+YfZ16WM51nWU7zg5JUe/Ltv76dAPSsi/P7WdDO/rfwVvT45+PN79Qf/qan5h8/L6en7q+XVLpbqj2Z9t/STgB6dv/5/Sx4lqk/PbVtWFEwztcByLg/75dX3VPzlEiF+u+gYXno8Nwjid+yVF2ij33EA0DG/Xk//HmLuupb40u1f3v8tHh2F+BgaVWmjd/suhvbCcDtusj76f3mzGwHDwUA4LW6eF6vRO0p6exa9+3zN1fYgNvbCUAP+s37MaVWE2v6v78P45Xqcf78xYDa+Wd/NX6elpP6RtxQcLwyXcySkM63v1U7y9sPQM/+ur7Kkgf0AODllie0R0rr9/weAGhF3gNAfPIeAOK7//t4HgQDgLM5vweA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+OQ9AMQn7wEgPnkPAPHJewCIT94DQHzyHgDik/cAEJ+8B4D45D0AxCfvASA+eQ8A8cl7AIhP3gNAfPIeAOKT9wAQn7wHgPjkPQDEJ+8BID55DwDxyXsAiE/eA0B88h4A4pP3ABCfvAeA+P65q+Lv93tX1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwLq/7m7A6b7f7zAMn89n9Z9tK5oW+6vopLrOcFKDb++H2Xq5rNLfh+NVH2x/q5Zcth5vWV/lrunP47VsllDbz7dvyBz3990NCGLcGEaP2ypOavC9/bBcL9dotdTH27/Zku/3W1LLNevxgvVVuLwp1/Rn5n+blL+jBx63Q2NJ3gNAfP/c3QBKdXKdc/XMoLxh591PYZ+3rYuzl/fp5RPYq/N+Fl2ze/zL6ZuFrIbZ8r5XVfnTPymM/Gn5ywcXVu/DXXPde/VZillTM89btFovtf3fZJzUlrM5rlYLzzynkl/vmcGwOZ7zTZqVkxqHqeXNz1/7XM6O5d1XVGpi4XrZXelm+fu2i7vui9HWe6/nj2P9Z5ySmp4yzjb7PJtnd/k7rBY+/nP5X1Xn3MvZqvaPyx10YT+0Wi+t6j27nJJxVWvZzmWxJct1ZHlT4zC1vJlxu8O+5c2XVt6fqQ2tvN7j5e/YLlyTC+PV5/dT543m4yXPDsnbNvXKjblhLXftfc6ut7dxmAqPu/TT/61a0s8SrRL2kbw373+Hw6lj87OvX51a/tmN/yRuCmxaHqxUnUtl1td52o6TC66LNj8iPKL/68B3jas+9b++OOK9eT8sdtzTHWU/B93LLTC/Q8/c8L7XuGOdNr6qnzPr61QNx8nbsuQRy3vXuOrQaxf8Jd57/54jfvsFe4feTJ8JAJh67/l91QO9tafjDefvNlN3NGz1FP9nsx8O3kfc/ecXj5Pa6UvTuy3Htbp9e/Z2tNvL708fH28v78Bnif8+3aH++1Sp6YW1zK6lzx6O3V1+uWnVy3o329O2STv6ofCB8H3rZUc5O8bJ6v3gfeOt/FGJsW9XO3nZ/1XtzJeTaU+q/FQ5qe1oWd2OcVu1XvIlnNqfJc+LHFxf5dtFvp/lPdDG7FkqWPWIcXJ2Ix/RCdzI/Xv65dSBEj2PExlPP15xPZ8HOftmBzE8aJxkbkk8onwAAAAAAMJzdxn64Xk9oCMOEeAk8Z/XO/XL5Vc6+zWfB8sv/5r4Se2Zzd+8PVUa1r6jHwqrbvv+iXwtp76x6uzt4veh/H0Pzx23Fwi/gD2Lf34/fdV5h2+VL3R2m4+X33brrW1Pb0d1DQ96Tqp6jNXZdpGavttYzhku2JZTjV+9DvH0cXuB8AvYs/h5DzxFz9+kh6d77/vzgd48KOkf1FT4eW/ez142Phx4z3mT97Gn2jOdOfOS7c1yShpTUv6mg/2ZaU9t+2vbU1LFZeXsWy9N7sv8rlT/ij37/TC7q2g4bnf0Z35QPXHcTqubtic1fVbO8scRVvc/q/35oFcnPV385/WG9O9zrH5eHdM7ppc0prBtq8XuK6ewVSUNyBdysN+aPOS1uqtqtb6OrKAj/VCy3mtXVuqfm4XscHBF50vbUf7u/iyfWNX+4aZxu6w0/7mkrtTnqh0dDb3o/D6/C6sdYan5exupvbXnem174Oz+bJh8x5sxPdF/m9uD565xu3lJY5/C/nznYLvMi/K+aiQtB/d4nXNWYGp6bfn7tCrnbcr7Lb9+a/v/Wet9dm2/od7GbW/tSTm7nb81Pj2Vz0xv0ph9+0/2eVHeV9m8BjDdD6am15bfqp1squq3zPptdVmo1tPXe2/t7609Kf20c3lNfrcd+0/28X084P9mJ1tAGPJ+w7j7S+0HD+4fa//8pGY0L6eVVv2ze/7CAs9ej2ev93Jta+xt3N5VTm/zX6bbhoUU//n81J2hzB2j2fhbPrRcOL2kSctyUs/Vj3+VrzezXIWtOmm5yqen2lNY+6wfUs8Jp+rNlFze/tW10KofCstZFjVzpD1HrrjW9n9haWeP29R/xRi3Y0XfyX362YfVR+tns622OXXZf99yAXAFJ2QAEJywBwAAAAAAAHgX94kB2vL9e4JwiACQ8aLv39d+rXP3F9n32d3OTIGP/iZr7fe8983/8+iOOknVgGw+endbPebb/J73jsFw1/b19O2aG8U/v9+3bYzh0eQF0SXabsOZBj/lPHjs/DNcv34fZ/dPDMxcPN6mP22wTPTPf4bJSt8xGO4aMIEH6lP2S48WP++POzV4aOLIS9+s38AKX0K3+weQ4EH8Pt7rhNyjhVyoGG5fNXf9hiFVdPsFXpT3J71ne/ai6SPl17Zz8/355S/hz7d/9n7szZYv27Nafq2z37Pdqv21N4P3rd/Cl5mn2pNfrlZXVveNt2V7dtc+PXH/XTH+TWkyCDP9vFlFbT+k6t38nHohf+F43lFOfjsaFv02rI2THeV4D/+m+M/rDdnNYLkbGrb2j5kyC8tv0s58+ZnqUhtbpt7axpf0T6ao2vL3FfWze/3uaHPJPIXrvfxzSV2pz00Wdsd4y5RW3pKf1R44XlF+oQqL3dEPhZ2Z/68jm/bu/d5mpYULXrggR8ZPYC86vy9Xu6eb/e0JLYqjVf8cKafn9VtefuoU/OCp+eaR4lTPo3163DOdOPz3aFhXje9nXPVZfq3e2tOJt+f9wZ3j7eXToQtW+ufP3yfNT2/Vngv2oW27LtXgz5/X9jv09P3G9e0f1+l0ysVt6N/b8/5th72cLXVj6C69tSfP9vLz9H64pf2z2xw9H8/dxffxgMh+Rzmzk7/N+SEeef+v8t1Bn+X3Vu/ZLFdsy37Y1zObfzK78lFbxV37jaeMk7Gd0ycnhhMuADylQ+71oufzR5vf30jdBFqdP3PHKFX+Ge3M1J5ahMLneA+2v+Edtdr2lJRzZP1ull/4YGDV+p0+qDwtPzU9057C9V6y4CVdenC8FebE6k5/s/yDa3m16vKVXrXfyNS7HA+ZEmqfz5+Vtq/9qeoy4yQzPTXOV1sFFHHsDK9l8w/D9XzW2cgBInnF9Xz2aXgpHngiOwEAAAAAAAAAAAAAAAAAAAAglvjv28m8zHzz/eSr04fiV3kDQCfe+D7d73+/jzkMw+c/wyLRZ9MB4LlelPdiG4DXekve/87UV3+H0Q/DABDeP3c34GbuwQPwBm85vweAN5P3/zp+Vd99AQC69d68H5+9H3M6f21/Or/n9gEAAAAAAAAAAAAAAAAAAKLp9/dwl99un33r/eCrcK8p53gtmyWM7wNoVeBBte05VWphyzvh7O66zNvGyanlHx9X15juRTtpEjd63vt2Wo3akh19yRt1St7Sc175O975c/ZO9rzCN6tOHSMulXdCjL3k28ZJpvwm78E8Pq42NXnj5/DnT37zcl3n/ThGDVaAciXvDOVt+v19vNlIvX7gnl2jTbEt/UmJp4yTp7STB+k37zctb5XNLn8VbjCrt9w2Jy4Pn6tu3R0vf7qws5kz/VB1hXC1nLGuwvbk55+1OX/7IzP/BfdNj4+3fH9O51n9gYZ8vat9Plw+TjILsq89mY0iU+9q+UNinJT088Hnb8rHeaqdqe1od5NGDizeo+vr+Zume4TlzaryfdZy/uU2MC0/tdGW13u8/Ok9uennTD9UXeJLlTN+Xk5fbU9q/rYu2GfN2l873jb7c3XKcv7aes8eJ1WN2deemWngLWdOlT9OWS0tU9R5gzZj2c5929F3Ypwy3Lpo3OjB5/etdvG9lXNS+Z3cz7u9AR36fD7jHrm2f5r3ZyfjZOmaWOpwwY+YHk59176wEGx5yXtw3q9yrPrTqh867M/V3dZdavvn7PlrNSn/gkHyOyT6TK5mX1Bvh4P/uOnB5TjlxvZwpWh5b+z+POWixdM1OR2f3pqdHc10ftFoyD5wcKqz671ruS4wXemp835Cevb9e95meg8bgHJh8352zSq81PK26ofacs7r/z7PRXb3z/Q8MnM22Wr9nj1Oap1dbz/jthObCxi+B96s3/fpDlvft5nuHFd3lPlgyJSzWfXyD6vKaVj+coZUOcvpQ3EXrZZT2J7MncJ97flkv6x4cHqm3uX8VeMtNf/qgMmP583p+S46b5zM6m3SnulKP1j+kFjvO/rzyHY9VA6Vwu0uX0imPatbZZ9H1XCD3k5KAnjhIvNCxjk3Cns9vzkZfx6nFLyBcc69ur6e35uqi8Adlt+V2ovh8ETGOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADzN/wCwXEkY4Glz7QAAAABJRU5ErkJggg=="},454:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-install-logs-a0fe1cb2f06bd446319ea8755907dcba.png"},3667:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-operator-install-ead7a27570833aea52fc48bf864e7458.png"},9609:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-elemental-operator-pod-5cf9077cbdd41cc2ea98372e615773e3.png"},5550:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-extension-enabled-c4e29279c65407712c74245a906fe8f1.png"},1663:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-extensions-menu-3417b5f0744722377d8b9e1826abc4f8.png"},5832:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-initial-registration-url-yaml-2976a9c6180726ebb308057cb33ae38f.png"},1325:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-initial-registration-url-0c8db5dad180464052c36f376b17c8e3.png"},4953:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-initial-registration-yaml-61b7ae494fd22967d770b3124dd1da9b.png"},5790:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-iso-create-94c20367fff7dd76b113c5f2e046fd69.png"},8571:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-machine-inventory-status-boot-complete-401945492ded59c3f4f94e8dc7ecc419.png"},4578:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-machine-inventory-status-booting-fba3e4b35fc4b52b43fa92dc00f14d28.png"},1314:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-machine-registered-fa33715b7ace60ba91c3ab12694be684.png"},3714:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-osmanagement-dashboard-5ec27221ddfdd9d63f846c6370847cbd.png"},6651:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-osmanagement-menu-18bc9bca56db4f66db675cb679e6ada9.png"},9230:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-registration-endpoints-040525e42e8fcfde1c35a85e44b1bc32.png"},9199:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-vm-boot-bios-28b0123c0fbaf64ff7fe1f5634b0f1ae.png"},7812:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rancher-vmware-vm-boot-uefi-ca7f800f1c8469b9c1477f78b6ca22e5.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>s});var a=n(7294);const i={},r=a.createContext(i);function s(e){const t=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),a.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ae61c247.0289edab.js b/assets/js/ae61c247.0289edab.js new file mode 100644 index 000000000..61bf7d7d4 --- /dev/null +++ b/assets/js/ae61c247.0289edab.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6870],{1249:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>p,contentTitle:()=>m,default:()=>v,frontMatter:()=>u,metadata:()=>g,toc:()=>j});var t=a(5893),s=a(1151),r=a(4298),l=a(1230),i=a(2361),o=a(5130),d=a(9992),c=a(8139),h=a(460);const u={sidebar_label:"Upgrade",title:""},m="Upgrade",g={id:"upgrade",title:"",description:"All components in Elemental are managed using Kubernetes. Below is how",source:"@site/versioned_docs/version-1.2/upgrade.md",sourceDirName:".",slug:"/upgrade",permalink:"/1.2/upgrade",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Upgrade",title:""},sidebar:"docs",previous:{title:"Installation",permalink:"/1.2/installation"},next:{title:"Customize Elemental Install",permalink:"/1.2/customizing"}},p={},j=[{value:"Elemental Teal node upgrade",id:"elemental-teal-node-upgrade",level:2},{value:"Upgrade via command line interface",id:"upgrade-via-command-line-interface",level:2},{value:"Selecting source for upgrade",id:"selecting-source-for-upgrade",level:3},{value:"Managing available versions",id:"managing-available-versions",level:3},{value:"Upgrade via user interface",id:"upgrade-via-user-interface",level:2}];function x(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components},{CodeBlock:u,Head:m,TabItem:g,Tabs:p,Vars:j}=n;return u||b("CodeBlock",!0),m||b("Head",!0),g||b("TabItem",!0),p||b("Tabs",!0),j||b("Vars",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(m,{children:(0,t.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/upgrade"})}),"\n","\n","\n",(0,t.jsx)(n.h1,{id:"upgrade",children:"Upgrade"}),"\n",(0,t.jsx)(n.p,{children:"All components in Elemental are managed using Kubernetes. Below is how\nto use Kubernetes approaches to upgrade the components."}),"\n",(0,t.jsx)(n.h2,{id:"elemental-teal-node-upgrade",children:"Elemental Teal node upgrade"}),"\n",(0,t.jsxs)(n.p,{children:["Elemental Teal is upgraded with the ",(0,t.jsx)(j,{name:"elemental_operator_name"}),". Refer to the\n",(0,t.jsx)(n.a,{href:"/1.2/elementaloperatorchart-reference",children:(0,t.jsx)(j,{name:"elemental_operator_name"})})," documentation for complete information."]}),"\n",(0,t.jsx)(n.p,{children:"Upgrade can be achieve either with CLI or UI:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#upgrade-via-command-line-interface",children:"Command Line Interface"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#upgrade-via-user-interface",children:"User Interface"})}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"upgrade-via-command-line-interface",children:"Upgrade via command line interface"}),"\n",(0,t.jsx)(n.p,{children:"There are two ways of selecting nodes for upgrading. Via a cluster target, which will match ALL nodes in a cluster that matches our\nselector or via node selector, which will match nodes based on the node labels. Node selector allows us to be more targeted with the upgrade\nwhile cluster selector just selects all the nodes in a matched cluster."}),"\n",(0,t.jsxs)(p,{children:[(0,t.jsxs)(g,{value:"clusterTarget",label:"With 'clusterTarget'",default:!0,children:[(0,t.jsxs)(n.p,{children:["You can target nodes for an upgrade via a ",(0,t.jsx)(n.code,{children:"clusterTarget"})," by setting it to the cluster name that you want to upgrade.\nAll nodes in a cluster that matches that name will match and be upgraded."]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-cluster-target.yaml",showLineNumbers:!0,children:r.Z})]}),(0,t.jsxs)(g,{value:"nodeSelector",label:"With nodeSelector",children:[(0,t.jsxs)(n.p,{children:["You can target nodes for an upgrade via a ",(0,t.jsx)(n.code,{children:"nodeSelector"})," by setting it to the label and value that you want to match.\nAny nodes containing that key with the value will match and be upgraded."]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-node-selector.yaml",showLineNumbers:!0,children:l.Z})]}),(0,t.jsxs)(g,{value:"forceUpgrade",label:"With FORCE flag",children:[(0,t.jsx)(n.p,{children:"When upgrading to an older version or the same version that is already running the upgrade-procedure will be skipped."}),(0,t.jsx)(n.p,{children:"It is possible to force upgrades to older versions by setting the FORCE environment variable as shown below."}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-force.yaml",showLineNumbers:!0,children:i.Z})]})]}),"\n",(0,t.jsx)(n.h3,{id:"selecting-source-for-upgrade",children:"Selecting source for upgrade"}),"\n",(0,t.jsxs)(p,{children:[(0,t.jsxs)(g,{value:"osImage",label:"Via 'osImage'",children:[(0,t.jsxs)(n.p,{children:["Just specify an OCI image on the ",(0,t.jsx)(n.code,{children:"osImage"})," field"]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-cluster-target.yaml",showLineNumbers:!0,children:r.Z})]}),(0,t.jsxs)(g,{value:"managedOSVersion",label:"Via 'ManagedOSVersion'",children:[(0,t.jsxs)(n.p,{children:["In this case we use the auto populated ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," resources to set the wanted ",(0,t.jsx)(n.code,{children:"managedOSVersionName"})," field.\nSee section ",(0,t.jsx)(n.a,{href:"#managing-available-versions",children:"Managing available versions"})," to understand how the ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," are managed."]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-managedos-version.yaml",showLineNumbers:!0,children:o.Z})]})]}),"\n",(0,t.jsx)(n.admonition,{title:"Warning",type:"warning",children:(0,t.jsxs)(n.p,{children:["If both ",(0,t.jsx)(n.code,{children:"osImage"})," and ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," are defined in the same ",(0,t.jsx)(n.code,{children:"ManagedOSImage"})," be aware that ",(0,t.jsx)(n.code,{children:"osImage"})," takes precedence."]})}),"\n",(0,t.jsx)(n.h3,{id:"managing-available-versions",children:"Managing available versions"}),"\n",(0,t.jsxs)(n.p,{children:["An ",(0,t.jsx)(n.code,{children:"ManagedOSVersionChannel"})," resource can be created in a Kubernetes cluster where the Elemental operator is installed to synchronize available versions for upgrades."]}),"\n",(0,t.jsxs)(n.p,{children:["It has a syncer in order to generate ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," automatically. Currently, we provide a json syncer and a custom one."]}),"\n",(0,t.jsxs)(p,{children:[(0,t.jsxs)(g,{value:"jsonSyncer",label:"Json syncer",children:[(0,t.jsxs)(n.p,{children:["This syncer will fetch a json from url and parse it into valid ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," resources."]}),(0,t.jsx)(u,{language:"yaml",title:"managed-os-version-json",showLineNumbers:!0,children:d.Z})]}),(0,t.jsxs)(g,{value:"customSyncer",label:"Custom syncer",children:[(0,t.jsxs)(n.p,{children:["A custom syncer allows more flexibility on how to gather ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," by allowing custom commands with custom images."]}),(0,t.jsxs)(n.p,{children:["This type of syncer allows to run a given command with arguments and env vars in a custom image and output a json file to ",(0,t.jsx)(n.code,{children:"/data/output"}),".\nThe generated data is then automounted by the syncer and then parsed so it can gather create the proper versions."]}),(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["The only requirement to make your own custom syncer is to make it output a json file to ",(0,t.jsx)(n.code,{children:"/data/output"})," and keep the correct json structure."]})}),(0,t.jsxs)(n.p,{children:["Elemental project provides an Elemental Teal channel to list all ",(0,t.jsx)(n.code,{children:"ManagedOSVersions"})," released as a custom syncer.\nSee the Elemental Teal channel resource definition below:"]}),(0,t.jsx)(u,{language:"yaml",title:"managed-os-version-channel-json.yaml",showLineNumbers:!0,children:c.Z})]})]}),"\n",(0,t.jsx)(n.p,{children:"In both cases the file that the operator expects to parse is a json file with the versions on it as follows"}),"\n",(0,t.jsx)(u,{language:"json",title:"versions.json",showLineNumbers:!0,children:h.Z}),"\n",(0,t.jsx)(n.h2,{id:"upgrade-via-user-interface",children:"Upgrade via user interface"}),"\n",(0,t.jsxs)(n.p,{children:["To upgrade via the UI, you have to go in the Elemental Advanced menu, then click on ",(0,t.jsx)(n.code,{children:"Update Groups"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Choose a name, select clusters to target and choose between the two upgrade ways:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Elemental Upgrade Menu",src:a(1343).Z+"",width:"901",height:"745"})}),"\n",(0,t.jsxs)(p,{children:[(0,t.jsxs)(g,{value:"managedOSVersion",label:"Via Managed OS Version",children:[(0,t.jsxs)(n.p,{children:["In this case, a ",(0,t.jsx)(n.code,{children:"OS Version Channels"})," is used to auto populated ",(0,t.jsx)(n.code,{children:"OS Versions"})," resources."]}),(0,t.jsx)(n.p,{children:"The channel bellow is provide by us but you can bring your own channel as well."}),(0,t.jsxs)(n.p,{children:["See section ",(0,t.jsx)(n.a,{href:"#managing-available-versions",children:"Managing available versions"})," to understand how the ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," are managed."]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Create OS Version Channel",src:a(4749).Z+"",width:"1162",height:"534"})}),(0,t.jsxs)(n.p,{children:["After a short syncing time, you will see your ",(0,t.jsx)(n.code,{children:"OS Versions"})," appears in the ",(0,t.jsx)(n.code,{children:"OS Versions"})," menu."]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Elemental OS Version menu",src:a(9036).Z+"",width:"993",height:"438"})}),(0,t.jsxs)(n.p,{children:["Finally, you can select the ",(0,t.jsx)(n.code,{children:"OS Versions"})," when you create your ",(0,t.jsx)(n.code,{children:"Upgrade Group"})," according to the following screenshot:"]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Select OS Version in Upgrade Group",src:a(5651).Z+"",width:"788",height:"802"})})]}),(0,t.jsxs)(g,{value:"imageFromRegistry",label:"Via Image from registry",children:[(0,t.jsxs)(n.p,{children:["Just specify an OCI image on the ",(0,t.jsx)(n.code,{children:"Image path"})," field to upgrade to:"]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Upgrade via Image Registry",src:a(6037).Z+"",width:"901",height:"745"})})]})]}),"\n",(0,t.jsxs)(n.p,{children:["Click on the ",(0,t.jsx)(n.code,{children:"Create"})," button to start the upgrade process, if you have multiple nodes, the upgrade will be done sequentially node by node."]})]})}function v(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}function b(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},8139:(e,n,a)=>{a.d(n,{Z:()=>t});const t="apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSVersionChannel\nmetadata:\n name: elemental-teal-channel\n namespace: fleet-default\nspec:\n options:\n image: registry.suse.com/rancher/elemental-teal-channel/5.3:latest\n type: custom\n"},9992:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSVersionChannel\nmetadata:\n name: elemental-versions\n namespace: fleet-default\nspec:\n options:\n URI: "https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/upgrade/versions.json"\n Timeout: "1m"\n type: json'},4298:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to or track the latest tag\n osImage: "registry.suse.com/rancher/elemental-teal/5.3:latest"\n clusterTargets:\n - clusterName: my-cluster\n'},2361:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to\n osImage: "registry.suse.com/rancher/elemental-teal/5.3:latest"\n clusterTargets:\n - clusterName: my-cluster\n upgradeContainer:\n envs:\n - name: FORCE\n value: "true"\n'},5130:(e,n,a)=>{a.d(n,{Z:()=>t});const t="apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new ManagedOSVersion you would like to upgrade to\n managedOSVersionName: v0.1.0-alpha22-amd64\n clusterTargets:\n - clusterName: my-cluster"},1230:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to\n osImage: "registry.suse.com/rancher/elemental-teal/5.3:latest"\n clusterTargets:\n - clusterName: my-cluster\n nodeSelector:\n matchLabels:\n kubernetes.io/hostname: my-machine\n'},460:(e,n,a)=>{a.d(n,{Z:()=>t});const t='[\n {\n "metadata": {\n "name": "v0.1.0"\n },\n "spec": {\n "version": "v0.1.0",\n "type": "container",\n "metadata": {\n "upgradeImage": "foo/bar:v0.1.0"\n }\n }\n },\n {\n "metadata": {\n "name": "v0.2.0"\n },\n "spec": {\n "version": "v0.2.0",\n "type": "container",\n "metadata": {\n "upgradeImage": "foo/bar:v0.2.0"\n }\n }\n }\n]'},6037:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-image-registry-dc5f48d0d96df566f8035d4fdd7f2e1e.png"},1343:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-menu-93b767af21b0dbe3e2b60d07897488ca.png"},9036:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-os-version-0dbbe5e7b5f9a4c0ba6801227541b900.png"},5651:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-upgrade-group-channel-6f58b8b4ab7ad99803bd22cdaf983a16.png"},4749:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-version-channel-1c99191874b1827b23f1bad6336aade3.png"},1151:(e,n,a)=>{a.d(n,{Z:()=>i,a:()=>l});var t=a(7294);const s={},r=t.createContext(s);function l(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ae61c247.b9473023.js b/assets/js/ae61c247.b9473023.js deleted file mode 100644 index 25c3029cf..000000000 --- a/assets/js/ae61c247.b9473023.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6870],{1249:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>p,contentTitle:()=>m,default:()=>v,frontMatter:()=>u,metadata:()=>g,toc:()=>j});var t=a(5893),s=a(1151),r=a(4298),l=a(1230),i=a(2361),o=a(5130),d=a(9992),c=a(8139),h=a(460);const u={sidebar_label:"Upgrade",title:""},m="Upgrade",g={id:"upgrade",title:"",description:"All components in Elemental are managed using Kubernetes. Below is how",source:"@site/versioned_docs/version-1.2/upgrade.md",sourceDirName:".",slug:"/upgrade",permalink:"/1.2/upgrade",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Upgrade",title:""},sidebar:"docs",previous:{title:"Installation",permalink:"/1.2/installation"},next:{title:"Customize Elemental Install",permalink:"/1.2/customizing"}},p={},j=[{value:"Elemental Teal node upgrade",id:"elemental-teal-node-upgrade",level:2},{value:"Upgrade via command line interface",id:"upgrade-via-command-line-interface",level:2},{value:"Selecting source for upgrade",id:"selecting-source-for-upgrade",level:3},{value:"Managing available versions",id:"managing-available-versions",level:3},{value:"Upgrade via user interface",id:"upgrade-via-user-interface",level:2}];function x(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components},{CodeBlock:u,TabItem:m,Tabs:g,Vars:p}=n;return u||b("CodeBlock",!0),m||b("TabItem",!0),g||b("Tabs",!0),p||b("Vars",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"upgrade",children:"Upgrade"}),"\n",(0,t.jsx)(n.p,{children:"All components in Elemental are managed using Kubernetes. Below is how\nto use Kubernetes approaches to upgrade the components."}),"\n",(0,t.jsx)(n.h2,{id:"elemental-teal-node-upgrade",children:"Elemental Teal node upgrade"}),"\n",(0,t.jsxs)(n.p,{children:["Elemental Teal is upgraded with the ",(0,t.jsx)(p,{name:"elemental_operator_name"}),". Refer to the\n",(0,t.jsx)(n.a,{href:"/1.2/elementaloperatorchart-reference",children:(0,t.jsx)(p,{name:"elemental_operator_name"})})," documentation for complete information."]}),"\n",(0,t.jsx)(n.p,{children:"Upgrade can be achieve either with CLI or UI:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#upgrade-via-command-line-interface",children:"Command Line Interface"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#upgrade-via-user-interface",children:"User Interface"})}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"upgrade-via-command-line-interface",children:"Upgrade via command line interface"}),"\n",(0,t.jsx)(n.p,{children:"There are two ways of selecting nodes for upgrading. Via a cluster target, which will match ALL nodes in a cluster that matches our\nselector or via node selector, which will match nodes based on the node labels. Node selector allows us to be more targeted with the upgrade\nwhile cluster selector just selects all the nodes in a matched cluster."}),"\n",(0,t.jsxs)(g,{children:[(0,t.jsxs)(m,{value:"clusterTarget",label:"With 'clusterTarget'",default:!0,children:[(0,t.jsxs)(n.p,{children:["You can target nodes for an upgrade via a ",(0,t.jsx)(n.code,{children:"clusterTarget"})," by setting it to the cluster name that you want to upgrade.\nAll nodes in a cluster that matches that name will match and be upgraded."]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-cluster-target.yaml",showLineNumbers:!0,children:r.Z})]}),(0,t.jsxs)(m,{value:"nodeSelector",label:"With nodeSelector",children:[(0,t.jsxs)(n.p,{children:["You can target nodes for an upgrade via a ",(0,t.jsx)(n.code,{children:"nodeSelector"})," by setting it to the label and value that you want to match.\nAny nodes containing that key with the value will match and be upgraded."]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-node-selector.yaml",showLineNumbers:!0,children:l.Z})]}),(0,t.jsxs)(m,{value:"forceUpgrade",label:"With FORCE flag",children:[(0,t.jsx)(n.p,{children:"When upgrading to an older version or the same version that is already running the upgrade-procedure will be skipped."}),(0,t.jsx)(n.p,{children:"It is possible to force upgrades to older versions by setting the FORCE environment variable as shown below."}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-force.yaml",showLineNumbers:!0,children:i.Z})]})]}),"\n",(0,t.jsx)(n.h3,{id:"selecting-source-for-upgrade",children:"Selecting source for upgrade"}),"\n",(0,t.jsxs)(g,{children:[(0,t.jsxs)(m,{value:"osImage",label:"Via 'osImage'",children:[(0,t.jsxs)(n.p,{children:["Just specify an OCI image on the ",(0,t.jsx)(n.code,{children:"osImage"})," field"]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-cluster-target.yaml",showLineNumbers:!0,children:r.Z})]}),(0,t.jsxs)(m,{value:"managedOSVersion",label:"Via 'ManagedOSVersion'",children:[(0,t.jsxs)(n.p,{children:["In this case we use the auto populated ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," resources to set the wanted ",(0,t.jsx)(n.code,{children:"managedOSVersionName"})," field.\nSee section ",(0,t.jsx)(n.a,{href:"#managing-available-versions",children:"Managing available versions"})," to understand how the ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," are managed."]}),(0,t.jsx)(u,{language:"yaml",title:"upgrade-managedos-version.yaml",showLineNumbers:!0,children:o.Z})]})]}),"\n",(0,t.jsx)(n.admonition,{title:"Warning",type:"warning",children:(0,t.jsxs)(n.p,{children:["If both ",(0,t.jsx)(n.code,{children:"osImage"})," and ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," are defined in the same ",(0,t.jsx)(n.code,{children:"ManagedOSImage"})," be aware that ",(0,t.jsx)(n.code,{children:"osImage"})," takes precedence."]})}),"\n",(0,t.jsx)(n.h3,{id:"managing-available-versions",children:"Managing available versions"}),"\n",(0,t.jsxs)(n.p,{children:["An ",(0,t.jsx)(n.code,{children:"ManagedOSVersionChannel"})," resource can be created in a Kubernetes cluster where the Elemental operator is installed to synchronize available versions for upgrades."]}),"\n",(0,t.jsxs)(n.p,{children:["It has a syncer in order to generate ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," automatically. Currently, we provide a json syncer and a custom one."]}),"\n",(0,t.jsxs)(g,{children:[(0,t.jsxs)(m,{value:"jsonSyncer",label:"Json syncer",children:[(0,t.jsxs)(n.p,{children:["This syncer will fetch a json from url and parse it into valid ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," resources."]}),(0,t.jsx)(u,{language:"yaml",title:"managed-os-version-json",showLineNumbers:!0,children:d.Z})]}),(0,t.jsxs)(m,{value:"customSyncer",label:"Custom syncer",children:[(0,t.jsxs)(n.p,{children:["A custom syncer allows more flexibility on how to gather ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," by allowing custom commands with custom images."]}),(0,t.jsxs)(n.p,{children:["This type of syncer allows to run a given command with arguments and env vars in a custom image and output a json file to ",(0,t.jsx)(n.code,{children:"/data/output"}),".\nThe generated data is then automounted by the syncer and then parsed so it can gather create the proper versions."]}),(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["The only requirement to make your own custom syncer is to make it output a json file to ",(0,t.jsx)(n.code,{children:"/data/output"})," and keep the correct json structure."]})}),(0,t.jsxs)(n.p,{children:["Elemental project provides an Elemental Teal channel to list all ",(0,t.jsx)(n.code,{children:"ManagedOSVersions"})," released as a custom syncer.\nSee the Elemental Teal channel resource definition below:"]}),(0,t.jsx)(u,{language:"yaml",title:"managed-os-version-channel-json.yaml",showLineNumbers:!0,children:c.Z})]})]}),"\n",(0,t.jsx)(n.p,{children:"In both cases the file that the operator expects to parse is a json file with the versions on it as follows"}),"\n",(0,t.jsx)(u,{language:"json",title:"versions.json",showLineNumbers:!0,children:h.Z}),"\n",(0,t.jsx)(n.h2,{id:"upgrade-via-user-interface",children:"Upgrade via user interface"}),"\n",(0,t.jsxs)(n.p,{children:["To upgrade via the UI, you have to go in the Elemental Advanced menu, then click on ",(0,t.jsx)(n.code,{children:"Update Groups"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Choose a name, select clusters to target and choose between the two upgrade ways:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Elemental Upgrade Menu",src:a(1343).Z+"",width:"901",height:"745"})}),"\n",(0,t.jsxs)(g,{children:[(0,t.jsxs)(m,{value:"managedOSVersion",label:"Via Managed OS Version",children:[(0,t.jsxs)(n.p,{children:["In this case, a ",(0,t.jsx)(n.code,{children:"OS Version Channels"})," is used to auto populated ",(0,t.jsx)(n.code,{children:"OS Versions"})," resources."]}),(0,t.jsx)(n.p,{children:"The channel bellow is provide by us but you can bring your own channel as well."}),(0,t.jsxs)(n.p,{children:["See section ",(0,t.jsx)(n.a,{href:"#managing-available-versions",children:"Managing available versions"})," to understand how the ",(0,t.jsx)(n.code,{children:"ManagedOSVersion"})," are managed."]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Create OS Version Channel",src:a(4749).Z+"",width:"1162",height:"534"})}),(0,t.jsxs)(n.p,{children:["After a short syncing time, you will see your ",(0,t.jsx)(n.code,{children:"OS Versions"})," appears in the ",(0,t.jsx)(n.code,{children:"OS Versions"})," menu."]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Elemental OS Version menu",src:a(9036).Z+"",width:"993",height:"438"})}),(0,t.jsxs)(n.p,{children:["Finally, you can select the ",(0,t.jsx)(n.code,{children:"OS Versions"})," when you create your ",(0,t.jsx)(n.code,{children:"Upgrade Group"})," according to the following screenshot:"]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Select OS Version in Upgrade Group",src:a(5651).Z+"",width:"788",height:"802"})})]}),(0,t.jsxs)(m,{value:"imageFromRegistry",label:"Via Image from registry",children:[(0,t.jsxs)(n.p,{children:["Just specify an OCI image on the ",(0,t.jsx)(n.code,{children:"Image path"})," field to upgrade to:"]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Upgrade via Image Registry",src:a(6037).Z+"",width:"901",height:"745"})})]})]}),"\n",(0,t.jsxs)(n.p,{children:["Click on the ",(0,t.jsx)(n.code,{children:"Create"})," button to start the upgrade process, if you have multiple nodes, the upgrade will be done sequentially node by node."]})]})}function v(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}function b(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},8139:(e,n,a)=>{a.d(n,{Z:()=>t});const t="apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSVersionChannel\nmetadata:\n name: elemental-teal-channel\n namespace: fleet-default\nspec:\n options:\n image: registry.suse.com/rancher/elemental-teal-channel/5.3:latest\n type: custom\n"},9992:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSVersionChannel\nmetadata:\n name: elemental-versions\n namespace: fleet-default\nspec:\n options:\n URI: "https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/upgrade/versions.json"\n Timeout: "1m"\n type: json'},4298:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to or track the latest tag\n osImage: "registry.suse.com/rancher/elemental-teal/5.3:latest"\n clusterTargets:\n - clusterName: my-cluster\n'},2361:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to\n osImage: "registry.suse.com/rancher/elemental-teal/5.3:latest"\n clusterTargets:\n - clusterName: my-cluster\n upgradeContainer:\n envs:\n - name: FORCE\n value: "true"\n'},5130:(e,n,a)=>{a.d(n,{Z:()=>t});const t="apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new ManagedOSVersion you would like to upgrade to\n managedOSVersionName: v0.1.0-alpha22-amd64\n clusterTargets:\n - clusterName: my-cluster"},1230:(e,n,a)=>{a.d(n,{Z:()=>t});const t='apiVersion: elemental.cattle.io/v1beta1\nkind: ManagedOSImage\nmetadata:\n name: my-upgrade\n namespace: fleet-default\nspec:\n # Set to the new Elemental version you would like to upgrade to\n osImage: "registry.suse.com/rancher/elemental-teal/5.3:latest"\n clusterTargets:\n - clusterName: my-cluster\n nodeSelector:\n matchLabels:\n kubernetes.io/hostname: my-machine\n'},460:(e,n,a)=>{a.d(n,{Z:()=>t});const t='[\n {\n "metadata": {\n "name": "v0.1.0"\n },\n "spec": {\n "version": "v0.1.0",\n "type": "container",\n "metadata": {\n "upgradeImage": "foo/bar:v0.1.0"\n }\n }\n },\n {\n "metadata": {\n "name": "v0.2.0"\n },\n "spec": {\n "version": "v0.2.0",\n "type": "container",\n "metadata": {\n "upgradeImage": "foo/bar:v0.2.0"\n }\n }\n }\n]'},6037:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-image-registry-dc5f48d0d96df566f8035d4fdd7f2e1e.png"},1343:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-menu-93b767af21b0dbe3e2b60d07897488ca.png"},9036:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-os-version-0dbbe5e7b5f9a4c0ba6801227541b900.png"},5651:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-upgrade-group-channel-6f58b8b4ab7ad99803bd22cdaf983a16.png"},4749:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/upgrade-ui-version-channel-1c99191874b1827b23f1bad6336aade3.png"},1151:(e,n,a)=>{a.d(n,{Z:()=>i,a:()=>l});var t=a(7294);const s={},r=t.createContext(s);function l(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b02e4210.3999e4a9.js b/assets/js/b02e4210.3999e4a9.js deleted file mode 100644 index bff6be1b4..000000000 --- a/assets/js/b02e4210.3999e4a9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[381],{7981:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>i,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var a=n(5893),t=n(1151);const o={sidebar_label:"Restore",title:""},s="Restore",c={id:"restore",title:"",description:"Follow this guide to restore an Elemental configuration from a backup with Rancher.",source:"@site/versioned_docs/version-1.3/restore.md",sourceDirName:".",slug:"/restore",permalink:"/restore",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Restore",title:""},sidebar:"docs",previous:{title:"Backup",permalink:"/backup"},next:{title:"Configure Wi-Fi",permalink:"/wifi"}},i={},l=[{value:"Prepare rancher-backup operator and backup files for restoring",id:"prepare-rancher-backup-operator-and-backup-files-for-restoring",level:2},{value:"Restore the Elemental configuration with rancher-backup operator",id:"restore-the-elemental-configuration-with-rancher-backup-operator",level:2}];function u(e){const r={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(r.h1,{id:"restore",children:"Restore"}),"\n",(0,a.jsx)(r.p,{children:"Follow this guide to restore an Elemental configuration from a backup with Rancher."}),"\n",(0,a.jsx)(r.h2,{id:"prepare-rancher-backup-operator-and-backup-files-for-restoring",children:"Prepare rancher-backup operator and backup files for restoring"}),"\n",(0,a.jsxs)(r.p,{children:["Go to official ",(0,a.jsx)(r.a,{href:"https://docs.ranchermanager.rancher.io/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/restore-rancher",children:"Rancher documentation"})," and make sure that ",(0,a.jsx)(r.code,{children:"rancher-backup operator"})," is installed and has access to backup files."]}),"\n",(0,a.jsxs)(r.p,{children:["You first have to follow this ",(0,a.jsx)(r.a,{href:"/backup",children:"documentation"})," to do a backup of Elemental resources."]}),"\n",(0,a.jsx)(r.h2,{id:"restore-the-elemental-configuration-with-rancher-backup-operator",children:"Restore the Elemental configuration with rancher-backup operator"}),"\n",(0,a.jsxs)(r.p,{children:["Create a ",(0,a.jsx)(r.code,{children:"restore object"})," (adapted to your needs) to restore the backup tarball."]}),"\n",(0,a.jsx)(r.pre,{children:(0,a.jsx)(r.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: resources.cattle.io/v1\nkind: Restore\nmetadata:\n name: elemental-restore\nspec:\n backupFilename: rancher-backup-430169aa-edde-4a61-85e8-858f625a755b-2022-10-17T05-15-00Z.tar.gz\n"})}),"\n",(0,a.jsx)(r.p,{children:"Apply manifest on Kubernetes."}),"\n",(0,a.jsx)(r.pre,{children:(0,a.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f elemental-restore.yaml\n"})}),"\n",(0,a.jsx)(r.p,{children:"Check logs from rancher-backup operator."}),"\n",(0,a.jsx)(r.pre,{children:(0,a.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl logs -n cattle-resources-system -l app.kubernetes.io/name=rancher-backup -f\n"})}),"\n",(0,a.jsx)(r.p,{children:"Verify if backup file was restore successfully."}),"\n",(0,a.jsx)(r.pre,{children:(0,a.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"...\nINFO[2022/10/31 06:34:50] Processing controllerRef apps/v1/deployments/rancher \nINFO[2022/10/31 06:34:50] Done restoring\n...\n"})}),"\n",(0,a.jsxs)(r.p,{children:["Continue with procedure from ",(0,a.jsx)(r.a,{href:"https://docs.ranchermanager.rancher.io/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/migrate-rancher-to-new-cluster",children:"Rancher documentation"})]})]})}function h(e={}){const{wrapper:r}={...(0,t.a)(),...e.components};return r?(0,a.jsx)(r,{...e,children:(0,a.jsx)(u,{...e})}):u(e)}},1151:(e,r,n)=>{n.d(r,{Z:()=>c,a:()=>s});var a=n(7294);const t={},o=a.createContext(t);function s(e){const r=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function c(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),a.createElement(o.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b02e4210.4e3a7699.js b/assets/js/b02e4210.4e3a7699.js new file mode 100644 index 000000000..d86d20e0a --- /dev/null +++ b/assets/js/b02e4210.4e3a7699.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[381],{7981:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>i,contentTitle:()=>s,default:()=>p,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var t=n(5893),a=n(1151);const o={sidebar_label:"Restore",title:""},s="Restore",c={id:"restore",title:"",description:"Follow this guide to restore an Elemental configuration from a backup with Rancher.",source:"@site/versioned_docs/version-1.3/restore.md",sourceDirName:".",slug:"/restore",permalink:"/restore",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Restore",title:""},sidebar:"docs",previous:{title:"Backup",permalink:"/backup"},next:{title:"Configure Wi-Fi",permalink:"/wifi"}},i={},l=[{value:"Prepare rancher-backup operator and backup files for restoring",id:"prepare-rancher-backup-operator-and-backup-files-for-restoring",level:2},{value:"Restore the Elemental configuration with rancher-backup operator",id:"restore-the-elemental-configuration-with-rancher-backup-operator",level:2}];function d(e){const r={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,a.a)(),...e.components},{Head:n}=r;return n||function(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n,{children:(0,t.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/restore"})}),"\n",(0,t.jsx)(r.h1,{id:"restore",children:"Restore"}),"\n",(0,t.jsx)(r.p,{children:"Follow this guide to restore an Elemental configuration from a backup with Rancher."}),"\n",(0,t.jsx)(r.h2,{id:"prepare-rancher-backup-operator-and-backup-files-for-restoring",children:"Prepare rancher-backup operator and backup files for restoring"}),"\n",(0,t.jsxs)(r.p,{children:["Go to official ",(0,t.jsx)(r.a,{href:"https://docs.ranchermanager.rancher.io/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/restore-rancher",children:"Rancher documentation"})," and make sure that ",(0,t.jsx)(r.code,{children:"rancher-backup operator"})," is installed and has access to backup files."]}),"\n",(0,t.jsxs)(r.p,{children:["You first have to follow this ",(0,t.jsx)(r.a,{href:"/backup",children:"documentation"})," to do a backup of Elemental resources."]}),"\n",(0,t.jsx)(r.h2,{id:"restore-the-elemental-configuration-with-rancher-backup-operator",children:"Restore the Elemental configuration with rancher-backup operator"}),"\n",(0,t.jsxs)(r.p,{children:["Create a ",(0,t.jsx)(r.code,{children:"restore object"})," (adapted to your needs) to restore the backup tarball."]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: resources.cattle.io/v1\nkind: Restore\nmetadata:\n name: elemental-restore\nspec:\n backupFilename: rancher-backup-430169aa-edde-4a61-85e8-858f625a755b-2022-10-17T05-15-00Z.tar.gz\n"})}),"\n",(0,t.jsx)(r.p,{children:"Apply manifest on Kubernetes."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f elemental-restore.yaml\n"})}),"\n",(0,t.jsx)(r.p,{children:"Check logs from rancher-backup operator."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl logs -n cattle-resources-system -l app.kubernetes.io/name=rancher-backup -f\n"})}),"\n",(0,t.jsx)(r.p,{children:"Verify if backup file was restore successfully."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"...\nINFO[2022/10/31 06:34:50] Processing controllerRef apps/v1/deployments/rancher \nINFO[2022/10/31 06:34:50] Done restoring\n...\n"})}),"\n",(0,t.jsxs)(r.p,{children:["Continue with procedure from ",(0,t.jsx)(r.a,{href:"https://docs.ranchermanager.rancher.io/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/migrate-rancher-to-new-cluster",children:"Rancher documentation"})]})]})}function p(e={}){const{wrapper:r}={...(0,a.a)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,r,n)=>{n.d(r,{Z:()=>c,a:()=>s});var t=n(7294);const a={},o=t.createContext(a);function s(e){const r=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function c(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),t.createElement(o.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b037c97a.3a868624.js b/assets/js/b037c97a.3a868624.js deleted file mode 100644 index 887f8d411..000000000 --- a/assets/js/b037c97a.3a868624.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[2923],{8821:(e,n,t)=>{t.d(n,{ZP:()=>r});var s=t(5893),i=t(1151);function a(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components},{TabItem:t,Tabs:a}=n;return t||l("TabItem",!0),a||l("Tabs",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"install-elemental-operator",children:"Install Elemental Operator"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"elemental-operator"})," is the management endpoint, running the management\ncluster and taking care of creating inventories, registrations for machines and much more."]}),"\n",(0,s.jsx)(n.p,{children:"We will use the Helm package manager to install the elemental-operator chart into our cluster."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Now after a few seconds you should see the operator pod appear on the ",(0,s.jsx)(n.code,{children:"cattle-elemental-system"})," namespace:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl get pods -n cattle-elemental-system\nNAME READY STATUS RESTARTS AGE\nelemental-operator-64f88fc695-b8qhn 1/1 Running 0 16s\n"})}),"\n",(0,s.jsx)(n.admonition,{title:"Helm v3.8.0+ required",type:"info",children:(0,s.jsx)(n.p,{children:"The Elemental Operator chart is distributed via an OCI registry: Helm correctly supports OCI based registries starting from the v3.8.0 release."})}),"\n",(0,s.jsx)(n.admonition,{title:"Swap charts installation order when upgrading from elemental-operator release < 1.2.4",type:"warning",children:(0,s.jsx)(n.p,{children:"When upgrading from an elemental-operator release embedding the Elemental CRDs (version < 1.2.4) the elemental-operator-crds chart installation will fail.\nYou will need to upgrade the elemental-operator chart first, and only then install the elemental-operator-crds chart."})}),"\n",(0,s.jsx)(n.h3,{id:"non-stable-installations",children:"Non-stable installations"}),"\n",(0,s.jsxs)(n.p,{children:["Besides the Helm charts listed above, there are two other ",(0,s.jsx)(n.code,{children:"non-stable"}),"\nversions available."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Staging:"})," refers to the latest tagged release from Github. This is documented in the ",(0,s.jsx)(n.a,{href:"next/quickstart-ui",children:"Next"})," pages."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Development:"})," refers to the 'tip of HEAD' from Github. This is the ongoing development version and changes constantly."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(a,{children:[(0,s.jsx)(t,{value:"stagingOperator",label:"Staging version (x86-64, ARM64 (Raspberry Pi 4))",default:!0,children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.opensuse.org/isv/rancher/elemental/staging/charts/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.opensuse.org/isv/rancher/elemental/staging/charts/rancher/elemental-operator-chart\n"})})}),(0,s.jsxs)(t,{value:"develOperator",label:"Development version (x86-64, ARM64 (Raspberry Pi 4))",default:!0,children:[(0,s.jsx)(n.admonition,{title:"Reminder",type:"warning",children:(0,s.jsx)(n.p,{children:"The development version is not recommended for production environments. We welcome feedback via Slack or Github issues, but it could be unstable and contain experimental features that can be dropped without notice."})}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.opensuse.org/isv/rancher/elemental/dev/charts/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install --set image.imagePullPolicy=Always elemental-operator oci://registry.opensuse.org/isv/rancher/elemental/dev/charts/rancher/elemental-operator-chart\n"})})]})]}),"\n",(0,s.jsx)(n.h3,{id:"installation-options",children:"Installation options"}),"\n",(0,s.jsxs)(n.p,{children:["There are a few options that can be set in the chart install but that is out of scope for this document. You can see all the values on the chart ",(0,s.jsx)(n.a,{href:"https://github.com/rancher/elemental-operator/blob/main/charts/operator/values.yaml",children:"values.yaml"}),"."]})]})}function r(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}function l(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},6265:(e,n,t)=>{t.d(n,{ZP:()=>r});var s=t(5893),i=t(1151);function a(e){const n={a:"a",code:"code",h2:"h2",li:"li",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["A Rancher server (v2.7.0 or later) configured (server-url set)","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["To configure the Rancher ",(0,s.jsx)(n.code,{children:"server-url"})," please check the ",(0,s.jsx)(n.a,{href:"https://rancher.com/docs/rancher/v2.6/en/admin-settings/#first-log-in",children:"Rancher docs"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["A machine (bare metal or virtualized) with TPM 2.0","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Hint 1: Libvirt allows setting virtual TPMs for virtual machines ",(0,s.jsx)(n.a,{href:"tpm/#add-tpm-module-to-virtual-machine",children:"example here"})]}),"\n",(0,s.jsxs)(n.li,{children:["Hint 2: You can enable TPM emulation on bare metal machines missing the TPM 2.0 module ",(0,s.jsx)(n.a,{href:"tpm/#add-tpm-emulation-to-bare-metal-machine",children:"example here"})]}),"\n",(0,s.jsx)(n.li,{children:"Hint 3: Make sure you're using UEFI (not BIOS) on x86-64, or the ISO won't boot"}),"\n",(0,s.jsxs)(n.li,{children:["Hint 4: A minimum volume size of 25 GB is recommended. See the ",(0,s.jsx)(n.a,{href:"/installation#deployed-elemental-teal-partition-table",children:"Elemental Teal partition table"})," for more details"]}),"\n",(0,s.jsxs)(n.li,{children:["Hint 5: CPU and RAM requirements depend on the Kubernetes version installed, for example ",(0,s.jsx)(n.a,{href:"https://docs.k3s.io/installation/requirements#hardware",children:"K3s"})," or ",(0,s.jsx)(n.a,{href:"https://docs.rke2.io/install/requirements#hardware",children:"RKE2"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Helm Package Manager (",(0,s.jsx)(n.a,{href:"https://helm.sh/",children:"https://helm.sh/"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:["For ARM (aarch64) - One SD-card (32 GB or more, must be ",(0,s.jsx)(n.strong,{children:"fast"})," - 40MB/s write speed is acceptable) and a USB-stick for installation"]}),"\n"]})]})}function r(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},5721:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>o,default:()=>p,frontMatter:()=>l,metadata:()=>c,toc:()=>d});var s=t(5893),i=t(1151),a=t(6265),r=t(8821);const l={sidebar_label:"Elemental the visual way",title:""},o="Elemental the visual way",c={id:"quickstart-ui",title:"",description:"This quickstart will show you how to deploy the Elemental plugin into an existing Rancher Manager instance.",source:"@site/versioned_docs/version-1.3/quickstart-ui.md",sourceDirName:".",slug:"/quickstart-ui",permalink:"/quickstart-ui",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Elemental the visual way",title:""},sidebar:"docs",previous:{title:"Overview",permalink:"/"},next:{title:"Elemental the command line way",permalink:"/quickstart-cli"}},h={},d=[{value:"Enable the Rancher Manager Extensions Support",id:"enable-the-rancher-manager-extensions-support",level:2},{value:"Install the elemental plugin",id:"install-the-elemental-plugin",level:2},{value:"Add a Machine Registration Endpoint",id:"add-a-machine-registration-endpoint",level:2},{value:"Preparing the installation (seed) image",id:"preparing-the-installation-seed-image",level:2},{value:"Machine Inventory",id:"machine-inventory",level:2},{value:"Create your first Elemental Cluster",id:"create-your-first-elemental-cluster",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",img:"img",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"elemental-the-visual-way",children:"Elemental the visual way"}),"\n",(0,s.jsx)(n.p,{children:"This quickstart will show you how to deploy the Elemental plugin into an existing Rancher Manager instance."}),"\n",(0,s.jsx)(n.p,{children:"Once installed, you'll be able to provision a new Elemental cluster based on RKE2 or K3s."}),"\n",(0,s.jsx)(a.ZP,{}),"\n",(0,s.jsx)(r.ZP,{}),"\n",(0,s.jsx)(n.h2,{id:"enable-the-rancher-manager-extensions-support",children:"Enable the Rancher Manager Extensions Support"}),"\n",(0,s.jsx)(n.p,{children:"In order to enable the Rancher Manager Extensions Support, you'll need to follow the steps below:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Open a web browser, connect and login to your Rancher Manager instance"}),"\n",(0,s.jsxs)(n.li,{children:["Click on the top left menu ",(0,s.jsx)(n.code,{children:"a"})," and click on ",(0,s.jsx)(n.code,{children:"Extensions"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Rancher Manager menu",src:t(7652).Z+"",width:"279",height:"545"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Click on ",(0,s.jsx)(n.code,{children:"Enable"})," button to install the ",(0,s.jsx)(n.code,{children:"Extension Operator"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Enable Rancher Manager Extensions Operator",src:t(6814).Z+"",width:"1107",height:"420"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["A popup will appear, click on the ",(0,s.jsx)(n.code,{children:"OK"})," button to continue and install the Rancher Manager Extensions repository"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Add Rancher Manager Extensions repository",src:t(576).Z+"",width:"1212",height:"586"})}),"\n",(0,s.jsx)(n.h2,{id:"install-the-elemental-plugin",children:"Install the elemental plugin"}),"\n",(0,s.jsxs)(n.p,{children:["After the Rancher Manager Extensions Support is enabled, you can install the ",(0,s.jsx)(n.code,{children:"elemental"})," plugin as follow:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Under the ",(0,s.jsx)(n.code,{children:"Available"})," tab you will see ",(0,s.jsx)(n.code,{children:"elemental"})," plugin available"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Rancher Manager Available plugins",src:t(5426).Z+"",width:"620",height:"296"})}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["If the ",(0,s.jsx)(n.code,{children:"Available"})," tab shows no entries, refresh the page. The ",(0,s.jsx)(n.code,{children:"elemental"})," plugin will then appear."]})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Click on the ",(0,s.jsx)(n.code,{children:"Install"})," button, a popup will appear and click on ",(0,s.jsx)(n.code,{children:"Install"})," again to continue."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Elemental plugin install",src:t(1709).Z+"",width:"1215",height:"598"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["On the ",(0,s.jsx)(n.code,{children:"Installed"})," tab, the ",(0,s.jsx)(n.code,{children:"elemental"})," plugin is now listed."]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["If the ",(0,s.jsx)(n.code,{children:"elemental"})," plugin is listed and the status stays at ",(0,s.jsx)(n.code,{children:"Installing..."}),", refresh the page. The ",(0,s.jsx)(n.code,{children:"elemental"})," plugin will display correctly."]})}),"\n",(0,s.jsxs)(n.p,{children:["Once the ",(0,s.jsx)(n.code,{children:"elemental"})," plugin installed, you can see the ",(0,s.jsx)(n.code,{children:"OS Manamagent"})," option in the Rancher Manager menu."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Rancher Manager OS Management menu",src:t(8054).Z+"",width:"278",height:"579"})}),"\n",(0,s.jsx)(n.h2,{id:"add-a-machine-registration-endpoint",children:"Add a Machine Registration Endpoint"}),"\n",(0,s.jsxs)(n.p,{children:["In the OS Management dashboard, click the ",(0,s.jsx)(n.code,{children:"Create Registration Endpoint"})," button."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"OS Management registration endpoints",src:t(867).Z+"",width:"766",height:"307"})}),"\n",(0,s.jsx)(n.p,{children:"Now here either you can enter each detail in its respective places or you can edit this as YAML and create the endpoint in one go. Here we'll edit every fields."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Create a Registration Endpoint with UI",src:t(1312).Z+"",width:"953",height:"1524"})}),"\n",(0,s.jsxs)(n.admonition,{title:"main options",type:"info",children:[(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"name: elemental-cluster1"}),": change this as per your need"]}),(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"device: /dev/sda"}),': make sure your target device is "sda". Otherwise find out how the disk device is named and change it here. For example, in Raspberry Pi it could be "mmblk"']}),(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"emulate-tpm: true"}),": use this only if your target device doesn't have a TPM device and you have a way of emulating TPM like in VMware or KVM"]}),(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"emulated-tpm-seed: 1"}),": increase this by 1 for every new machine. If this value is not set, each machine will receive the same TPM hash and it won't show up under the machine inventory."]})]}),"\n",(0,s.jsx)(n.admonition,{title:"attention",type:"danger",children:(0,s.jsxs)(n.p,{children:["Emulated TPM is only for non-production usage like for testing as it beats the purpose of security. So in production usage use the code above without the ",(0,s.jsx)(n.code,{children:"emulate-tpm"})," and ",(0,s.jsx)(n.code,{children:"emulate-tpm-seed"})]})}),"\n",(0,s.jsx)(n.p,{children:"Once you create the machine registration end point it should show up as active."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Machine registered in Registration Endpoints",src:t(9538).Z+"",width:"572",height:"376"})}),"\n",(0,s.jsx)(n.h2,{id:"preparing-the-installation-seed-image",children:"Preparing the installation (seed) image"}),"\n",(0,s.jsx)(n.p,{children:"Now this is the last step, you need to prepare an Elemental Teal seed image that includes the initial registration config, so\nit can be auto registered, installed and fully deployed as part of your cluster. The contents of the file are nothing\nmore than the registration URL that the node needs to register and the proper server certificate, so it can connect securely."}),"\n",(0,s.jsx)(n.p,{children:"This seed image can then be used to provision an infinite number of machines."}),"\n",(0,s.jsxs)(n.p,{children:["The seed image is created as a Kubernetes resource above and can be built using the ",(0,s.jsx)(n.code,{children:"Build ISO"})," button:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Build ISO in Registration Endpoints",src:t(2233).Z+"",width:"1247",height:"435"})}),"\n",(0,s.jsxs)(n.p,{children:["Once the build is done, ISO can be downloaded using the ",(0,s.jsx)(n.code,{children:"Download ISO"})," button:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Download ISO in Registration Endpoints",src:t(3783).Z+"",width:"1247",height:"435"})}),"\n",(0,s.jsx)(n.p,{children:"You can now boot your nodes with this image and they will:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Register with the registrationURL given and create a per-machine ",(0,s.jsx)(n.code,{children:"MachineInventory"})]}),"\n",(0,s.jsx)(n.li,{children:"Install Elemental Teal to the given device"}),"\n",(0,s.jsx)(n.li,{children:"Reboot"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"machine-inventory",children:"Machine Inventory"}),"\n",(0,s.jsxs)(n.p,{children:["When nodes are booting up for the first time, they connect to Rancher Manager and a ",(0,s.jsx)(n.a,{href:"https://elemental.docs.rancher.com/architecture#machineinventory",children:(0,s.jsx)(n.code,{children:"Machine Inventory"})})," is created for each node."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Machine Inventory menu",src:t(7050).Z+"",width:"1673",height:"574"})}),"\n",(0,s.jsxs)(n.p,{children:["Custom columns are based on ",(0,s.jsx)(n.code,{children:"Machine Inventory Labels"})," which you can add when you create your ",(0,s.jsx)(n.code,{children:"Machine Registration Endpoint"}),":"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Machine Registration Endpoint Hardware Labels",src:t(493).Z+"",width:"1665",height:"1368"})}),"\n",(0,s.jsxs)(n.p,{children:["On the following screenshot, ",(0,s.jsx)(n.a,{href:"https://elemental.docs.rancher.com/hardwarelabels/#hardware-labels",children:(0,s.jsx)(n.code,{children:"Hardware Labels"})})," are used as custom columns:"]}),"\n",(0,s.jsx)(n.p,{children:"You can also add custom columns by clicking on the three dots menu."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Machine Inventory custom columns",src:t(761).Z+"",width:"1672",height:"734"})}),"\n",(0,s.jsxs)(n.p,{children:["Finally, you can also filter your ",(0,s.jsx)(n.code,{children:"Machine Inventory"})," using those labels."]}),"\n",(0,s.jsxs)(n.p,{children:["For instance if you only want to see your AMD machines, you can filter on ",(0,s.jsx)(n.code,{children:"CPUModel"})," like below:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Machine Inventory filtering",src:t(9017).Z+"",width:"1672",height:"734"})}),"\n",(0,s.jsx)(n.h2,{id:"create-your-first-elemental-cluster",children:"Create your first Elemental Cluster"}),"\n",(0,s.jsxs)(n.p,{children:["Now let's use those ",(0,s.jsx)(n.code,{children:"Machine Inventory"})," to create a cluster by clicking on ",(0,s.jsx)(n.code,{children:"Create Elemental Cluster"})," :"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Create Elemental Cluster button",src:t(2919).Z+"",width:"1663",height:"854"})}),"\n",(0,s.jsx)(n.p,{children:"For your Elemental cluster, you can either choose K3s or RKE2 for Kubernetes."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Elemental Cluster Creation Screen",src:t(571).Z+"",width:"1677",height:"1374"})}),"\n",(0,s.jsxs)(n.p,{children:["Most of the options are coming from Rancher, that's why we will not detail all the possibilities.\nFeel free to check the ",(0,s.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/pages-for-subheaders/rancher-server-configuration",children:"Rancher Manager documentation"})," if you want to know more."]}),"\n",(0,s.jsxs)(n.p,{children:["However, it is important to highlight the ",(0,s.jsx)(n.code,{children:"Inventory of Machines Selector Template"})," section."]}),"\n",(0,s.jsxs)(n.p,{children:["It lets you choose which ",(0,s.jsx)(n.code,{children:"Machine Inventory"})," you want to use to create your Elemental cluster using the previously defined ",(0,s.jsx)(n.code,{children:"Machine Inventory Labels"})," :"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Use Machine Inventory Selector Template",src:t(5348).Z+"",width:"1359",height:"547"})}),"\n",(0,s.jsxs)(n.p,{children:["As our three Machine Inventories contain the label ",(0,s.jsx)(n.code,{children:"CPUVendor"})," with the key ",(0,s.jsx)(n.code,{children:"AuthenticAMD"}),", the three machines will be used to create the Elemental cluster."]})]})}function p(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},2919:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-create-cluster-button-e1d0392a7278e6de17a5fbe26b77b5eb.png"},5348:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-create-cluster-machine-selector-template-a114d9eb08cb6423423a79c94900afd1.png"},571:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-create-cluster-standard-screen--fdccedc04c52226c9b621f580de28f85.png"},1709:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-elemental-plugin-install-ecdc4ce7ce04426c02ff914ecf13d906.png"},8054:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-elemental-plugin-menu-0e0659f62678b700aa7d7341284fd9a5.png"},6814:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-extension-enable-86662009426b5220cab5c9f72a71ea4b.png"},576:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-extension-repository-84e4ca717832fe04524f71741750f69c.png"},5426:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-extensions-available-31f7812c57abc824b1337bd8ae3d6247.png"},761:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-machine-inventory-custom-columns-120ed1afa8effc83540bb72631623aa7.png"},9017:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-machine-inventory-filtering-b7918cd6394c1d0aa8158adbc7d6039b.png"},7050:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-machine-inventory-menu-e868fad782ec36416690986b9a0ee4b9.png"},7652:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-menu-62e787746510862a9bc32b4ac1d65213.png"},2233:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-registration-endpoint-build-ISO-e3e6386d33bb61f4c45bfd261000cdc5.png"},9538:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-registration-endpoint-complete-7c3686ae051927fdb9cec1ee38a8eb58.png"},1312:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-registration-endpoint-create-details-5954e7fe1555060b20987c13a0978cd8.png"},867:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-registration-endpoint-create-f687c90235eea798645d699b6bbd8d23.png"},3783:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-registration-endpoint-download-ISO-d9eccf8bb5bdc387fecfa757df572815.png"},493:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/quickstart-ui-registration-endpoint-hardware-labels-d96f34687fee37f7f1438e21508cacce.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>r});var s=t(7294);const i={},a=s.createContext(i);function r(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b037c97a.4d238169.js b/assets/js/b037c97a.4d238169.js new file mode 100644 index 000000000..853a34ea2 --- /dev/null +++ b/assets/js/b037c97a.4d238169.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[2923],{8821:(e,n,t)=>{t.d(n,{ZP:()=>r});var i=t(5893),s=t(1151);function a(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components},{TabItem:t,Tabs:a}=n;return t||l("TabItem",!0),a||l("Tabs",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"install-elemental-operator",children:"Install Elemental Operator"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"elemental-operator"})," is the management endpoint, running the management\ncluster and taking care of creating inventories, registrations for machines and much more."]}),"\n",(0,i.jsx)(n.p,{children:"We will use the Helm package manager to install the elemental-operator chart into our cluster."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Now after a few seconds you should see the operator pod appear on the ",(0,i.jsx)(n.code,{children:"cattle-elemental-system"})," namespace:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl get pods -n cattle-elemental-system\nNAME READY STATUS RESTARTS AGE\nelemental-operator-64f88fc695-b8qhn 1/1 Running 0 16s\n"})}),"\n",(0,i.jsx)(n.admonition,{title:"Helm v3.8.0+ required",type:"info",children:(0,i.jsx)(n.p,{children:"The Elemental Operator chart is distributed via an OCI registry: Helm correctly supports OCI based registries starting from the v3.8.0 release."})}),"\n",(0,i.jsx)(n.admonition,{title:"Swap charts installation order when upgrading from elemental-operator release < 1.2.4",type:"warning",children:(0,i.jsx)(n.p,{children:"When upgrading from an elemental-operator release embedding the Elemental CRDs (version < 1.2.4) the elemental-operator-crds chart installation will fail.\nYou will need to upgrade the elemental-operator chart first, and only then install the elemental-operator-crds chart."})}),"\n",(0,i.jsx)(n.h3,{id:"non-stable-installations",children:"Non-stable installations"}),"\n",(0,i.jsxs)(n.p,{children:["Besides the Helm charts listed above, there are two other ",(0,i.jsx)(n.code,{children:"non-stable"}),"\nversions available."]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Staging:"})," refers to the latest tagged release from Github. This is documented in the ",(0,i.jsx)(n.a,{href:"next/quickstart-ui",children:"Next"})," pages."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Development:"})," refers to the 'tip of HEAD' from Github. This is the ongoing development version and changes constantly."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(a,{children:[(0,i.jsx)(t,{value:"stagingOperator",label:"Staging version (x86-64, ARM64 (Raspberry Pi 4))",default:!0,children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.opensuse.org/isv/rancher/elemental/staging/charts/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.opensuse.org/isv/rancher/elemental/staging/charts/rancher/elemental-operator-chart\n"})})}),(0,i.jsxs)(t,{value:"develOperator",label:"Development version (x86-64, ARM64 (Raspberry Pi 4))",default:!0,children:[(0,i.jsx)(n.admonition,{title:"Reminder",type:"warning",children:(0,i.jsx)(n.p,{children:"The development version is not recommended for production environments. We welcome feedback via Slack or Github issues, but it could be unstable and contain experimental features that can be dropped without notice."})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.opensuse.org/isv/rancher/elemental/dev/charts/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install --set image.imagePullPolicy=Always elemental-operator oci://registry.opensuse.org/isv/rancher/elemental/dev/charts/rancher/elemental-operator-chart\n"})})]})]}),"\n",(0,i.jsx)(n.h3,{id:"installation-options",children:"Installation options"}),"\n",(0,i.jsxs)(n.p,{children:["There are a few options that can be set in the chart install but that is out of scope for this document. You can see all the values on the chart ",(0,i.jsx)(n.a,{href:"https://github.com/rancher/elemental-operator/blob/main/charts/operator/values.yaml",children:"values.yaml"}),"."]})]})}function r(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}function l(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},6265:(e,n,t)=>{t.d(n,{ZP:()=>r});var i=t(5893),s=t(1151);function a(e){const n={a:"a",code:"code",h2:"h2",li:"li",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["A Rancher server (v2.7.0 or later) configured (server-url set)","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["To configure the Rancher ",(0,i.jsx)(n.code,{children:"server-url"})," please check the ",(0,i.jsx)(n.a,{href:"https://rancher.com/docs/rancher/v2.6/en/admin-settings/#first-log-in",children:"Rancher docs"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["A machine (bare metal or virtualized) with TPM 2.0","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Hint 1: Libvirt allows setting virtual TPMs for virtual machines ",(0,i.jsx)(n.a,{href:"tpm/#add-tpm-module-to-virtual-machine",children:"example here"})]}),"\n",(0,i.jsxs)(n.li,{children:["Hint 2: You can enable TPM emulation on bare metal machines missing the TPM 2.0 module ",(0,i.jsx)(n.a,{href:"tpm/#add-tpm-emulation-to-bare-metal-machine",children:"example here"})]}),"\n",(0,i.jsx)(n.li,{children:"Hint 3: Make sure you're using UEFI (not BIOS) on x86-64, or the ISO won't boot"}),"\n",(0,i.jsxs)(n.li,{children:["Hint 4: A minimum volume size of 25 GB is recommended. See the ",(0,i.jsx)(n.a,{href:"/installation#deployed-elemental-teal-partition-table",children:"Elemental Teal partition table"})," for more details"]}),"\n",(0,i.jsxs)(n.li,{children:["Hint 5: CPU and RAM requirements depend on the Kubernetes version installed, for example ",(0,i.jsx)(n.a,{href:"https://docs.k3s.io/installation/requirements#hardware",children:"K3s"})," or ",(0,i.jsx)(n.a,{href:"https://docs.rke2.io/install/requirements#hardware",children:"RKE2"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Helm Package Manager (",(0,i.jsx)(n.a,{href:"https://helm.sh/",children:"https://helm.sh/"}),")"]}),"\n",(0,i.jsxs)(n.li,{children:["For ARM (aarch64) - One SD-card (32 GB or more, must be ",(0,i.jsx)(n.strong,{children:"fast"})," - 40MB/s write speed is acceptable) and a USB-stick for installation"]}),"\n"]})]})}function r(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},5721:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>o,default:()=>p,frontMatter:()=>l,metadata:()=>c,toc:()=>d});var i=t(5893),s=t(1151),a=t(6265),r=t(8821);const l={sidebar_label:"Elemental the visual way",title:""},o="Elemental the visual way",c={id:"quickstart-ui",title:"",description:"This quickstart will show you how to deploy the Elemental plugin into an existing Rancher Manager instance.",source:"@site/versioned_docs/version-1.3/quickstart-ui.md",sourceDirName:".",slug:"/quickstart-ui",permalink:"/quickstart-ui",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Elemental the visual way",title:""},sidebar:"docs",previous:{title:"Overview",permalink:"/"},next:{title:"Elemental the command line way",permalink:"/quickstart-cli"}},h={},d=[{value:"Enable the Rancher Manager Extensions Support",id:"enable-the-rancher-manager-extensions-support",level:2},{value:"Install the elemental plugin",id:"install-the-elemental-plugin",level:2},{value:"Add a Machine Registration Endpoint",id:"add-a-machine-registration-endpoint",level:2},{value:"Preparing the installation (seed) image",id:"preparing-the-installation-seed-image",level:2},{value:"Machine Inventory",id:"machine-inventory",level:2},{value:"Create your first Elemental Cluster",id:"create-your-first-elemental-cluster",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components},{Head:l}=n;return l||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(l,{children:(0,i.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/quickstart-ui"})}),"\n","\n","\n",(0,i.jsx)(n.h1,{id:"elemental-the-visual-way",children:"Elemental the visual way"}),"\n",(0,i.jsx)(n.p,{children:"This quickstart will show you how to deploy the Elemental plugin into an existing Rancher Manager instance."}),"\n",(0,i.jsx)(n.p,{children:"Once installed, you'll be able to provision a new Elemental cluster based on RKE2 or K3s."}),"\n",(0,i.jsx)(a.ZP,{}),"\n",(0,i.jsx)(r.ZP,{}),"\n",(0,i.jsx)(n.h2,{id:"enable-the-rancher-manager-extensions-support",children:"Enable the Rancher Manager Extensions Support"}),"\n",(0,i.jsx)(n.p,{children:"In order to enable the Rancher Manager Extensions Support, you'll need to follow the steps below:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Open a web browser, connect and login to your Rancher Manager instance"}),"\n",(0,i.jsxs)(n.li,{children:["Click on the top left menu ",(0,i.jsx)(n.code,{children:"a"})," and click on ",(0,i.jsx)(n.code,{children:"Extensions"})]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Rancher Manager menu",src:t(7652).Z+"",width:"279",height:"545"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Click on ",(0,i.jsx)(n.code,{children:"Enable"})," button to install the ",(0,i.jsx)(n.code,{children:"Extension Operator"})]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Enable Rancher Manager Extensions Operator",src:t(6814).Z+"",width:"1107",height:"420"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["A popup will appear, click on the ",(0,i.jsx)(n.code,{children:"OK"})," button to continue and install the Rancher Manager Extensions repository"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Add Rancher Manager Extensions repository",src:t(576).Z+"",width:"1212",height:"586"})}),"\n",(0,i.jsx)(n.h2,{id:"install-the-elemental-plugin",children:"Install the elemental plugin"}),"\n",(0,i.jsxs)(n.p,{children:["After the Rancher Manager Extensions Support is enabled, you can install the ",(0,i.jsx)(n.code,{children:"elemental"})," plugin as follow:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Under the ",(0,i.jsx)(n.code,{children:"Available"})," tab you will see ",(0,i.jsx)(n.code,{children:"elemental"})," plugin available"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Rancher Manager Available plugins",src:t(5426).Z+"",width:"620",height:"296"})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["If the ",(0,i.jsx)(n.code,{children:"Available"})," tab shows no entries, refresh the page. The ",(0,i.jsx)(n.code,{children:"elemental"})," plugin will then appear."]})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Click on the ",(0,i.jsx)(n.code,{children:"Install"})," button, a popup will appear and click on ",(0,i.jsx)(n.code,{children:"Install"})," again to continue."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Elemental plugin install",src:t(1709).Z+"",width:"1215",height:"598"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["On the ",(0,i.jsx)(n.code,{children:"Installed"})," tab, the ",(0,i.jsx)(n.code,{children:"elemental"})," plugin is now listed."]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["If the ",(0,i.jsx)(n.code,{children:"elemental"})," plugin is listed and the status stays at ",(0,i.jsx)(n.code,{children:"Installing..."}),", refresh the page. The ",(0,i.jsx)(n.code,{children:"elemental"})," plugin will display correctly."]})}),"\n",(0,i.jsxs)(n.p,{children:["Once the ",(0,i.jsx)(n.code,{children:"elemental"})," plugin installed, you can see the ",(0,i.jsx)(n.code,{children:"OS Manamagent"})," option in the Rancher Manager menu."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Rancher Manager OS Management menu",src:t(8054).Z+"",width:"278",height:"579"})}),"\n",(0,i.jsx)(n.h2,{id:"add-a-machine-registration-endpoint",children:"Add a Machine Registration Endpoint"}),"\n",(0,i.jsxs)(n.p,{children:["In the OS Management dashboard, click the ",(0,i.jsx)(n.code,{children:"Create Registration Endpoint"})," button."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"OS Management registration endpoints",src:t(867).Z+"",width:"766",height:"307"})}),"\n",(0,i.jsx)(n.p,{children:"Now here either you can enter each detail in its respective places or you can edit this as YAML and create the endpoint in one go. Here we'll edit every fields."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Create a Registration Endpoint with UI",src:t(1312).Z+"",width:"953",height:"1524"})}),"\n",(0,i.jsxs)(n.admonition,{title:"main options",type:"info",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"name: elemental-cluster1"}),": change this as per your need"]}),(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"device: /dev/sda"}),': make sure your target device is "sda". Otherwise find out how the disk device is named and change it here. For example, in Raspberry Pi it could be "mmblk"']}),(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"emulate-tpm: true"}),": use this only if your target device doesn't have a TPM device and you have a way of emulating TPM like in VMware or KVM"]}),(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"emulated-tpm-seed: 1"}),": increase this by 1 for every new machine. If this value is not set, each machine will receive the same TPM hash and it won't show up under the machine inventory."]})]}),"\n",(0,i.jsx)(n.admonition,{title:"attention",type:"danger",children:(0,i.jsxs)(n.p,{children:["Emulated TPM is only for non-production usage like for testing as it beats the purpose of security. So in production usage use the code above without the ",(0,i.jsx)(n.code,{children:"emulate-tpm"})," and ",(0,i.jsx)(n.code,{children:"emulate-tpm-seed"})]})}),"\n",(0,i.jsx)(n.p,{children:"Once you create the machine registration end point it should show up as active."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Machine registered in Registration Endpoints",src:t(9538).Z+"",width:"572",height:"376"})}),"\n",(0,i.jsx)(n.h2,{id:"preparing-the-installation-seed-image",children:"Preparing the installation (seed) image"}),"\n",(0,i.jsx)(n.p,{children:"Now this is the last step, you need to prepare an Elemental Teal seed image that includes the initial registration config, so\nit can be auto registered, installed and fully deployed as part of your cluster. The contents of the file are nothing\nmore than the registration URL that the node needs to register and the proper server certificate, so it can connect securely."}),"\n",(0,i.jsx)(n.p,{children:"This seed image can then be used to provision an infinite number of machines."}),"\n",(0,i.jsxs)(n.p,{children:["The seed image is created as a Kubernetes resource above and can be built using the ",(0,i.jsx)(n.code,{children:"Build ISO"})," button:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Build ISO in Registration Endpoints",src:t(2233).Z+"",width:"1247",height:"435"})}),"\n",(0,i.jsxs)(n.p,{children:["Once the build is done, ISO can be downloaded using the ",(0,i.jsx)(n.code,{children:"Download ISO"})," button:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Download ISO in Registration Endpoints",src:t(3783).Z+"",width:"1247",height:"435"})}),"\n",(0,i.jsx)(n.p,{children:"You can now boot your nodes with this image and they will:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Register with the registrationURL given and create a per-machine ",(0,i.jsx)(n.code,{children:"MachineInventory"})]}),"\n",(0,i.jsx)(n.li,{children:"Install Elemental Teal to the given device"}),"\n",(0,i.jsx)(n.li,{children:"Reboot"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"machine-inventory",children:"Machine Inventory"}),"\n",(0,i.jsxs)(n.p,{children:["When nodes are booting up for the first time, they connect to Rancher Manager and a ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/architecture#machineinventory",children:(0,i.jsx)(n.code,{children:"Machine Inventory"})})," is created for each node."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Machine Inventory menu",src:t(7050).Z+"",width:"1673",height:"574"})}),"\n",(0,i.jsxs)(n.p,{children:["Custom columns are based on ",(0,i.jsx)(n.code,{children:"Machine Inventory Labels"})," which you can add when you create your ",(0,i.jsx)(n.code,{children:"Machine Registration Endpoint"}),":"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Machine Registration Endpoint Hardware Labels",src:t(493).Z+"",width:"1665",height:"1368"})}),"\n",(0,i.jsxs)(n.p,{children:["On the following screenshot, ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/hardwarelabels/#hardware-labels",children:(0,i.jsx)(n.code,{children:"Hardware Labels"})})," are used as custom columns:"]}),"\n",(0,i.jsx)(n.p,{children:"You can also add custom columns by clicking on the three dots menu."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Machine Inventory custom columns",src:t(761).Z+"",width:"1672",height:"734"})}),"\n",(0,i.jsxs)(n.p,{children:["Finally, you can also filter your ",(0,i.jsx)(n.code,{children:"Machine Inventory"})," using those labels."]}),"\n",(0,i.jsxs)(n.p,{children:["For instance if you only want to see your AMD machines, you can filter on ",(0,i.jsx)(n.code,{children:"CPUModel"})," like below:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Machine Inventory filtering",src:t(9017).Z+"",width:"1672",height:"734"})}),"\n",(0,i.jsx)(n.h2,{id:"create-your-first-elemental-cluster",children:"Create your first Elemental Cluster"}),"\n",(0,i.jsxs)(n.p,{children:["Now let's use those ",(0,i.jsx)(n.code,{children:"Machine Inventory"})," to create a cluster by clicking on ",(0,i.jsx)(n.code,{children:"Create Elemental Cluster"})," :"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Create Elemental Cluster button",src:t(2919).Z+"",width:"1663",height:"854"})}),"\n",(0,i.jsx)(n.p,{children:"For your Elemental cluster, you can either choose K3s or RKE2 for Kubernetes."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Elemental Cluster Creation Screen",src:t(571).Z+"",width:"1677",height:"1374"})}),"\n",(0,i.jsxs)(n.p,{children:["Most of the options are coming from Rancher, that's why we will not detail all the possibilities.\nFeel free to check the ",(0,i.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/pages-for-subheaders/rancher-server-configuration",children:"Rancher Manager documentation"})," if you want to know more."]}),"\n",(0,i.jsxs)(n.p,{children:["However, it is important to highlight the ",(0,i.jsx)(n.code,{children:"Inventory of Machines Selector Template"})," section."]}),"\n",(0,i.jsxs)(n.p,{children:["It lets you choose which ",(0,i.jsx)(n.code,{children:"Machine Inventory"})," you want to use to create your Elemental cluster using the previously defined ",(0,i.jsx)(n.code,{children:"Machine Inventory Labels"})," :"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Use Machine Inventory Selector Template",src:t(5348).Z+"",width:"1359",height:"547"})}),"\n",(0,i.jsxs)(n.p,{children:["As our three Machine Inventories contain the label ",(0,i.jsx)(n.code,{children:"CPUVendor"})," with the key ",(0,i.jsx)(n.code,{children:"AuthenticAMD"}),", the three machines will be used to create the Elemental cluster."]})]})}function p(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},2919:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-create-cluster-button-e1d0392a7278e6de17a5fbe26b77b5eb.png"},5348:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-create-cluster-machine-selector-template-a114d9eb08cb6423423a79c94900afd1.png"},571:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-create-cluster-standard-screen--fdccedc04c52226c9b621f580de28f85.png"},1709:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-elemental-plugin-install-ecdc4ce7ce04426c02ff914ecf13d906.png"},8054:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-elemental-plugin-menu-0e0659f62678b700aa7d7341284fd9a5.png"},6814:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-extension-enable-86662009426b5220cab5c9f72a71ea4b.png"},576:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-extension-repository-84e4ca717832fe04524f71741750f69c.png"},5426:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-extensions-available-31f7812c57abc824b1337bd8ae3d6247.png"},761:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-machine-inventory-custom-columns-120ed1afa8effc83540bb72631623aa7.png"},9017:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-machine-inventory-filtering-b7918cd6394c1d0aa8158adbc7d6039b.png"},7050:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-machine-inventory-menu-e868fad782ec36416690986b9a0ee4b9.png"},7652:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-menu-62e787746510862a9bc32b4ac1d65213.png"},2233:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-build-ISO-e3e6386d33bb61f4c45bfd261000cdc5.png"},9538:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-complete-7c3686ae051927fdb9cec1ee38a8eb58.png"},1312:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-create-details-5954e7fe1555060b20987c13a0978cd8.png"},867:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-create-f687c90235eea798645d699b6bbd8d23.png"},3783:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-download-ISO-d9eccf8bb5bdc387fecfa757df572815.png"},493:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-hardware-labels-d96f34687fee37f7f1438e21508cacce.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>r});var i=t(7294);const s={},a=i.createContext(s);function r(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b3210992.6de473be.js b/assets/js/b3210992.6de473be.js new file mode 100644 index 000000000..e184e53c2 --- /dev/null +++ b/assets/js/b3210992.6de473be.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[1898],{5454:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>l,default:()=>x,frontMatter:()=>i,metadata:()=>c,toc:()=>o});var s=n(5893),r=n(1151),d=n(1819);const i={sidebar_label:"Hardware Labels",title:""},l=void 0,c={id:"hardwarelabels",title:"",description:"Hardware Labels",source:"@site/versioned_docs/version-1.2/hardwarelabels.md",sourceDirName:".",slug:"/hardwarelabels",permalink:"/1.2/hardwarelabels",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Hardware Labels",title:""},sidebar:"docs",previous:{title:"Smbios",permalink:"/1.2/smbios"},next:{title:"Inventory Management",permalink:"/1.2/inventory-management"}},a={},o=[{value:"Hardware Labels",id:"hardware-labels",level:2},{value:"Block device drive types",id:"block-device-drive-types",level:3},{value:"Block device controller types",id:"block-device-controller-types",level:3},{value:"Example MachineRegistration",id:"example-machineregistration",level:3}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.a)(),...e.components},{CodeBlock:n,Head:i}=t;return n||j("CodeBlock",!0),i||j("Head",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i,{children:(0,s.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/hardwarelabels"})}),"\n","\n","\n",(0,s.jsx)(t.h2,{id:"hardware-labels",children:"Hardware Labels"}),"\n",(0,s.jsxs)(t.p,{children:["When a node is registered, hardware data is collected and made available to the MachineRegistration in the same way as ",(0,s.jsx)(t.a,{href:"/1.2/smbios",children:"SMBIOS data"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["This data can be used for easy identification and selection via a ",(0,s.jsx)(t.a,{href:"/1.2/machineinventoryselectortemplate-reference",children:"MachineSelector"}),"."]}),"\n",(0,s.jsx)(t.p,{children:"The following are available for templating:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Label"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Memory/Total Physical Bytes}"})}),(0,s.jsx)(t.td,{children:"The total RAM memory in the node, expressed in bytes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/CPU/Total Cores}"})}),(0,s.jsx)(t.td,{children:"Total CPU cores"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/CPU/Total Threads}"})}),(0,s.jsx)(t.td,{children:"Total CPU threads"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/CPU/Vendor}"})}),(0,s.jsx)(t.td,{children:"CPU vendor"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/CPU/Model}"})}),(0,s.jsx)(t.td,{children:"CPU model"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/GPU/Vendor}"})}),(0,s.jsx)(t.td,{children:"GPU vendor (Only available if the node has an identifiable GPU)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/GPU/Model}"})}),(0,s.jsx)(t.td,{children:"GPU model (Only available if the node has an identifiable GPU)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Network/Number Interfaces}"})}),(0,s.jsx)(t.td,{children:"Number of network interfaces in the system"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Network/{Iface name}/Name}"})}),(0,s.jsx)(t.td,{children:"Network interface name"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Network/{Iface name}/IsVirtual}"})}),(0,s.jsx)(t.td,{children:"Boolean indicating virtual network interface"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/Number Devices}"})}),(0,s.jsx)(t.td,{children:"Number of block devices in the system (includes DVD and USB drives)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Name}"})}),(0,s.jsx)(t.td,{children:"Device name of the block device (i.e. sda, sr0, vda, etc...)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Removable}"})}),(0,s.jsx)(t.td,{children:"Whether this block device is removable (i.e. DVD)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Size}"})}),(0,s.jsx)(t.td,{children:"Total space in this block device, expressed in bytes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Drive Type}"})}),(0,s.jsx)(t.td,{children:"Drive type of this block device, see table below"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Storage Controller}"})}),(0,s.jsx)(t.td,{children:"Controller type for this block device connection, see table below"})]})]})]}),"\n",(0,s.jsx)(t.admonition,{title:"info",type:"info",children:(0,s.jsxs)(t.p,{children:["On both ",(0,s.jsx)(t.code,{children:"Block Devices"})," and ",(0,s.jsx)(t.code,{children:"Network"})," the device name is used as a sub-block, as there could be more than one device."]})}),"\n",(0,s.jsx)(t.h3,{id:"block-device-drive-types",children:"Block device drive types"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Type"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"HDD"}),(0,s.jsx)(t.td,{children:"Hard disk drive"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"FDD"}),(0,s.jsx)(t.td,{children:"Floppy disk drive"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ODD"}),(0,s.jsx)(t.td,{children:"Optical disk drive"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SSD"}),(0,s.jsx)(t.td,{children:"Solid-state drive"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"virtual"}),(0,s.jsx)(t.td,{children:"virtual drive i.e. loop devices"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Unknown"}),(0,s.jsx)(t.td,{children:"unknown drive type"})]})]})]}),"\n",(0,s.jsx)(t.h3,{id:"block-device-controller-types",children:"Block device controller types"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Type"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"IDE"}),(0,s.jsx)(t.td,{children:"Integrated Drive Electronics"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SCSI"}),(0,s.jsx)(t.td,{children:"Small computer system interface"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"NVMe"}),(0,s.jsx)(t.td,{children:"Non-volatile Memory Express"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"MMC"}),(0,s.jsx)(t.td,{children:"Multi-media controller (used for mobile phone storage devices)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"virtio"}),(0,s.jsx)(t.td,{children:"Virtualized storage controller/driver"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"loop"}),(0,s.jsx)(t.td,{children:"loop device"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Unknown"}),(0,s.jsx)(t.td,{children:"unknown controller type"})]})]})]}),"\n",(0,s.jsx)(t.h3,{id:"example-machineregistration",children:"Example MachineRegistration"}),"\n",(0,s.jsx)(n,{language:"yaml",title:"registration example with smbios labels",showLineNumbers:!0,children:d.Z})]})}function x(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}function j(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1819:(e,t,n)=>{n.d(t,{Z:()=>s});const s='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineInventoryLabels:\n elemental.cattle.io/CpuTotalCores: "${System Data/CPU/Total Cores}"\n elemental.cattle.io/CpuTotalThreads: "${System Data/CPU/Total Threads}"\n elemental.cattle.io/TotalMemoryBytes: "${System Data/Memory/Total Physical Bytes}"\n elemental.cattle.io/NumberBlockDevices: "${System Data/Block Devices/Number Devices}"\n'},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>i});var s=n(7294);const r={},d=s.createContext(r);function i(e){const t=s.useContext(d);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),s.createElement(d.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b3210992.a1e96a74.js b/assets/js/b3210992.a1e96a74.js deleted file mode 100644 index 4036ca4de..000000000 --- a/assets/js/b3210992.a1e96a74.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[1898],{5454:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>a,contentTitle:()=>l,default:()=>x,frontMatter:()=>i,metadata:()=>c,toc:()=>o});var n=s(5893),r=s(1151),d=s(1819);const i={sidebar_label:"Hardware Labels",title:""},l=void 0,c={id:"hardwarelabels",title:"",description:"Hardware Labels",source:"@site/versioned_docs/version-1.2/hardwarelabels.md",sourceDirName:".",slug:"/hardwarelabels",permalink:"/1.2/hardwarelabels",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Hardware Labels",title:""},sidebar:"docs",previous:{title:"Smbios",permalink:"/1.2/smbios"},next:{title:"Inventory Management",permalink:"/1.2/inventory-management"}},a={},o=[{value:"Hardware Labels",id:"hardware-labels",level:2},{value:"Block device drive types",id:"block-device-drive-types",level:3},{value:"Block device controller types",id:"block-device-controller-types",level:3},{value:"Example MachineRegistration",id:"example-machineregistration",level:3}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.a)(),...e.components},{CodeBlock:s}=t;return s||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("CodeBlock",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h2,{id:"hardware-labels",children:"Hardware Labels"}),"\n",(0,n.jsxs)(t.p,{children:["When a node is registered, hardware data is collected and made available to the MachineRegistration in the same way as ",(0,n.jsx)(t.a,{href:"/1.2/smbios",children:"SMBIOS data"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["This data can be used for easy identification and selection via a ",(0,n.jsx)(t.a,{href:"/1.2/machineinventoryselectortemplate-reference",children:"MachineSelector"}),"."]}),"\n",(0,n.jsx)(t.p,{children:"The following are available for templating:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Label"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/Memory/Total Physical Bytes}"})}),(0,n.jsx)(t.td,{children:"The total RAM memory in the node, expressed in bytes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/CPU/Total Cores}"})}),(0,n.jsx)(t.td,{children:"Total CPU cores"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/CPU/Total Threads}"})}),(0,n.jsx)(t.td,{children:"Total CPU threads"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/CPU/Vendor}"})}),(0,n.jsx)(t.td,{children:"CPU vendor"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/CPU/Model}"})}),(0,n.jsx)(t.td,{children:"CPU model"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/GPU/Vendor}"})}),(0,n.jsx)(t.td,{children:"GPU vendor (Only available if the node has an identifiable GPU)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/GPU/Model}"})}),(0,n.jsx)(t.td,{children:"GPU model (Only available if the node has an identifiable GPU)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/Network/Number Interfaces}"})}),(0,n.jsx)(t.td,{children:"Number of network interfaces in the system"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/Network/{Iface name}/Name}"})}),(0,n.jsx)(t.td,{children:"Network interface name"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/Network/{Iface name}/IsVirtual}"})}),(0,n.jsx)(t.td,{children:"Boolean indicating virtual network interface"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/Block Devices/Number Devices}"})}),(0,n.jsx)(t.td,{children:"Number of block devices in the system (includes DVD and USB drives)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Name}"})}),(0,n.jsx)(t.td,{children:"Device name of the block device (i.e. sda, sr0, vda, etc...)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Removable}"})}),(0,n.jsx)(t.td,{children:"Whether this block device is removable (i.e. DVD)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Size}"})}),(0,n.jsx)(t.td,{children:"Total space in this block device, expressed in bytes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Drive Type}"})}),(0,n.jsx)(t.td,{children:"Drive type of this block device, see table below"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"${System Data/Block Devices/{Disk name}/Storage Controller}"})}),(0,n.jsx)(t.td,{children:"Controller type for this block device connection, see table below"})]})]})]}),"\n",(0,n.jsx)(t.admonition,{title:"info",type:"info",children:(0,n.jsxs)(t.p,{children:["On both ",(0,n.jsx)(t.code,{children:"Block Devices"})," and ",(0,n.jsx)(t.code,{children:"Network"})," the device name is used as a sub-block, as there could be more than one device."]})}),"\n",(0,n.jsx)(t.h3,{id:"block-device-drive-types",children:"Block device drive types"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Type"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"HDD"}),(0,n.jsx)(t.td,{children:"Hard disk drive"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"FDD"}),(0,n.jsx)(t.td,{children:"Floppy disk drive"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"ODD"}),(0,n.jsx)(t.td,{children:"Optical disk drive"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"SSD"}),(0,n.jsx)(t.td,{children:"Solid-state drive"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"virtual"}),(0,n.jsx)(t.td,{children:"virtual drive i.e. loop devices"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Unknown"}),(0,n.jsx)(t.td,{children:"unknown drive type"})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"block-device-controller-types",children:"Block device controller types"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Type"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"IDE"}),(0,n.jsx)(t.td,{children:"Integrated Drive Electronics"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"SCSI"}),(0,n.jsx)(t.td,{children:"Small computer system interface"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"NVMe"}),(0,n.jsx)(t.td,{children:"Non-volatile Memory Express"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"MMC"}),(0,n.jsx)(t.td,{children:"Multi-media controller (used for mobile phone storage devices)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"virtio"}),(0,n.jsx)(t.td,{children:"Virtualized storage controller/driver"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"loop"}),(0,n.jsx)(t.td,{children:"loop device"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Unknown"}),(0,n.jsx)(t.td,{children:"unknown controller type"})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"example-machineregistration",children:"Example MachineRegistration"}),"\n",(0,n.jsx)(s,{language:"yaml",title:"registration example with smbios labels",showLineNumbers:!0,children:d.Z})]})}function x(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},1819:(e,t,s)=>{s.d(t,{Z:()=>n});const n='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineInventoryLabels:\n elemental.cattle.io/CpuTotalCores: "${System Data/CPU/Total Cores}"\n elemental.cattle.io/CpuTotalThreads: "${System Data/CPU/Total Threads}"\n elemental.cattle.io/TotalMemoryBytes: "${System Data/Memory/Total Physical Bytes}"\n elemental.cattle.io/NumberBlockDevices: "${System Data/Block Devices/Number Devices}"\n'},1151:(e,t,s)=>{s.d(t,{Z:()=>l,a:()=>i});var n=s(7294);const r={},d=n.createContext(r);function i(e){const t=n.useContext(d);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(d.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b80d3b11.006544bf.js b/assets/js/b80d3b11.006544bf.js deleted file mode 100644 index e27c6ee27..000000000 --- a/assets/js/b80d3b11.006544bf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7479],{8988:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=s(5893),t=s(1151);const o={sidebar_label:"Kubernetes versions",title:""},a=void 0,i={id:"kubernetesversions",title:"",description:"Valid Versions",source:"@site/versioned_docs/version-1.2/kubernetesversions.md",sourceDirName:".",slug:"/kubernetesversions",permalink:"/1.2/kubernetesversions",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Kubernetes versions",title:""},sidebar:"docs",previous:{title:"Elemental Operator Helm Chart",permalink:"/1.2/elementaloperatorchart-reference"},next:{title:"Smbios",permalink:"/1.2/smbios"}},l={},c=[{value:"Valid Versions",id:"valid-versions",level:2}];function d(e){const n={code:"code",h2:"h2",p:"p",pre:"pre",strong:"strong",...(0,t.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"valid-versions",children:"Valid Versions"}),"\n",(0,r.jsxs)(n.p,{children:["The list of valid versions for the ",(0,r.jsx)(n.code,{children:"kubernetesVersion"})," field can be determined\nfrom the Rancher metadata using the following commands."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"k3s:"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"curl -sL https://raw.githubusercontent.com/rancher/kontainer-driver-metadata/release-v2.6/data/data.json | jq -r '.k3s.releases[].version'\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"rke2:"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"curl -sL https://raw.githubusercontent.com/rancher/kontainer-driver-metadata/release-v2.6/data/data.json | jq -r '.rke2.releases[].version'\n"})})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},1151:(e,n,s)=>{s.d(n,{Z:()=>i,a:()=>a});var r=s(7294);const t={},o=r.createContext(t);function a(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b80d3b11.9ab9cb25.js b/assets/js/b80d3b11.9ab9cb25.js new file mode 100644 index 000000000..cef811ad6 --- /dev/null +++ b/assets/js/b80d3b11.9ab9cb25.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7479],{8988:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var s=r(5893),t=r(1151);const o={sidebar_label:"Kubernetes versions",title:""},i=void 0,a={id:"kubernetesversions",title:"",description:"Valid Versions",source:"@site/versioned_docs/version-1.2/kubernetesversions.md",sourceDirName:".",slug:"/kubernetesversions",permalink:"/1.2/kubernetesversions",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Kubernetes versions",title:""},sidebar:"docs",previous:{title:"Elemental Operator Helm Chart",permalink:"/1.2/elementaloperatorchart-reference"},next:{title:"Smbios",permalink:"/1.2/smbios"}},c={},l=[{value:"Valid Versions",id:"valid-versions",level:2}];function d(e){const n={code:"code",h2:"h2",p:"p",pre:"pre",strong:"strong",...(0,t.a)(),...e.components},{Head:r}=n;return r||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(r,{children:(0,s.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/kubernetesversions"})}),"\n",(0,s.jsx)(n.h2,{id:"valid-versions",children:"Valid Versions"}),"\n",(0,s.jsxs)(n.p,{children:["The list of valid versions for the ",(0,s.jsx)(n.code,{children:"kubernetesVersion"})," field can be determined\nfrom the Rancher metadata using the following commands."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"k3s:"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"curl -sL https://raw.githubusercontent.com/rancher/kontainer-driver-metadata/release-v2.6/data/data.json | jq -r '.k3s.releases[].version'\n"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"rke2:"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"curl -sL https://raw.githubusercontent.com/rancher/kontainer-driver-metadata/release-v2.6/data/data.json | jq -r '.rke2.releases[].version'\n"})})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},1151:(e,n,r)=>{r.d(n,{Z:()=>a,a:()=>i});var s=r(7294);const t={},o=s.createContext(t);function i(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bb3fbf9f.35ae4380.js b/assets/js/bb3fbf9f.35ae4380.js new file mode 100644 index 000000000..0d0a7e5fb --- /dev/null +++ b/assets/js/bb3fbf9f.35ae4380.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[9638],{9246:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>c,default:()=>p,frontMatter:()=>l,metadata:()=>d,toc:()=>m});var i=t(5893),a=t(1151),s=t(6506),r=t(8638),o=t(2624);const l={sidebar_label:"Elemental behind proxy",title:""},c=void 0,d={id:"elemental_behind_proxy",title:"",description:"Introduction",source:"@site/versioned_docs/version-1.3/elemental_behind_proxy.md",sourceDirName:".",slug:"/elemental_behind_proxy",permalink:"/elemental_behind_proxy",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Elemental behind proxy",title:""},sidebar:"docs",previous:{title:"Configure Wi-Fi",permalink:"/wifi"},next:{title:"How to use Elemental with Rancher and VMware",permalink:"/rancher-vmware"}},h={},m=[{value:"Introduction",id:"introduction",level:2},{value:"Elemental-register",id:"elemental-register",level:2},{value:"Create Elemental cluster",id:"create-elemental-cluster",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components},{CodeBlock:l,Head:c,TabItem:d,Tabs:h}=n;return l||g("CodeBlock",!0),c||g("Head",!0),d||g("TabItem",!0),h||g("Tabs",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(c,{children:(0,i.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/elemental_behind_proxy"})}),"\n","\n","\n",(0,i.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsx)(n.p,{children:"In a lot of enterprise environments, servers or VMs running on premises do not have direct Internet access. Instead, the connection to external services is done through a HTTP(S) proxy for security reasons. This tutorial shows you how to set up an Elemental deployment in such an environment."}),"\n",(0,i.jsx)(n.admonition,{title:"important note",type:"caution",children:(0,i.jsxs)(n.p,{children:["This guide will not cover the Rancher installation behind a proxy. It's a different use case and you can find the detailed documentation ",(0,i.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/pages-for-subheaders/rancher-behind-an-http-proxy",children:"here"}),"."]})}),"\n",(0,i.jsx)(n.admonition,{title:"info",type:"info",children:(0,i.jsxs)(n.p,{children:["For this documentation, we assume you are using a SUSE family system (like Elemental Teal), so proxy settings have to be written in ",(0,i.jsx)(n.code,{children:"/etc/sysconfig/proxy"}),"."]})}),"\n",(0,i.jsx)(n.p,{children:"Proxy settings must be configured in the following locations:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Machine Registration Endpoint"}),"\n",(0,i.jsx)(n.li,{children:"SeedImage resource"}),"\n",(0,i.jsx)(n.li,{children:"Elemental cluster configuration"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"elemental-system-agent"})," needs proxy settings to reach the Rancher Manager.\nTo achieve that, you need to fill the cloud-init section of the Machine Registration Endpoint."]}),"\n",(0,i.jsxs)(n.p,{children:["You can do it either with ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/quickstart-ui#add-a-machine-registration-endpoint",children:"UI"})," or ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/quickstart-cli#prepare-your-kubernetes-resources",children:"CLI"}),"."]}),"\n",(0,i.jsxs)(h,{children:[(0,i.jsx)(d,{value:"cliRegistration",label:"CLI",default:!0,children:(0,i.jsx)(l,{language:"yaml",title:"registration.yaml",showLineNumbers:!0,children:s.Z})}),(0,i.jsx)(d,{value:"uiRegistration",label:"UI",default:!0,children:(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Add proxy settings in Machine Registration",src:t(997).Z+"",width:"668",height:"650"})})})]}),"\n",(0,i.jsx)(n.h2,{id:"elemental-register",children:"Elemental-register"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/architecture/#elemental-register-client",children:"Elemental-register"})," is the first communication endpoint between the new host and Rancher Manager, this is the first place where proxy settings need to be set."]}),"\n",(0,i.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,i.jsx)(n.p,{children:"At the time of writing, it's only possible to configure proxy settings for the ISO with the CLI. The proxy settings aren't implemented in the UI."})}),"\n",(0,i.jsxs)(n.p,{children:["The process happens when you boot your Elemental ISO for the first time, in order to configure the proxy settings you have to include a ",(0,i.jsx)(n.code,{children:"cloud-init"})," definition in the ISO.\nTo do that, you have to create a ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/seedimage-reference/",children:"SeedImage"})," definition."]}),"\n",(0,i.jsx)(l,{language:"yaml",title:"seedimage.yaml",showLineNumbers:!0,children:r.Z}),"\n",(0,i.jsxs)(n.p,{children:["Apply the YAML with ",(0,i.jsx)(n.code,{children:"kubectl"})," and then, print your SeedImage definition to get the URL to download it:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"kubectl apply -f \nkubectl get seedimage -n -o yaml\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Boot the ISO and you should see your new system appears in ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/architecture#machineinventory",children:"Machine inventory"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"create-elemental-cluster",children:"Create Elemental cluster"}),"\n",(0,i.jsx)(n.p,{children:"For this step, you can use either the UI or CLI."}),"\n",(0,i.jsxs)(h,{children:[(0,i.jsxs)(d,{value:"cliCluster",label:"CLI",default:!0,children:[(0,i.jsx)(l,{language:"yaml",title:"cluster.yaml",showLineNumbers:!0,children:o.Z}),(0,i.jsxs)(n.p,{children:["You can see that proxy settings are added below ",(0,i.jsx)(n.code,{children:"agentEnvVars"}),"."]})]}),(0,i.jsx)(d,{value:"uiCluster",label:"UI",default:!0,children:(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Add proxy settings for Elemental cluster",src:t(169).Z+"",width:"1756",height:"516"})})})]})]})}function p(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}function g(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},2624:(e,n,t)=>{t.d(n,{Z:()=>i});const i="kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: my-cluster\n namespace: fleet-default\nspec:\n agentEnvVars:\n - name: HTTP_PROXY\n value: http://:\n - name: HTTPS_PROXY\n value: https://:\n - name: NO_PROXY\n value: localhost,127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local\n rkeConfig:\n machineGlobalConfig:\n etcd-expose-metrics: false\n profile: null\n machinePools:\n - controlPlaneRole: true\n etcdRole: true\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: my-machine-selector\n name: pool1\n quantity: 1\n unhealthyNodeTimeout: 0s\n workerRole: true\n machineSelectorConfig:\n - config:\n protect-kernel-defaults: false\n registries: {}\n kubernetesVersion: v1.24.8+k3s1\n"},6506:(e,n,t)=>{t.d(n,{Z:()=>i});const i='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n write_files:\n - path: /etc/sysconfig/proxy\n append: true\n content: |\n PROXY_ENABLED="yes"\n HTTP_PROXY=http://:\n HTTPS_PROXY=https://:\n NO_PROXY="localhost, 127.0.0.1"\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n registration:\n emulate-tpm: true\n'},8638:(e,n,t)=>{t.d(n,{Z:()=>i});const i='apiVersion: elemental.cattle.io/v1beta1\nkind: SeedImage\nmetadata:\n name: ...\n namespace: ...\nspec:\n baseImage: https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable:/Teal53/media/iso/elemental-teal.x86_64.iso\n cloud-config:\n write_files:\n - path: /etc/sysconfig/proxy\n append: true\n content: |\n PROXY_ENABLED="yes"\n HTTP_PROXY=http://:\n HTTPS_PROXY=https://:\n NO_PROXY="localhost, 127.0.0.1"\n registrationRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineRegistration\n name: ...\n namespace: ...\n'},169:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/proxy-settings-cluster-ui-7303e94b634e59942023814ceff5f54f.png"},997:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/proxy-settings-machine-registration-ui-887aa84b2d739e775e490d74062979fe.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>r});var i=t(7294);const a={},s=i.createContext(a);function r(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bb3fbf9f.62f24dad.js b/assets/js/bb3fbf9f.62f24dad.js deleted file mode 100644 index 5b283e510..000000000 --- a/assets/js/bb3fbf9f.62f24dad.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[9638],{9246:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>c,default:()=>p,frontMatter:()=>l,metadata:()=>d,toc:()=>m});var i=t(5893),s=t(1151),a=t(6506),r=t(8638),o=t(2624);const l={sidebar_label:"Elemental behind proxy",title:""},c=void 0,d={id:"elemental_behind_proxy",title:"",description:"Introduction",source:"@site/versioned_docs/version-1.3/elemental_behind_proxy.md",sourceDirName:".",slug:"/elemental_behind_proxy",permalink:"/elemental_behind_proxy",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Elemental behind proxy",title:""},sidebar:"docs",previous:{title:"Configure Wi-Fi",permalink:"/wifi"},next:{title:"How to use Elemental with Rancher and VMware",permalink:"/rancher-vmware"}},h={},m=[{value:"Introduction",id:"introduction",level:2},{value:"Elemental-register",id:"elemental-register",level:2},{value:"Create Elemental cluster",id:"create-elemental-cluster",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components},{CodeBlock:l,TabItem:c,Tabs:d}=n;return l||g("CodeBlock",!0),c||g("TabItem",!0),d||g("Tabs",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsx)(n.p,{children:"In a lot of enterprise environments, servers or VMs running on premises do not have direct Internet access. Instead, the connection to external services is done through a HTTP(S) proxy for security reasons. This tutorial shows you how to set up an Elemental deployment in such an environment."}),"\n",(0,i.jsx)(n.admonition,{title:"important note",type:"caution",children:(0,i.jsxs)(n.p,{children:["This guide will not cover the Rancher installation behind a proxy. It's a different use case and you can find the detailed documentation ",(0,i.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/pages-for-subheaders/rancher-behind-an-http-proxy",children:"here"}),"."]})}),"\n",(0,i.jsx)(n.admonition,{title:"info",type:"info",children:(0,i.jsxs)(n.p,{children:["For this documentation, we assume you are using a SUSE family system (like Elemental Teal), so proxy settings have to be written in ",(0,i.jsx)(n.code,{children:"/etc/sysconfig/proxy"}),"."]})}),"\n",(0,i.jsx)(n.p,{children:"Proxy settings must be configured in the following locations:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Machine Registration Endpoint"}),"\n",(0,i.jsx)(n.li,{children:"SeedImage resource"}),"\n",(0,i.jsx)(n.li,{children:"Elemental cluster configuration"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"elemental-system-agent"})," needs proxy settings to reach the Rancher Manager.\nTo achieve that, you need to fill the cloud-init section of the Machine Registration Endpoint."]}),"\n",(0,i.jsxs)(n.p,{children:["You can do it either with ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/quickstart-ui#add-a-machine-registration-endpoint",children:"UI"})," or ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/quickstart-cli#prepare-your-kubernetes-resources",children:"CLI"}),"."]}),"\n",(0,i.jsxs)(d,{children:[(0,i.jsx)(c,{value:"cliRegistration",label:"CLI",default:!0,children:(0,i.jsx)(l,{language:"yaml",title:"registration.yaml",showLineNumbers:!0,children:a.Z})}),(0,i.jsx)(c,{value:"uiRegistration",label:"UI",default:!0,children:(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Add proxy settings in Machine Registration",src:t(997).Z+"",width:"668",height:"650"})})})]}),"\n",(0,i.jsx)(n.h2,{id:"elemental-register",children:"Elemental-register"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/architecture/#elemental-register-client",children:"Elemental-register"})," is the first communication endpoint between the new host and Rancher Manager, this is the first place where proxy settings need to be set."]}),"\n",(0,i.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,i.jsx)(n.p,{children:"At the time of writing, it's only possible to configure proxy settings for the ISO with the CLI. The proxy settings aren't implemented in the UI."})}),"\n",(0,i.jsxs)(n.p,{children:["The process happens when you boot your Elemental ISO for the first time, in order to configure the proxy settings you have to include a ",(0,i.jsx)(n.code,{children:"cloud-init"})," definition in the ISO.\nTo do that, you have to create a ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/seedimage-reference/",children:"SeedImage"})," definition."]}),"\n",(0,i.jsx)(l,{language:"yaml",title:"seedimage.yaml",showLineNumbers:!0,children:r.Z}),"\n",(0,i.jsxs)(n.p,{children:["Apply the YAML with ",(0,i.jsx)(n.code,{children:"kubectl"})," and then, print your SeedImage definition to get the URL to download it:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"kubectl apply -f \nkubectl get seedimage -n -o yaml\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Boot the ISO and you should see your new system appears in ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/architecture#machineinventory",children:"Machine inventory"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"create-elemental-cluster",children:"Create Elemental cluster"}),"\n",(0,i.jsx)(n.p,{children:"For this step, you can use either the UI or CLI."}),"\n",(0,i.jsxs)(d,{children:[(0,i.jsxs)(c,{value:"cliCluster",label:"CLI",default:!0,children:[(0,i.jsx)(l,{language:"yaml",title:"cluster.yaml",showLineNumbers:!0,children:o.Z}),(0,i.jsxs)(n.p,{children:["You can see that proxy settings are added below ",(0,i.jsx)(n.code,{children:"agentEnvVars"}),"."]})]}),(0,i.jsx)(c,{value:"uiCluster",label:"UI",default:!0,children:(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Add proxy settings for Elemental cluster",src:t(169).Z+"",width:"1756",height:"516"})})})]})]})}function p(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}function g(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},2624:(e,n,t)=>{t.d(n,{Z:()=>i});const i="kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: my-cluster\n namespace: fleet-default\nspec:\n agentEnvVars:\n - name: HTTP_PROXY\n value: http://:\n - name: HTTPS_PROXY\n value: https://:\n - name: NO_PROXY\n value: localhost,127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local\n rkeConfig:\n machineGlobalConfig:\n etcd-expose-metrics: false\n profile: null\n machinePools:\n - controlPlaneRole: true\n etcdRole: true\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: my-machine-selector\n name: pool1\n quantity: 1\n unhealthyNodeTimeout: 0s\n workerRole: true\n machineSelectorConfig:\n - config:\n protect-kernel-defaults: false\n registries: {}\n kubernetesVersion: v1.24.8+k3s1\n"},6506:(e,n,t)=>{t.d(n,{Z:()=>i});const i='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n write_files:\n - path: /etc/sysconfig/proxy\n append: true\n content: |\n PROXY_ENABLED="yes"\n HTTP_PROXY=http://:\n HTTPS_PROXY=https://:\n NO_PROXY="localhost, 127.0.0.1"\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n registration:\n emulate-tpm: true\n'},8638:(e,n,t)=>{t.d(n,{Z:()=>i});const i='apiVersion: elemental.cattle.io/v1beta1\nkind: SeedImage\nmetadata:\n name: ...\n namespace: ...\nspec:\n baseImage: https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable:/Teal53/media/iso/elemental-teal.x86_64.iso\n cloud-config:\n write_files:\n - path: /etc/sysconfig/proxy\n append: true\n content: |\n PROXY_ENABLED="yes"\n HTTP_PROXY=http://:\n HTTPS_PROXY=https://:\n NO_PROXY="localhost, 127.0.0.1"\n registrationRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineRegistration\n name: ...\n namespace: ...\n'},169:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/proxy-settings-cluster-ui-7303e94b634e59942023814ceff5f54f.png"},997:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/proxy-settings-machine-registration-ui-887aa84b2d739e775e490d74062979fe.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>r});var i=t(7294);const s={},a=i.createContext(s);function r(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bd2c0bea.229ff471.js b/assets/js/bd2c0bea.229ff471.js deleted file mode 100644 index 407bff7e2..000000000 --- a/assets/js/bd2c0bea.229ff471.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7775],{8167:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var r=t(5893),s=t(1151);const a={sidebar_label:"Rancher upgrades",title:""},o="Troubleshooting Rancher upgrades",i={id:"troubleshooting-rancher-upgrades",title:"",description:"Upgrading to Rancher v2.7.2 will fail if Elemental clusters are defined. The rancher pod gets stuck in a crash loop (see https://github.com/rancher/rancher/issues/41145).",source:"@site/versioned_docs/version-1.3/troubleshooting-rancher-upgrades.md",sourceDirName:".",slug:"/troubleshooting-rancher-upgrades",permalink:"/troubleshooting-rancher-upgrades",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Rancher upgrades",title:""},sidebar:"docs",previous:{title:"Add a custom certificate",permalink:"/custom-certificate"},next:{title:"Restore",permalink:"/troubleshooting-restore"}},c={},l=[];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"troubleshooting-rancher-upgrades",children:"Troubleshooting Rancher upgrades"}),"\n",(0,r.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,r.jsxs)(n.p,{children:["Upgrading to Rancher v2.7.2 will fail if Elemental clusters are defined. The rancher pod gets stuck in a crash loop (see ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/rancher/issues/41145",children:"https://github.com/rancher/rancher/issues/41145"}),")."]})}),"\n",(0,r.jsx)(n.p,{children:"Note that the issue is present only if at least one Elemental cluster is defined."}),"\n",(0,r.jsxs)(n.p,{children:["To workaround the issue create an empty ",(0,r.jsx)(n.code,{children:"dynamicschemas.management.cattle.io"})," resource named ",(0,r.jsx)(n.code,{children:"machineinventoryselectortemplate"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f - <{t.d(n,{Z:()=>i,a:()=>o});var r=t(7294);const s={},a=r.createContext(s);function o(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bd2c0bea.9d4b0195.js b/assets/js/bd2c0bea.9d4b0195.js new file mode 100644 index 000000000..cdaa1bdc8 --- /dev/null +++ b/assets/js/bd2c0bea.9d4b0195.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7775],{8167:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var r=t(5893),s=t(1151);const o={sidebar_label:"Rancher upgrades",title:""},a="Troubleshooting Rancher upgrades",i={id:"troubleshooting-rancher-upgrades",title:"",description:"Upgrading to Rancher v2.7.2 will fail if Elemental clusters are defined. The rancher pod gets stuck in a crash loop (see https://github.com/rancher/rancher/issues/41145).",source:"@site/versioned_docs/version-1.3/troubleshooting-rancher-upgrades.md",sourceDirName:".",slug:"/troubleshooting-rancher-upgrades",permalink:"/troubleshooting-rancher-upgrades",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Rancher upgrades",title:""},sidebar:"docs",previous:{title:"Add a custom certificate",permalink:"/custom-certificate"},next:{title:"Restore",permalink:"/troubleshooting-restore"}},c={},l=[];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",p:"p",pre:"pre",...(0,s.a)(),...e.components},{Head:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t,{children:(0,r.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/troubleshooting-rancher-upgrades"})}),"\n",(0,r.jsx)(n.h1,{id:"troubleshooting-rancher-upgrades",children:"Troubleshooting Rancher upgrades"}),"\n",(0,r.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,r.jsxs)(n.p,{children:["Upgrading to Rancher v2.7.2 will fail if Elemental clusters are defined. The rancher pod gets stuck in a crash loop (see ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/rancher/issues/41145",children:"https://github.com/rancher/rancher/issues/41145"}),")."]})}),"\n",(0,r.jsx)(n.p,{children:"Note that the issue is present only if at least one Elemental cluster is defined."}),"\n",(0,r.jsxs)(n.p,{children:["To workaround the issue create an empty ",(0,r.jsx)(n.code,{children:"dynamicschemas.management.cattle.io"})," resource named ",(0,r.jsx)(n.code,{children:"machineinventoryselectortemplate"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f - <{t.d(n,{Z:()=>i,a:()=>a});var r=t(7294);const s={},o=r.createContext(s);function a(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c377a04b.4f79ac86.js b/assets/js/c377a04b.4f79ac86.js deleted file mode 100644 index 77eb59b12..000000000 --- a/assets/js/c377a04b.4f79ac86.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6971],{9925:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>s,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>c});var a=t(5893),l=t(1151);const r={slug:"/",sidebar_label:"Overview",title:""},s="Overview",i={id:"index",title:"",description:"Elemental is a software stack enabling centralized, full cloud-native OS management with Kubernetes.",source:"@site/docs/index.md",sourceDirName:".",slug:"/",permalink:"/next/",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{slug:"/",sidebar_label:"Overview",title:""},sidebar:"docs",next:{title:"Elemental the visual way",permalink:"/next/quickstart-ui"}},o={},c=[{value:"What is Elemental Teal ?",id:"what-is-elemental-teal-",level:2},{value:"Elemental on x86-64 hardware",id:"elemental-on-x86-64-hardware",level:3},{value:"Elemental on ARM hardware",id:"elemental-on-arm-hardware",level:3},{value:"Elemental on other hardware",id:"elemental-on-other-hardware",level:3},{value:"Ready to give it a try?",id:"ready-to-give-it-a-try",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.a)(),...e.components},{Vars:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Vars",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"overview",children:"Overview"}),"\n",(0,a.jsx)(n.p,{children:"Elemental is a software stack enabling centralized, full cloud-native OS management with Kubernetes."}),"\n",(0,a.jsx)(n.p,{children:"The Elemental Stack consists of a handful of packages on top of SLE Micro for Rancher:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-toolkit"})," - Includes a set of OS utilities to enable OS management via containers. Includes dracut modules, bootloader configuration, cloud-init style configuration services, etc."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-operator"})," - Connects to Rancher Manager and handles MachineRegistration and MachineInventory CRDs."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-register"})," - Registers machines via machineRegistrations and installs them via elemental-cli."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-cli"})," - Installs any elemental-toolkit based derivative. Basically an installer based on our A/B install and upgrade system."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"rancher-system-agent"}),' - Runs on the installed system and gets instructions ("Plans") from Rancher Manager what to install and run on the system.']}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["Cluster Node OSes are built and maintained via container images through the ",(0,a.jsx)(t,{name:"elemental_cli_name"})," and they can be installed on new hosts using the ",(0,a.jsx)(t,{link:"elemental_ui_url",name:"elemental_ui_name"})," for ",(0,a.jsx)(n.a,{href:"https://www.rancher.com/products/rancher",children:"Rancher Manager"})," or the ",(0,a.jsx)(t,{link:"elemental_cli_url",name:"elemental_cli_name"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(t,{link:"elemental_operator_url",name:"elemental_operator_name"})," and the ",(0,a.jsx)(t,{link:"ranchersystemagent_url",name:"ranchersystemagent_name"})," enable Rancher Manager to fully control Elemental clusters, from the installation and management of the OS on the Nodes to the provisioning of new K3s or RKE2 clusters in a centralized way."]}),"\n",(0,a.jsx)(n.h2,{id:"what-is-elemental-teal-",children:"What is Elemental Teal ?"}),"\n",(0,a.jsx)(n.p,{children:'Elemental Teal is a combination of "SLE Micro for Rancher" with the Rancher Elemental stack.'}),"\n",(0,a.jsx)(n.p,{children:'SLE Micro for Rancher is a containerized and "stripped to the bones" OS layer. At its core, it only requires grub2, dracut, a kernel, and systemd.'}),"\n",(0,a.jsx)(n.p,{children:"It's sole purpose is to run Kubernetes (k3s or RKE2), with everything controlled through Rancher Manager."}),"\n",(0,a.jsxs)(n.p,{children:["Elemental Teal is built in the ",(0,a.jsx)(n.a,{href:"https://build.opensuse.org/package/show/isv:Rancher:Elemental:Stable:Teal53/node-image",children:"openSUSE Build Service"}),"\nand available through the ",(0,a.jsx)(n.a,{href:"https://registry.suse.com",children:"SUSE Registry"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["You can check latest versions available with ",(0,a.jsx)(n.a,{href:"https://github.com/containers/skopeo",children:"skopeo"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-console",metastring:"showLineNumbers",children:"skopeo list-tags docker://registry.suse.com/rancher/elemental-teal/5.3\n"})}),"\n",(0,a.jsx)(n.h3,{id:"elemental-on-x86-64-hardware",children:"Elemental on x86-64 hardware"}),"\n",(0,a.jsx)(n.p,{children:"Elemental Teal is production ready and fully supported on x86-64 starting with Rancher v2.7.0."}),"\n",(0,a.jsx)(n.h3,{id:"elemental-on-arm-hardware",children:"Elemental on ARM hardware"}),"\n",(0,a.jsx)(n.p,{children:"ARM (aarch64) is functional in the development stage. ARM is currently only tested on Raspberry Pi 4 Model B with k3s 1.24.8 (or later). Feedback is welcome."}),"\n",(0,a.jsx)(n.h3,{id:"elemental-on-other-hardware",children:"Elemental on other hardware"}),"\n",(0,a.jsx)(n.p,{children:"Elemental is currently targeting 'edge' scenarios and does therefore not support other hardware. We will re-assess this as the market evolves."}),"\n",(0,a.jsx)(n.h2,{id:"ready-to-give-it-a-try",children:"Ready to give it a try?"}),"\n",(0,a.jsx)(n.p,{children:"Get an Elemental Cluster up and running with your preferred method"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["With Rancher manager ",(0,a.jsx)(n.a,{href:"/next/quickstart-ui",children:"Elemental plugin"})]}),"\n",(0,a.jsxs)(n.li,{children:["With the ",(0,a.jsx)(n.a,{href:"/next/quickstart-cli",children:"Elemental CLI"})]}),"\n"]}),"\n",(0,a.jsx)(n.admonition,{title:"What's next?",type:"note",children:(0,a.jsxs)(n.p,{children:["Want more details? Take a look at the ",(0,a.jsx)(n.a,{href:"/next/architecture",children:"Architecture"})," section or reach out to the ",(0,a.jsx)(t,{link:"elemental_slack_url",name:"elemental_slack_name"})," Slack channel."]})})]})}function d(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>i,a:()=>s});var a=t(7294);const l={},r=a.createContext(l);function s(e){const n=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:s(e.components),a.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c377a04b.5dad62c5.js b/assets/js/c377a04b.5dad62c5.js new file mode 100644 index 000000000..1f0bba5df --- /dev/null +++ b/assets/js/c377a04b.5dad62c5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6971],{9925:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>s,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>c});var a=t(5893),l=t(1151);const r={slug:"/",sidebar_label:"Overview",title:""},s="Overview",i={id:"index",title:"",description:"Elemental is a software stack enabling centralized, full cloud-native OS management with Kubernetes.",source:"@site/docs/index.md",sourceDirName:".",slug:"/",permalink:"/next/",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{slug:"/",sidebar_label:"Overview",title:""},sidebar:"docs",next:{title:"Elemental the visual way",permalink:"/next/quickstart-ui"}},o={},c=[{value:"What is Elemental Teal ?",id:"what-is-elemental-teal-",level:2},{value:"Elemental on x86-64 hardware",id:"elemental-on-x86-64-hardware",level:3},{value:"Elemental on ARM hardware",id:"elemental-on-arm-hardware",level:3},{value:"Elemental on other hardware",id:"elemental-on-other-hardware",level:3},{value:"Ready to give it a try?",id:"ready-to-give-it-a-try",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.a)(),...e.components},{Head:t,Vars:r}=n;return t||m("Head",!0),r||m("Vars",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t,{children:(0,a.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com"})}),"\n",(0,a.jsx)(n.h1,{id:"overview",children:"Overview"}),"\n",(0,a.jsx)(n.p,{children:"Elemental is a software stack enabling centralized, full cloud-native OS management with Kubernetes."}),"\n",(0,a.jsx)(n.p,{children:"The Elemental Stack consists of a handful of packages on top of SLE Micro for Rancher:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-toolkit"})," - Includes a set of OS utilities to enable OS management via containers. Includes dracut modules, bootloader configuration, cloud-init style configuration services, etc."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-operator"})," - Connects to Rancher Manager and handles MachineRegistration and MachineInventory CRDs."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-register"})," - Registers machines via machineRegistrations and installs them via elemental-cli."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"elemental-cli"})," - Installs any elemental-toolkit based derivative. Basically an installer based on our A/B install and upgrade system."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"rancher-system-agent"}),' - Runs on the installed system and gets instructions ("Plans") from Rancher Manager what to install and run on the system.']}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["Cluster Node OSes are built and maintained via container images through the ",(0,a.jsx)(r,{name:"elemental_cli_name"})," and they can be installed on new hosts using the ",(0,a.jsx)(r,{link:"elemental_ui_url",name:"elemental_ui_name"})," for ",(0,a.jsx)(n.a,{href:"https://www.rancher.com/products/rancher",children:"Rancher Manager"})," or the ",(0,a.jsx)(r,{link:"elemental_cli_url",name:"elemental_cli_name"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(r,{link:"elemental_operator_url",name:"elemental_operator_name"})," and the ",(0,a.jsx)(r,{link:"ranchersystemagent_url",name:"ranchersystemagent_name"})," enable Rancher Manager to fully control Elemental clusters, from the installation and management of the OS on the Nodes to the provisioning of new K3s or RKE2 clusters in a centralized way."]}),"\n",(0,a.jsx)(n.h2,{id:"what-is-elemental-teal-",children:"What is Elemental Teal ?"}),"\n",(0,a.jsx)(n.p,{children:'Elemental Teal is a combination of "SLE Micro for Rancher" with the Rancher Elemental stack.'}),"\n",(0,a.jsx)(n.p,{children:'SLE Micro for Rancher is a containerized and "stripped to the bones" OS layer. At its core, it only requires grub2, dracut, a kernel, and systemd.'}),"\n",(0,a.jsx)(n.p,{children:"It's sole purpose is to run Kubernetes (k3s or RKE2), with everything controlled through Rancher Manager."}),"\n",(0,a.jsxs)(n.p,{children:["Elemental Teal is built in the ",(0,a.jsx)(n.a,{href:"https://build.opensuse.org/package/show/isv:Rancher:Elemental:Stable:Teal53/node-image",children:"openSUSE Build Service"}),"\nand available through the ",(0,a.jsx)(n.a,{href:"https://registry.suse.com",children:"SUSE Registry"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["You can check latest versions available with ",(0,a.jsx)(n.a,{href:"https://github.com/containers/skopeo",children:"skopeo"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-console",metastring:"showLineNumbers",children:"skopeo list-tags docker://registry.suse.com/rancher/elemental-teal/5.3\n"})}),"\n",(0,a.jsx)(n.h3,{id:"elemental-on-x86-64-hardware",children:"Elemental on x86-64 hardware"}),"\n",(0,a.jsx)(n.p,{children:"Elemental Teal is production ready and fully supported on x86-64 starting with Rancher v2.7.0."}),"\n",(0,a.jsx)(n.h3,{id:"elemental-on-arm-hardware",children:"Elemental on ARM hardware"}),"\n",(0,a.jsx)(n.p,{children:"ARM (aarch64) is functional in the development stage. ARM is currently only tested on Raspberry Pi 4 Model B with k3s 1.24.8 (or later). Feedback is welcome."}),"\n",(0,a.jsx)(n.h3,{id:"elemental-on-other-hardware",children:"Elemental on other hardware"}),"\n",(0,a.jsx)(n.p,{children:"Elemental is currently targeting 'edge' scenarios and does therefore not support other hardware. We will re-assess this as the market evolves."}),"\n",(0,a.jsx)(n.h2,{id:"ready-to-give-it-a-try",children:"Ready to give it a try?"}),"\n",(0,a.jsx)(n.p,{children:"Get an Elemental Cluster up and running with your preferred method"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["With Rancher manager ",(0,a.jsx)(n.a,{href:"/next/quickstart-ui",children:"Elemental plugin"})]}),"\n",(0,a.jsxs)(n.li,{children:["With the ",(0,a.jsx)(n.a,{href:"/next/quickstart-cli",children:"Elemental CLI"})]}),"\n"]}),"\n",(0,a.jsx)(n.admonition,{title:"What's next?",type:"note",children:(0,a.jsxs)(n.p,{children:["Want more details? Take a look at the ",(0,a.jsx)(n.a,{href:"/next/architecture",children:"Architecture"})," section or reach out to the ",(0,a.jsx)(r,{link:"elemental_slack_url",name:"elemental_slack_name"})," Slack channel."]})})]})}function d(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}function m(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,n,t)=>{t.d(n,{Z:()=>i,a:()=>s});var a=t(7294);const l={},r=a.createContext(l);function s(e){const n=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:s(e.components),a.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c395c3b1.192df8fe.js b/assets/js/c395c3b1.192df8fe.js deleted file mode 100644 index a1758e3c1..000000000 --- a/assets/js/c395c3b1.192df8fe.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4837],{7227:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var t=o(5893),i=o(1151);const r={sidebar_label:"Cloud-config reference",title:""},s="Cloud-config Reference",c={id:"cloud-config-reference",title:"",description:"All custom configuration applied on top of a fresh deployment should come",source:"@site/versioned_docs/version-1.2/cloud-config-reference.md",sourceDirName:".",slug:"/cloud-config-reference",permalink:"/1.2/cloud-config-reference",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Cloud-config reference",title:""},sidebar:"docs",previous:{title:"Elemental plans",permalink:"/1.2/elemental-plans"},next:{title:"Machineregistration reference",permalink:"/1.2/machineregistration-reference"}},l={},a=[];function d(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",...(0,i.a)(),...e.components},{Details:o}=n;return o||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"cloud-config-reference",children:"Cloud-config Reference"}),"\n",(0,t.jsxs)(n.p,{children:["All custom configuration applied on top of a fresh deployment should come\nfrom the ",(0,t.jsx)(n.code,{children:"cloud-config"})," section in a ",(0,t.jsx)(n.code,{children:"MachineRegistration"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["This will get run by ",(0,t.jsx)(n.a,{href:"https://github.com/rancher/elemental-cli/blob/main/docs/elemental_run-stage.md",children:(0,t.jsx)(n.code,{children:"elemental-cli run-stage"})})," during the ",(0,t.jsx)(n.code,{children:"boot"})," stage, and\nit will be stored in the node under the ",(0,t.jsx)(n.code,{children:"/oem"})," dir."]}),"\n",(0,t.jsxs)(n.p,{children:["Elemental uses ",(0,t.jsx)(n.a,{href:"https://github.com/mudler/yip",children:"yip"})," to run these cloud-config files, so we support the ",(0,t.jsx)(n.a,{href:"https://github.com/mudler/yip#compatibility-with-cloud-init-format",children:"yip subset cloud-config implementation"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Below is an example of the supported configuration on a ",(0,t.jsx)(n.code,{children:"MachineRegistration"})," resource."]}),"\n",(0,t.jsxs)(o,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: "bar"\n passwd: "foo"\n groups: "users"\n homedir: "/home/foo"\n shell: "/bin/bash"\n ssh_authorized_keys:\n - faaapploo\n # Assigns these keys to the first user in users or root if there\n # is none\n ssh_authorized_keys:\n - asdd\n # Run these commands once the system has fully booted\n runcmd:\n - foo\n # Write arbitrary files\n write_files:\n - encoding: b64\n content: CiMgVGhpcyBmaWxlIGNvbnRyb2xzIHRoZSBzdGF0ZSBvZiBTRUxpbnV4\n path: /foo/bar\n permissions: "0644"\n owner: "bar"\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineName: my-machine\n machineInventoryLabels:\n element: fire\n'})})]})]})}function u(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,o)=>{o.d(n,{Z:()=>c,a:()=>s});var t=o(7294);const i={},r=t.createContext(i);function s(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c395c3b1.52a88a05.js b/assets/js/c395c3b1.52a88a05.js new file mode 100644 index 000000000..862c892c4 --- /dev/null +++ b/assets/js/c395c3b1.52a88a05.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4837],{7227:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>a});var t=o(5893),r=o(1151);const i={sidebar_label:"Cloud-config reference",title:""},s="Cloud-config Reference",c={id:"cloud-config-reference",title:"",description:"All custom configuration applied on top of a fresh deployment should come",source:"@site/versioned_docs/version-1.2/cloud-config-reference.md",sourceDirName:".",slug:"/cloud-config-reference",permalink:"/1.2/cloud-config-reference",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Cloud-config reference",title:""},sidebar:"docs",previous:{title:"Elemental plans",permalink:"/1.2/elemental-plans"},next:{title:"Machineregistration reference",permalink:"/1.2/machineregistration-reference"}},l={},a=[];function d(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",...(0,r.a)(),...e.components},{Details:o,Head:i}=n;return o||h("Details",!0),i||h("Head",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i,{children:(0,t.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/cloud-config-reference"})}),"\n",(0,t.jsx)(n.h1,{id:"cloud-config-reference",children:"Cloud-config Reference"}),"\n",(0,t.jsxs)(n.p,{children:["All custom configuration applied on top of a fresh deployment should come\nfrom the ",(0,t.jsx)(n.code,{children:"cloud-config"})," section in a ",(0,t.jsx)(n.code,{children:"MachineRegistration"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["This will get run by ",(0,t.jsx)(n.a,{href:"https://github.com/rancher/elemental-cli/blob/main/docs/elemental_run-stage.md",children:(0,t.jsx)(n.code,{children:"elemental-cli run-stage"})})," during the ",(0,t.jsx)(n.code,{children:"boot"})," stage, and\nit will be stored in the node under the ",(0,t.jsx)(n.code,{children:"/oem"})," dir."]}),"\n",(0,t.jsxs)(n.p,{children:["Elemental uses ",(0,t.jsx)(n.a,{href:"https://github.com/mudler/yip",children:"yip"})," to run these cloud-config files, so we support the ",(0,t.jsx)(n.a,{href:"https://github.com/mudler/yip#compatibility-with-cloud-init-format",children:"yip subset cloud-config implementation"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Below is an example of the supported configuration on a ",(0,t.jsx)(n.code,{children:"MachineRegistration"})," resource."]}),"\n",(0,t.jsxs)(o,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: "bar"\n passwd: "foo"\n groups: "users"\n homedir: "/home/foo"\n shell: "/bin/bash"\n ssh_authorized_keys:\n - faaapploo\n # Assigns these keys to the first user in users or root if there\n # is none\n ssh_authorized_keys:\n - asdd\n # Run these commands once the system has fully booted\n runcmd:\n - foo\n # Write arbitrary files\n write_files:\n - encoding: b64\n content: CiMgVGhpcyBmaWxlIGNvbnRyb2xzIHRoZSBzdGF0ZSBvZiBTRUxpbnV4\n path: /foo/bar\n permissions: "0644"\n owner: "bar"\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineName: my-machine\n machineInventoryLabels:\n element: fire\n'})})]})]})}function u(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}function h(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,n,o)=>{o.d(n,{Z:()=>c,a:()=>s});var t=o(7294);const r={},i=t.createContext(r);function s(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c395f53e.1cd7f8e1.js b/assets/js/c395f53e.1cd7f8e1.js new file mode 100644 index 000000000..009691e6a --- /dev/null +++ b/assets/js/c395f53e.1cd7f8e1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4897],{5529:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>l,metadata:()=>a,toc:()=>d});var t=n(5893),s=n(1151);const l={sidebar_label:"Elemental Operator Helm Chart",title:""},i="Elemental Operator Helm Chart",a={id:"elementaloperatorchart-reference",title:"",description:"The is responsible for managing the Elemental versions and maintaining a machine inventory to assist with edge or bare metal installations.",source:"@site/versioned_docs/version-1.2/elementaloperatorchart-reference.md",sourceDirName:".",slug:"/elementaloperatorchart-reference",permalink:"/1.2/elementaloperatorchart-reference",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Elemental Operator Helm Chart",title:""},sidebar:"docs",previous:{title:"SeedImage reference",permalink:"/1.2/seedimage-reference"},next:{title:"Kubernetes versions",permalink:"/1.2/kubernetesversions"}},c={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Get Helm chart info",id:"get-helm-chart-info",level:2},{value:"Install Chart",id:"install-chart",level:2},{value:"Uninstall Chart",id:"uninstall-chart",level:2},{value:"Upgrading Chart",id:"upgrading-chart",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Values",id:"values",level:2}];function o(e){const r={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components},{Head:n,Vars:l}=r;return n||m("Head",!0),l||m("Vars",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n,{children:(0,t.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/elementaloperatorchart-reference"})}),"\n",(0,t.jsx)(r.h1,{id:"elemental-operator-helm-chart",children:"Elemental Operator Helm Chart"}),"\n",(0,t.jsxs)(r.p,{children:["The ",(0,t.jsx)(l,{name:"elemental_operator_name",link:"elemental_operator_url"})," is responsible for managing the Elemental versions and maintaining a machine inventory to assist with edge or bare metal installations."]}),"\n",(0,t.jsxs)(r.p,{children:["The associated chart bootstraps an elemental-operator deployment on the ",(0,t.jsx)(r.a,{href:"https://rancher.com/docs/rancher/v2.6/",children:"Rancher Manager v2.6"})," cluster using the ",(0,t.jsx)(r.a,{href:"https://helm.sh",children:"Helm"})," package manager."]}),"\n",(0,t.jsx)(r.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsx)(r.li,{children:"Rancher Manager version v2.6"}),"\n",(0,t.jsx)(r.li,{children:"Helm client version v3.8.0+"}),"\n"]}),"\n",(0,t.jsx)(r.h2,{id:"get-helm-chart-info",children:"Get Helm chart info"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm pull oci://registry.suse.com/rancher/elemental-operator-chart\nhelm show all oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,t.jsx)(r.h2,{id:"install-chart",children:"Install Chart"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm install --create-namespace -n cattle-elemental-system elemental-operator-crds \\\n oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm install --create-namespace -n cattle-elemental-system elemental-operator \\\n oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,t.jsx)(r.p,{children:"The command deploys elemental-operator on the Kubernetes cluster in the default configuration."}),"\n",(0,t.jsx)(r.p,{children:(0,t.jsxs)(r.em,{children:["See ",(0,t.jsx)(r.a,{href:"#configuration",children:"configuration"})," below."]})}),"\n",(0,t.jsx)(r.p,{children:(0,t.jsxs)(r.em,{children:["See ",(0,t.jsx)(r.a,{href:"https://helm.sh/docs/helm/helm_install/",children:"helm install"})," for command documentation."]})}),"\n",(0,t.jsx)(r.h2,{id:"uninstall-chart",children:"Uninstall Chart"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm uninstall -n cattle-elemental-system elemental-operator\n"})}),"\n",(0,t.jsx)(r.p,{children:"This removes all the Kubernetes components associated with the chart and deletes the release."}),"\n",(0,t.jsx)(r.p,{children:(0,t.jsxs)(r.em,{children:["See ",(0,t.jsx)(r.a,{href:"https://helm.sh/docs/helm/helm_uninstall/",children:"helm uninstall"})," for command documentation."]})}),"\n",(0,t.jsx)(r.h2,{id:"upgrading-chart",children:"Upgrading Chart"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm upgrade -n cattle-elemental-system \\\n --install elemental-operator \\\n oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,t.jsx)(r.p,{children:(0,t.jsxs)(r.em,{children:["See ",(0,t.jsx)(r.a,{href:"https://helm.sh/docs/helm/helm_upgrade/",children:"helm upgrade"})," for command documentation."]})}),"\n",(0,t.jsx)(r.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsxs)(r.p,{children:["See ",(0,t.jsx)(r.a,{href:"https://helm.sh/docs/intro/using_helm/#customizing-the-chart-before-installing",children:"Customizing the Chart Before Installing"}),". To see all configurable options with detailed comments, visit the chart's ",(0,t.jsx)(r.a,{href:"#values",children:"values"}),", or run these configuration commands:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm show values oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,t.jsx)(r.h2,{id:"values",children:"Values"}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Key"}),(0,t.jsx)(r.th,{children:"Type"}),(0,t.jsx)(r.th,{children:"Default"}),(0,t.jsx)(r.th,{children:"Description"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"image.empty"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"rancher/pause:3.1"})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"image.repository"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"registry.suse.com/rancher/elemental-operator-chart"})}),(0,t.jsx)(r.td,{children:"Source image for elemental-operator with repository name"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"image.tag"}),(0,t.jsx)(r.td,{children:"tag"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:'""'})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"image.imagePullPolicy"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"IfNotPresent"})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"noProxy"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:'`127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local"'}),(0,t.jsx)(r.td,{children:"Comma separated list of domains or ip addresses that will not use the proxy"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"global.cattle.systemDefaultRegistry"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:'""'})}),(0,t.jsx)(r.td,{children:"Default container registry name"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"sync_interval"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:'"60m"'})}),(0,t.jsx)(r.td,{children:"Default sync interval for upgrade channel"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"sync_namespaces"}),(0,t.jsx)(r.td,{children:"list"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"[]"})}),(0,t.jsx)(r.td,{children:"Namespace the operator will watch for, leave empty for all"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"debug"}),(0,t.jsx)(r.td,{children:"bool"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"false"})}),(0,t.jsx)(r.td,{children:"Enable debug output for operator"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"nodeSelector.kubernetes.io/os"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"linux"})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"tolerations"}),(0,t.jsx)(r.td,{children:"object"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"{}"})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"tolerations.key"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"cattle.io/os"})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"tolerations.operator"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:'"Equal"'})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"tolerations.value"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:'"linux"'})}),(0,t.jsx)(r.td,{})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"tolerations.effect"}),(0,t.jsx)(r.td,{children:"string"}),(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"NoSchedule"})}),(0,t.jsx)(r.td,{})]})]})]})]})}function h(e={}){const{wrapper:r}={...(0,s.a)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(o,{...e})}):o(e)}function m(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,r,n)=>{n.d(r,{Z:()=>a,a:()=>i});var t=n(7294);const s={},l=t.createContext(s);function i(e){const r=t.useContext(l);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),t.createElement(l.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c395f53e.362e7fcd.js b/assets/js/c395f53e.362e7fcd.js deleted file mode 100644 index 71fc53ff2..000000000 --- a/assets/js/c395f53e.362e7fcd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4897],{5529:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>l,metadata:()=>a,toc:()=>d});var n=t(5893),s=t(1151);const l={sidebar_label:"Elemental Operator Helm Chart",title:""},i="Elemental Operator Helm Chart",a={id:"elementaloperatorchart-reference",title:"",description:"The is responsible for managing the Elemental versions and maintaining a machine inventory to assist with edge or bare metal installations.",source:"@site/versioned_docs/version-1.2/elementaloperatorchart-reference.md",sourceDirName:".",slug:"/elementaloperatorchart-reference",permalink:"/1.2/elementaloperatorchart-reference",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Elemental Operator Helm Chart",title:""},sidebar:"docs",previous:{title:"SeedImage reference",permalink:"/1.2/seedimage-reference"},next:{title:"Kubernetes versions",permalink:"/1.2/kubernetesversions"}},c={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Get Helm chart info",id:"get-helm-chart-info",level:2},{value:"Install Chart",id:"install-chart",level:2},{value:"Uninstall Chart",id:"uninstall-chart",level:2},{value:"Upgrading Chart",id:"upgrading-chart",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Values",id:"values",level:2}];function o(e){const r={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components},{Vars:t}=r;return t||function(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Vars",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(r.h1,{id:"elemental-operator-helm-chart",children:"Elemental Operator Helm Chart"}),"\n",(0,n.jsxs)(r.p,{children:["The ",(0,n.jsx)(t,{name:"elemental_operator_name",link:"elemental_operator_url"})," is responsible for managing the Elemental versions and maintaining a machine inventory to assist with edge or bare metal installations."]}),"\n",(0,n.jsxs)(r.p,{children:["The associated chart bootstraps an elemental-operator deployment on the ",(0,n.jsx)(r.a,{href:"https://rancher.com/docs/rancher/v2.6/",children:"Rancher Manager v2.6"})," cluster using the ",(0,n.jsx)(r.a,{href:"https://helm.sh",children:"Helm"})," package manager."]}),"\n",(0,n.jsx)(r.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsx)(r.li,{children:"Rancher Manager version v2.6"}),"\n",(0,n.jsx)(r.li,{children:"Helm client version v3.8.0+"}),"\n"]}),"\n",(0,n.jsx)(r.h2,{id:"get-helm-chart-info",children:"Get Helm chart info"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm pull oci://registry.suse.com/rancher/elemental-operator-chart\nhelm show all oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,n.jsx)(r.h2,{id:"install-chart",children:"Install Chart"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm install --create-namespace -n cattle-elemental-system elemental-operator-crds \\\n oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm install --create-namespace -n cattle-elemental-system elemental-operator \\\n oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,n.jsx)(r.p,{children:"The command deploys elemental-operator on the Kubernetes cluster in the default configuration."}),"\n",(0,n.jsx)(r.p,{children:(0,n.jsxs)(r.em,{children:["See ",(0,n.jsx)(r.a,{href:"#configuration",children:"configuration"})," below."]})}),"\n",(0,n.jsx)(r.p,{children:(0,n.jsxs)(r.em,{children:["See ",(0,n.jsx)(r.a,{href:"https://helm.sh/docs/helm/helm_install/",children:"helm install"})," for command documentation."]})}),"\n",(0,n.jsx)(r.h2,{id:"uninstall-chart",children:"Uninstall Chart"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm uninstall -n cattle-elemental-system elemental-operator\n"})}),"\n",(0,n.jsx)(r.p,{children:"This removes all the Kubernetes components associated with the chart and deletes the release."}),"\n",(0,n.jsx)(r.p,{children:(0,n.jsxs)(r.em,{children:["See ",(0,n.jsx)(r.a,{href:"https://helm.sh/docs/helm/helm_uninstall/",children:"helm uninstall"})," for command documentation."]})}),"\n",(0,n.jsx)(r.h2,{id:"upgrading-chart",children:"Upgrading Chart"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm upgrade -n cattle-elemental-system \\\n --install elemental-operator \\\n oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,n.jsx)(r.p,{children:(0,n.jsxs)(r.em,{children:["See ",(0,n.jsx)(r.a,{href:"https://helm.sh/docs/helm/helm_upgrade/",children:"helm upgrade"})," for command documentation."]})}),"\n",(0,n.jsx)(r.h2,{id:"configuration",children:"Configuration"}),"\n",(0,n.jsxs)(r.p,{children:["See ",(0,n.jsx)(r.a,{href:"https://helm.sh/docs/intro/using_helm/#customizing-the-chart-before-installing",children:"Customizing the Chart Before Installing"}),". To see all configurable options with detailed comments, visit the chart's ",(0,n.jsx)(r.a,{href:"#values",children:"values"}),", or run these configuration commands:"]}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-console",metastring:"showLineNumbers",children:"helm show values oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,n.jsx)(r.h2,{id:"values",children:"Values"}),"\n",(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Key"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Default"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"image.empty"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"rancher/pause:3.1"})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"image.repository"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"registry.suse.com/rancher/elemental-operator-chart"})}),(0,n.jsx)(r.td,{children:"Source image for elemental-operator with repository name"})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"image.tag"}),(0,n.jsx)(r.td,{children:"tag"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:'""'})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"image.imagePullPolicy"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"IfNotPresent"})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"noProxy"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:'`127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local"'}),(0,n.jsx)(r.td,{children:"Comma separated list of domains or ip addresses that will not use the proxy"})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"global.cattle.systemDefaultRegistry"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:'""'})}),(0,n.jsx)(r.td,{children:"Default container registry name"})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"sync_interval"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:'"60m"'})}),(0,n.jsx)(r.td,{children:"Default sync interval for upgrade channel"})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"sync_namespaces"}),(0,n.jsx)(r.td,{children:"list"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"[]"})}),(0,n.jsx)(r.td,{children:"Namespace the operator will watch for, leave empty for all"})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"debug"}),(0,n.jsx)(r.td,{children:"bool"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"false"})}),(0,n.jsx)(r.td,{children:"Enable debug output for operator"})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"nodeSelector.kubernetes.io/os"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"linux"})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"tolerations"}),(0,n.jsx)(r.td,{children:"object"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"{}"})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"tolerations.key"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"cattle.io/os"})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"tolerations.operator"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:'"Equal"'})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"tolerations.value"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:'"linux"'})}),(0,n.jsx)(r.td,{})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"tolerations.effect"}),(0,n.jsx)(r.td,{children:"string"}),(0,n.jsx)(r.td,{children:(0,n.jsx)(r.code,{children:"NoSchedule"})}),(0,n.jsx)(r.td,{})]})]})]})]})}function h(e={}){const{wrapper:r}={...(0,s.a)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(o,{...e})}):o(e)}},1151:(e,r,t)=>{t.d(r,{Z:()=>a,a:()=>i});var n=t(7294);const s={},l=n.createContext(s);function i(e){const r=n.useContext(l);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(l.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c541ae51.26ea00c1.js b/assets/js/c541ae51.26ea00c1.js new file mode 100644 index 000000000..552eeab1d --- /dev/null +++ b/assets/js/c541ae51.26ea00c1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[9491],{4108:(e,t,c)=>{c.r(t),c.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var i=c(5893),n=c(1151);const o={sidebar_label:"Add a custom certificate",title:""},r=void 0,s={id:"custom-certificate",title:"",description:"How to add a custom certificate",source:"@site/versioned_docs/version-1.2/custom-certificate.md",sourceDirName:".",slug:"/custom-certificate",permalink:"/1.2/custom-certificate",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Add a custom certificate",title:""},sidebar:"docs",previous:{title:"Include cloud-config from removable devices",permalink:"/1.2/removable-device-cloudconfig"},next:{title:"Rancher upgrades",permalink:"/1.2/troubleshooting-rancher-upgrades"}},a={},d=[{value:"How to add a custom certificate",id:"how-to-add-a-custom-certificate",level:3}];function l(e){const t={admonition:"admonition",code:"code",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.a)(),...e.components},{Head:c}=t;return c||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(c,{children:(0,i.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/custom-certificate"})}),"\n",(0,i.jsx)(t.h3,{id:"how-to-add-a-custom-certificate",children:"How to add a custom certificate"}),"\n",(0,i.jsxs)(t.p,{children:["Prerequisite: A certificate in ",(0,i.jsx)(t.code,{children:".pem"})," format"]}),"\n",(0,i.jsx)(t.p,{children:"Goal: Make a custom certificate available system-wide"}),"\n",(0,i.jsx)(t.admonition,{title:"This is for certificates used by system-level services.",type:"note",children:(0,i.jsx)(t.p,{children:"Kubernetes workloads should bring their certificates within the\ncontainer image instead."})}),"\n",(0,i.jsx)(t.p,{children:"In order to install a custom certificate on SLE Micro for Rancher we\nneed to"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["copy the ",(0,i.jsx)(t.code,{children:".pem"})," file to ",(0,i.jsx)(t.code,{children:"/etc/pki/trust/anchors/"})]}),"\n",(0,i.jsxs)(t.li,{children:["run ",(0,i.jsx)(t.code,{children:"update-ca-certificates"})]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["The respective ",(0,i.jsx)(t.code,{children:"cloud-config"})," snippet looks like this:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-yaml",children:"write_files:\n - path: /etc/pki/trust/anchors/my-custom-certificate.pem\n permission: 0444\n content: |-\n -----BEGIN CERTIFICATE-----\n ...\n -----END CERTIFICATE-----\nruncmd:\n - update-ca-certificates\n"})}),"\n",(0,i.jsx)(t.p,{children:"(actual certificate content omitted for brevity reasons)"})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},1151:(e,t,c)=>{c.d(t,{Z:()=>s,a:()=>r});var i=c(7294);const n={},o=i.createContext(n);function r(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c541ae51.9051816f.js b/assets/js/c541ae51.9051816f.js deleted file mode 100644 index 325b811a9..000000000 --- a/assets/js/c541ae51.9051816f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[9491],{4108:(e,t,c)=>{c.r(t),c.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var i=c(5893),n=c(1151);const o={sidebar_label:"Add a custom certificate",title:""},r=void 0,s={id:"custom-certificate",title:"",description:"How to add a custom certificate",source:"@site/versioned_docs/version-1.2/custom-certificate.md",sourceDirName:".",slug:"/custom-certificate",permalink:"/1.2/custom-certificate",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Add a custom certificate",title:""},sidebar:"docs",previous:{title:"Include cloud-config from removable devices",permalink:"/1.2/removable-device-cloudconfig"},next:{title:"Rancher upgrades",permalink:"/1.2/troubleshooting-rancher-upgrades"}},a={},d=[{value:"How to add a custom certificate",id:"how-to-add-a-custom-certificate",level:3}];function l(e){const t={admonition:"admonition",code:"code",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h3,{id:"how-to-add-a-custom-certificate",children:"How to add a custom certificate"}),"\n",(0,i.jsxs)(t.p,{children:["Prerequisite: A certificate in ",(0,i.jsx)(t.code,{children:".pem"})," format"]}),"\n",(0,i.jsx)(t.p,{children:"Goal: Make a custom certificate available system-wide"}),"\n",(0,i.jsx)(t.admonition,{title:"This is for certificates used by system-level services.",type:"note",children:(0,i.jsx)(t.p,{children:"Kubernetes workloads should bring their certificates within the\ncontainer image instead."})}),"\n",(0,i.jsx)(t.p,{children:"In order to install a custom certificate on SLE Micro for Rancher we\nneed to"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["copy the ",(0,i.jsx)(t.code,{children:".pem"})," file to ",(0,i.jsx)(t.code,{children:"/etc/pki/trust/anchors/"})]}),"\n",(0,i.jsxs)(t.li,{children:["run ",(0,i.jsx)(t.code,{children:"update-ca-certificates"})]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["The respective ",(0,i.jsx)(t.code,{children:"cloud-config"})," snippet looks like this:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-yaml",children:"write_files:\n - path: /etc/pki/trust/anchors/my-custom-certificate.pem\n permission: 0444\n content: |-\n -----BEGIN CERTIFICATE-----\n ...\n -----END CERTIFICATE-----\nruncmd:\n - update-ca-certificates\n"})}),"\n",(0,i.jsx)(t.p,{children:"(actual certificate content omitted for brevity reasons)"})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},1151:(e,t,c)=>{c.d(t,{Z:()=>s,a:()=>r});var i=c(7294);const n={},o=i.createContext(n);function r(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cc55a3ba.6e943ecb.js b/assets/js/cc55a3ba.6e943ecb.js deleted file mode 100644 index af04a92b9..000000000 --- a/assets/js/cc55a3ba.6e943ecb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4953],{2941:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>l,toc:()=>d});var i=t(5893),r=t(1151);const s={sidebar_label:"Machineregistration reference",title:""},a="MachineRegistration reference",l={id:"machineregistration-reference",title:"",description:"The MachineRegistration resource is the responsible of defining a machine registration end point. Once created it generates a registration URL used by nodes to register so they are inventoried.",source:"@site/versioned_docs/version-1.2/machineregistration-reference.md",sourceDirName:".",slug:"/machineregistration-reference",permalink:"/1.2/machineregistration-reference",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Machineregistration reference",title:""},sidebar:"docs",previous:{title:"Cloud-config reference",permalink:"/1.2/cloud-config-reference"},next:{title:"MachineInventorySelectorTemplate reference",permalink:"/1.2/machineinventoryselectortemplate-reference"}},o={},d=[{value:"config.cloud-config",id:"configcloud-config",level:4},{value:"config.elemental.registration",id:"configelementalregistration",level:4},{value:"config.elemental.install",id:"configelementalinstall",level:4},{value:"machineName",id:"machinename",level:4},{value:"machineInventoryLabels",id:"machineinventorylabels",level:4},{value:"machineInventoryAnnotations",id:"machineinventoryannotations",level:4}];function c(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",h1:"h1",h4:"h4",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.a)(),...e.components},{Details:t,Vars:s}=n;return t||m("Details",!0),s||m("Vars",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"machineregistration-reference",children:"MachineRegistration reference"}),"\n",(0,i.jsx)(n.p,{children:"The MachineRegistration resource is the responsible of defining a machine registration end point. Once created it generates a registration URL used by nodes to register so they are inventoried."}),"\n",(0,i.jsxs)(n.p,{children:["There are several keys that can be configured under a ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," resource spec."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="MachineRegistration" showLineNumbers',children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineName: name\n machineInventoryLabels:\n label: value\n machineInventoryAnnotations:\n annotation: value\n config:\n cloud-config:\n ...\n elemental:\n registration:\n ...\n install:\n ... \n"})}),"\n",(0,i.jsx)(n.h4,{id:"configcloud-config",children:"config.cloud-config"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the cloud-configuration to be injected in the node. See the ",(0,i.jsx)(n.a,{href:"/1.2/cloud-config-reference",children:"Cloud Config Reference"})," for full information."]}),"\n",(0,i.jsx)(n.h4,{id:"configelementalregistration",children:"config.elemental.registration"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the configuration used for the connection and the initial registration to the ",(0,i.jsx)(s,{name:"elemental_operator_name"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Supports the following values:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"url"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsxs)(n.td,{children:["URL to connect to the ",(0,i.jsx)(s,{name:"elemental_operator_name"})]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"ca-cert"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"CA to validate the certificate provided by the server at 'url' (required if the certificate is not signed by a public CA)"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"no-smbios"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsxs)(n.td,{children:["Whether SMBIOS data should be sent to the ",(0,i.jsx)(s,{name:"elemental_operator_name"})," (see the ",(0,i.jsx)(n.a,{href:"/1.2/smbios",children:"SMBIOS reference"})," for more information)"]})]})]})]}),"\n",(0,i.jsxs)(n.admonition,{type:"warning",children:[(0,i.jsx)(n.p,{children:"The following values are for development purposes only."}),(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"emulate-tpm"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"This will use software emulation of the TPM (required for hosts without TPM hardware)"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"emulated-tpm-seed"}),(0,i.jsx)(n.td,{children:"int64"}),(0,i.jsx)(n.td,{children:"1"}),(0,i.jsxs)(n.td,{children:["Fixed seed to use with 'emulate-tpm'. Set to -1 to get a random seed. See ",(0,i.jsx)(n.a,{href:"/1.2/tpm",children:"TPM"})," for more information"]})]})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"configelementalinstall",children:"config.elemental.install"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the installation configuration that would be applied via ",(0,i.jsx)(n.code,{children:"operator-register"})," when booted from an ISO and passed to ",(0,i.jsx)(n.a,{href:"https://github.com/rancher/elemental-cli/blob/main/docs/elemental_install.md",children:(0,i.jsx)(n.code,{children:"elemental-cli install"})})]}),"\n",(0,i.jsx)(n.p,{children:"Supports the following values:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"firmware"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"efi"}),(0,i.jsx)(n.td,{children:"Firmware to install ('efi' or 'bios')"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"device"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Device to install the system to"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"no-format"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Don\u2019t format disks. It is implied that COS_STATE, COS_RECOVERY, COS_PERSISTENT, COS_OEM partitions are already existing on the target disk"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"config-urls"}),(0,i.jsx)(n.td,{children:"list"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Cloud-init config files locations"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"iso"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Performs an installation from the ISO url instead of the running ISO"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"system-uri"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsxs)(n.td,{children:["Sets the system image source and its type (e.g. 'docker",":registry",".org/image",":tag","') instead of using the running ISO"]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"debug"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Enable debug output"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"tty"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Add named tty to grub"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"poweroff"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Shutdown the system after install"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"reboot"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Reboot the system after install"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"eject-cd"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Try to eject the cd on reboot"})]})]})]}),"\n",(0,i.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,i.jsxs)(n.p,{children:["In case of using both ",(0,i.jsx)(n.code,{children:"iso"})," and ",(0,i.jsx)(n.code,{children:"system-uri"})," the ",(0,i.jsx)(n.code,{children:"iso"})," value takes precedence"]})}),"\n",(0,i.jsxs)(n.p,{children:["The only required value for a successful installation is the ",(0,i.jsx)(n.code,{children:"device"})," key as we need a target disk to install to. The rest of the parameters are all optional."]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n elemental:\n install:\n device: /dev/sda\n debug: true\n reboot: true\n eject-cd: true\n system-uri: registry.suse.com/rancher/elemental-teal/5.3:latest\n"})})]}),"\n",(0,i.jsx)(n.h4,{id:"machinename",children:"machineName"}),"\n",(0,i.jsxs)(n.p,{children:["This refers to the name that will be set to the node and the kubernetes resources that require a hostname (rke2 deployed pods for example, they use the node hostname as part of the pod names)\n",(0,i.jsx)(n.code,{children:"String"})," type."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["When ",(0,i.jsx)(n.code,{children:"elemental:registration:no-smbios"})," is set to ",(0,i.jsx)(n.code,{children:"false"})," (default), machineName is interpolated with ",(0,i.jsx)(n.a,{href:"https://www.dmtf.org/standards/smbios",children:"SMBIOS"})," data which allows you to store hardware information.\nSee our ",(0,i.jsx)(n.a,{href:"/1.2/smbios",children:"SMBIOS docs"})," for more information.\nIf no ",(0,i.jsx)(n.code,{children:"machineName"})," is specified, a default one in the form ",(0,i.jsx)(n.code,{children:"m-$UUID"})," will be set.\nThe UUID will be retrieved from the SMBIOS data if available, otherwise a random UUID will be generated."]})}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineName: hostname-test-4\n"})})]}),"\n",(0,i.jsx)(n.h4,{id:"machineinventorylabels",children:"machineInventoryLabels"}),"\n",(0,i.jsxs)(n.p,{children:["Labels that will be set to the ",(0,i.jsx)(n.code,{children:"MachineInventory"})," that is created from this ",(0,i.jsx)(n.code,{children:"MachineRegistration"}),"\n",(0,i.jsx)(n.code,{children:"Key: value"})," type. These labels will be used to establish a selection criteria in ",(0,i.jsx)(n.a,{href:"/1.2/machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Elemental Teal nodes will run ",(0,i.jsx)(n.code,{children:"elemental-register"})," every 24 hours.",(0,i.jsx)(n.br,{}),"\n","It is possible to update the ",(0,i.jsx)(n.code,{children:"machineInventoryLabels"})," so that all registered nodes will apply the new labels on the next successfull registration update."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["When ",(0,i.jsx)(n.code,{children:"elemental:registration:no-smbios"})," is set to ",(0,i.jsx)(n.code,{children:"false"})," (default), Labels are interpolated with ",(0,i.jsx)(n.a,{href:"https://www.dmtf.org/standards/smbios",children:"SMBIOS"})," data. This allows to store hardware information in custom labels.\nSee our ",(0,i.jsx)(n.a,{href:"/1.2/smbios",children:"SMBIOS docs"})," for more information."]})}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineInventoryLabels:\n my.prefix.io/element: fire\n my.prefix.io/cpus: 32\n my.prefix.io/manufacturer: "${System Information/Manufacturer}"\n my.prefix.io/productName: "${System Information/Product Name}"\n my.prefix.io/serialNumber: "${System Information/Serial Number}"\n my.prefix.io/machineUUID: "${System Information/UUID}"\n'})})]}),"\n",(0,i.jsx)(n.h4,{id:"machineinventoryannotations",children:"machineInventoryAnnotations"}),"\n",(0,i.jsxs)(n.p,{children:["Annotations that will be set to the ",(0,i.jsx)(n.code,{children:"MachineInventory"})," that is created from this ",(0,i.jsx)(n.code,{children:"MachineRegistration"}),"\n",(0,i.jsx)(n.code,{children:"Key: value"})," type"]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineInventoryAnnotations:\n owner: bob\n version: 1.0.0\n"})})]})]})}function h(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}function m(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>a});var i=t(7294);const r={},s=i.createContext(r);function a(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cc55a3ba.a189dbc9.js b/assets/js/cc55a3ba.a189dbc9.js new file mode 100644 index 000000000..53cd3ec70 --- /dev/null +++ b/assets/js/cc55a3ba.a189dbc9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4953],{2941:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>l,toc:()=>d});var i=t(5893),r=t(1151);const s={sidebar_label:"Machineregistration reference",title:""},a="MachineRegistration reference",l={id:"machineregistration-reference",title:"",description:"The MachineRegistration resource is the responsible of defining a machine registration end point. Once created it generates a registration URL used by nodes to register so they are inventoried.",source:"@site/versioned_docs/version-1.2/machineregistration-reference.md",sourceDirName:".",slug:"/machineregistration-reference",permalink:"/1.2/machineregistration-reference",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Machineregistration reference",title:""},sidebar:"docs",previous:{title:"Cloud-config reference",permalink:"/1.2/cloud-config-reference"},next:{title:"MachineInventorySelectorTemplate reference",permalink:"/1.2/machineinventoryselectortemplate-reference"}},o={},d=[{value:"config.cloud-config",id:"configcloud-config",level:4},{value:"config.elemental.registration",id:"configelementalregistration",level:4},{value:"config.elemental.install",id:"configelementalinstall",level:4},{value:"machineName",id:"machinename",level:4},{value:"machineInventoryLabels",id:"machineinventorylabels",level:4},{value:"machineInventoryAnnotations",id:"machineinventoryannotations",level:4}];function c(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",h1:"h1",h4:"h4",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.a)(),...e.components},{Details:t,Head:s,Vars:a}=n;return t||m("Details",!0),s||m("Head",!0),a||m("Vars",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s,{children:(0,i.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/machineregistration-reference"})}),"\n",(0,i.jsx)(n.h1,{id:"machineregistration-reference",children:"MachineRegistration reference"}),"\n",(0,i.jsx)(n.p,{children:"The MachineRegistration resource is the responsible of defining a machine registration end point. Once created it generates a registration URL used by nodes to register so they are inventoried."}),"\n",(0,i.jsxs)(n.p,{children:["There are several keys that can be configured under a ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," resource spec."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="MachineRegistration" showLineNumbers',children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineName: name\n machineInventoryLabels:\n label: value\n machineInventoryAnnotations:\n annotation: value\n config:\n cloud-config:\n ...\n elemental:\n registration:\n ...\n install:\n ... \n"})}),"\n",(0,i.jsx)(n.h4,{id:"configcloud-config",children:"config.cloud-config"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the cloud-configuration to be injected in the node. See the ",(0,i.jsx)(n.a,{href:"/1.2/cloud-config-reference",children:"Cloud Config Reference"})," for full information."]}),"\n",(0,i.jsx)(n.h4,{id:"configelementalregistration",children:"config.elemental.registration"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the configuration used for the connection and the initial registration to the ",(0,i.jsx)(a,{name:"elemental_operator_name"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Supports the following values:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"url"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsxs)(n.td,{children:["URL to connect to the ",(0,i.jsx)(a,{name:"elemental_operator_name"})]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"ca-cert"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"CA to validate the certificate provided by the server at 'url' (required if the certificate is not signed by a public CA)"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"no-smbios"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsxs)(n.td,{children:["Whether SMBIOS data should be sent to the ",(0,i.jsx)(a,{name:"elemental_operator_name"})," (see the ",(0,i.jsx)(n.a,{href:"/1.2/smbios",children:"SMBIOS reference"})," for more information)"]})]})]})]}),"\n",(0,i.jsxs)(n.admonition,{type:"warning",children:[(0,i.jsx)(n.p,{children:"The following values are for development purposes only."}),(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"emulate-tpm"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"This will use software emulation of the TPM (required for hosts without TPM hardware)"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"emulated-tpm-seed"}),(0,i.jsx)(n.td,{children:"int64"}),(0,i.jsx)(n.td,{children:"1"}),(0,i.jsxs)(n.td,{children:["Fixed seed to use with 'emulate-tpm'. Set to -1 to get a random seed. See ",(0,i.jsx)(n.a,{href:"/1.2/tpm",children:"TPM"})," for more information"]})]})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"configelementalinstall",children:"config.elemental.install"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the installation configuration that would be applied via ",(0,i.jsx)(n.code,{children:"operator-register"})," when booted from an ISO and passed to ",(0,i.jsx)(n.a,{href:"https://github.com/rancher/elemental-cli/blob/main/docs/elemental_install.md",children:(0,i.jsx)(n.code,{children:"elemental-cli install"})})]}),"\n",(0,i.jsx)(n.p,{children:"Supports the following values:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"firmware"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"efi"}),(0,i.jsx)(n.td,{children:"Firmware to install ('efi' or 'bios')"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"device"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Device to install the system to"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"no-format"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Don\u2019t format disks. It is implied that COS_STATE, COS_RECOVERY, COS_PERSISTENT, COS_OEM partitions are already existing on the target disk"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"config-urls"}),(0,i.jsx)(n.td,{children:"list"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Cloud-init config files locations"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"iso"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Performs an installation from the ISO url instead of the running ISO"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"system-uri"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsxs)(n.td,{children:["Sets the system image source and its type (e.g. 'docker",":registry",".org/image",":tag","') instead of using the running ISO"]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"debug"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Enable debug output"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"tty"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Add named tty to grub"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"poweroff"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Shutdown the system after install"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"reboot"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Reboot the system after install"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"eject-cd"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Try to eject the cd on reboot"})]})]})]}),"\n",(0,i.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,i.jsxs)(n.p,{children:["In case of using both ",(0,i.jsx)(n.code,{children:"iso"})," and ",(0,i.jsx)(n.code,{children:"system-uri"})," the ",(0,i.jsx)(n.code,{children:"iso"})," value takes precedence"]})}),"\n",(0,i.jsxs)(n.p,{children:["The only required value for a successful installation is the ",(0,i.jsx)(n.code,{children:"device"})," key as we need a target disk to install to. The rest of the parameters are all optional."]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n elemental:\n install:\n device: /dev/sda\n debug: true\n reboot: true\n eject-cd: true\n system-uri: registry.suse.com/rancher/elemental-teal/5.3:latest\n"})})]}),"\n",(0,i.jsx)(n.h4,{id:"machinename",children:"machineName"}),"\n",(0,i.jsxs)(n.p,{children:["This refers to the name that will be set to the node and the kubernetes resources that require a hostname (rke2 deployed pods for example, they use the node hostname as part of the pod names)\n",(0,i.jsx)(n.code,{children:"String"})," type."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["When ",(0,i.jsx)(n.code,{children:"elemental:registration:no-smbios"})," is set to ",(0,i.jsx)(n.code,{children:"false"})," (default), machineName is interpolated with ",(0,i.jsx)(n.a,{href:"https://www.dmtf.org/standards/smbios",children:"SMBIOS"})," data which allows you to store hardware information.\nSee our ",(0,i.jsx)(n.a,{href:"/1.2/smbios",children:"SMBIOS docs"})," for more information.\nIf no ",(0,i.jsx)(n.code,{children:"machineName"})," is specified, a default one in the form ",(0,i.jsx)(n.code,{children:"m-$UUID"})," will be set.\nThe UUID will be retrieved from the SMBIOS data if available, otherwise a random UUID will be generated."]})}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineName: hostname-test-4\n"})})]}),"\n",(0,i.jsx)(n.h4,{id:"machineinventorylabels",children:"machineInventoryLabels"}),"\n",(0,i.jsxs)(n.p,{children:["Labels that will be set to the ",(0,i.jsx)(n.code,{children:"MachineInventory"})," that is created from this ",(0,i.jsx)(n.code,{children:"MachineRegistration"}),"\n",(0,i.jsx)(n.code,{children:"Key: value"})," type. These labels will be used to establish a selection criteria in ",(0,i.jsx)(n.a,{href:"/1.2/machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Elemental Teal nodes will run ",(0,i.jsx)(n.code,{children:"elemental-register"})," every 24 hours.",(0,i.jsx)(n.br,{}),"\n","It is possible to update the ",(0,i.jsx)(n.code,{children:"machineInventoryLabels"})," so that all registered nodes will apply the new labels on the next successfull registration update."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["When ",(0,i.jsx)(n.code,{children:"elemental:registration:no-smbios"})," is set to ",(0,i.jsx)(n.code,{children:"false"})," (default), Labels are interpolated with ",(0,i.jsx)(n.a,{href:"https://www.dmtf.org/standards/smbios",children:"SMBIOS"})," data. This allows to store hardware information in custom labels.\nSee our ",(0,i.jsx)(n.a,{href:"/1.2/smbios",children:"SMBIOS docs"})," for more information."]})}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineInventoryLabels:\n my.prefix.io/element: fire\n my.prefix.io/cpus: 32\n my.prefix.io/manufacturer: "${System Information/Manufacturer}"\n my.prefix.io/productName: "${System Information/Product Name}"\n my.prefix.io/serialNumber: "${System Information/Serial Number}"\n my.prefix.io/machineUUID: "${System Information/UUID}"\n'})})]}),"\n",(0,i.jsx)(n.h4,{id:"machineinventoryannotations",children:"machineInventoryAnnotations"}),"\n",(0,i.jsxs)(n.p,{children:["Annotations that will be set to the ",(0,i.jsx)(n.code,{children:"MachineInventory"})," that is created from this ",(0,i.jsx)(n.code,{children:"MachineRegistration"}),"\n",(0,i.jsx)(n.code,{children:"Key: value"})," type"]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineInventoryAnnotations:\n owner: bob\n version: 1.0.0\n"})})]})]})}function h(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}function m(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>a});var i=t(7294);const r={},s=i.createContext(r);function a(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ccc14432.0181111c.js b/assets/js/ccc14432.0181111c.js new file mode 100644 index 000000000..d63273594 --- /dev/null +++ b/assets/js/ccc14432.0181111c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[5556],{7428:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>i,default:()=>m,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var s=t(5893),l=t(1151);const a={sidebar_label:"Elemental plans",title:""},i=void 0,o={id:"elemental-plans",title:"",description:"Introduction",source:"@site/versioned_docs/version-1.3/elemental-plans.md",sourceDirName:".",slug:"/elemental-plans",permalink:"/elemental-plans",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Elemental plans",title:""},sidebar:"docs",previous:{title:"Customize Elemental Install",permalink:"/customizing"},next:{title:"Cloud-config reference",permalink:"/cloud-config-reference"}},r={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Types of Plans",id:"types-of-plans",level:2},{value:"Adding local plans on Elemental",id:"adding-local-plans-on-elemental",level:2},{value:"Plan examples",id:"plan-examples",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.a)(),...e.components},{Head:t,TabItem:a,Tabs:i}=n;return t||p("Head",!0),a||p("TabItem",!0),i||p("Tabs",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t,{children:(0,s.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/elemental-plans"})}),"\n",(0,s.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsxs)(n.p,{children:["Elemental uses the ",(0,s.jsx)(n.a,{href:"https://github.com/rancher/system-agent",children:"Rancher System Agent"}),", renamed to Elemental System Agent, to initially bootstrap the node with a simple plan."]}),"\n",(0,s.jsx)(n.p,{children:"The plan will apply the following configurations:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Set some labels for the node"}),"\n",(0,s.jsxs)(n.li,{children:["Set the proper hostname according to the ",(0,s.jsx)(n.code,{children:"MachineInventory"})," value"]}),"\n",(0,s.jsx)(n.li,{children:"Install the default Rancher System Agent from Rancher Server, and install the proper Kubernetes components"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The bootstrap service also accepts local plans stored under ",(0,s.jsx)(n.code,{children:"/var/lib/elemental/agent/plans"}),". Any plan written\nin there will also be applied during the initial node start after the installation is completed."]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["The local plans run only during the initial Elemental bootstrap ",(0,s.jsx)(n.strong,{children:"before"})," Kubernetes is installed on the node."]})}),"\n",(0,s.jsx)(n.h2,{id:"types-of-plans",children:"Types of Plans"}),"\n",(0,s.jsx)(n.p,{children:"The type of plans that Elemental can use are:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"One time instructions: Only run once"}),"\n",(0,s.jsx)(n.li,{children:"Periodic instructions: They run periodically"}),"\n",(0,s.jsx)(n.li,{children:"Files: Creates files"}),"\n",(0,s.jsx)(n.li,{children:"Probes: http probes"}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsx)(n.p,{children:"Both one time instructions and periodic instructions can run either a direct command or a docker image."})}),"\n",(0,s.jsx)(n.h2,{id:"adding-local-plans-on-elemental",children:"Adding local plans on Elemental"}),"\n",(0,s.jsxs)(n.p,{children:["You can add local plans to Elemental as part of the ",(0,s.jsx)(n.code,{children:"MachineRegistration"})," CRD, in the ",(0,s.jsx)(n.code,{children:"cloud-config"})," section as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n write_files:\n - path: /var/lib/elemental/agent/plans/mycustomplan.plan\n permissions: "0600"\n content: |\n {"instructions":\n [\n {\n "name":"set hostname",\n "command":"hostnamectl",\n "args": ["set-hostname", "myHostname"]\n },\n {\n "name":"stop sshd service",\n "command":"systemctl",\n "args": ["stop", "sshd"]\n }\n ]\n }\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineName: my-machine\n machineInventoryLabels:\n element: fire\n'})}),"\n",(0,s.jsx)(n.h2,{id:"plan-examples",children:"Plan examples"}),"\n",(0,s.jsxs)(n.p,{children:["The following plans are provided as a quick reference and are not guaranteed to work in your environment. To learn more about plans please check ",(0,s.jsx)(n.a,{href:"https://github.com/rancher/system-agent",children:"Rancher System Agent"}),"."]}),"\n",(0,s.jsxs)(i,{children:[(0,s.jsx)(a,{value:"example1",label:"Example 1: one time instructions",default:!0,children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"instructions":\n [\n {\n "name":"set hostname",\n "command":"hostnamectl",\n "args": ["set-hostname", "myHostname"]\n },\n {\n "name":"stop sshd service",\n "command":"systemctl",\n "args": ["stop", "sshd"]\n }\n ]\n}\n'})})}),(0,s.jsx)(a,{value:"example2",label:"Example 2: periodic instructions",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"periodicInstructions":\n [\n {\n "name":"set hostname",\n "image":"ghcr.io/rancher-sandbox/elemental-example-plan:main"\n "command": "run.sh"\n }\n ]\n}\n'})})}),(0,s.jsx)(a,{value:"example3",label:"Example 3: files",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"files":\n [\n {\n "content":"Welcome to the system",\n "path":"/etc/motd",\n "permissions": "0644"\n }\n ]\n}\n'})})}),(0,s.jsx)(a,{value:"example4",label:"Example 4: probes",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"probes":\n "probe1": {\n "name": "Service Up",\n "httpGet": {\n "url": "http://10.0.0.1/healthz",\n "insecure": "false",\n "clientCert": "....",\n "clientKey": "....",\n "caCert": "....."\n } \n }\n}\n'})})})]})]})}function m(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}function p(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>i});var s=t(7294);const l={},a=s.createContext(l);function i(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ccc14432.e631397b.js b/assets/js/ccc14432.e631397b.js deleted file mode 100644 index 6433400b8..000000000 --- a/assets/js/ccc14432.e631397b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[5556],{7428:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>i,default:()=>m,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var s=t(5893),l=t(1151);const a={sidebar_label:"Elemental plans",title:""},i=void 0,o={id:"elemental-plans",title:"",description:"Introduction",source:"@site/versioned_docs/version-1.3/elemental-plans.md",sourceDirName:".",slug:"/elemental-plans",permalink:"/elemental-plans",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Elemental plans",title:""},sidebar:"docs",previous:{title:"Customize Elemental Install",permalink:"/customizing"},next:{title:"Cloud-config reference",permalink:"/cloud-config-reference"}},r={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Types of Plans",id:"types-of-plans",level:2},{value:"Adding local plans on Elemental",id:"adding-local-plans-on-elemental",level:2},{value:"Plan examples",id:"plan-examples",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.a)(),...e.components},{TabItem:t,Tabs:a}=n;return t||p("TabItem",!0),a||p("Tabs",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsxs)(n.p,{children:["Elemental uses the ",(0,s.jsx)(n.a,{href:"https://github.com/rancher/system-agent",children:"Rancher System Agent"}),", renamed to Elemental System Agent, to initially bootstrap the node with a simple plan."]}),"\n",(0,s.jsx)(n.p,{children:"The plan will apply the following configurations:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Set some labels for the node"}),"\n",(0,s.jsxs)(n.li,{children:["Set the proper hostname according to the ",(0,s.jsx)(n.code,{children:"MachineInventory"})," value"]}),"\n",(0,s.jsx)(n.li,{children:"Install the default Rancher System Agent from Rancher Server, and install the proper Kubernetes components"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The bootstrap service also accepts local plans stored under ",(0,s.jsx)(n.code,{children:"/var/lib/elemental/agent/plans"}),". Any plan written\nin there will also be applied during the initial node start after the installation is completed."]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["The local plans run only during the initial Elemental bootstrap ",(0,s.jsx)(n.strong,{children:"before"})," Kubernetes is installed on the node."]})}),"\n",(0,s.jsx)(n.h2,{id:"types-of-plans",children:"Types of Plans"}),"\n",(0,s.jsx)(n.p,{children:"The type of plans that Elemental can use are:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"One time instructions: Only run once"}),"\n",(0,s.jsx)(n.li,{children:"Periodic instructions: They run periodically"}),"\n",(0,s.jsx)(n.li,{children:"Files: Creates files"}),"\n",(0,s.jsx)(n.li,{children:"Probes: http probes"}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsx)(n.p,{children:"Both one time instructions and periodic instructions can run either a direct command or a docker image."})}),"\n",(0,s.jsx)(n.h2,{id:"adding-local-plans-on-elemental",children:"Adding local plans on Elemental"}),"\n",(0,s.jsxs)(n.p,{children:["You can add local plans to Elemental as part of the ",(0,s.jsx)(n.code,{children:"MachineRegistration"})," CRD, in the ",(0,s.jsx)(n.code,{children:"cloud-config"})," section as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n write_files:\n - path: /var/lib/elemental/agent/plans/mycustomplan.plan\n permissions: "0600"\n content: |\n {"instructions":\n [\n {\n "name":"set hostname",\n "command":"hostnamectl",\n "args": ["set-hostname", "myHostname"]\n },\n {\n "name":"stop sshd service",\n "command":"systemctl",\n "args": ["stop", "sshd"]\n }\n ]\n }\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineName: my-machine\n machineInventoryLabels:\n element: fire\n'})}),"\n",(0,s.jsx)(n.h2,{id:"plan-examples",children:"Plan examples"}),"\n",(0,s.jsxs)(n.p,{children:["The following plans are provided as a quick reference and are not guaranteed to work in your environment. To learn more about plans please check ",(0,s.jsx)(n.a,{href:"https://github.com/rancher/system-agent",children:"Rancher System Agent"}),"."]}),"\n",(0,s.jsxs)(a,{children:[(0,s.jsx)(t,{value:"example1",label:"Example 1: one time instructions",default:!0,children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"instructions":\n [\n {\n "name":"set hostname",\n "command":"hostnamectl",\n "args": ["set-hostname", "myHostname"]\n },\n {\n "name":"stop sshd service",\n "command":"systemctl",\n "args": ["stop", "sshd"]\n }\n ]\n}\n'})})}),(0,s.jsx)(t,{value:"example2",label:"Example 2: periodic instructions",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"periodicInstructions":\n [\n {\n "name":"set hostname",\n "image":"ghcr.io/rancher-sandbox/elemental-example-plan:main"\n "command": "run.sh"\n }\n ]\n}\n'})})}),(0,s.jsx)(t,{value:"example3",label:"Example 3: files",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"files":\n [\n {\n "content":"Welcome to the system",\n "path":"/etc/motd",\n "permissions": "0644"\n }\n ]\n}\n'})})}),(0,s.jsx)(t,{value:"example4",label:"Example 4: probes",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:"showLineNumbers",children:'{"probes":\n "probe1": {\n "name": "Service Up",\n "httpGet": {\n "url": "http://10.0.0.1/healthz",\n "insecure": "false",\n "clientCert": "....",\n "clientKey": "....",\n "caCert": "....."\n } \n }\n}\n'})})})]})]})}function m(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}function p(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>i});var s=t(7294);const l={},a=s.createContext(l);function i(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ce8372b3.abcf1913.js b/assets/js/ce8372b3.abcf1913.js new file mode 100644 index 000000000..3dfc197b8 --- /dev/null +++ b/assets/js/ce8372b3.abcf1913.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6777],{724:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>i,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var t=n(5893),a=n(1151);const o={sidebar_label:"Restore",title:""},s="Restore",c={id:"restore",title:"",description:"Follow this guide to restore an Elemental configuration from a backup with Rancher.",source:"@site/docs/restore.md",sourceDirName:".",slug:"/restore",permalink:"/next/restore",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Restore",title:""},sidebar:"docs",previous:{title:"Backup",permalink:"/next/backup"},next:{title:"Configure Wi-Fi",permalink:"/next/wifi"}},i={},l=[{value:"Prepare rancher-backup operator and backup files for restoring",id:"prepare-rancher-backup-operator-and-backup-files-for-restoring",level:2},{value:"Restore the Elemental configuration with rancher-backup operator",id:"restore-the-elemental-configuration-with-rancher-backup-operator",level:2}];function p(e){const r={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,a.a)(),...e.components},{Head:n}=r;return n||function(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n,{children:(0,t.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/restore"})}),"\n",(0,t.jsx)(r.h1,{id:"restore",children:"Restore"}),"\n",(0,t.jsx)(r.p,{children:"Follow this guide to restore an Elemental configuration from a backup with Rancher."}),"\n",(0,t.jsx)(r.h2,{id:"prepare-rancher-backup-operator-and-backup-files-for-restoring",children:"Prepare rancher-backup operator and backup files for restoring"}),"\n",(0,t.jsxs)(r.p,{children:["Go to official ",(0,t.jsx)(r.a,{href:"https://docs.ranchermanager.rancher.io/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/restore-rancher",children:"Rancher documentation"})," and make sure that ",(0,t.jsx)(r.code,{children:"rancher-backup operator"})," is installed and has access to backup files."]}),"\n",(0,t.jsxs)(r.p,{children:["You first have to follow this ",(0,t.jsx)(r.a,{href:"/next/backup",children:"documentation"})," to do a backup of Elemental resources."]}),"\n",(0,t.jsx)(r.h2,{id:"restore-the-elemental-configuration-with-rancher-backup-operator",children:"Restore the Elemental configuration with rancher-backup operator"}),"\n",(0,t.jsxs)(r.p,{children:["Create a ",(0,t.jsx)(r.code,{children:"restore object"})," (adapted to your needs) to restore the backup tarball."]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: resources.cattle.io/v1\nkind: Restore\nmetadata:\n name: elemental-restore\nspec:\n backupFilename: rancher-backup-430169aa-edde-4a61-85e8-858f625a755b-2022-10-17T05-15-00Z.tar.gz\n"})}),"\n",(0,t.jsx)(r.p,{children:"Apply manifest on Kubernetes."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f elemental-restore.yaml\n"})}),"\n",(0,t.jsx)(r.p,{children:"Check logs from rancher-backup operator."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl logs -n cattle-resources-system -l app.kubernetes.io/name=rancher-backup -f\n"})}),"\n",(0,t.jsx)(r.p,{children:"Verify if backup file was restore successfully."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"...\nINFO[2022/10/31 06:34:50] Processing controllerRef apps/v1/deployments/rancher \nINFO[2022/10/31 06:34:50] Done restoring\n...\n"})}),"\n",(0,t.jsxs)(r.p,{children:["Continue with procedure from ",(0,t.jsx)(r.a,{href:"https://docs.ranchermanager.rancher.io/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/migrate-rancher-to-new-cluster",children:"Rancher documentation"})]})]})}function u(e={}){const{wrapper:r}={...(0,a.a)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(p,{...e})}):p(e)}},1151:(e,r,n)=>{n.d(r,{Z:()=>c,a:()=>s});var t=n(7294);const a={},o=t.createContext(a);function s(e){const r=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function c(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),t.createElement(o.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ce8372b3.e6766f01.js b/assets/js/ce8372b3.e6766f01.js deleted file mode 100644 index 6dd416bbd..000000000 --- a/assets/js/ce8372b3.e6766f01.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[6777],{724:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>i,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var t=n(5893),a=n(1151);const o={sidebar_label:"Restore",title:""},s="Restore",c={id:"restore",title:"",description:"Follow this guide to restore an Elemental configuration from a backup with Rancher.",source:"@site/docs/restore.md",sourceDirName:".",slug:"/restore",permalink:"/next/restore",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Restore",title:""},sidebar:"docs",previous:{title:"Backup",permalink:"/next/backup"},next:{title:"Configure Wi-Fi",permalink:"/next/wifi"}},i={},l=[{value:"Prepare rancher-backup operator and backup files for restoring",id:"prepare-rancher-backup-operator-and-backup-files-for-restoring",level:2},{value:"Restore the Elemental configuration with rancher-backup operator",id:"restore-the-elemental-configuration-with-rancher-backup-operator",level:2}];function u(e){const r={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.h1,{id:"restore",children:"Restore"}),"\n",(0,t.jsx)(r.p,{children:"Follow this guide to restore an Elemental configuration from a backup with Rancher."}),"\n",(0,t.jsx)(r.h2,{id:"prepare-rancher-backup-operator-and-backup-files-for-restoring",children:"Prepare rancher-backup operator and backup files for restoring"}),"\n",(0,t.jsxs)(r.p,{children:["Go to official ",(0,t.jsx)(r.a,{href:"https://docs.ranchermanager.rancher.io/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/restore-rancher",children:"Rancher documentation"})," and make sure that ",(0,t.jsx)(r.code,{children:"rancher-backup operator"})," is installed and has access to backup files."]}),"\n",(0,t.jsxs)(r.p,{children:["You first have to follow this ",(0,t.jsx)(r.a,{href:"/next/backup",children:"documentation"})," to do a backup of Elemental resources."]}),"\n",(0,t.jsx)(r.h2,{id:"restore-the-elemental-configuration-with-rancher-backup-operator",children:"Restore the Elemental configuration with rancher-backup operator"}),"\n",(0,t.jsxs)(r.p,{children:["Create a ",(0,t.jsx)(r.code,{children:"restore object"})," (adapted to your needs) to restore the backup tarball."]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: resources.cattle.io/v1\nkind: Restore\nmetadata:\n name: elemental-restore\nspec:\n backupFilename: rancher-backup-430169aa-edde-4a61-85e8-858f625a755b-2022-10-17T05-15-00Z.tar.gz\n"})}),"\n",(0,t.jsx)(r.p,{children:"Apply manifest on Kubernetes."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f elemental-restore.yaml\n"})}),"\n",(0,t.jsx)(r.p,{children:"Check logs from rancher-backup operator."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl logs -n cattle-resources-system -l app.kubernetes.io/name=rancher-backup -f\n"})}),"\n",(0,t.jsx)(r.p,{children:"Verify if backup file was restore successfully."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"...\nINFO[2022/10/31 06:34:50] Processing controllerRef apps/v1/deployments/rancher \nINFO[2022/10/31 06:34:50] Done restoring\n...\n"})}),"\n",(0,t.jsxs)(r.p,{children:["Continue with procedure from ",(0,t.jsx)(r.a,{href:"https://docs.ranchermanager.rancher.io/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/migrate-rancher-to-new-cluster",children:"Rancher documentation"})]})]})}function h(e={}){const{wrapper:r}={...(0,a.a)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},1151:(e,r,n)=>{n.d(r,{Z:()=>c,a:()=>s});var t=n(7294);const a={},o=t.createContext(a);function s(e){const r=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function c(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),t.createElement(o.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cf169a96.27586135.js b/assets/js/cf169a96.27586135.js deleted file mode 100644 index 7e8f38af1..000000000 --- a/assets/js/cf169a96.27586135.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[9656],{3850:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>d,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var r=n(5893),o=n(1151);const s={sidebar_label:"Restore",title:""},a="Troubleshooting restore",c={id:"troubleshooting-restore",title:"",description:"When a restore is performed, do not restart the rancher-system-agent on elemental nodes as it can stale and end with the following error:",source:"@site/docs/troubleshooting-restore.md",sourceDirName:".",slug:"/troubleshooting-restore",permalink:"/next/troubleshooting-restore",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Restore",title:""},sidebar:"docs",previous:{title:"Rancher upgrades",permalink:"/next/troubleshooting-rancher-upgrades"},next:{title:"Upgrade",permalink:"/next/troubleshooting-upgrade"}},i={},l=[];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",p:"p",pre:"pre",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"troubleshooting-restore",children:"Troubleshooting restore"}),"\n",(0,r.jsxs)(t.admonition,{title:"warning",type:"warning",children:[(0,r.jsxs)(t.p,{children:["When a restore is performed, do not restart the ",(0,r.jsx)(t.code,{children:"rancher-system-agent"})," on elemental nodes as it can stale and end with the following error:"]}),(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"panic: error while connecting to Kubernetes cluster: the server has asked for the client to provide credentials"})}),(0,r.jsx)(t.p,{children:"If you face this problem, please follow the procedure below."})]}),"\n",(0,r.jsxs)(t.p,{children:["Before you initiate a restore, you need to copy ",(0,r.jsx)(t.code,{children:"/var/lib/rancher/agent/rancher2_connection_info.json"})," from the elemental node to a place where you have access with Rancher UI."]}),"\n",(0,r.jsxs)(t.p,{children:["Once the file is copied, download the ",(0,r.jsx)(t.code,{children:"rancher-agent-token-update.sh"})," script from the ",(0,r.jsx)(t.a,{href:"https://github.com/rancher/elemental",children:"Elemental repository"}),":"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://raw.githubusercontent.com/rancher/elemental/main/scripts/rancher-agent-token-update && chmod +x rancher-agent-token-update\n"})}),"\n",(0,r.jsx)(t.p,{children:"Execute the script without any additional options:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"./rancher-agent-token-update\n"})}),"\n",(0,r.jsxs)(t.p,{children:["After the restore successfully completed, copy ",(0,r.jsx)(t.code,{children:"rancher2_connection_info.json"})," back to the elemental node to the path\n",(0,r.jsx)(t.code,{children:"/var/lib/rancher/agent/rancher2_connection_info.json"}),". Finally, restart the ",(0,r.jsx)(t.code,{children:"rancher-system-agent"})," service:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"systemctl restart rancher-system-agent\n"})})]})}function d(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>a});var r=n(7294);const o={},s=r.createContext(o);function a(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cf169a96.82fda36c.js b/assets/js/cf169a96.82fda36c.js new file mode 100644 index 000000000..003cf6384 --- /dev/null +++ b/assets/js/cf169a96.82fda36c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[9656],{3850:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>d,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var r=n(5893),o=n(1151);const s={sidebar_label:"Restore",title:""},a="Troubleshooting restore",c={id:"troubleshooting-restore",title:"",description:"When a restore is performed, do not restart the rancher-system-agent on elemental nodes as it can stale and end with the following error:",source:"@site/docs/troubleshooting-restore.md",sourceDirName:".",slug:"/troubleshooting-restore",permalink:"/next/troubleshooting-restore",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Restore",title:""},sidebar:"docs",previous:{title:"Rancher upgrades",permalink:"/next/troubleshooting-rancher-upgrades"},next:{title:"Upgrade",permalink:"/next/troubleshooting-upgrade"}},i={},l=[];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",p:"p",pre:"pre",...(0,o.a)(),...e.components},{Head:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n,{children:(0,r.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/troubleshooting-restore"})}),"\n",(0,r.jsx)(t.h1,{id:"troubleshooting-restore",children:"Troubleshooting restore"}),"\n",(0,r.jsxs)(t.admonition,{title:"warning",type:"warning",children:[(0,r.jsxs)(t.p,{children:["When a restore is performed, do not restart the ",(0,r.jsx)(t.code,{children:"rancher-system-agent"})," on elemental nodes as it can stale and end with the following error:"]}),(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"panic: error while connecting to Kubernetes cluster: the server has asked for the client to provide credentials"})}),(0,r.jsx)(t.p,{children:"If you face this problem, please follow the procedure below."})]}),"\n",(0,r.jsxs)(t.p,{children:["Before you initiate a restore, you need to copy ",(0,r.jsx)(t.code,{children:"/var/lib/rancher/agent/rancher2_connection_info.json"})," from the elemental node to a place where you have access with Rancher UI."]}),"\n",(0,r.jsxs)(t.p,{children:["Once the file is copied, download the ",(0,r.jsx)(t.code,{children:"rancher-agent-token-update.sh"})," script from the ",(0,r.jsx)(t.a,{href:"https://github.com/rancher/elemental",children:"Elemental repository"}),":"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://raw.githubusercontent.com/rancher/elemental/main/scripts/rancher-agent-token-update && chmod +x rancher-agent-token-update\n"})}),"\n",(0,r.jsx)(t.p,{children:"Execute the script without any additional options:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"./rancher-agent-token-update\n"})}),"\n",(0,r.jsxs)(t.p,{children:["After the restore successfully completed, copy ",(0,r.jsx)(t.code,{children:"rancher2_connection_info.json"})," back to the elemental node to the path\n",(0,r.jsx)(t.code,{children:"/var/lib/rancher/agent/rancher2_connection_info.json"}),". Finally, restart the ",(0,r.jsx)(t.code,{children:"rancher-system-agent"})," service:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",metastring:"showLineNumbers",children:"systemctl restart rancher-system-agent\n"})})]})}function d(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>a});var r=n(7294);const o={},s=r.createContext(o);function a(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d0681c17.02a14704.js b/assets/js/d0681c17.02a14704.js new file mode 100644 index 000000000..ddb62151a --- /dev/null +++ b/assets/js/d0681c17.02a14704.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4859],{2113:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});var i=t(5893),s=t(1151);const a={sidebar_label:"Elemental the visual way",title:""},l="Elemental the visual way",r={id:"quickstart-ui",title:"",description:"The following instructions need Rancher 2.8.x at least.",source:"@site/docs/quickstart-ui.md",sourceDirName:".",slug:"/quickstart-ui",permalink:"/next/quickstart-ui",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Elemental the visual way",title:""},sidebar:"docs",previous:{title:"Overview",permalink:"/next/"},next:{title:"Elemental the command line way",permalink:"/next/quickstart-cli"}},o={},c=[{value:"Enable the Rancher Manager Extensions Support",id:"enable-the-rancher-manager-extensions-support",level:2},{value:"Install the elemental plugin",id:"install-the-elemental-plugin",level:2},{value:"Install the elemental operator",id:"install-the-elemental-operator",level:2},{value:"Add a Machine Registration Endpoint",id:"add-a-machine-registration-endpoint",level:2},{value:"Preparing the installation (seed) image",id:"preparing-the-installation-seed-image",level:2},{value:"Machine Inventory",id:"machine-inventory",level:2},{value:"Create your first Elemental Cluster",id:"create-your-first-elemental-cluster",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components},{Head:a}=n;return a||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(a,{children:(0,i.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/quickstart-ui"})}),"\n","\n","\n",(0,i.jsx)(n.h1,{id:"elemental-the-visual-way",children:"Elemental the visual way"}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"The following instructions need Rancher 2.8.x at least."})}),"\n",(0,i.jsx)(n.p,{children:"This quickstart will show you how to deploy the Elemental plugin and operator into an existing Rancher Manager instance."}),"\n",(0,i.jsx)(n.p,{children:"Once installed, you'll be able to provision a new Elemental cluster based on RKE2 or K3s."}),"\n",(0,i.jsxs)(n.p,{children:["However, if you want to install staging or dev operator, you can only do it in ",(0,i.jsx)(n.a,{href:"http://elemental.docs.rancher.com/next/quickstart-cli#non-stable-installations",children:"CLI mode"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"enable-the-rancher-manager-extensions-support",children:"Enable the Rancher Manager Extensions Support"}),"\n",(0,i.jsx)(n.p,{children:"In order to enable the Rancher Manager Extensions Support, you'll need to follow the steps below:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Open a web browser, connect and login to your Rancher Manager instance"}),"\n",(0,i.jsxs)(n.li,{children:["Click on the top left menu and click on ",(0,i.jsx)(n.code,{children:"Extensions"})]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Rancher Manager menu",src:t(2631).Z+"",width:"2206",height:"1298"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Click on ",(0,i.jsx)(n.code,{children:"Enable"})," button to install the ",(0,i.jsx)(n.code,{children:"Extension Operator"})]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Enable Rancher Manager Extensions Operator",src:t(4030).Z+"",width:"1107",height:"420"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["A popup will appear, click on the ",(0,i.jsx)(n.code,{children:"OK"})," button to continue and install the Rancher Manager Extensions repository"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Add Rancher Manager Extensions repository",src:t(5256).Z+"",width:"1790",height:"1254"})}),"\n",(0,i.jsx)(n.h2,{id:"install-the-elemental-plugin",children:"Install the elemental plugin"}),"\n",(0,i.jsxs)(n.p,{children:["After the Rancher Manager Extensions Support is enabled, you can install the ",(0,i.jsx)(n.code,{children:"elemental"})," plugin as follow:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Under the ",(0,i.jsx)(n.code,{children:"Available"})," tab you will see ",(0,i.jsx)(n.code,{children:"elemental"})," plugin available"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Rancher Manager Available plugins",src:t(401).Z+"",width:"1854",height:"624"})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["If the ",(0,i.jsx)(n.code,{children:"Available"})," tab shows no entries, refresh the page. The ",(0,i.jsx)(n.code,{children:"elemental"})," plugin will then appear."]})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Click on the ",(0,i.jsx)(n.code,{children:"Install"})," button, a popup will appear and click on ",(0,i.jsx)(n.code,{children:"Install"})," again to continue."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Elemental plugin install",src:t(3733).Z+"",width:"2040",height:"1364"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["On the ",(0,i.jsx)(n.code,{children:"Installed"})," tab, the ",(0,i.jsx)(n.code,{children:"elemental"})," plugin is now listed."]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["If the ",(0,i.jsx)(n.code,{children:"elemental"})," plugin is listed and the status stays at ",(0,i.jsx)(n.code,{children:"Installing..."}),", refresh the page. The ",(0,i.jsx)(n.code,{children:"elemental"})," plugin will display correctly."]})}),"\n",(0,i.jsxs)(n.p,{children:["Once the ",(0,i.jsx)(n.code,{children:"elemental"})," plugin installed, you can see the ",(0,i.jsx)(n.code,{children:"OS Management"})," option in the Rancher Manager menu, refresh the page if you do not see it."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Rancher Manager OS Management menu",src:t(7432).Z+"",width:"2790",height:"1228"})}),"\n",(0,i.jsx)(n.h2,{id:"install-the-elemental-operator",children:"Install the elemental operator"}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"The following guide will show you how to install the operator through the Elemental UI. But you can also install it directly from the Marketplace."})}),"\n",(0,i.jsx)(n.p,{children:"Click on the OS Management button in the navigation menu."}),"\n",(0,i.jsxs)(n.p,{children:["If the operator is not already installed, the elemental ui will let you deploy it by clicking on the ",(0,i.jsx)(n.code,{children:"Install Elemental Operator"})," button:\n",(0,i.jsx)(n.img,{alt:"Button to deploy elemental operator",src:t(8367).Z+"",width:"2194",height:"932"})]}),"\n",(0,i.jsx)(n.p,{children:"It will redirect you to the Rancher Marketplace to install the operator."}),"\n",(0,i.jsxs)(n.p,{children:["Click on the ",(0,i.jsx)(n.code,{children:"Next"})," button:\n",(0,i.jsx)(n.img,{alt:"Install Elemental operator screenshot 1",src:t(3902).Z+"",width:"2326",height:"986"})]}),"\n",(0,i.jsxs)(n.p,{children:["In this screen, you can customize or use the default values, click on ",(0,i.jsx)(n.code,{children:"Install"})," to continue:\n",(0,i.jsx)(n.img,{alt:"Install Elemental operator screenshot 2",src:t(7925).Z+"",width:"2326",height:"1214"})]}),"\n",(0,i.jsxs)(n.p,{children:["You should see ",(0,i.jsx)(n.code,{children:"elemental-operator-crds"}),"and ",(0,i.jsx)(n.code,{children:"elemental-operator"})," deployed in the ",(0,i.jsx)(n.code,{children:"cattle-elemental-system"})," namespace:\n",(0,i.jsx)(n.img,{alt:"Install Elemental operator screenshot 3",src:t(3852).Z+"",width:"2326",height:"1214"})]}),"\n",(0,i.jsx)(n.admonition,{type:"warning",children:(0,i.jsx)(n.p,{children:"If you do not see them, make sure to select the correct namespace at the top of the page."})}),"\n",(0,i.jsx)(n.h2,{id:"add-a-machine-registration-endpoint",children:"Add a Machine Registration Endpoint"}),"\n",(0,i.jsxs)(n.p,{children:["In the OS Management dashboard, click the ",(0,i.jsx)(n.code,{children:"Create Registration Endpoint"})," button."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"OS Management registration endpoints",src:t(700).Z+"",width:"1516",height:"608"})}),"\n",(0,i.jsx)(n.p,{children:"Now here either you can enter each detail in its respective places or you can edit this as YAML and create the endpoint in one go. Here we'll edit every fields."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Create a Registration Endpoint with UI",src:t(5262).Z+"",width:"2096",height:"2964"})}),"\n",(0,i.jsxs)(n.admonition,{title:"main options",type:"info",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"name: elemental-cluster1"}),": change this as per your need"]}),(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"device: /dev/sda"}),': make sure your target device is "sda". Otherwise find out how the disk device is named and change it here. For example, in Raspberry Pi it could be "mmblk"']}),(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"emulate-tpm: true"}),": use this only if your target device doesn't have a TPM device and you have a way of emulating TPM like in VMware or KVM"]}),(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"emulated-tpm-seed: 1"}),": increase this by 1 for every new machine. If this value is not set, each machine will receive the same TPM hash and it won't show up under the machine inventory."]})]}),"\n",(0,i.jsx)(n.admonition,{title:"attention",type:"danger",children:(0,i.jsxs)(n.p,{children:["Emulated TPM is only for non-production usage like for testing as it beats the purpose of security. So in production usage use the code above without the ",(0,i.jsx)(n.code,{children:"emulate-tpm"})," and ",(0,i.jsx)(n.code,{children:"emulate-tpm-seed"})]})}),"\n",(0,i.jsx)(n.p,{children:"Once you create the machine registration end point it should show up as active."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Machine registered in Registration Endpoints",src:t(7666).Z+"",width:"1428",height:"738"})}),"\n",(0,i.jsx)(n.h2,{id:"preparing-the-installation-seed-image",children:"Preparing the installation (seed) image"}),"\n",(0,i.jsx)(n.p,{children:"Now this is the last step, you need to prepare an Elemental Teal seed image that includes the initial registration config, so\nit can be auto registered, installed and fully deployed as part of your cluster. The contents of the file are nothing\nmore than the registration URL that the node needs to register and the proper server certificate, so it can connect securely."}),"\n",(0,i.jsx)(n.p,{children:"This seed image can then be used to provision an infinite number of machines."}),"\n",(0,i.jsxs)(n.p,{children:["The seed image is created as a Kubernetes resource above and can be built using the ",(0,i.jsx)(n.code,{children:"Build ISO"})," button:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Build ISO in Registration Endpoints",src:t(4080).Z+"",width:"2316",height:"858"})}),"\n",(0,i.jsxs)(n.p,{children:["Once the build is done, ISO can be downloaded using the ",(0,i.jsx)(n.code,{children:"Download ISO"})," button:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Download ISO in Registration Endpoints",src:t(6950).Z+"",width:"2316",height:"858"})}),"\n",(0,i.jsx)(n.p,{children:"You can now boot your nodes with this image and they will:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Register with the registrationURL given and create a per-machine ",(0,i.jsx)(n.code,{children:"MachineInventory"})]}),"\n",(0,i.jsx)(n.li,{children:"Install Elemental Teal to the given device"}),"\n",(0,i.jsx)(n.li,{children:"Reboot"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"machine-inventory",children:"Machine Inventory"}),"\n",(0,i.jsxs)(n.p,{children:["When nodes are booting up for the first time, they connect to Rancher Manager and a ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/architecture#machineinventory",children:(0,i.jsx)(n.code,{children:"Machine Inventory"})})," is created for each node."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Machine Inventory menu",src:t(3349).Z+"",width:"2858",height:"924"})}),"\n",(0,i.jsxs)(n.p,{children:["Custom columns are based on ",(0,i.jsx)(n.code,{children:"Machine Inventory Labels"})," which you can add when you create your ",(0,i.jsx)(n.code,{children:"Machine Registration Endpoint"}),":"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Machine Registration Endpoint Hardware Labels",src:t(4736).Z+"",width:"2858",height:"2848"})}),"\n",(0,i.jsxs)(n.p,{children:["On the following screenshot, ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/hardwarelabels/#hardware-labels",children:(0,i.jsx)(n.code,{children:"Hardware Labels"})})," are used as custom columns:"]}),"\n",(0,i.jsx)(n.p,{children:"You can also add custom columns by clicking on the three dots menu."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Machine Inventory custom columns",src:t(9313).Z+"",width:"2812",height:"1080"})}),"\n",(0,i.jsxs)(n.p,{children:["Finally, you can also filter your ",(0,i.jsx)(n.code,{children:"Machine Inventory"})," using those labels."]}),"\n",(0,i.jsxs)(n.p,{children:["For instance if you only want to see your AMD machines, you can filter on ",(0,i.jsx)(n.code,{children:"CPUModel"})," like below:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Machine Inventory filtering",src:t(2679).Z+"",width:"2812",height:"952"})}),"\n",(0,i.jsx)(n.h2,{id:"create-your-first-elemental-cluster",children:"Create your first Elemental Cluster"}),"\n",(0,i.jsxs)(n.p,{children:["Now let's use those ",(0,i.jsx)(n.code,{children:"Machine Inventory"})," to create a cluster by clicking on ",(0,i.jsx)(n.code,{children:"Create Elemental Cluster"})," :"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Create Elemental Cluster button",src:t(5343).Z+"",width:"3402",height:"1374"})}),"\n",(0,i.jsx)(n.p,{children:"For your Elemental cluster, you can either choose K3s or RKE2 for Kubernetes."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Elemental Cluster Creation Screen",src:t(6905).Z+"",width:"3270",height:"2698"})}),"\n",(0,i.jsxs)(n.p,{children:["Most of the options are coming from Rancher, that's why we will not detail all the possibilities.\nFeel free to check the ",(0,i.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/pages-for-subheaders/rancher-server-configuration",children:"Rancher Manager documentation"})," if you want to know more."]}),"\n",(0,i.jsxs)(n.p,{children:["However, it is important to highlight the ",(0,i.jsx)(n.code,{children:"Inventory of Machines Selector Template"})," section."]}),"\n",(0,i.jsxs)(n.p,{children:["It lets you choose which ",(0,i.jsx)(n.code,{children:"Machine Inventory"})," you want to use to create your Elemental cluster using the previously defined ",(0,i.jsx)(n.code,{children:"Machine Inventory Labels"})," :"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Use Machine Inventory Selector Template",src:t(6683).Z+"",width:"1359",height:"547"})}),"\n",(0,i.jsxs)(n.p,{children:["As our three Machine Inventories contain the label ",(0,i.jsx)(n.code,{children:"CPUVendor"})," with the key ",(0,i.jsx)(n.code,{children:"AuthenticAMD"}),", the three machines will be used to create the Elemental cluster."]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},5343:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-create-cluster-button-9dce4aea82dba2f2cddfa61e55990abf.png"},6683:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-create-cluster-machine-selector-template-a114d9eb08cb6423423a79c94900afd1.png"},6905:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-create-cluster-standard-screen--b4d5776817a8e33b829a331c54a2bc0f.png"},3733:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-elemental-plugin-install-ae50450195b775629fc115ebc15ff71c.png"},7432:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-elemental-plugin-menu-de00267de23c6c23f57c86c433c1a4b1.png"},4030:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-extension-enable-86662009426b5220cab5c9f72a71ea4b.png"},8367:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-extension-operator-button-98e94400280a95b4a9c3c95a5265b46b.png"},3902:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-extension-operator-install-1-7f304ff533f2c6a56bf7ee237be25785.png"},7925:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-extension-operator-install-2-8534d83dc6a3c2012c38ea37dcd62465.png"},3852:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-extension-operator-install-3-acf0971bd9406407a7e311d1cfa27bc4.png"},5256:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-extension-repository-49117208197294088a4ae90f47a6b164.png"},401:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-extensions-available-8ea4add6f2ee3b91cb8dffa69448fba6.png"},9313:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-machine-inventory-custom-columns-1ee92dd817182439e979126b947499cf.png"},2679:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-machine-inventory-filtering-b5693898b66e6771aa10d38bf75dc24c.png"},3349:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-machine-inventory-menu-42c7f3af783616ff18d2d4c76636b60f.png"},2631:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-menu-00ae3e2cb0dca507e5fb9b0753087ee2.png"},4080:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-build-ISO-f8f10423606ddf4a1ca1e677be69316c.png"},7666:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-complete-2e9c6ad1ad36b63e77b99236e12c440e.png"},5262:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-create-details-0ea1a4baf150d758fcb059b3a3ef6d31.png"},700:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-create-5c6bba22feee56e9750693135f84fb86.png"},6950:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-download-ISO-804d30921eedaf172794e756e6c47d9f.png"},4736:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-hardware-labels-54233251b432f017a2e147f8d0b1dead.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>l});var i=t(7294);const s={},a=i.createContext(s);function l(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d0681c17.30b8173a.js b/assets/js/d0681c17.30b8173a.js deleted file mode 100644 index 559f7da11..000000000 --- a/assets/js/d0681c17.30b8173a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4859],{2113:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});var i=t(5893),s=t(1151);const a={sidebar_label:"Elemental the visual way",title:""},l="Elemental the visual way",r={id:"quickstart-ui",title:"",description:"The following instructions need Rancher 2.8.x at least.",source:"@site/docs/quickstart-ui.md",sourceDirName:".",slug:"/quickstart-ui",permalink:"/next/quickstart-ui",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Elemental the visual way",title:""},sidebar:"docs",previous:{title:"Overview",permalink:"/next/"},next:{title:"Elemental the command line way",permalink:"/next/quickstart-cli"}},o={},c=[{value:"Enable the Rancher Manager Extensions Support",id:"enable-the-rancher-manager-extensions-support",level:2},{value:"Install the elemental plugin",id:"install-the-elemental-plugin",level:2},{value:"Install the elemental operator",id:"install-the-elemental-operator",level:2},{value:"Add a Machine Registration Endpoint",id:"add-a-machine-registration-endpoint",level:2},{value:"Preparing the installation (seed) image",id:"preparing-the-installation-seed-image",level:2},{value:"Machine Inventory",id:"machine-inventory",level:2},{value:"Create your first Elemental Cluster",id:"create-your-first-elemental-cluster",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"elemental-the-visual-way",children:"Elemental the visual way"}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"The following instructions need Rancher 2.8.x at least."})}),"\n",(0,i.jsx)(n.p,{children:"This quickstart will show you how to deploy the Elemental plugin and operator into an existing Rancher Manager instance."}),"\n",(0,i.jsx)(n.p,{children:"Once installed, you'll be able to provision a new Elemental cluster based on RKE2 or K3s."}),"\n",(0,i.jsxs)(n.p,{children:["However, if you want to install staging or dev operator, you can only do it in ",(0,i.jsx)(n.a,{href:"http://elemental.docs.rancher.com/next/quickstart-cli#non-stable-installations",children:"CLI mode"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"enable-the-rancher-manager-extensions-support",children:"Enable the Rancher Manager Extensions Support"}),"\n",(0,i.jsx)(n.p,{children:"In order to enable the Rancher Manager Extensions Support, you'll need to follow the steps below:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Open a web browser, connect and login to your Rancher Manager instance"}),"\n",(0,i.jsxs)(n.li,{children:["Click on the top left menu and click on ",(0,i.jsx)(n.code,{children:"Extensions"})]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Rancher Manager menu",src:t(2631).Z+"",width:"2206",height:"1298"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Click on ",(0,i.jsx)(n.code,{children:"Enable"})," button to install the ",(0,i.jsx)(n.code,{children:"Extension Operator"})]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Enable Rancher Manager Extensions Operator",src:t(4030).Z+"",width:"1107",height:"420"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["A popup will appear, click on the ",(0,i.jsx)(n.code,{children:"OK"})," button to continue and install the Rancher Manager Extensions repository"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Add Rancher Manager Extensions repository",src:t(5256).Z+"",width:"1790",height:"1254"})}),"\n",(0,i.jsx)(n.h2,{id:"install-the-elemental-plugin",children:"Install the elemental plugin"}),"\n",(0,i.jsxs)(n.p,{children:["After the Rancher Manager Extensions Support is enabled, you can install the ",(0,i.jsx)(n.code,{children:"elemental"})," plugin as follow:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Under the ",(0,i.jsx)(n.code,{children:"Available"})," tab you will see ",(0,i.jsx)(n.code,{children:"elemental"})," plugin available"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Rancher Manager Available plugins",src:t(401).Z+"",width:"1854",height:"624"})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["If the ",(0,i.jsx)(n.code,{children:"Available"})," tab shows no entries, refresh the page. The ",(0,i.jsx)(n.code,{children:"elemental"})," plugin will then appear."]})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Click on the ",(0,i.jsx)(n.code,{children:"Install"})," button, a popup will appear and click on ",(0,i.jsx)(n.code,{children:"Install"})," again to continue."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Elemental plugin install",src:t(3733).Z+"",width:"2040",height:"1364"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["On the ",(0,i.jsx)(n.code,{children:"Installed"})," tab, the ",(0,i.jsx)(n.code,{children:"elemental"})," plugin is now listed."]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["If the ",(0,i.jsx)(n.code,{children:"elemental"})," plugin is listed and the status stays at ",(0,i.jsx)(n.code,{children:"Installing..."}),", refresh the page. The ",(0,i.jsx)(n.code,{children:"elemental"})," plugin will display correctly."]})}),"\n",(0,i.jsxs)(n.p,{children:["Once the ",(0,i.jsx)(n.code,{children:"elemental"})," plugin installed, you can see the ",(0,i.jsx)(n.code,{children:"OS Management"})," option in the Rancher Manager menu, refresh the page if you do not see it."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Rancher Manager OS Management menu",src:t(7432).Z+"",width:"2790",height:"1228"})}),"\n",(0,i.jsx)(n.h2,{id:"install-the-elemental-operator",children:"Install the elemental operator"}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"The following guide will show you how to install the operator through the Elemental UI. But you can also install it directly from the Marketplace."})}),"\n",(0,i.jsx)(n.p,{children:"Click on the OS Management button in the navigation menu."}),"\n",(0,i.jsxs)(n.p,{children:["If the operator is not already installed, the elemental ui will let you deploy it by clicking on the ",(0,i.jsx)(n.code,{children:"Install Elemental Operator"})," button:\n",(0,i.jsx)(n.img,{alt:"Button to deploy elemental operator",src:t(8367).Z+"",width:"2194",height:"932"})]}),"\n",(0,i.jsx)(n.p,{children:"It will redirect you to the Rancher Marketplace to install the operator."}),"\n",(0,i.jsxs)(n.p,{children:["Click on the ",(0,i.jsx)(n.code,{children:"Next"})," button:\n",(0,i.jsx)(n.img,{alt:"Install Elemental operator screenshot 1",src:t(3902).Z+"",width:"2326",height:"986"})]}),"\n",(0,i.jsxs)(n.p,{children:["In this screen, you can customize or use the default values, click on ",(0,i.jsx)(n.code,{children:"Install"})," to continue:\n",(0,i.jsx)(n.img,{alt:"Install Elemental operator screenshot 2",src:t(7925).Z+"",width:"2326",height:"1214"})]}),"\n",(0,i.jsxs)(n.p,{children:["You should see ",(0,i.jsx)(n.code,{children:"elemental-operator-crds"}),"and ",(0,i.jsx)(n.code,{children:"elemental-operator"})," deployed in the ",(0,i.jsx)(n.code,{children:"cattle-elemental-system"})," namespace:\n",(0,i.jsx)(n.img,{alt:"Install Elemental operator screenshot 3",src:t(3852).Z+"",width:"2326",height:"1214"})]}),"\n",(0,i.jsx)(n.admonition,{type:"warning",children:(0,i.jsx)(n.p,{children:"If you do not see them, make sure to select the correct namespace at the top of the page."})}),"\n",(0,i.jsx)(n.h2,{id:"add-a-machine-registration-endpoint",children:"Add a Machine Registration Endpoint"}),"\n",(0,i.jsxs)(n.p,{children:["In the OS Management dashboard, click the ",(0,i.jsx)(n.code,{children:"Create Registration Endpoint"})," button."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"OS Management registration endpoints",src:t(700).Z+"",width:"1516",height:"608"})}),"\n",(0,i.jsx)(n.p,{children:"Now here either you can enter each detail in its respective places or you can edit this as YAML and create the endpoint in one go. Here we'll edit every fields."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Create a Registration Endpoint with UI",src:t(5262).Z+"",width:"2096",height:"2964"})}),"\n",(0,i.jsxs)(n.admonition,{title:"main options",type:"info",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"name: elemental-cluster1"}),": change this as per your need"]}),(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"device: /dev/sda"}),': make sure your target device is "sda". Otherwise find out how the disk device is named and change it here. For example, in Raspberry Pi it could be "mmblk"']}),(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"emulate-tpm: true"}),": use this only if your target device doesn't have a TPM device and you have a way of emulating TPM like in VMware or KVM"]}),(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"emulated-tpm-seed: 1"}),": increase this by 1 for every new machine. If this value is not set, each machine will receive the same TPM hash and it won't show up under the machine inventory."]})]}),"\n",(0,i.jsx)(n.admonition,{title:"attention",type:"danger",children:(0,i.jsxs)(n.p,{children:["Emulated TPM is only for non-production usage like for testing as it beats the purpose of security. So in production usage use the code above without the ",(0,i.jsx)(n.code,{children:"emulate-tpm"})," and ",(0,i.jsx)(n.code,{children:"emulate-tpm-seed"})]})}),"\n",(0,i.jsx)(n.p,{children:"Once you create the machine registration end point it should show up as active."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Machine registered in Registration Endpoints",src:t(7666).Z+"",width:"1428",height:"738"})}),"\n",(0,i.jsx)(n.h2,{id:"preparing-the-installation-seed-image",children:"Preparing the installation (seed) image"}),"\n",(0,i.jsx)(n.p,{children:"Now this is the last step, you need to prepare an Elemental Teal seed image that includes the initial registration config, so\nit can be auto registered, installed and fully deployed as part of your cluster. The contents of the file are nothing\nmore than the registration URL that the node needs to register and the proper server certificate, so it can connect securely."}),"\n",(0,i.jsx)(n.p,{children:"This seed image can then be used to provision an infinite number of machines."}),"\n",(0,i.jsxs)(n.p,{children:["The seed image is created as a Kubernetes resource above and can be built using the ",(0,i.jsx)(n.code,{children:"Build ISO"})," button:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Build ISO in Registration Endpoints",src:t(4080).Z+"",width:"2316",height:"858"})}),"\n",(0,i.jsxs)(n.p,{children:["Once the build is done, ISO can be downloaded using the ",(0,i.jsx)(n.code,{children:"Download ISO"})," button:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Download ISO in Registration Endpoints",src:t(6950).Z+"",width:"2316",height:"858"})}),"\n",(0,i.jsx)(n.p,{children:"You can now boot your nodes with this image and they will:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Register with the registrationURL given and create a per-machine ",(0,i.jsx)(n.code,{children:"MachineInventory"})]}),"\n",(0,i.jsx)(n.li,{children:"Install Elemental Teal to the given device"}),"\n",(0,i.jsx)(n.li,{children:"Reboot"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"machine-inventory",children:"Machine Inventory"}),"\n",(0,i.jsxs)(n.p,{children:["When nodes are booting up for the first time, they connect to Rancher Manager and a ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/architecture#machineinventory",children:(0,i.jsx)(n.code,{children:"Machine Inventory"})})," is created for each node."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Machine Inventory menu",src:t(3349).Z+"",width:"2858",height:"924"})}),"\n",(0,i.jsxs)(n.p,{children:["Custom columns are based on ",(0,i.jsx)(n.code,{children:"Machine Inventory Labels"})," which you can add when you create your ",(0,i.jsx)(n.code,{children:"Machine Registration Endpoint"}),":"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Machine Registration Endpoint Hardware Labels",src:t(4736).Z+"",width:"2858",height:"2848"})}),"\n",(0,i.jsxs)(n.p,{children:["On the following screenshot, ",(0,i.jsx)(n.a,{href:"https://elemental.docs.rancher.com/hardwarelabels/#hardware-labels",children:(0,i.jsx)(n.code,{children:"Hardware Labels"})})," are used as custom columns:"]}),"\n",(0,i.jsx)(n.p,{children:"You can also add custom columns by clicking on the three dots menu."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Machine Inventory custom columns",src:t(9313).Z+"",width:"2812",height:"1080"})}),"\n",(0,i.jsxs)(n.p,{children:["Finally, you can also filter your ",(0,i.jsx)(n.code,{children:"Machine Inventory"})," using those labels."]}),"\n",(0,i.jsxs)(n.p,{children:["For instance if you only want to see your AMD machines, you can filter on ",(0,i.jsx)(n.code,{children:"CPUModel"})," like below:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Machine Inventory filtering",src:t(2679).Z+"",width:"2812",height:"952"})}),"\n",(0,i.jsx)(n.h2,{id:"create-your-first-elemental-cluster",children:"Create your first Elemental Cluster"}),"\n",(0,i.jsxs)(n.p,{children:["Now let's use those ",(0,i.jsx)(n.code,{children:"Machine Inventory"})," to create a cluster by clicking on ",(0,i.jsx)(n.code,{children:"Create Elemental Cluster"})," :"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Create Elemental Cluster button",src:t(5343).Z+"",width:"3402",height:"1374"})}),"\n",(0,i.jsx)(n.p,{children:"For your Elemental cluster, you can either choose K3s or RKE2 for Kubernetes."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Elemental Cluster Creation Screen",src:t(6905).Z+"",width:"3270",height:"2698"})}),"\n",(0,i.jsxs)(n.p,{children:["Most of the options are coming from Rancher, that's why we will not detail all the possibilities.\nFeel free to check the ",(0,i.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/pages-for-subheaders/rancher-server-configuration",children:"Rancher Manager documentation"})," if you want to know more."]}),"\n",(0,i.jsxs)(n.p,{children:["However, it is important to highlight the ",(0,i.jsx)(n.code,{children:"Inventory of Machines Selector Template"})," section."]}),"\n",(0,i.jsxs)(n.p,{children:["It lets you choose which ",(0,i.jsx)(n.code,{children:"Machine Inventory"})," you want to use to create your Elemental cluster using the previously defined ",(0,i.jsx)(n.code,{children:"Machine Inventory Labels"})," :"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Use Machine Inventory Selector Template",src:t(6683).Z+"",width:"1359",height:"547"})}),"\n",(0,i.jsxs)(n.p,{children:["As our three Machine Inventories contain the label ",(0,i.jsx)(n.code,{children:"CPUVendor"})," with the key ",(0,i.jsx)(n.code,{children:"AuthenticAMD"}),", the three machines will be used to create the Elemental cluster."]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},5343:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-create-cluster-button-9dce4aea82dba2f2cddfa61e55990abf.png"},6683:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-create-cluster-machine-selector-template-a114d9eb08cb6423423a79c94900afd1.png"},6905:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-create-cluster-standard-screen--b4d5776817a8e33b829a331c54a2bc0f.png"},3733:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-elemental-plugin-install-ae50450195b775629fc115ebc15ff71c.png"},7432:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-elemental-plugin-menu-de00267de23c6c23f57c86c433c1a4b1.png"},4030:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-extension-enable-86662009426b5220cab5c9f72a71ea4b.png"},8367:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-extension-operator-button-98e94400280a95b4a9c3c95a5265b46b.png"},3902:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-extension-operator-install-1-7f304ff533f2c6a56bf7ee237be25785.png"},7925:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-extension-operator-install-2-8534d83dc6a3c2012c38ea37dcd62465.png"},3852:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-extension-operator-install-3-acf0971bd9406407a7e311d1cfa27bc4.png"},5256:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-extension-repository-49117208197294088a4ae90f47a6b164.png"},401:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-extensions-available-8ea4add6f2ee3b91cb8dffa69448fba6.png"},9313:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-machine-inventory-custom-columns-1ee92dd817182439e979126b947499cf.png"},2679:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-machine-inventory-filtering-b5693898b66e6771aa10d38bf75dc24c.png"},3349:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-machine-inventory-menu-42c7f3af783616ff18d2d4c76636b60f.png"},2631:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-menu-00ae3e2cb0dca507e5fb9b0753087ee2.png"},4080:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-build-ISO-f8f10423606ddf4a1ca1e677be69316c.png"},7666:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-complete-2e9c6ad1ad36b63e77b99236e12c440e.png"},5262:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-create-details-0ea1a4baf150d758fcb059b3a3ef6d31.png"},700:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-create-5c6bba22feee56e9750693135f84fb86.png"},6950:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-download-ISO-804d30921eedaf172794e756e6c47d9f.png"},4736:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/quickstart-ui-registration-endpoint-hardware-labels-54233251b432f017a2e147f8d0b1dead.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>l});var i=t(7294);const s={},a=i.createContext(s);function l(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d49b78bc.b9ef8d5a.js b/assets/js/d49b78bc.b9ef8d5a.js new file mode 100644 index 000000000..2b4375d1d --- /dev/null +++ b/assets/js/d49b78bc.b9ef8d5a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[2936],{1704:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>d,toc:()=>c});var i=t(5893),s=t(1151);const r={sidebar_label:"MachineRegistration reference",title:""},l="MachineRegistration reference",d={id:"machineregistration-reference",title:"",description:"The MachineRegistration resource is the responsible of defining a machine registration end point. Once created it generates a registration URL used by nodes to register so they are inventoried.",source:"@site/docs/machineregistration-reference.md",sourceDirName:".",slug:"/machineregistration-reference",permalink:"/next/machineregistration-reference",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"MachineRegistration reference",title:""},sidebar:"docs",previous:{title:"Cloud-config reference",permalink:"/next/cloud-config-reference"},next:{title:"MachineInventorySelectorTemplate reference",permalink:"/next/machineinventoryselectortemplate-reference"}},a={},c=[{value:"config.cloud-config",id:"configcloud-config",level:4},{value:"config.elemental.registration",id:"configelementalregistration",level:4},{value:"config.elemental.install",id:"configelementalinstall",level:4},{value:"config.elemental.install.device-selector",id:"configelementalinstalldevice-selector",level:4},{value:"config.elemental.reset",id:"configelementalreset",level:4},{value:"machineName",id:"machinename",level:4},{value:"machineInventoryLabels",id:"machineinventorylabels",level:4},{value:"machineInventoryAnnotations",id:"machineinventoryannotations",level:4}];function o(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",h1:"h1",h4:"h4",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components},{Details:t,Head:r,Vars:l}=n;return t||x("Details",!0),r||x("Head",!0),l||x("Vars",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(r,{children:(0,i.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/machineregistration-reference"})}),"\n",(0,i.jsx)(n.h1,{id:"machineregistration-reference",children:"MachineRegistration reference"}),"\n",(0,i.jsx)(n.p,{children:"The MachineRegistration resource is the responsible of defining a machine registration end point. Once created it generates a registration URL used by nodes to register so they are inventoried."}),"\n",(0,i.jsxs)(n.p,{children:["There are several keys that can be configured under a ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," resource spec."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="MachineRegistration" showLineNumbers',children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineName: name\n machineInventoryLabels:\n label: value\n machineInventoryAnnotations:\n annotation: value\n config:\n cloud-config:\n ...\n elemental:\n registration:\n ...\n install:\n ... \n"})}),"\n",(0,i.jsx)(n.h4,{id:"configcloud-config",children:"config.cloud-config"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the cloud-configuration to be injected in the node. See the ",(0,i.jsx)(n.a,{href:"/next/cloud-config-reference",children:"Cloud Config Reference"})," for full information."]}),"\n",(0,i.jsx)(n.h4,{id:"configelementalregistration",children:"config.elemental.registration"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the configuration used for the connection and the initial registration to the ",(0,i.jsx)(l,{name:"elemental_operator_name"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Supports the following values:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"url"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsxs)(n.td,{children:["URL to connect to the ",(0,i.jsx)(l,{name:"elemental_operator_name"})]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"ca-cert"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"CA to validate the certificate provided by the server at 'url' (required if the certificate is not signed by a public CA)"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"no-smbios"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsxs)(n.td,{children:["Whether SMBIOS data should be sent to the ",(0,i.jsx)(l,{name:"elemental_operator_name"})," (see the ",(0,i.jsx)(n.a,{href:"/next/smbios",children:"SMBIOS reference"})," for more information)"]})]})]})]}),"\n",(0,i.jsxs)(n.admonition,{type:"warning",children:[(0,i.jsx)(n.p,{children:"The following values are for development purposes only."}),(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"emulate-tpm"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"This will use software emulation of the TPM (required for hosts without TPM hardware)"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"emulated-tpm-seed"}),(0,i.jsx)(n.td,{children:"int64"}),(0,i.jsx)(n.td,{children:"1"}),(0,i.jsxs)(n.td,{children:["Fixed seed to use with 'emulate-tpm'. Set to -1 to get a random seed. See ",(0,i.jsx)(n.a,{href:"/next/tpm",children:"TPM"})," for more information"]})]})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"configelementalinstall",children:"config.elemental.install"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the installation configuration that would be applied via ",(0,i.jsx)(n.code,{children:"elemental-register --install"})," when booted from an ISO and passed to ",(0,i.jsx)(n.a,{href:"https://github.com/rancher/elemental-toolkit/blob/main/docs/elemental_install.md",children:(0,i.jsx)(n.code,{children:"elemental install"})})]}),"\n",(0,i.jsx)(n.p,{children:"Supports the following values:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"firmware"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"efi"}),(0,i.jsx)(n.td,{children:"Firmware to install ('efi' or 'bios')"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"device"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Device to install the system to"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"device-selector"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Rules for picking device to install the system to"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"no-format"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Don\u2019t format disks. It is implied that COS_STATE, COS_RECOVERY, COS_PERSISTENT, COS_OEM partitions are already existing on the target disk"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"config-urls"}),(0,i.jsx)(n.td,{children:"list"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Cloud-init config files locations"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"iso"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Performs an installation from the ISO url instead of the running ISO"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"system-uri"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsxs)(n.td,{children:["Sets the system image source and its type (e.g. 'docker",":registry",".org/image",":tag","') instead of using the running ISO"]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"debug"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Enable debug output"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"tty"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Add named tty to grub"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"poweroff"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Shutdown the system after install"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"reboot"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Reboot the system after install"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"eject-cd"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Try to eject the cd on reboot"})]})]})]}),"\n",(0,i.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,i.jsxs)(n.p,{children:["In case of using both ",(0,i.jsx)(n.code,{children:"iso"})," and ",(0,i.jsx)(n.code,{children:"system-uri"})," the ",(0,i.jsx)(n.code,{children:"iso"})," value takes precedence"]})}),"\n",(0,i.jsxs)(n.p,{children:["It is only required to specify either the ",(0,i.jsx)(n.code,{children:"device"})," or ",(0,i.jsx)(n.code,{children:"device-selector"})," fields for a successful install, the rest of the parameters are all optional."]}),"\n",(0,i.jsxs)(n.p,{children:["If both ",(0,i.jsx)(n.code,{children:"device"})," and ",(0,i.jsx)(n.code,{children:"device-selector"})," is specified the value of ",(0,i.jsx)(n.code,{children:"device"})," is used and ",(0,i.jsx)(n.code,{children:"device-selector"})," is ignored."]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n elemental:\n install:\n device: /dev/sda\n debug: true\n reboot: true\n eject-cd: true\n system-uri: registry.suse.com/rancher/elemental-teal/5.4:latest\n"})})]}),"\n",(0,i.jsx)(n.h4,{id:"configelementalinstalldevice-selector",children:"config.elemental.install.device-selector"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"device-selector"})," field can be used to dynamically pick device during installation. The field contains a list of rules that looks like the following:"]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example device-selector based on device name"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"device-selector:\n- key: Name\n operator: In\n values:\n - /dev/sda\n - /dev/vda\n - /dev/nvme0\n"})})]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example device-selector based on device size"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"device-selector:\n- key: Size\n operator: Lt\n values:\n - 100Gi\n- key: Size\n operator: Gt\n values:\n - 30Gi\n"})})]}),"\n",(0,i.jsx)(n.p,{children:"The currently supported operators are:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Operator"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"In"}),(0,i.jsx)(n.td,{children:"The key matches one of the provided values"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"NotIn"}),(0,i.jsx)(n.td,{children:"The key does not match any of the provided values"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Gt"}),(0,i.jsx)(n.td,{children:"The key is greater than a single provided value"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Lt"}),(0,i.jsx)(n.td,{children:"The key is lesser than a single provided value"})]})]})]}),"\n",(0,i.jsx)(n.p,{children:"The currently supported keys are:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Name"}),(0,i.jsx)(n.td,{children:"The device name (eg. /dev/sda)"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Size"}),(0,i.jsx)(n.td,{children:"The device size (values can be specified using kubernetes resources, eg 100Gi)"})]})]})]}),"\n",(0,i.jsxs)(n.p,{children:["The rules are AND",":ed"," together, which means all rules must match the targeted device."]}),"\n",(0,i.jsx)(n.h4,{id:"configelementalreset",children:"config.elemental.reset"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the reset configuration that would be applied via ",(0,i.jsx)(n.code,{children:"elemental-register --reset"}),", when booted from the recovery partition and passed to ",(0,i.jsx)(n.a,{href:"https://github.com/rancher/elemental-toolkit/blob/main/docs/elemental_reset.md",children:(0,i.jsx)(n.code,{children:"elemental reset"})})]}),"\n",(0,i.jsx)(n.p,{children:"Supports the following values:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"enabled"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"MachineInventories created from this MachineRegistration will have reset functionality enabled"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"reset-persistent"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"true"}),(0,i.jsx)(n.td,{children:"Format the COS_PERSISTENT partition"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"reset-oem"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"true"}),(0,i.jsx)(n.td,{children:"Format the COS_OEM partition"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"config-urls"}),(0,i.jsx)(n.td,{children:"list"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Cloud-init config files"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"system-uri"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsxs)(n.td,{children:["Sets the system image source and its type (e.g. 'docker",":registry",".org/image",":tag","') instead of using the running ISO"]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"debug"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Enable debug output"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"poweroff"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Shutdown the system after reset"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"reboot"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"true"}),(0,i.jsx)(n.td,{children:"Reboot the system after reset"})]})]})]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n elemental:\n reset:\n enabled: true\n debug: true\n reset-persistent: true\n reset-oem: true\n reboot: true\n system-uri: registry.opensuse.org/isv/rancher/elemental/stable/teal53/15.4/rancher/elemental-teal/5.3:latest\n"})})]}),"\n",(0,i.jsx)(n.h4,{id:"machinename",children:"machineName"}),"\n",(0,i.jsxs)(n.p,{children:["This refers to the name that will be set to the node and the kubernetes resources that require a hostname (rke2 deployed pods for example, they use the node hostname as part of the pod names)\n",(0,i.jsx)(n.code,{children:"String"})," type."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["When ",(0,i.jsx)(n.code,{children:"elemental:registration:no-smbios"})," is set to ",(0,i.jsx)(n.code,{children:"false"})," (default), machineName is interpolated with ",(0,i.jsx)(n.a,{href:"https://www.dmtf.org/standards/smbios",children:"SMBIOS"})," data which allows you to store hardware information.\nSee our ",(0,i.jsx)(n.a,{href:"/next/smbios",children:"SMBIOS docs"})," for more information.\nIf no ",(0,i.jsx)(n.code,{children:"machineName"})," is specified, a default one in the form ",(0,i.jsx)(n.code,{children:"m-$UUID"})," will be set.\nThe UUID will be retrieved from the SMBIOS data if available, otherwise a random UUID will be generated."]})}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineName: hostname-test-4\n"})})]}),"\n",(0,i.jsx)(n.h4,{id:"machineinventorylabels",children:"machineInventoryLabels"}),"\n",(0,i.jsxs)(n.p,{children:["Labels that will be set to the ",(0,i.jsx)(n.code,{children:"MachineInventory"})," that is created from this ",(0,i.jsx)(n.code,{children:"MachineRegistration"}),"\n",(0,i.jsx)(n.code,{children:"Key: value"})," type. These labels will be used to establish a selection criteria in ",(0,i.jsx)(n.a,{href:"/next/machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Elemental Teal nodes will run ",(0,i.jsx)(n.code,{children:"elemental-register"})," every 24 hours.",(0,i.jsx)(n.br,{}),"\n","It is possible to update the ",(0,i.jsx)(n.code,{children:"machineInventoryLabels"})," so that all registered nodes will apply the new labels on the next successfull registration update."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["When ",(0,i.jsx)(n.code,{children:"elemental:registration:no-smbios"})," is set to ",(0,i.jsx)(n.code,{children:"false"})," (default), Labels are interpolated with ",(0,i.jsx)(n.a,{href:"https://www.dmtf.org/standards/smbios",children:"SMBIOS"})," data. This allows to store hardware information in custom labels.\nSee our ",(0,i.jsx)(n.a,{href:"/next/smbios",children:"SMBIOS docs"})," for more information."]})}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineInventoryLabels:\n my.prefix.io/element: fire\n my.prefix.io/cpus: 32\n my.prefix.io/manufacturer: "${System Information/Manufacturer}"\n my.prefix.io/productName: "${System Information/Product Name}"\n my.prefix.io/serialNumber: "${System Information/Serial Number}"\n my.prefix.io/machineUUID: "${System Information/UUID}"\n'})})]}),"\n",(0,i.jsx)(n.h4,{id:"machineinventoryannotations",children:"machineInventoryAnnotations"}),"\n",(0,i.jsxs)(n.p,{children:["Annotations that will be set to the ",(0,i.jsx)(n.code,{children:"MachineInventory"})," that is created from this ",(0,i.jsx)(n.code,{children:"MachineRegistration"}),"\n",(0,i.jsx)(n.code,{children:"Key: value"})," type"]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineInventoryAnnotations:\n owner: bob\n version: 1.0.0\n"})})]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}function x(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,n,t)=>{t.d(n,{Z:()=>d,a:()=>l});var i=t(7294);const s={},r=i.createContext(s);function l(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d49b78bc.c73752a2.js b/assets/js/d49b78bc.c73752a2.js deleted file mode 100644 index 417bcba54..000000000 --- a/assets/js/d49b78bc.c73752a2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[2936],{1704:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>d,toc:()=>c});var i=t(5893),s=t(1151);const r={sidebar_label:"MachineRegistration reference",title:""},l="MachineRegistration reference",d={id:"machineregistration-reference",title:"",description:"The MachineRegistration resource is the responsible of defining a machine registration end point. Once created it generates a registration URL used by nodes to register so they are inventoried.",source:"@site/docs/machineregistration-reference.md",sourceDirName:".",slug:"/machineregistration-reference",permalink:"/next/machineregistration-reference",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"MachineRegistration reference",title:""},sidebar:"docs",previous:{title:"Cloud-config reference",permalink:"/next/cloud-config-reference"},next:{title:"MachineInventorySelectorTemplate reference",permalink:"/next/machineinventoryselectortemplate-reference"}},a={},c=[{value:"config.cloud-config",id:"configcloud-config",level:4},{value:"config.elemental.registration",id:"configelementalregistration",level:4},{value:"config.elemental.install",id:"configelementalinstall",level:4},{value:"config.elemental.install.device-selector",id:"configelementalinstalldevice-selector",level:4},{value:"config.elemental.reset",id:"configelementalreset",level:4},{value:"machineName",id:"machinename",level:4},{value:"machineInventoryLabels",id:"machineinventorylabels",level:4},{value:"machineInventoryAnnotations",id:"machineinventoryannotations",level:4}];function o(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",h1:"h1",h4:"h4",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components},{Details:t,Vars:r}=n;return t||x("Details",!0),r||x("Vars",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"machineregistration-reference",children:"MachineRegistration reference"}),"\n",(0,i.jsx)(n.p,{children:"The MachineRegistration resource is the responsible of defining a machine registration end point. Once created it generates a registration URL used by nodes to register so they are inventoried."}),"\n",(0,i.jsxs)(n.p,{children:["There are several keys that can be configured under a ",(0,i.jsx)(n.code,{children:"MachineRegistration"})," resource spec."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="MachineRegistration" showLineNumbers',children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineName: name\n machineInventoryLabels:\n label: value\n machineInventoryAnnotations:\n annotation: value\n config:\n cloud-config:\n ...\n elemental:\n registration:\n ...\n install:\n ... \n"})}),"\n",(0,i.jsx)(n.h4,{id:"configcloud-config",children:"config.cloud-config"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the cloud-configuration to be injected in the node. See the ",(0,i.jsx)(n.a,{href:"/next/cloud-config-reference",children:"Cloud Config Reference"})," for full information."]}),"\n",(0,i.jsx)(n.h4,{id:"configelementalregistration",children:"config.elemental.registration"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the configuration used for the connection and the initial registration to the ",(0,i.jsx)(r,{name:"elemental_operator_name"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Supports the following values:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"url"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsxs)(n.td,{children:["URL to connect to the ",(0,i.jsx)(r,{name:"elemental_operator_name"})]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"ca-cert"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"CA to validate the certificate provided by the server at 'url' (required if the certificate is not signed by a public CA)"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"no-smbios"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsxs)(n.td,{children:["Whether SMBIOS data should be sent to the ",(0,i.jsx)(r,{name:"elemental_operator_name"})," (see the ",(0,i.jsx)(n.a,{href:"/next/smbios",children:"SMBIOS reference"})," for more information)"]})]})]})]}),"\n",(0,i.jsxs)(n.admonition,{type:"warning",children:[(0,i.jsx)(n.p,{children:"The following values are for development purposes only."}),(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"emulate-tpm"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"This will use software emulation of the TPM (required for hosts without TPM hardware)"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"emulated-tpm-seed"}),(0,i.jsx)(n.td,{children:"int64"}),(0,i.jsx)(n.td,{children:"1"}),(0,i.jsxs)(n.td,{children:["Fixed seed to use with 'emulate-tpm'. Set to -1 to get a random seed. See ",(0,i.jsx)(n.a,{href:"/next/tpm",children:"TPM"})," for more information"]})]})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"configelementalinstall",children:"config.elemental.install"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the installation configuration that would be applied via ",(0,i.jsx)(n.code,{children:"elemental-register --install"})," when booted from an ISO and passed to ",(0,i.jsx)(n.a,{href:"https://github.com/rancher/elemental-toolkit/blob/main/docs/elemental_install.md",children:(0,i.jsx)(n.code,{children:"elemental install"})})]}),"\n",(0,i.jsx)(n.p,{children:"Supports the following values:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"firmware"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"efi"}),(0,i.jsx)(n.td,{children:"Firmware to install ('efi' or 'bios')"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"device"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Device to install the system to"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"device-selector"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Rules for picking device to install the system to"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"no-format"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Don\u2019t format disks. It is implied that COS_STATE, COS_RECOVERY, COS_PERSISTENT, COS_OEM partitions are already existing on the target disk"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"config-urls"}),(0,i.jsx)(n.td,{children:"list"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Cloud-init config files locations"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"iso"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Performs an installation from the ISO url instead of the running ISO"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"system-uri"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsxs)(n.td,{children:["Sets the system image source and its type (e.g. 'docker",":registry",".org/image",":tag","') instead of using the running ISO"]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"debug"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Enable debug output"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"tty"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Add named tty to grub"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"poweroff"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Shutdown the system after install"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"reboot"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Reboot the system after install"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"eject-cd"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Try to eject the cd on reboot"})]})]})]}),"\n",(0,i.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,i.jsxs)(n.p,{children:["In case of using both ",(0,i.jsx)(n.code,{children:"iso"})," and ",(0,i.jsx)(n.code,{children:"system-uri"})," the ",(0,i.jsx)(n.code,{children:"iso"})," value takes precedence"]})}),"\n",(0,i.jsxs)(n.p,{children:["It is only required to specify either the ",(0,i.jsx)(n.code,{children:"device"})," or ",(0,i.jsx)(n.code,{children:"device-selector"})," fields for a successful install, the rest of the parameters are all optional."]}),"\n",(0,i.jsxs)(n.p,{children:["If both ",(0,i.jsx)(n.code,{children:"device"})," and ",(0,i.jsx)(n.code,{children:"device-selector"})," is specified the value of ",(0,i.jsx)(n.code,{children:"device"})," is used and ",(0,i.jsx)(n.code,{children:"device-selector"})," is ignored."]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n elemental:\n install:\n device: /dev/sda\n debug: true\n reboot: true\n eject-cd: true\n system-uri: registry.suse.com/rancher/elemental-teal/5.4:latest\n"})})]}),"\n",(0,i.jsx)(n.h4,{id:"configelementalinstalldevice-selector",children:"config.elemental.install.device-selector"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"device-selector"})," field can be used to dynamically pick device during installation. The field contains a list of rules that looks like the following:"]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example device-selector based on device name"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"device-selector:\n- key: Name\n operator: In\n values:\n - /dev/sda\n - /dev/vda\n - /dev/nvme0\n"})})]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example device-selector based on device size"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"device-selector:\n- key: Size\n operator: Lt\n values:\n - 100Gi\n- key: Size\n operator: Gt\n values:\n - 30Gi\n"})})]}),"\n",(0,i.jsx)(n.p,{children:"The currently supported operators are:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Operator"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"In"}),(0,i.jsx)(n.td,{children:"The key matches one of the provided values"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"NotIn"}),(0,i.jsx)(n.td,{children:"The key does not match any of the provided values"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Gt"}),(0,i.jsx)(n.td,{children:"The key is greater than a single provided value"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Lt"}),(0,i.jsx)(n.td,{children:"The key is lesser than a single provided value"})]})]})]}),"\n",(0,i.jsx)(n.p,{children:"The currently supported keys are:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Name"}),(0,i.jsx)(n.td,{children:"The device name (eg. /dev/sda)"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Size"}),(0,i.jsx)(n.td,{children:"The device size (values can be specified using kubernetes resources, eg 100Gi)"})]})]})]}),"\n",(0,i.jsxs)(n.p,{children:["The rules are AND",":ed"," together, which means all rules must match the targeted device."]}),"\n",(0,i.jsx)(n.h4,{id:"configelementalreset",children:"config.elemental.reset"}),"\n",(0,i.jsxs)(n.p,{children:["Contains the reset configuration that would be applied via ",(0,i.jsx)(n.code,{children:"elemental-register --reset"}),", when booted from the recovery partition and passed to ",(0,i.jsx)(n.a,{href:"https://github.com/rancher/elemental-toolkit/blob/main/docs/elemental_reset.md",children:(0,i.jsx)(n.code,{children:"elemental reset"})})]}),"\n",(0,i.jsx)(n.p,{children:"Supports the following values:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default value"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"enabled"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"MachineInventories created from this MachineRegistration will have reset functionality enabled"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"reset-persistent"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"true"}),(0,i.jsx)(n.td,{children:"Format the COS_PERSISTENT partition"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"reset-oem"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"true"}),(0,i.jsx)(n.td,{children:"Format the COS_OEM partition"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"config-urls"}),(0,i.jsx)(n.td,{children:"list"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsx)(n.td,{children:"Cloud-init config files"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"system-uri"}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{children:"empty"}),(0,i.jsxs)(n.td,{children:["Sets the system image source and its type (e.g. 'docker",":registry",".org/image",":tag","') instead of using the running ISO"]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"debug"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Enable debug output"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"poweroff"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Shutdown the system after reset"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"reboot"}),(0,i.jsx)(n.td,{children:"bool"}),(0,i.jsx)(n.td,{children:"true"}),(0,i.jsx)(n.td,{children:"Reboot the system after reset"})]})]})]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n elemental:\n reset:\n enabled: true\n debug: true\n reset-persistent: true\n reset-oem: true\n reboot: true\n system-uri: registry.opensuse.org/isv/rancher/elemental/stable/teal53/15.4/rancher/elemental-teal/5.3:latest\n"})})]}),"\n",(0,i.jsx)(n.h4,{id:"machinename",children:"machineName"}),"\n",(0,i.jsxs)(n.p,{children:["This refers to the name that will be set to the node and the kubernetes resources that require a hostname (rke2 deployed pods for example, they use the node hostname as part of the pod names)\n",(0,i.jsx)(n.code,{children:"String"})," type."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["When ",(0,i.jsx)(n.code,{children:"elemental:registration:no-smbios"})," is set to ",(0,i.jsx)(n.code,{children:"false"})," (default), machineName is interpolated with ",(0,i.jsx)(n.a,{href:"https://www.dmtf.org/standards/smbios",children:"SMBIOS"})," data which allows you to store hardware information.\nSee our ",(0,i.jsx)(n.a,{href:"/next/smbios",children:"SMBIOS docs"})," for more information.\nIf no ",(0,i.jsx)(n.code,{children:"machineName"})," is specified, a default one in the form ",(0,i.jsx)(n.code,{children:"m-$UUID"})," will be set.\nThe UUID will be retrieved from the SMBIOS data if available, otherwise a random UUID will be generated."]})}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineName: hostname-test-4\n"})})]}),"\n",(0,i.jsx)(n.h4,{id:"machineinventorylabels",children:"machineInventoryLabels"}),"\n",(0,i.jsxs)(n.p,{children:["Labels that will be set to the ",(0,i.jsx)(n.code,{children:"MachineInventory"})," that is created from this ",(0,i.jsx)(n.code,{children:"MachineRegistration"}),"\n",(0,i.jsx)(n.code,{children:"Key: value"})," type. These labels will be used to establish a selection criteria in ",(0,i.jsx)(n.a,{href:"/next/machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Elemental Teal nodes will run ",(0,i.jsx)(n.code,{children:"elemental-register"})," every 24 hours.",(0,i.jsx)(n.br,{}),"\n","It is possible to update the ",(0,i.jsx)(n.code,{children:"machineInventoryLabels"})," so that all registered nodes will apply the new labels on the next successfull registration update."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["When ",(0,i.jsx)(n.code,{children:"elemental:registration:no-smbios"})," is set to ",(0,i.jsx)(n.code,{children:"false"})," (default), Labels are interpolated with ",(0,i.jsx)(n.a,{href:"https://www.dmtf.org/standards/smbios",children:"SMBIOS"})," data. This allows to store hardware information in custom labels.\nSee our ",(0,i.jsx)(n.a,{href:"/next/smbios",children:"SMBIOS docs"})," for more information."]})}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:'apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineInventoryLabels:\n my.prefix.io/element: fire\n my.prefix.io/cpus: 32\n my.prefix.io/manufacturer: "${System Information/Manufacturer}"\n my.prefix.io/productName: "${System Information/Product Name}"\n my.prefix.io/serialNumber: "${System Information/Serial Number}"\n my.prefix.io/machineUUID: "${System Information/UUID}"\n'})})]}),"\n",(0,i.jsx)(n.h4,{id:"machineinventoryannotations",children:"machineInventoryAnnotations"}),"\n",(0,i.jsxs)(n.p,{children:["Annotations that will be set to the ",(0,i.jsx)(n.code,{children:"MachineInventory"})," that is created from this ",(0,i.jsx)(n.code,{children:"MachineRegistration"}),"\n",(0,i.jsx)(n.code,{children:"Key: value"})," type"]}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n machineInventoryAnnotations:\n owner: bob\n version: 1.0.0\n"})})]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}function x(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,n,t)=>{t.d(n,{Z:()=>d,a:()=>l});var i=t(7294);const s={},r=i.createContext(s);function l(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d68e3ab2.16be6c5c.js b/assets/js/d68e3ab2.16be6c5c.js new file mode 100644 index 000000000..0c8990b12 --- /dev/null +++ b/assets/js/d68e3ab2.16be6c5c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[9165],{8821:(e,n,t)=>{t.d(n,{ZP:()=>s});var r=t(5893),i=t(1151);function a(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components},{TabItem:t,Tabs:a}=n;return t||l("TabItem",!0),a||l("Tabs",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"install-elemental-operator",children:"Install Elemental Operator"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"elemental-operator"})," is the management endpoint, running the management\ncluster and taking care of creating inventories, registrations for machines and much more."]}),"\n",(0,r.jsx)(n.p,{children:"We will use the Helm package manager to install the elemental-operator chart into our cluster."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Now after a few seconds you should see the operator pod appear on the ",(0,r.jsx)(n.code,{children:"cattle-elemental-system"})," namespace:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl get pods -n cattle-elemental-system\nNAME READY STATUS RESTARTS AGE\nelemental-operator-64f88fc695-b8qhn 1/1 Running 0 16s\n"})}),"\n",(0,r.jsx)(n.admonition,{title:"Helm v3.8.0+ required",type:"info",children:(0,r.jsx)(n.p,{children:"The Elemental Operator chart is distributed via an OCI registry: Helm correctly supports OCI based registries starting from the v3.8.0 release."})}),"\n",(0,r.jsx)(n.admonition,{title:"Swap charts installation order when upgrading from elemental-operator release < 1.2.4",type:"warning",children:(0,r.jsx)(n.p,{children:"When upgrading from an elemental-operator release embedding the Elemental CRDs (version < 1.2.4) the elemental-operator-crds chart installation will fail.\nYou will need to upgrade the elemental-operator chart first, and only then install the elemental-operator-crds chart."})}),"\n",(0,r.jsx)(n.h3,{id:"non-stable-installations",children:"Non-stable installations"}),"\n",(0,r.jsxs)(n.p,{children:["Besides the Helm charts listed above, there are two other ",(0,r.jsx)(n.code,{children:"non-stable"}),"\nversions available."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Staging:"})," refers to the latest tagged release from Github. This is documented in the ",(0,r.jsx)(n.a,{href:"next/quickstart-ui",children:"Next"})," pages."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Development:"})," refers to the 'tip of HEAD' from Github. This is the ongoing development version and changes constantly."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(a,{children:[(0,r.jsx)(t,{value:"stagingOperator",label:"Staging version (x86-64, ARM64 (Raspberry Pi 4))",default:!0,children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.opensuse.org/isv/rancher/elemental/staging/charts/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.opensuse.org/isv/rancher/elemental/staging/charts/rancher/elemental-operator-chart\n"})})}),(0,r.jsxs)(t,{value:"develOperator",label:"Development version (x86-64, ARM64 (Raspberry Pi 4))",default:!0,children:[(0,r.jsx)(n.admonition,{title:"Reminder",type:"warning",children:(0,r.jsx)(n.p,{children:"The development version is not recommended for production environments. We welcome feedback via Slack or Github issues, but it could be unstable and contain experimental features that can be dropped without notice."})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.opensuse.org/isv/rancher/elemental/dev/charts/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install --set image.imagePullPolicy=Always elemental-operator oci://registry.opensuse.org/isv/rancher/elemental/dev/charts/rancher/elemental-operator-chart\n"})})]})]}),"\n",(0,r.jsx)(n.h3,{id:"installation-options",children:"Installation options"}),"\n",(0,r.jsxs)(n.p,{children:["There are a few options that can be set in the chart install but that is out of scope for this document. You can see all the values on the chart ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/elemental-operator/blob/main/charts/operator/values.yaml",children:"values.yaml"}),"."]})]})}function s(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}function l(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},6265:(e,n,t)=>{t.d(n,{ZP:()=>s});var r=t(5893),i=t(1151);function a(e){const n={a:"a",code:"code",h2:"h2",li:"li",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["A Rancher server (v2.7.0 or later) configured (server-url set)","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["To configure the Rancher ",(0,r.jsx)(n.code,{children:"server-url"})," please check the ",(0,r.jsx)(n.a,{href:"https://rancher.com/docs/rancher/v2.6/en/admin-settings/#first-log-in",children:"Rancher docs"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["A machine (bare metal or virtualized) with TPM 2.0","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Hint 1: Libvirt allows setting virtual TPMs for virtual machines ",(0,r.jsx)(n.a,{href:"tpm/#add-tpm-module-to-virtual-machine",children:"example here"})]}),"\n",(0,r.jsxs)(n.li,{children:["Hint 2: You can enable TPM emulation on bare metal machines missing the TPM 2.0 module ",(0,r.jsx)(n.a,{href:"tpm/#add-tpm-emulation-to-bare-metal-machine",children:"example here"})]}),"\n",(0,r.jsx)(n.li,{children:"Hint 3: Make sure you're using UEFI (not BIOS) on x86-64, or the ISO won't boot"}),"\n",(0,r.jsxs)(n.li,{children:["Hint 4: A minimum volume size of 25 GB is recommended. See the ",(0,r.jsx)(n.a,{href:"/installation#deployed-elemental-teal-partition-table",children:"Elemental Teal partition table"})," for more details"]}),"\n",(0,r.jsxs)(n.li,{children:["Hint 5: CPU and RAM requirements depend on the Kubernetes version installed, for example ",(0,r.jsx)(n.a,{href:"https://docs.k3s.io/installation/requirements#hardware",children:"K3s"})," or ",(0,r.jsx)(n.a,{href:"https://docs.rke2.io/install/requirements#hardware",children:"RKE2"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Helm Package Manager (",(0,r.jsx)(n.a,{href:"https://helm.sh/",children:"https://helm.sh/"}),")"]}),"\n",(0,r.jsxs)(n.li,{children:["For ARM (aarch64) - One SD-card (32 GB or more, must be ",(0,r.jsx)(n.strong,{children:"fast"})," - 40MB/s write speed is acceptable) and a USB-stick for installation"]}),"\n"]})]})}function s(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},5960:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>g,contentTitle:()=>u,default:()=>j,frontMatter:()=>m,metadata:()=>p,toc:()=>f});var r=t(5893),i=t(1151),a=t(9548),s=t(4713),l=t(8260),o=t(3367),c=t(6265),h=t(8821),d=t(5974);const m={sidebar_label:"Elemental the command line way",title:""},u="Elemental the command line way",p={id:"quickstart-cli",title:"",description:"Follow this guide to have an auto-deployed cluster via rke2/k3s and managed by Rancher",source:"@site/versioned_docs/version-1.3/quickstart-cli.md",sourceDirName:".",slug:"/quickstart-cli",permalink:"/quickstart-cli",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Elemental the command line way",title:""},sidebar:"docs",previous:{title:"Elemental the visual way",permalink:"/quickstart-ui"},next:{title:"Architecture",permalink:"/architecture"}},g={},f=[{value:"Prepare your kubernetes resources",id:"prepare-your-kubernetes-resources",level:2},{value:"Preparing the installation (seed) image",id:"preparing-the-installation-seed-image",level:2},{value:"Retrieving the prebuilt seed image",id:"retrieving-the-prebuilt-seed-image",level:4},{value:"Verifying the download",id:"verifying-the-download",level:5},{value:"Injecting the registration information",id:"injecting-the-registration-information",level:4},{value:"Writing the seed image to a USB stick",id:"writing-the-seed-image-to-a-usb-stick",level:4},{value:"Booting the Raspberry Pi",id:"booting-the-raspberry-pi",level:4},{value:"Selecting the right machines to join a cluster",id:"selecting-the-right-machines-to-join-a-cluster",level:3},{value:"How can I choose the kubernetes version and deployer for the cluster?",id:"how-can-i-choose-the-kubernetes-version-and-deployer-for-the-cluster",level:2},{value:"How can I follow what is going on behind the scenes?",id:"how-can-i-follow-what-is-going-on-behind-the-scenes",level:2}];function x(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components},{CodeBlock:t,Head:m,TabItem:u,Tabs:p}=n;return t||b("CodeBlock",!0),m||b("Head",!0),u||b("TabItem",!0),p||b("Tabs",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(m,{children:(0,r.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/quickstart-cli"})}),"\n","\n","\n",(0,r.jsx)(n.h1,{id:"elemental-the-command-line-way",children:"Elemental the command line way"}),"\n",(0,r.jsx)(n.p,{children:"Follow this guide to have an auto-deployed cluster via rke2/k3s and managed by Rancher\nwith the only help of an Elemental Teal ISO."}),"\n",(0,r.jsx)(c.ZP,{}),"\n",(0,r.jsx)(h.ZP,{}),"\n",(0,r.jsx)(n.h2,{id:"prepare-your-kubernetes-resources",children:"Prepare your kubernetes resources"}),"\n",(0,r.jsxs)(n.p,{children:["Node deployment starts with a ",(0,r.jsx)(n.code,{children:"MachineRegistration"}),", identifying a set of machines sharing the same configuration (disk drives, network, etc.)."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," is needed to perform the deployment of the Elemental OS on the target hosts. When booting up, each host registers to the Elemental Operator which tracks the new host with a ",(0,r.jsx)(n.code,{children:"MachineInventory"})," resource."]}),"\n",(0,r.jsxs)(n.p,{children:["Then it continues with having a Cluster resource that uses a ",(0,r.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," to know which machines are for that cluster."]}),"\n",(0,r.jsxs)(n.p,{children:["This selector is a simple matcher based on labels set in the ",(0,r.jsx)(n.code,{children:"MachineInventory"}),", so if your selector is matching on the label ",(0,r.jsx)(n.code,{children:"cluster-id"})," with a value ",(0,r.jsx)(n.code,{children:"cluster-id-val"}),"\nand your ",(0,r.jsx)(n.code,{children:"MachineInventory"})," has that same ",(0,r.jsx)(n.code,{children:"cluster-id"}),":",(0,r.jsx)(n.code,{children:"cluster-id-val"})," label, it will match and be bootstrapped as part of the cluster."]}),"\n",(0,r.jsxs)(n.p,{children:["In this quickstart we are going to deploy the resources to provision a cluster named ",(0,r.jsx)(n.em,{children:"volcano"})," that will match on ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s with the label ",(0,r.jsx)(n.em,{children:"element"}),":",(0,r.jsx)(n.em,{children:"fire"}),"."]}),"\n",(0,r.jsxs)(p,{children:[(0,r.jsxs)(u,{value:"manualYaml",label:"Manually creating the resource yamls",default:!0,children:[(0,r.jsx)(n.p,{children:"You will need to create the following files:"}),(0,r.jsx)(t,{language:"yaml",title:"selector.yaml",showLineNumbers:!0,children:o.Z}),(0,r.jsxs)(n.p,{children:["As you can see this is a very simple selector that looks for ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s having a label with the key ",(0,r.jsx)(n.code,{children:"element"})," and the value ",(0,r.jsx)(n.code,{children:"fire"}),"."]}),(0,r.jsx)(t,{language:"yaml",title:"cluster.yaml",showLineNumbers:!0,children:a.Z}),(0,r.jsxs)(n.p,{children:["As you can see the ",(0,r.jsx)(n.code,{children:"machineConfigRef"})," is of kind ",(0,r.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," with the name ",(0,r.jsx)(n.code,{children:"fire-machine-selector"}),": it matches the selector we created."]}),(0,r.jsxs)(n.p,{children:["You can get more information about cluster options like ",(0,r.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/reference-guides/cluster-configuration/rancher-server-configuration/rke2-cluster-configuration#machineglobalconfig",children:(0,r.jsx)(n.code,{children:"machineGlobalConfig"})})," or ",(0,r.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/reference-guides/cluster-configuration/rancher-server-configuration/rke2-cluster-configuration#machineselectorconfig",children:(0,r.jsx)(n.code,{children:"machineSelectorConfig"})})," directly in the ",(0,r.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com",children:"Rancher Manager documentation"}),"."]}),(0,r.jsxs)(p,{children:[(0,r.jsx)(u,{value:"normalRegistration",label:"Registration",default:!0,children:(0,r.jsx)(t,{language:"yaml",title:"registration.yaml",showLineNumbers:!0,children:s.Z})}),(0,r.jsxs)(u,{value:"rpiRegistration",label:"Registration for Raspberry Pi",default:!0,children:[(0,r.jsx)(t,{language:"yaml",title:"rpi-registration.yaml",showLineNumbers:!0,children:l.Z}),(0,r.jsxs)(n.p,{children:["For deployment on Raspberry Pi, you need to enable emulated TPM\n(except you have ",(0,r.jsx)(n.a,{href:"https://thepihut.com/products/letstrust-tpm-for-raspberry-pi",children:"a hardware TPM for Raspberry Pi"}),").\nYou also need to disable writing to the EFI store (since Raspberry Pi doesn't have one) via ",(0,r.jsx)(n.code,{children:"disable-boot-entry: true"}),"."]})]})]}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," defines the registration and installation configuration. Once created, the Elemental operator exposes a unique URL to be used with the ",(0,r.jsx)(n.code,{children:"elemental-register"})," binary to reach out to the management cluster and register the machine during installation: if the registration is successful, the operator creates a ",(0,r.jsx)(n.code,{children:"MachineInventory"})," tracking the machine, which can be used to provision the machine as a node of our cluster.\nWe define the label matching our selector here, although it can also be added later to the created ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s."]}),(0,r.jsxs)(n.admonition,{title:"warning",type:"warning",children:[(0,r.jsx)(n.p,{children:"Make sure to modify the registration.yaml above to set the proper install device to point to a valid device based on your node configuration (i.e. /dev/sda, /dev/vda, /dev/nvme0, etc...)."}),(0,r.jsxs)(n.p,{children:["The SD-card on a Raspberry Pi is usually ",(0,r.jsx)(n.code,{children:"/dev/mmcblk0"}),"."]})]}),(0,r.jsxs)(p,{children:[(0,r.jsxs)(u,{value:"seedImagex86",label:"Seed Image (x86_64)",default:!0,children:[(0,r.jsx)(t,{language:"yaml",title:"seedimage.yaml",showLineNumbers:!0,children:d.Z}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"SeedImage"})," is required to generate the ",(0,r.jsx)(n.em,{children:"seed image"})," (like a bootable ISO) that will boot and start the Elemental provisioning on the target machines."]}),(0,r.jsx)(n.p,{children:"Now that we have defined all the configuration files let's apply them to create the proper resources in Kubernetes:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f selector.yaml \nkubectl apply -f cluster.yaml \nkubectl apply -f registration.yaml\nkubectl apply -f seedimage.yaml\n"})})]}),(0,r.jsxs)(u,{value:"seedImagerpi",label:"Seed Image for Raspberry Pi",default:!0,children:[(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource, which automates the creation of an Elemental bootable image (the ",(0,r.jsx)(n.em,{children:"seed image"}),"), does not support Raspberry Pi yet.\nWe will generate a ",(0,r.jsx)(n.em,{children:"seed image"})," manually in the ",(0,r.jsx)(n.a,{href:"/quickstart-cli#preparing-the-installation-seed-image",children:"next section"}),"."]}),(0,r.jsx)(n.p,{children:"Now that we have defined all the configuration files let's apply them to create the proper resources in Kubernetes:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f selector.yaml \nkubectl apply -f cluster.yaml \nkubectl apply -f registration.yaml\n"})})]})]})]}),(0,r.jsxs)(u,{value:"repofiles",label:"Using quickstart files from Elemental docs repo directly",children:[(0,r.jsxs)(n.p,{children:["You can directly apply the quickstart example resource files from the ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/elemental-docs",children:"Elemental docs repository"}),"."]}),(0,r.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,r.jsxs)(n.p,{children:["The quickstart example resource files assume the default storage of the target host to be mapped to the ",(0,r.jsx)(n.code,{children:"/dev/sda"}),".\nIf your host storage device file is different, you have to change the registration.yaml file before applying it, changing the ",(0,r.jsx)(n.code,{children:"config.elemental.install.device"})," accordingly."]})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"kubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/selector.yaml\nkubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/cluster.yaml\nkubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/registration.yaml\nkubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/seedimage.yaml (not for aarch64 yet)\n"})})]})]}),"\n",(0,r.jsx)(n.h2,{id:"preparing-the-installation-seed-image",children:"Preparing the installation (seed) image"}),"\n",(0,r.jsx)(n.p,{children:"This is the last step: you need an Elemental Teal seed image that includes the initial registration config, so it can be auto registered, installed and fully deployed as part of your cluster."}),"\n",(0,r.jsxs)(n.admonition,{title:"note",type:"note",children:[(0,r.jsxs)(n.p,{children:["The initial registration config file is generated when you create a ",(0,r.jsx)(n.code,{children:"Machine Registration"}),"."]}),(0,r.jsx)(n.p,{children:"You can download it with:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:'wget --no-check-certificate `kubectl get machineregistration -n fleet-default fire-nodes -o jsonpath="{.status.registrationURL}"` -O initial-registration.yaml\n'})})]}),"\n",(0,r.jsx)(n.p,{children:"The contents of the registration config file are nothing more than the registration URL that the node needs to register, the proper server certificate and few options for the registration process."}),"\n",(0,r.jsx)(n.p,{children:"Once generated, a seed image can be used to provision any number of machines."}),"\n",(0,r.jsxs)(p,{children:[(0,r.jsxs)(u,{value:"download",label:"Downloading the quickstart ISO",children:[(0,r.jsxs)(n.p,{children:["The seed image created by the ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource above can be downloaded as an ISO via the following script:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:'kubectl wait --for=condition=ready pod -n fleet-default fire-img\nwget --no-check-certificate `kubectl get seedimage -n fleet-default fire-img -o jsonpath="{.status.downloadURL}"` -O elemental-teal.x86_64.iso\n'})}),(0,r.jsxs)(n.p,{children:["The first command waits for the ISO to be built and ready, the second one downloads it in the current directory with the name ",(0,r.jsx)(n.code,{children:"elemental-teal-x86_64.iso"}),"."]})]}),(0,r.jsxs)(u,{value:"manual_iso",label:"Preparing the seed image (x86_64) manually",children:[(0,r.jsxs)(n.p,{children:["If you created a ",(0,r.jsx)(n.a,{href:"customizing#create-a-custom-bootable-installation-media",children:"customized ISO"}),",\nyou can use the ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/elemental/blob/main/.github/elemental-iso-add-registration",children:(0,r.jsx)(n.code,{children:"elemental-iso-add-registration"})}),"\nscript to add the registration config file"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"elemental-iso-add-registration initial-registration.yaml my-customized.iso\n"})})]}),(0,r.jsxs)(u,{value:"manual_raw",label:"Preparing the seed image (aarch64) manually",children:[(0,r.jsx)(n.p,{children:"Elemental's support for Raspberry Pi is primarily for demonstration purposes at this point. Therefore the installation process is modelled similar to x86-64. You boot from a seed image (an USB stick in this case) and install to a storage medium (SD-card for Raspberry Pi)."}),(0,r.jsx)(n.h4,{id:"retrieving-the-prebuilt-seed-image",children:"Retrieving the prebuilt seed image"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable/containers/rpi.raw\n"})}),(0,r.jsx)(n.h5,{id:"verifying-the-download",children:"Verifying the download"}),(0,r.jsx)(n.p,{children:"In order to verify the integrity of the downloaded artifacts, you\nshould do a checksum verification:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable/containers/rpi.raw.sha256\nsha256sum -c rpi.raw.sha256\n"})}),(0,r.jsxs)(n.p,{children:["This should print ",(0,r.jsx)(n.code,{children:"rpi.raw: OK"})," as output."]}),(0,r.jsx)(n.h4,{id:"injecting-the-registration-information",children:"Injecting the registration information"}),(0,r.jsxs)(n.p,{children:["Adding the ",(0,r.jsx)(n.code,{children:"initial-registration.yaml"})," isn't scripted yet. This is still a manual process:"]}),(0,r.jsxs)(n.p,{children:["The written USB stick will have two partitions. ",(0,r.jsx)(n.code,{children:"RPI_BOOT"})," contains the boot loader files and ",(0,r.jsx)(n.code,{children:"COS_LIVE"})," the Elemental files.\nMount the ",(0,r.jsx)(n.code,{children:"COS_LIVE"})," partition and write ",(0,r.jsx)(n.code,{children:"initial-registration.yaml"})," as ",(0,r.jsx)(n.code,{children:"livecd-cloud-config.yaml"})," to this partition."]}),(0,r.jsx)(n.p,{children:"If you've mounted the USB stick with a file manager, this command should work to copy the registration information:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"sudo cp initial-registration.yaml /run/media/$USER/COS_LIVE/livecd-cloud-config.yaml\n"})}),(0,r.jsx)(n.p,{children:"If you prefer using some CLI tools:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"IMAGE=rpi.raw\nDEST=$(mktemp -d)\n\nSECTORSIZE=$(sfdisk -J ${IMAGE} | jq '.partitiontable.sectorsize')\nDATAPARTITIONSTART=$(sfdisk -J ${IMAGE} | jq '.partitiontable.partitions[1].start')\nsudo mount -o rw,loop,offset=$((${SECTORSIZE}*${DATAPARTITIONSTART})) ${IMAGE} ${DEST}\nsudo cp initial-registration.yaml ${DEST}/livecd-cloud-config.yaml\nsudo umount ${DEST}\nrmdir ${DEST}\n"})}),(0,r.jsx)(n.h4,{id:"writing-the-seed-image-to-a-usb-stick",children:"Writing the seed image to a USB stick"}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:".raw"})," image needs to be written to a USB stick to boot from. This can be done with ",(0,r.jsx)(n.code,{children:"dd"})," on the Linux command line if you're comfortable with this command.\n",(0,r.jsx)(n.a,{href:"https://www.opensuse.org",children:"openSUSE"})," has nice instructions on how to write an image to a storage medium for ",(0,r.jsx)(n.a,{href:"https://en.opensuse.org/SDB:Live_USB_stick",children:"Linux"}),",\n",(0,r.jsx)(n.a,{href:"https://en.opensuse.org/SDB:Create_a_Live_USB_stick_using_Windows",children:"Windows"}),", and ",(0,r.jsx)(n.a,{href:"https://en.opensuse.org/SDB:Create_a_Live_USB_stick_using_macOS",children:"OS X"}),"."]}),(0,r.jsx)(n.h4,{id:"booting-the-raspberry-pi",children:"Booting the Raspberry Pi"}),(0,r.jsx)(n.p,{children:"Now unmount the USB stick and plug it into your Raspberry Pi."}),(0,r.jsxs)(n.p,{children:["Plug a large (32 GB or more) and ",(0,r.jsx)(n.strong,{children:"fast"})," (!!) micro SD-card into the respective slot."]}),(0,r.jsx)(n.p,{children:"Connect the system to ethernet."}),(0,r.jsx)(n.p,{children:"A powercycle will reboot the Pi. Everything else is identical to x86-64."}),(0,r.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,r.jsx)(n.p,{children:"Make sure the micro SD-card is unpartitioned. Otherwise the Pi bootloader will try to boot from it and fail."})})]})]}),"\n",(0,r.jsx)(n.p,{children:"You can now boot your nodes with this image and they will:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Register with the registrationURL given and create a per-machine ",(0,r.jsx)(n.code,{children:"MachineInventory"})]}),"\n",(0,r.jsx)(n.li,{children:"Install Elemental Teal to the given device"}),"\n",(0,r.jsx)(n.li,{children:"Reboot"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"selecting-the-right-machines-to-join-a-cluster",children:"Selecting the right machines to join a cluster"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," selects the machines needed to provision the cluster from the ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s having the ",(0,r.jsxs)(n.em,{children:["element",":fire"]})," label.\nWe have added the ",(0,r.jsx)(n.em,{children:"element"}),":",(0,r.jsx)(n.em,{children:"fire"})," label in the ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," ",(0,r.jsx)(n.code,{children:"machineInventoryLabels"})," map, so all the ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s originated from it already have the label.\nOne could anyway skip the label from the ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," and add it later:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:'kubectl -n fleet-default label machineinventory $(kubectl get machineinventory -n fleet-default --no-headers -o custom-columns=":metadata.name") element=fire\n'})}),"\n",(0,r.jsxs)(n.p,{children:["As soon as ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s with the ",(0,r.jsx)(n.em,{children:"element"}),":",(0,r.jsx)(n.em,{children:"fire"})," are present, the corresponding machines auto-deploy the cluster via the chosen provider (k3s/rke)."]}),"\n",(0,r.jsx)(n.p,{children:"After a few minutes your new cluster will be fully provisioned!!"}),"\n",(0,r.jsx)(n.h2,{id:"how-can-i-choose-the-kubernetes-version-and-deployer-for-the-cluster",children:"How can I choose the kubernetes version and deployer for the cluster?"}),"\n",(0,r.jsxs)(n.p,{children:["In your cluster.yaml file there is a key in the ",(0,r.jsx)(n.code,{children:"Spec"})," called ",(0,r.jsx)(n.code,{children:"kubernetesVersion"}),". That sets the version and deployer that will be used for the cluster,\nfor example Kubernetes",(0,r.jsx)(n.code,{children:"v1.24.8"})," for rke2 would be ",(0,r.jsx)(n.code,{children:"v1.24.8+rke2r1"})," and for k3s ",(0,r.jsx)(n.code,{children:"v1.24.8+k3s1"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["To see all compatible versions check the ",(0,r.jsx)(n.a,{href:"https://www.suse.com/suse-rancher/support-matrix/all-supported-versions/",children:"Rancher Support Matrix"})," PDF for rke/rke2/k3s versions and their components."]}),"\n",(0,r.jsxs)(n.p,{children:["You can also check our ",(0,r.jsx)(n.a,{href:"/kubernetesversions",children:"Version doc"})," to know how to obtain those versions."]}),"\n",(0,r.jsxs)(n.p,{children:["Check our ",(0,r.jsx)(n.a,{href:"/cluster-reference",children:"Cluster Spec"})," page for more info about the ",(0,r.jsx)(n.code,{children:"Cluster"})," resource."]}),"\n",(0,r.jsx)(n.h2,{id:"how-can-i-follow-what-is-going-on-behind-the-scenes",children:"How can I follow what is going on behind the scenes?"}),"\n",(0,r.jsx)(n.p,{children:"You should be able to follow along what the machine is doing via:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["During ISO boot:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["ssh into the machine (user/pass: root/ros):","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -t elemental"})," shows you the progress of the registration (",(0,r.jsx)(n.em,{children:"elemental-register"}),") and the installation of Elemental (",(0,r.jsx)(n.em,{children:"elemental install"}),")."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Once the system is installed:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["On the Rancher UI -> ",(0,r.jsx)(n.code,{children:"Cluster Management"})," allows you to see your new cluster and the ",(0,r.jsx)(n.code,{children:"Provisioning Log"})," in the cluster details"]}),"\n",(0,r.jsxs)(n.li,{children:["ssh into the machine (user/pass: Whatever your configured on the registration.yaml under ",(0,r.jsx)(n.code,{children:"Spec.config.cloud-config.users"}),"):","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -u elemental-system-agent"})," shows the output of the initial elemental config and the installation of the ",(0,r.jsx)(n.code,{children:"rancher-system-agent"})]}),"\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -u rancher-system-agent"})," shows the output of the boostrap of cluster components like k3s"]}),"\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -u k3s"})," shows the logs of the k3s deployment"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]})]})}function j(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(x,{...e})}):x(e)}function b(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},9548:(e,n,t)=>{t.d(n,{Z:()=>r});const r="kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: volcano\n namespace: fleet-default\nspec:\n rkeConfig:\n machineGlobalConfig:\n etcd-expose-metrics: false\n profile: null\n machinePools:\n - controlPlaneRole: true\n etcdRole: true\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: fire-machine-selector\n name: fire-pool\n quantity: 1\n unhealthyNodeTimeout: 0s\n workerRole: true\n machineSelectorConfig:\n - config:\n protect-kernel-defaults: false\n registries: {}\n kubernetesVersion: v1.24.8+k3s1\n"},4713:(e,n,t)=>{t.d(n,{Z:()=>r});const r='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'},8260:(e,n,t)=>{t.d(n,{Z:()=>r});const r='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/mmcblk0\n debug: true\n disable-boot-entry: true\n registration:\n emulate-tpm: true\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'},5974:(e,n,t)=>{t.d(n,{Z:()=>r});const r="apiVersion: elemental.cattle.io/v1beta1\nkind: SeedImage\nmetadata:\n name: fire-img\n namespace: fleet-default\nspec:\n baseImage: registry.suse.com/rancher/elemental-teal-iso/5.4:1.2.2\n registrationRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineRegistration\n name: fire-nodes\n namespace: fleet-default\n"},3367:(e,n,t)=>{t.d(n,{Z:()=>r});const r="apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: fire-machine-selector\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n matchExpressions:\n - key: element\n operator: In\n values: [ 'fire' ]\n"},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>s});var r=t(7294);const i={},a=r.createContext(i);function s(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d68e3ab2.7f182de8.js b/assets/js/d68e3ab2.7f182de8.js deleted file mode 100644 index f04116997..000000000 --- a/assets/js/d68e3ab2.7f182de8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[9165],{8821:(e,n,t)=>{t.d(n,{ZP:()=>s});var r=t(5893),i=t(1151);function a(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components},{TabItem:t,Tabs:a}=n;return t||l("TabItem",!0),a||l("Tabs",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"install-elemental-operator",children:"Install Elemental Operator"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"elemental-operator"})," is the management endpoint, running the management\ncluster and taking care of creating inventories, registrations for machines and much more."]}),"\n",(0,r.jsx)(n.p,{children:"We will use the Helm package manager to install the elemental-operator chart into our cluster."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Now after a few seconds you should see the operator pod appear on the ",(0,r.jsx)(n.code,{children:"cattle-elemental-system"})," namespace:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl get pods -n cattle-elemental-system\nNAME READY STATUS RESTARTS AGE\nelemental-operator-64f88fc695-b8qhn 1/1 Running 0 16s\n"})}),"\n",(0,r.jsx)(n.admonition,{title:"Helm v3.8.0+ required",type:"info",children:(0,r.jsx)(n.p,{children:"The Elemental Operator chart is distributed via an OCI registry: Helm correctly supports OCI based registries starting from the v3.8.0 release."})}),"\n",(0,r.jsx)(n.admonition,{title:"Swap charts installation order when upgrading from elemental-operator release < 1.2.4",type:"warning",children:(0,r.jsx)(n.p,{children:"When upgrading from an elemental-operator release embedding the Elemental CRDs (version < 1.2.4) the elemental-operator-crds chart installation will fail.\nYou will need to upgrade the elemental-operator chart first, and only then install the elemental-operator-crds chart."})}),"\n",(0,r.jsx)(n.h3,{id:"non-stable-installations",children:"Non-stable installations"}),"\n",(0,r.jsxs)(n.p,{children:["Besides the Helm charts listed above, there are two other ",(0,r.jsx)(n.code,{children:"non-stable"}),"\nversions available."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Staging:"})," refers to the latest tagged release from Github. This is documented in the ",(0,r.jsx)(n.a,{href:"next/quickstart-ui",children:"Next"})," pages."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Development:"})," refers to the 'tip of HEAD' from Github. This is the ongoing development version and changes constantly."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(a,{children:[(0,r.jsx)(t,{value:"stagingOperator",label:"Staging version (x86-64, ARM64 (Raspberry Pi 4))",default:!0,children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.opensuse.org/isv/rancher/elemental/staging/charts/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.opensuse.org/isv/rancher/elemental/staging/charts/rancher/elemental-operator-chart\n"})})}),(0,r.jsxs)(t,{value:"develOperator",label:"Development version (x86-64, ARM64 (Raspberry Pi 4))",default:!0,children:[(0,r.jsx)(n.admonition,{title:"Reminder",type:"warning",children:(0,r.jsx)(n.p,{children:"The development version is not recommended for production environments. We welcome feedback via Slack or Github issues, but it could be unstable and contain experimental features that can be dropped without notice."})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.opensuse.org/isv/rancher/elemental/dev/charts/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install --set image.imagePullPolicy=Always elemental-operator oci://registry.opensuse.org/isv/rancher/elemental/dev/charts/rancher/elemental-operator-chart\n"})})]})]}),"\n",(0,r.jsx)(n.h3,{id:"installation-options",children:"Installation options"}),"\n",(0,r.jsxs)(n.p,{children:["There are a few options that can be set in the chart install but that is out of scope for this document. You can see all the values on the chart ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/elemental-operator/blob/main/charts/operator/values.yaml",children:"values.yaml"}),"."]})]})}function s(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}function l(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},6265:(e,n,t)=>{t.d(n,{ZP:()=>s});var r=t(5893),i=t(1151);function a(e){const n={a:"a",code:"code",h2:"h2",li:"li",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["A Rancher server (v2.7.0 or later) configured (server-url set)","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["To configure the Rancher ",(0,r.jsx)(n.code,{children:"server-url"})," please check the ",(0,r.jsx)(n.a,{href:"https://rancher.com/docs/rancher/v2.6/en/admin-settings/#first-log-in",children:"Rancher docs"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["A machine (bare metal or virtualized) with TPM 2.0","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Hint 1: Libvirt allows setting virtual TPMs for virtual machines ",(0,r.jsx)(n.a,{href:"tpm/#add-tpm-module-to-virtual-machine",children:"example here"})]}),"\n",(0,r.jsxs)(n.li,{children:["Hint 2: You can enable TPM emulation on bare metal machines missing the TPM 2.0 module ",(0,r.jsx)(n.a,{href:"tpm/#add-tpm-emulation-to-bare-metal-machine",children:"example here"})]}),"\n",(0,r.jsx)(n.li,{children:"Hint 3: Make sure you're using UEFI (not BIOS) on x86-64, or the ISO won't boot"}),"\n",(0,r.jsxs)(n.li,{children:["Hint 4: A minimum volume size of 25 GB is recommended. See the ",(0,r.jsx)(n.a,{href:"/installation#deployed-elemental-teal-partition-table",children:"Elemental Teal partition table"})," for more details"]}),"\n",(0,r.jsxs)(n.li,{children:["Hint 5: CPU and RAM requirements depend on the Kubernetes version installed, for example ",(0,r.jsx)(n.a,{href:"https://docs.k3s.io/installation/requirements#hardware",children:"K3s"})," or ",(0,r.jsx)(n.a,{href:"https://docs.rke2.io/install/requirements#hardware",children:"RKE2"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Helm Package Manager (",(0,r.jsx)(n.a,{href:"https://helm.sh/",children:"https://helm.sh/"}),")"]}),"\n",(0,r.jsxs)(n.li,{children:["For ARM (aarch64) - One SD-card (32 GB or more, must be ",(0,r.jsx)(n.strong,{children:"fast"})," - 40MB/s write speed is acceptable) and a USB-stick for installation"]}),"\n"]})]})}function s(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},5960:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>g,contentTitle:()=>u,default:()=>j,frontMatter:()=>m,metadata:()=>p,toc:()=>f});var r=t(5893),i=t(1151),a=t(9548),s=t(4713),l=t(8260),o=t(3367),c=t(6265),h=t(8821),d=t(5974);const m={sidebar_label:"Elemental the command line way",title:""},u="Elemental the command line way",p={id:"quickstart-cli",title:"",description:"Follow this guide to have an auto-deployed cluster via rke2/k3s and managed by Rancher",source:"@site/versioned_docs/version-1.3/quickstart-cli.md",sourceDirName:".",slug:"/quickstart-cli",permalink:"/quickstart-cli",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Elemental the command line way",title:""},sidebar:"docs",previous:{title:"Elemental the visual way",permalink:"/quickstart-ui"},next:{title:"Architecture",permalink:"/architecture"}},g={},f=[{value:"Prepare your kubernetes resources",id:"prepare-your-kubernetes-resources",level:2},{value:"Preparing the installation (seed) image",id:"preparing-the-installation-seed-image",level:2},{value:"Retrieving the prebuilt seed image",id:"retrieving-the-prebuilt-seed-image",level:4},{value:"Verifying the download",id:"verifying-the-download",level:5},{value:"Injecting the registration information",id:"injecting-the-registration-information",level:4},{value:"Writing the seed image to a USB stick",id:"writing-the-seed-image-to-a-usb-stick",level:4},{value:"Booting the Raspberry Pi",id:"booting-the-raspberry-pi",level:4},{value:"Selecting the right machines to join a cluster",id:"selecting-the-right-machines-to-join-a-cluster",level:3},{value:"How can I choose the kubernetes version and deployer for the cluster?",id:"how-can-i-choose-the-kubernetes-version-and-deployer-for-the-cluster",level:2},{value:"How can I follow what is going on behind the scenes?",id:"how-can-i-follow-what-is-going-on-behind-the-scenes",level:2}];function x(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components},{CodeBlock:t,TabItem:m,Tabs:u}=n;return t||b("CodeBlock",!0),m||b("TabItem",!0),u||b("Tabs",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"elemental-the-command-line-way",children:"Elemental the command line way"}),"\n",(0,r.jsx)(n.p,{children:"Follow this guide to have an auto-deployed cluster via rke2/k3s and managed by Rancher\nwith the only help of an Elemental Teal ISO."}),"\n",(0,r.jsx)(c.ZP,{}),"\n",(0,r.jsx)(h.ZP,{}),"\n",(0,r.jsx)(n.h2,{id:"prepare-your-kubernetes-resources",children:"Prepare your kubernetes resources"}),"\n",(0,r.jsxs)(n.p,{children:["Node deployment starts with a ",(0,r.jsx)(n.code,{children:"MachineRegistration"}),", identifying a set of machines sharing the same configuration (disk drives, network, etc.)."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," is needed to perform the deployment of the Elemental OS on the target hosts. When booting up, each host registers to the Elemental Operator which tracks the new host with a ",(0,r.jsx)(n.code,{children:"MachineInventory"})," resource."]}),"\n",(0,r.jsxs)(n.p,{children:["Then it continues with having a Cluster resource that uses a ",(0,r.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," to know which machines are for that cluster."]}),"\n",(0,r.jsxs)(n.p,{children:["This selector is a simple matcher based on labels set in the ",(0,r.jsx)(n.code,{children:"MachineInventory"}),", so if your selector is matching on the label ",(0,r.jsx)(n.code,{children:"cluster-id"})," with a value ",(0,r.jsx)(n.code,{children:"cluster-id-val"}),"\nand your ",(0,r.jsx)(n.code,{children:"MachineInventory"})," has that same ",(0,r.jsx)(n.code,{children:"cluster-id"}),":",(0,r.jsx)(n.code,{children:"cluster-id-val"})," label, it will match and be bootstrapped as part of the cluster."]}),"\n",(0,r.jsxs)(n.p,{children:["In this quickstart we are going to deploy the resources to provision a cluster named ",(0,r.jsx)(n.em,{children:"volcano"})," that will match on ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s with the label ",(0,r.jsx)(n.em,{children:"element"}),":",(0,r.jsx)(n.em,{children:"fire"}),"."]}),"\n",(0,r.jsxs)(u,{children:[(0,r.jsxs)(m,{value:"manualYaml",label:"Manually creating the resource yamls",default:!0,children:[(0,r.jsx)(n.p,{children:"You will need to create the following files:"}),(0,r.jsx)(t,{language:"yaml",title:"selector.yaml",showLineNumbers:!0,children:o.Z}),(0,r.jsxs)(n.p,{children:["As you can see this is a very simple selector that looks for ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s having a label with the key ",(0,r.jsx)(n.code,{children:"element"})," and the value ",(0,r.jsx)(n.code,{children:"fire"}),"."]}),(0,r.jsx)(t,{language:"yaml",title:"cluster.yaml",showLineNumbers:!0,children:a.Z}),(0,r.jsxs)(n.p,{children:["As you can see the ",(0,r.jsx)(n.code,{children:"machineConfigRef"})," is of kind ",(0,r.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," with the name ",(0,r.jsx)(n.code,{children:"fire-machine-selector"}),": it matches the selector we created."]}),(0,r.jsxs)(n.p,{children:["You can get more information about cluster options like ",(0,r.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/reference-guides/cluster-configuration/rancher-server-configuration/rke2-cluster-configuration#machineglobalconfig",children:(0,r.jsx)(n.code,{children:"machineGlobalConfig"})})," or ",(0,r.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/reference-guides/cluster-configuration/rancher-server-configuration/rke2-cluster-configuration#machineselectorconfig",children:(0,r.jsx)(n.code,{children:"machineSelectorConfig"})})," directly in the ",(0,r.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com",children:"Rancher Manager documentation"}),"."]}),(0,r.jsxs)(u,{children:[(0,r.jsx)(m,{value:"normalRegistration",label:"Registration",default:!0,children:(0,r.jsx)(t,{language:"yaml",title:"registration.yaml",showLineNumbers:!0,children:s.Z})}),(0,r.jsxs)(m,{value:"rpiRegistration",label:"Registration for Raspberry Pi",default:!0,children:[(0,r.jsx)(t,{language:"yaml",title:"rpi-registration.yaml",showLineNumbers:!0,children:l.Z}),(0,r.jsxs)(n.p,{children:["For deployment on Raspberry Pi, you need to enable emulated TPM\n(except you have ",(0,r.jsx)(n.a,{href:"https://thepihut.com/products/letstrust-tpm-for-raspberry-pi",children:"a hardware TPM for Raspberry Pi"}),").\nYou also need to disable writing to the EFI store (since Raspberry Pi doesn't have one) via ",(0,r.jsx)(n.code,{children:"disable-boot-entry: true"}),"."]})]})]}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," defines the registration and installation configuration. Once created, the Elemental operator exposes a unique URL to be used with the ",(0,r.jsx)(n.code,{children:"elemental-register"})," binary to reach out to the management cluster and register the machine during installation: if the registration is successful, the operator creates a ",(0,r.jsx)(n.code,{children:"MachineInventory"})," tracking the machine, which can be used to provision the machine as a node of our cluster.\nWe define the label matching our selector here, although it can also be added later to the created ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s."]}),(0,r.jsxs)(n.admonition,{title:"warning",type:"warning",children:[(0,r.jsx)(n.p,{children:"Make sure to modify the registration.yaml above to set the proper install device to point to a valid device based on your node configuration (i.e. /dev/sda, /dev/vda, /dev/nvme0, etc...)."}),(0,r.jsxs)(n.p,{children:["The SD-card on a Raspberry Pi is usually ",(0,r.jsx)(n.code,{children:"/dev/mmcblk0"}),"."]})]}),(0,r.jsxs)(u,{children:[(0,r.jsxs)(m,{value:"seedImagex86",label:"Seed Image (x86_64)",default:!0,children:[(0,r.jsx)(t,{language:"yaml",title:"seedimage.yaml",showLineNumbers:!0,children:d.Z}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"SeedImage"})," is required to generate the ",(0,r.jsx)(n.em,{children:"seed image"})," (like a bootable ISO) that will boot and start the Elemental provisioning on the target machines."]}),(0,r.jsx)(n.p,{children:"Now that we have defined all the configuration files let's apply them to create the proper resources in Kubernetes:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f selector.yaml \nkubectl apply -f cluster.yaml \nkubectl apply -f registration.yaml\nkubectl apply -f seedimage.yaml\n"})})]}),(0,r.jsxs)(m,{value:"seedImagerpi",label:"Seed Image for Raspberry Pi",default:!0,children:[(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource, which automates the creation of an Elemental bootable image (the ",(0,r.jsx)(n.em,{children:"seed image"}),"), does not support Raspberry Pi yet.\nWe will generate a ",(0,r.jsx)(n.em,{children:"seed image"})," manually in the ",(0,r.jsx)(n.a,{href:"/quickstart-cli#preparing-the-installation-seed-image",children:"next section"}),"."]}),(0,r.jsx)(n.p,{children:"Now that we have defined all the configuration files let's apply them to create the proper resources in Kubernetes:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f selector.yaml \nkubectl apply -f cluster.yaml \nkubectl apply -f registration.yaml\n"})})]})]})]}),(0,r.jsxs)(m,{value:"repofiles",label:"Using quickstart files from Elemental docs repo directly",children:[(0,r.jsxs)(n.p,{children:["You can directly apply the quickstart example resource files from the ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/elemental-docs",children:"Elemental docs repository"}),"."]}),(0,r.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,r.jsxs)(n.p,{children:["The quickstart example resource files assume the default storage of the target host to be mapped to the ",(0,r.jsx)(n.code,{children:"/dev/sda"}),".\nIf your host storage device file is different, you have to change the registration.yaml file before applying it, changing the ",(0,r.jsx)(n.code,{children:"config.elemental.install.device"})," accordingly."]})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"kubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/selector.yaml\nkubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/cluster.yaml\nkubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/registration.yaml\nkubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/seedimage.yaml (not for aarch64 yet)\n"})})]})]}),"\n",(0,r.jsx)(n.h2,{id:"preparing-the-installation-seed-image",children:"Preparing the installation (seed) image"}),"\n",(0,r.jsx)(n.p,{children:"This is the last step: you need an Elemental Teal seed image that includes the initial registration config, so it can be auto registered, installed and fully deployed as part of your cluster."}),"\n",(0,r.jsxs)(n.admonition,{title:"note",type:"note",children:[(0,r.jsxs)(n.p,{children:["The initial registration config file is generated when you create a ",(0,r.jsx)(n.code,{children:"Machine Registration"}),"."]}),(0,r.jsx)(n.p,{children:"You can download it with:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:'wget --no-check-certificate `kubectl get machineregistration -n fleet-default fire-nodes -o jsonpath="{.status.registrationURL}"` -O initial-registration.yaml\n'})})]}),"\n",(0,r.jsx)(n.p,{children:"The contents of the registration config file are nothing more than the registration URL that the node needs to register, the proper server certificate and few options for the registration process."}),"\n",(0,r.jsx)(n.p,{children:"Once generated, a seed image can be used to provision any number of machines."}),"\n",(0,r.jsxs)(u,{children:[(0,r.jsxs)(m,{value:"download",label:"Downloading the quickstart ISO",children:[(0,r.jsxs)(n.p,{children:["The seed image created by the ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource above can be downloaded as an ISO via the following script:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:'kubectl wait --for=condition=ready pod -n fleet-default fire-img\nwget --no-check-certificate `kubectl get seedimage -n fleet-default fire-img -o jsonpath="{.status.downloadURL}"` -O elemental-teal.x86_64.iso\n'})}),(0,r.jsxs)(n.p,{children:["The first command waits for the ISO to be built and ready, the second one downloads it in the current directory with the name ",(0,r.jsx)(n.code,{children:"elemental-teal-x86_64.iso"}),"."]})]}),(0,r.jsxs)(m,{value:"manual_iso",label:"Preparing the seed image (x86_64) manually",children:[(0,r.jsxs)(n.p,{children:["If you created a ",(0,r.jsx)(n.a,{href:"customizing#create-a-custom-bootable-installation-media",children:"customized ISO"}),",\nyou can use the ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/elemental/blob/main/.github/elemental-iso-add-registration",children:(0,r.jsx)(n.code,{children:"elemental-iso-add-registration"})}),"\nscript to add the registration config file"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"elemental-iso-add-registration initial-registration.yaml my-customized.iso\n"})})]}),(0,r.jsxs)(m,{value:"manual_raw",label:"Preparing the seed image (aarch64) manually",children:[(0,r.jsx)(n.p,{children:"Elemental's support for Raspberry Pi is primarily for demonstration purposes at this point. Therefore the installation process is modelled similar to x86-64. You boot from a seed image (an USB stick in this case) and install to a storage medium (SD-card for Raspberry Pi)."}),(0,r.jsx)(n.h4,{id:"retrieving-the-prebuilt-seed-image",children:"Retrieving the prebuilt seed image"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable/containers/rpi.raw\n"})}),(0,r.jsx)(n.h5,{id:"verifying-the-download",children:"Verifying the download"}),(0,r.jsx)(n.p,{children:"In order to verify the integrity of the downloaded artifacts, you\nshould do a checksum verification:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable/containers/rpi.raw.sha256\nsha256sum -c rpi.raw.sha256\n"})}),(0,r.jsxs)(n.p,{children:["This should print ",(0,r.jsx)(n.code,{children:"rpi.raw: OK"})," as output."]}),(0,r.jsx)(n.h4,{id:"injecting-the-registration-information",children:"Injecting the registration information"}),(0,r.jsxs)(n.p,{children:["Adding the ",(0,r.jsx)(n.code,{children:"initial-registration.yaml"})," isn't scripted yet. This is still a manual process:"]}),(0,r.jsxs)(n.p,{children:["The written USB stick will have two partitions. ",(0,r.jsx)(n.code,{children:"RPI_BOOT"})," contains the boot loader files and ",(0,r.jsx)(n.code,{children:"COS_LIVE"})," the Elemental files.\nMount the ",(0,r.jsx)(n.code,{children:"COS_LIVE"})," partition and write ",(0,r.jsx)(n.code,{children:"initial-registration.yaml"})," as ",(0,r.jsx)(n.code,{children:"livecd-cloud-config.yaml"})," to this partition."]}),(0,r.jsx)(n.p,{children:"If you've mounted the USB stick with a file manager, this command should work to copy the registration information:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"sudo cp initial-registration.yaml /run/media/$USER/COS_LIVE/livecd-cloud-config.yaml\n"})}),(0,r.jsx)(n.p,{children:"If you prefer using some CLI tools:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"IMAGE=rpi.raw\nDEST=$(mktemp -d)\n\nSECTORSIZE=$(sfdisk -J ${IMAGE} | jq '.partitiontable.sectorsize')\nDATAPARTITIONSTART=$(sfdisk -J ${IMAGE} | jq '.partitiontable.partitions[1].start')\nsudo mount -o rw,loop,offset=$((${SECTORSIZE}*${DATAPARTITIONSTART})) ${IMAGE} ${DEST}\nsudo cp initial-registration.yaml ${DEST}/livecd-cloud-config.yaml\nsudo umount ${DEST}\nrmdir ${DEST}\n"})}),(0,r.jsx)(n.h4,{id:"writing-the-seed-image-to-a-usb-stick",children:"Writing the seed image to a USB stick"}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:".raw"})," image needs to be written to a USB stick to boot from. This can be done with ",(0,r.jsx)(n.code,{children:"dd"})," on the Linux command line if you're comfortable with this command.\n",(0,r.jsx)(n.a,{href:"https://www.opensuse.org",children:"openSUSE"})," has nice instructions on how to write an image to a storage medium for ",(0,r.jsx)(n.a,{href:"https://en.opensuse.org/SDB:Live_USB_stick",children:"Linux"}),",\n",(0,r.jsx)(n.a,{href:"https://en.opensuse.org/SDB:Create_a_Live_USB_stick_using_Windows",children:"Windows"}),", and ",(0,r.jsx)(n.a,{href:"https://en.opensuse.org/SDB:Create_a_Live_USB_stick_using_macOS",children:"OS X"}),"."]}),(0,r.jsx)(n.h4,{id:"booting-the-raspberry-pi",children:"Booting the Raspberry Pi"}),(0,r.jsx)(n.p,{children:"Now unmount the USB stick and plug it into your Raspberry Pi."}),(0,r.jsxs)(n.p,{children:["Plug a large (32 GB or more) and ",(0,r.jsx)(n.strong,{children:"fast"})," (!!) micro SD-card into the respective slot."]}),(0,r.jsx)(n.p,{children:"Connect the system to ethernet."}),(0,r.jsx)(n.p,{children:"A powercycle will reboot the Pi. Everything else is identical to x86-64."}),(0,r.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,r.jsx)(n.p,{children:"Make sure the micro SD-card is unpartitioned. Otherwise the Pi bootloader will try to boot from it and fail."})})]})]}),"\n",(0,r.jsx)(n.p,{children:"You can now boot your nodes with this image and they will:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Register with the registrationURL given and create a per-machine ",(0,r.jsx)(n.code,{children:"MachineInventory"})]}),"\n",(0,r.jsx)(n.li,{children:"Install Elemental Teal to the given device"}),"\n",(0,r.jsx)(n.li,{children:"Reboot"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"selecting-the-right-machines-to-join-a-cluster",children:"Selecting the right machines to join a cluster"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," selects the machines needed to provision the cluster from the ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s having the ",(0,r.jsxs)(n.em,{children:["element",":fire"]})," label.\nWe have added the ",(0,r.jsx)(n.em,{children:"element"}),":",(0,r.jsx)(n.em,{children:"fire"})," label in the ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," ",(0,r.jsx)(n.code,{children:"machineInventoryLabels"})," map, so all the ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s originated from it already have the label.\nOne could anyway skip the label from the ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," and add it later:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:'kubectl -n fleet-default label machineinventory $(kubectl get machineinventory -n fleet-default --no-headers -o custom-columns=":metadata.name") element=fire\n'})}),"\n",(0,r.jsxs)(n.p,{children:["As soon as ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s with the ",(0,r.jsx)(n.em,{children:"element"}),":",(0,r.jsx)(n.em,{children:"fire"})," are present, the corresponding machines auto-deploy the cluster via the chosen provider (k3s/rke)."]}),"\n",(0,r.jsx)(n.p,{children:"After a few minutes your new cluster will be fully provisioned!!"}),"\n",(0,r.jsx)(n.h2,{id:"how-can-i-choose-the-kubernetes-version-and-deployer-for-the-cluster",children:"How can I choose the kubernetes version and deployer for the cluster?"}),"\n",(0,r.jsxs)(n.p,{children:["In your cluster.yaml file there is a key in the ",(0,r.jsx)(n.code,{children:"Spec"})," called ",(0,r.jsx)(n.code,{children:"kubernetesVersion"}),". That sets the version and deployer that will be used for the cluster,\nfor example Kubernetes",(0,r.jsx)(n.code,{children:"v1.24.8"})," for rke2 would be ",(0,r.jsx)(n.code,{children:"v1.24.8+rke2r1"})," and for k3s ",(0,r.jsx)(n.code,{children:"v1.24.8+k3s1"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["To see all compatible versions check the ",(0,r.jsx)(n.a,{href:"https://www.suse.com/suse-rancher/support-matrix/all-supported-versions/",children:"Rancher Support Matrix"})," PDF for rke/rke2/k3s versions and their components."]}),"\n",(0,r.jsxs)(n.p,{children:["You can also check our ",(0,r.jsx)(n.a,{href:"/kubernetesversions",children:"Version doc"})," to know how to obtain those versions."]}),"\n",(0,r.jsxs)(n.p,{children:["Check our ",(0,r.jsx)(n.a,{href:"/cluster-reference",children:"Cluster Spec"})," page for more info about the ",(0,r.jsx)(n.code,{children:"Cluster"})," resource."]}),"\n",(0,r.jsx)(n.h2,{id:"how-can-i-follow-what-is-going-on-behind-the-scenes",children:"How can I follow what is going on behind the scenes?"}),"\n",(0,r.jsx)(n.p,{children:"You should be able to follow along what the machine is doing via:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["During ISO boot:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["ssh into the machine (user/pass: root/ros):","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -t elemental"})," shows you the progress of the registration (",(0,r.jsx)(n.em,{children:"elemental-register"}),") and the installation of Elemental (",(0,r.jsx)(n.em,{children:"elemental install"}),")."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Once the system is installed:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["On the Rancher UI -> ",(0,r.jsx)(n.code,{children:"Cluster Management"})," allows you to see your new cluster and the ",(0,r.jsx)(n.code,{children:"Provisioning Log"})," in the cluster details"]}),"\n",(0,r.jsxs)(n.li,{children:["ssh into the machine (user/pass: Whatever your configured on the registration.yaml under ",(0,r.jsx)(n.code,{children:"Spec.config.cloud-config.users"}),"):","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -u elemental-system-agent"})," shows the output of the initial elemental config and the installation of the ",(0,r.jsx)(n.code,{children:"rancher-system-agent"})]}),"\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -u rancher-system-agent"})," shows the output of the boostrap of cluster components like k3s"]}),"\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -u k3s"})," shows the logs of the k3s deployment"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]})]})}function j(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(x,{...e})}):x(e)}function b(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},9548:(e,n,t)=>{t.d(n,{Z:()=>r});const r="kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: volcano\n namespace: fleet-default\nspec:\n rkeConfig:\n machineGlobalConfig:\n etcd-expose-metrics: false\n profile: null\n machinePools:\n - controlPlaneRole: true\n etcdRole: true\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: fire-machine-selector\n name: fire-pool\n quantity: 1\n unhealthyNodeTimeout: 0s\n workerRole: true\n machineSelectorConfig:\n - config:\n protect-kernel-defaults: false\n registries: {}\n kubernetesVersion: v1.24.8+k3s1\n"},4713:(e,n,t)=>{t.d(n,{Z:()=>r});const r='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'},8260:(e,n,t)=>{t.d(n,{Z:()=>r});const r='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/mmcblk0\n debug: true\n disable-boot-entry: true\n registration:\n emulate-tpm: true\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'},5974:(e,n,t)=>{t.d(n,{Z:()=>r});const r="apiVersion: elemental.cattle.io/v1beta1\nkind: SeedImage\nmetadata:\n name: fire-img\n namespace: fleet-default\nspec:\n baseImage: registry.suse.com/rancher/elemental-teal-iso/5.4:1.2.2\n registrationRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineRegistration\n name: fire-nodes\n namespace: fleet-default\n"},3367:(e,n,t)=>{t.d(n,{Z:()=>r});const r="apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: fire-machine-selector\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n matchExpressions:\n - key: element\n operator: In\n values: [ 'fire' ]\n"},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>s});var r=t(7294);const i={},a=r.createContext(i);function s(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d8f7dbb7.3cfc277a.js b/assets/js/d8f7dbb7.3cfc277a.js deleted file mode 100644 index c2dbf78c5..000000000 --- a/assets/js/d8f7dbb7.3cfc277a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[5532],{8807:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>c});var a=n(5893),i=n(1151),o=n(2957);const r={sidebar_label:"Trusted Platform Module (TPM)",title:""},d="Trusted Platform Module 2.0 (TPM)",s={id:"tpm",title:"",description:"Trusted Platform Module (TPM, also known as ISO/IEC 11889) is an international standard for a secure cryptoprocessor, a dedicated microcontroller designed to secure hardware through integrated cryptographic keys. The term can also refer to a chip conforming to the standard.",source:"@site/versioned_docs/version-1.3/tpm.md",sourceDirName:".",slug:"/tpm",permalink:"/tpm",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Trusted Platform Module (TPM)",title:""}},l={},c=[{value:"Add TPM module to virtual machine",id:"add-tpm-module-to-virtual-machine",level:2},{value:"Create Virtual Machine",id:"create-virtual-machine",level:3},{value:"Verify and edit hardware module list",id:"verify-and-edit-hardware-module-list",level:3},{value:"Add TPM module to VM",id:"add-tpm-module-to-vm",level:3},{value:"Finish VM configuration",id:"finish-vm-configuration",level:3},{value:"Add TPM emulation to bare metal machine",id:"add-tpm-emulation-to-bare-metal-machine",level:2}];function m(e){const t={admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",p:"p",strong:"strong",...(0,i.a)(),...e.components},{CodeBlock:r}=t;return r||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("CodeBlock",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h1,{id:"trusted-platform-module-20-tpm",children:"Trusted Platform Module 2.0 (TPM)"}),"\n",(0,a.jsx)(t.p,{children:"Trusted Platform Module (TPM, also known as ISO/IEC 11889) is an international standard for a secure cryptoprocessor, a dedicated microcontroller designed to secure hardware through integrated cryptographic keys. The term can also refer to a chip conforming to the standard."}),"\n",(0,a.jsx)(t.h2,{id:"add-tpm-module-to-virtual-machine",children:"Add TPM module to virtual machine"}),"\n",(0,a.jsx)(t.p,{children:"Easy way to add TPM to virtual machine is to use Libvirt with Virt-manager"}),"\n",(0,a.jsx)(t.h3,{id:"create-virtual-machine",children:"Create Virtual Machine"}),"\n",(0,a.jsx)(t.p,{children:"After starting virt-manager create new virtual machine"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create new VM",src:n(4245).Z+"",width:"786",height:"831"})}),"\n",(0,a.jsx)(t.h3,{id:"verify-and-edit-hardware-module-list",children:"Verify and edit hardware module list"}),"\n",(0,a.jsxs)(t.p,{children:["On the hardware configuration screen, verify list of modules and click ",(0,a.jsx)(t.em,{children:(0,a.jsx)(t.strong,{children:"Add Hardware"})})," button"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Devices list",src:n(9818).Z+"",width:"1019",height:"845"})}),"\n",(0,a.jsx)(t.h3,{id:"add-tpm-module-to-vm",children:"Add TPM module to VM"}),"\n",(0,a.jsx)(t.p,{children:"From the list of emulated devices choose TPM module and add it to VM"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Add TPM module",src:n(3954).Z+"",width:"1017",height:"842"})}),"\n",(0,a.jsx)(t.h3,{id:"finish-vm-configuration",children:"Finish VM configuration"}),"\n",(0,a.jsx)(t.p,{children:"On the last screen verify once again if TPM module was added properly"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Verify TPM",src:n(1482).Z+"",width:"1018",height:"845"})}),"\n",(0,a.jsx)(t.h2,{id:"add-tpm-emulation-to-bare-metal-machine",children:"Add TPM emulation to bare metal machine"}),"\n",(0,a.jsxs)(t.p,{children:["During applying ",(0,a.jsx)(t.code,{children:"#!yaml MachineRegistration"})," add following key to the yaml ",(0,a.jsx)(t.code,{children:"config:elemental:registration:emulate-tpm: true"})]}),"\n",(0,a.jsx)(t.admonition,{type:"info",children:(0,a.jsxs)(t.p,{children:["If you plan to deploy more than 1 machine with TPM emulation, make sure to set ",(0,a.jsx)(t.code,{children:"config:elemental:registration:emulated-tpm-seed: -1"}),"\nso the seed used for the TPM emulation is randomized per machine. Otherwise, you will get the same TPM Hash for all deployed machines and only the last\none to be registered will be valid."]})}),"\n",(0,a.jsx)(r,{language:"yaml",title:"registration-tpm.yaml",showLineNumbers:!0,children:o.Z})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(m,{...e})}):m(e)}},2957:(e,t,n)=>{n.d(t,{Z:()=>a});const a="apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n registration:\n emulate-tpm: true\n"},4245:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm1-7a68f095e057c5834efe61309decb43a.png"},9818:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm2-480a00b132fddce83ba3e85ac5c5969a.png"},3954:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm3-0a66311610b78cb9ad5c1e0a9506f18f.png"},1482:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm4-142e726b37fba5f4f9abb93cc957fb4a.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>r});var a=n(7294);const i={},o=a.createContext(i);function r(e){const t=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d8f7dbb7.e6c89814.js b/assets/js/d8f7dbb7.e6c89814.js new file mode 100644 index 000000000..aa5afaf85 --- /dev/null +++ b/assets/js/d8f7dbb7.e6c89814.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[5532],{8807:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var a=n(5893),i=n(1151),r=n(2957);const o={sidebar_label:"Trusted Platform Module (TPM)",title:""},d="Trusted Platform Module 2.0 (TPM)",s={id:"tpm",title:"",description:"Trusted Platform Module (TPM, also known as ISO/IEC 11889) is an international standard for a secure cryptoprocessor, a dedicated microcontroller designed to secure hardware through integrated cryptographic keys. The term can also refer to a chip conforming to the standard.",source:"@site/versioned_docs/version-1.3/tpm.md",sourceDirName:".",slug:"/tpm",permalink:"/tpm",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"Trusted Platform Module (TPM)",title:""}},l={},c=[{value:"Add TPM module to virtual machine",id:"add-tpm-module-to-virtual-machine",level:2},{value:"Create Virtual Machine",id:"create-virtual-machine",level:3},{value:"Verify and edit hardware module list",id:"verify-and-edit-hardware-module-list",level:3},{value:"Add TPM module to VM",id:"add-tpm-module-to-vm",level:3},{value:"Finish VM configuration",id:"finish-vm-configuration",level:3},{value:"Add TPM emulation to bare metal machine",id:"add-tpm-emulation-to-bare-metal-machine",level:2}];function m(e){const t={admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",p:"p",strong:"strong",...(0,i.a)(),...e.components},{CodeBlock:o,Head:d}=t;return o||u("CodeBlock",!0),d||u("Head",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(d,{children:(0,a.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/tpm"})}),"\n","\n","\n",(0,a.jsx)(t.h1,{id:"trusted-platform-module-20-tpm",children:"Trusted Platform Module 2.0 (TPM)"}),"\n",(0,a.jsx)(t.p,{children:"Trusted Platform Module (TPM, also known as ISO/IEC 11889) is an international standard for a secure cryptoprocessor, a dedicated microcontroller designed to secure hardware through integrated cryptographic keys. The term can also refer to a chip conforming to the standard."}),"\n",(0,a.jsx)(t.h2,{id:"add-tpm-module-to-virtual-machine",children:"Add TPM module to virtual machine"}),"\n",(0,a.jsx)(t.p,{children:"Easy way to add TPM to virtual machine is to use Libvirt with Virt-manager"}),"\n",(0,a.jsx)(t.h3,{id:"create-virtual-machine",children:"Create Virtual Machine"}),"\n",(0,a.jsx)(t.p,{children:"After starting virt-manager create new virtual machine"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create new VM",src:n(4245).Z+"",width:"786",height:"831"})}),"\n",(0,a.jsx)(t.h3,{id:"verify-and-edit-hardware-module-list",children:"Verify and edit hardware module list"}),"\n",(0,a.jsxs)(t.p,{children:["On the hardware configuration screen, verify list of modules and click ",(0,a.jsx)(t.em,{children:(0,a.jsx)(t.strong,{children:"Add Hardware"})})," button"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Devices list",src:n(9818).Z+"",width:"1019",height:"845"})}),"\n",(0,a.jsx)(t.h3,{id:"add-tpm-module-to-vm",children:"Add TPM module to VM"}),"\n",(0,a.jsx)(t.p,{children:"From the list of emulated devices choose TPM module and add it to VM"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Add TPM module",src:n(3954).Z+"",width:"1017",height:"842"})}),"\n",(0,a.jsx)(t.h3,{id:"finish-vm-configuration",children:"Finish VM configuration"}),"\n",(0,a.jsx)(t.p,{children:"On the last screen verify once again if TPM module was added properly"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Verify TPM",src:n(1482).Z+"",width:"1018",height:"845"})}),"\n",(0,a.jsx)(t.h2,{id:"add-tpm-emulation-to-bare-metal-machine",children:"Add TPM emulation to bare metal machine"}),"\n",(0,a.jsxs)(t.p,{children:["During applying ",(0,a.jsx)(t.code,{children:"#!yaml MachineRegistration"})," add following key to the yaml ",(0,a.jsx)(t.code,{children:"config:elemental:registration:emulate-tpm: true"})]}),"\n",(0,a.jsx)(t.admonition,{type:"info",children:(0,a.jsxs)(t.p,{children:["If you plan to deploy more than 1 machine with TPM emulation, make sure to set ",(0,a.jsx)(t.code,{children:"config:elemental:registration:emulated-tpm-seed: -1"}),"\nso the seed used for the TPM emulation is randomized per machine. Otherwise, you will get the same TPM Hash for all deployed machines and only the last\none to be registered will be valid."]})}),"\n",(0,a.jsx)(o,{language:"yaml",title:"registration-tpm.yaml",showLineNumbers:!0,children:r.Z})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(m,{...e})}):m(e)}function u(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},2957:(e,t,n)=>{n.d(t,{Z:()=>a});const a="apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n registration:\n emulate-tpm: true\n"},4245:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm1-7a68f095e057c5834efe61309decb43a.png"},9818:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm2-480a00b132fddce83ba3e85ac5c5969a.png"},3954:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm3-0a66311610b78cb9ad5c1e0a9506f18f.png"},1482:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm4-142e726b37fba5f4f9abb93cc957fb4a.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>o});var a=n(7294);const i={},r=a.createContext(i);function o(e){const t=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),a.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/dd6e5f02.66edbd80.js b/assets/js/dd6e5f02.66edbd80.js new file mode 100644 index 000000000..bf5c3cd22 --- /dev/null +++ b/assets/js/dd6e5f02.66edbd80.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[2347],{7718:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>d});var r=t(5893),s=t(1151);const a={sidebar_label:"SeedImage reference",title:""},o="SeedImage reference",i={id:"seedimage-reference",title:"",description:"A SeedImage resource allows to build an ISO that can be used to install Elemental onto a node.",source:"@site/versioned_docs/version-1.3/seedimage-reference.md",sourceDirName:".",slug:"/seedimage-reference",permalink:"/seedimage-reference",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"SeedImage reference",title:""},sidebar:"docs",previous:{title:"Cluster reference",permalink:"/cluster-reference"},next:{title:"Elemental Operator Helm Chart",permalink:"/elementaloperatorchart-reference"}},c={},d=[];function l(e){const n={admonition:"admonition",br:"br",code:"code",em:"em",h1:"h1",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components},{Details:t,Head:a}=n;return t||u("Details",!0),a||u("Head",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(a,{children:(0,r.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/seedimage-reference"})}),"\n",(0,r.jsx)(n.h1,{id:"seedimage-reference",children:"SeedImage reference"}),"\n",(0,r.jsxs)(n.p,{children:["A ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource allows to build an ISO that can be used to install Elemental onto a node.",(0,r.jsx)(n.br,{}),"\n","It requires a ",(0,r.jsx)(n.code,{children:"baseImage"}),", i.e., a URL to an Elemental installation ISO, and a ",(0,r.jsx)(n.code,{children:"registrationRef"})," reference to a ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," resource, from which the registration part of the Elemental configuration is extracted and injected in the ISO to produce the final ",(0,r.jsx)(n.em,{children:"seed image"}),".",(0,r.jsx)(n.br,{}),"\n","It is also possible to inject ISO customizations in the ",(0,r.jsx)(n.code,{children:"cloud-config"})," field."]}),"\n",(0,r.jsxs)(n.p,{children:["Once the seed image is ready, the download URL is shared in the ",(0,r.jsx)(n.code,{children:".status.downloadURL"})," field.\nIt stays available for download for ",(0,r.jsx)(n.code,{children:"cleanupAfterMinutes"})," minutes (default is ",(0,r.jsx)(n.code,{children:"60"}),", 1 hour), after which it is deleted.",(0,r.jsx)(n.br,{}),"\n","Setting ",(0,r.jsx)(n.code,{children:"retriggerBuild"})," to ",(0,r.jsx)(n.code,{children:"true"})," retriggers the seed image build process while setting ",(0,r.jsx)(n.code,{children:"cleanupAfterMinutes"})," to ",(0,r.jsx)(n.code,{children:"0"})," keeps the seed image around till the ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource is deleted."]}),"\n",(0,r.jsx)(n.admonition,{title:"seed images may fill up local storage",type:"warning",children:(0,r.jsxs)(n.p,{children:["The seed images are kept on the node's local storage: pay attention to the number of ",(0,r.jsx)(n.code,{children:"SeedImage"})," resources you start concurrently and to the ones you may leave around with the auto-cleanup feature disabled (",(0,r.jsx)(n.code,{children:"cleanupAfterMinutes"})," = ",(0,r.jsx)(n.code,{children:"0"}),") as you may exhaust the storage on your cluster nodes."]})}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource tracks the seed image build process through two status conditions:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Ready"}),": tracks the creation of all the required child resources that perform the actual build process."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"SeedImageReady"}),": tracks the status of the build process in the child resources."]}),"\n"]}),"\n",(0,r.jsxs)(t,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: SeedImage\nmetadata:\n name: ...\n namespace: ...\nspec:\n baseImage: ...\n cloud-config: ...\n registrationRef:\n name: ...\n namespace: ...\n cleanupAfterMinutes: ...\n retriggerBuild: ...\n"})})]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}function u(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,n,t)=>{t.d(n,{Z:()=>i,a:()=>o});var r=t(7294);const s={},a=r.createContext(s);function o(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/dd6e5f02.afb00e23.js b/assets/js/dd6e5f02.afb00e23.js deleted file mode 100644 index 94332e876..000000000 --- a/assets/js/dd6e5f02.afb00e23.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[2347],{7718:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var r=t(5893),s=t(1151);const o={sidebar_label:"SeedImage reference",title:""},a="SeedImage reference",i={id:"seedimage-reference",title:"",description:"A SeedImage resource allows to build an ISO that can be used to install Elemental onto a node.",source:"@site/versioned_docs/version-1.3/seedimage-reference.md",sourceDirName:".",slug:"/seedimage-reference",permalink:"/seedimage-reference",draft:!1,unlisted:!1,tags:[],version:"1.3",frontMatter:{sidebar_label:"SeedImage reference",title:""},sidebar:"docs",previous:{title:"Cluster reference",permalink:"/cluster-reference"},next:{title:"Elemental Operator Helm Chart",permalink:"/elementaloperatorchart-reference"}},c={},d=[];function l(e){const n={admonition:"admonition",br:"br",code:"code",em:"em",h1:"h1",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components},{Details:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"seedimage-reference",children:"SeedImage reference"}),"\n",(0,r.jsxs)(n.p,{children:["A ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource allows to build an ISO that can be used to install Elemental onto a node.",(0,r.jsx)(n.br,{}),"\n","It requires a ",(0,r.jsx)(n.code,{children:"baseImage"}),", i.e., a URL to an Elemental installation ISO, and a ",(0,r.jsx)(n.code,{children:"registrationRef"})," reference to a ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," resource, from which the registration part of the Elemental configuration is extracted and injected in the ISO to produce the final ",(0,r.jsx)(n.em,{children:"seed image"}),".",(0,r.jsx)(n.br,{}),"\n","It is also possible to inject ISO customizations in the ",(0,r.jsx)(n.code,{children:"cloud-config"})," field."]}),"\n",(0,r.jsxs)(n.p,{children:["Once the seed image is ready, the download URL is shared in the ",(0,r.jsx)(n.code,{children:".status.downloadURL"})," field.\nIt stays available for download for ",(0,r.jsx)(n.code,{children:"cleanupAfterMinutes"})," minutes (default is ",(0,r.jsx)(n.code,{children:"60"}),", 1 hour), after which it is deleted.",(0,r.jsx)(n.br,{}),"\n","Setting ",(0,r.jsx)(n.code,{children:"retriggerBuild"})," to ",(0,r.jsx)(n.code,{children:"true"})," retriggers the seed image build process while setting ",(0,r.jsx)(n.code,{children:"cleanupAfterMinutes"})," to ",(0,r.jsx)(n.code,{children:"0"})," keeps the seed image around till the ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource is deleted."]}),"\n",(0,r.jsx)(n.admonition,{title:"seed images may fill up local storage",type:"warning",children:(0,r.jsxs)(n.p,{children:["The seed images are kept on the node's local storage: pay attention to the number of ",(0,r.jsx)(n.code,{children:"SeedImage"})," resources you start concurrently and to the ones you may leave around with the auto-cleanup feature disabled (",(0,r.jsx)(n.code,{children:"cleanupAfterMinutes"})," = ",(0,r.jsx)(n.code,{children:"0"}),") as you may exhaust the storage on your cluster nodes."]})}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource tracks the seed image build process through two status conditions:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Ready"}),": tracks the creation of all the required child resources that perform the actual build process."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"SeedImageReady"}),": tracks the status of the build process in the child resources."]}),"\n"]}),"\n",(0,r.jsxs)(t,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: elemental.cattle.io/v1beta1\nkind: SeedImage\nmetadata:\n name: ...\n namespace: ...\nspec:\n baseImage: ...\n cloud-config: ...\n registrationRef:\n name: ...\n namespace: ...\n cleanupAfterMinutes: ...\n retriggerBuild: ...\n"})})]})]})}function u(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>i,a:()=>a});var r=t(7294);const s={},o=r.createContext(s);function a(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e24c3caa.01159749.js b/assets/js/e24c3caa.01159749.js new file mode 100644 index 000000000..549c152b9 --- /dev/null +++ b/assets/js/e24c3caa.01159749.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[1345],{3187:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var a=n(5893),i=n(1151),r=n(2957);const o={sidebar_label:"Trusted Platform Module (TPM)",title:""},d="Trusted Platform Module 2.0 (TPM)",s={id:"tpm",title:"",description:"Trusted Platform Module (TPM, also known as ISO/IEC 11889) is an international standard for a secure cryptoprocessor, a dedicated microcontroller designed to secure hardware through integrated cryptographic keys. The term can also refer to a chip conforming to the standard.",source:"@site/versioned_docs/version-1.2/tpm.md",sourceDirName:".",slug:"/tpm",permalink:"/1.2/tpm",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Trusted Platform Module (TPM)",title:""}},l={},c=[{value:"Add TPM module to virtual machine",id:"add-tpm-module-to-virtual-machine",level:2},{value:"Create Virtual Machine",id:"create-virtual-machine",level:3},{value:"Verify and edit hardware module list",id:"verify-and-edit-hardware-module-list",level:3},{value:"Add TPM module to VM",id:"add-tpm-module-to-vm",level:3},{value:"Finish VM configuration",id:"finish-vm-configuration",level:3},{value:"Add TPM emulation to bare metal machine",id:"add-tpm-emulation-to-bare-metal-machine",level:2}];function m(e){const t={admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",p:"p",strong:"strong",...(0,i.a)(),...e.components},{CodeBlock:o,Head:d}=t;return o||u("CodeBlock",!0),d||u("Head",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(d,{children:(0,a.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/tpm"})}),"\n","\n","\n",(0,a.jsx)(t.h1,{id:"trusted-platform-module-20-tpm",children:"Trusted Platform Module 2.0 (TPM)"}),"\n",(0,a.jsx)(t.p,{children:"Trusted Platform Module (TPM, also known as ISO/IEC 11889) is an international standard for a secure cryptoprocessor, a dedicated microcontroller designed to secure hardware through integrated cryptographic keys. The term can also refer to a chip conforming to the standard."}),"\n",(0,a.jsx)(t.h2,{id:"add-tpm-module-to-virtual-machine",children:"Add TPM module to virtual machine"}),"\n",(0,a.jsx)(t.p,{children:"Easy way to add TPM to virtual machine is to use Libvirt with Virt-manager"}),"\n",(0,a.jsx)(t.h3,{id:"create-virtual-machine",children:"Create Virtual Machine"}),"\n",(0,a.jsx)(t.p,{children:"After starting virt-manager create new virtual machine"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create new VM",src:n(2334).Z+"",width:"786",height:"831"})}),"\n",(0,a.jsx)(t.h3,{id:"verify-and-edit-hardware-module-list",children:"Verify and edit hardware module list"}),"\n",(0,a.jsxs)(t.p,{children:["On the hardware configuration screen, verify list of modules and click ",(0,a.jsx)(t.em,{children:(0,a.jsx)(t.strong,{children:"Add Hardware"})})," button"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Devices list",src:n(7429).Z+"",width:"1019",height:"845"})}),"\n",(0,a.jsx)(t.h3,{id:"add-tpm-module-to-vm",children:"Add TPM module to VM"}),"\n",(0,a.jsx)(t.p,{children:"From the list of emulated devices choose TPM module and add it to VM"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Add TPM module",src:n(6768).Z+"",width:"1017",height:"842"})}),"\n",(0,a.jsx)(t.h3,{id:"finish-vm-configuration",children:"Finish VM configuration"}),"\n",(0,a.jsx)(t.p,{children:"On the last screen verify once again if TPM module was added properly"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Verify TPM",src:n(5397).Z+"",width:"1018",height:"845"})}),"\n",(0,a.jsx)(t.h2,{id:"add-tpm-emulation-to-bare-metal-machine",children:"Add TPM emulation to bare metal machine"}),"\n",(0,a.jsxs)(t.p,{children:["During applying ",(0,a.jsx)(t.code,{children:"#!yaml MachineRegistration"})," add following key to the yaml ",(0,a.jsx)(t.code,{children:"config:elemental:registration:emulate-tpm: true"})]}),"\n",(0,a.jsx)(t.admonition,{type:"info",children:(0,a.jsxs)(t.p,{children:["If you plan to deploy more than 1 machine with TPM emulation, make sure to set ",(0,a.jsx)(t.code,{children:"config:elemental:registration:emulated-tpm-seed: -1"}),"\nso the seed used for the TPM emulation is randomized per machine. Otherwise, you will get the same TPM Hash for all deployed machines and only the last\none to be registered will be valid."]})}),"\n",(0,a.jsx)(o,{language:"yaml",title:"registration-tpm.yaml",showLineNumbers:!0,children:r.Z})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(m,{...e})}):m(e)}function u(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},2957:(e,t,n)=>{n.d(t,{Z:()=>a});const a="apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n registration:\n emulate-tpm: true\n"},2334:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm1-7a68f095e057c5834efe61309decb43a.png"},7429:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm2-480a00b132fddce83ba3e85ac5c5969a.png"},6768:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm3-0a66311610b78cb9ad5c1e0a9506f18f.png"},5397:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm4-142e726b37fba5f4f9abb93cc957fb4a.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>o});var a=n(7294);const i={},r=a.createContext(i);function o(e){const t=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),a.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e24c3caa.61457071.js b/assets/js/e24c3caa.61457071.js deleted file mode 100644 index ba4bf163e..000000000 --- a/assets/js/e24c3caa.61457071.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[1345],{3187:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>c});var a=n(5893),i=n(1151),o=n(2957);const r={sidebar_label:"Trusted Platform Module (TPM)",title:""},d="Trusted Platform Module 2.0 (TPM)",s={id:"tpm",title:"",description:"Trusted Platform Module (TPM, also known as ISO/IEC 11889) is an international standard for a secure cryptoprocessor, a dedicated microcontroller designed to secure hardware through integrated cryptographic keys. The term can also refer to a chip conforming to the standard.",source:"@site/versioned_docs/version-1.2/tpm.md",sourceDirName:".",slug:"/tpm",permalink:"/1.2/tpm",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Trusted Platform Module (TPM)",title:""}},l={},c=[{value:"Add TPM module to virtual machine",id:"add-tpm-module-to-virtual-machine",level:2},{value:"Create Virtual Machine",id:"create-virtual-machine",level:3},{value:"Verify and edit hardware module list",id:"verify-and-edit-hardware-module-list",level:3},{value:"Add TPM module to VM",id:"add-tpm-module-to-vm",level:3},{value:"Finish VM configuration",id:"finish-vm-configuration",level:3},{value:"Add TPM emulation to bare metal machine",id:"add-tpm-emulation-to-bare-metal-machine",level:2}];function m(e){const t={admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",p:"p",strong:"strong",...(0,i.a)(),...e.components},{CodeBlock:r}=t;return r||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("CodeBlock",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h1,{id:"trusted-platform-module-20-tpm",children:"Trusted Platform Module 2.0 (TPM)"}),"\n",(0,a.jsx)(t.p,{children:"Trusted Platform Module (TPM, also known as ISO/IEC 11889) is an international standard for a secure cryptoprocessor, a dedicated microcontroller designed to secure hardware through integrated cryptographic keys. The term can also refer to a chip conforming to the standard."}),"\n",(0,a.jsx)(t.h2,{id:"add-tpm-module-to-virtual-machine",children:"Add TPM module to virtual machine"}),"\n",(0,a.jsx)(t.p,{children:"Easy way to add TPM to virtual machine is to use Libvirt with Virt-manager"}),"\n",(0,a.jsx)(t.h3,{id:"create-virtual-machine",children:"Create Virtual Machine"}),"\n",(0,a.jsx)(t.p,{children:"After starting virt-manager create new virtual machine"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Create new VM",src:n(2334).Z+"",width:"786",height:"831"})}),"\n",(0,a.jsx)(t.h3,{id:"verify-and-edit-hardware-module-list",children:"Verify and edit hardware module list"}),"\n",(0,a.jsxs)(t.p,{children:["On the hardware configuration screen, verify list of modules and click ",(0,a.jsx)(t.em,{children:(0,a.jsx)(t.strong,{children:"Add Hardware"})})," button"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Devices list",src:n(7429).Z+"",width:"1019",height:"845"})}),"\n",(0,a.jsx)(t.h3,{id:"add-tpm-module-to-vm",children:"Add TPM module to VM"}),"\n",(0,a.jsx)(t.p,{children:"From the list of emulated devices choose TPM module and add it to VM"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Add TPM module",src:n(6768).Z+"",width:"1017",height:"842"})}),"\n",(0,a.jsx)(t.h3,{id:"finish-vm-configuration",children:"Finish VM configuration"}),"\n",(0,a.jsx)(t.p,{children:"On the last screen verify once again if TPM module was added properly"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Verify TPM",src:n(5397).Z+"",width:"1018",height:"845"})}),"\n",(0,a.jsx)(t.h2,{id:"add-tpm-emulation-to-bare-metal-machine",children:"Add TPM emulation to bare metal machine"}),"\n",(0,a.jsxs)(t.p,{children:["During applying ",(0,a.jsx)(t.code,{children:"#!yaml MachineRegistration"})," add following key to the yaml ",(0,a.jsx)(t.code,{children:"config:elemental:registration:emulate-tpm: true"})]}),"\n",(0,a.jsx)(t.admonition,{type:"info",children:(0,a.jsxs)(t.p,{children:["If you plan to deploy more than 1 machine with TPM emulation, make sure to set ",(0,a.jsx)(t.code,{children:"config:elemental:registration:emulated-tpm-seed: -1"}),"\nso the seed used for the TPM emulation is randomized per machine. Otherwise, you will get the same TPM Hash for all deployed machines and only the last\none to be registered will be valid."]})}),"\n",(0,a.jsx)(r,{language:"yaml",title:"registration-tpm.yaml",showLineNumbers:!0,children:o.Z})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(m,{...e})}):m(e)}},2957:(e,t,n)=>{n.d(t,{Z:()=>a});const a="apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: my-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n registration:\n emulate-tpm: true\n"},2334:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm1-7a68f095e057c5834efe61309decb43a.png"},7429:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm2-480a00b132fddce83ba3e85ac5c5969a.png"},6768:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm3-0a66311610b78cb9ad5c1e0a9506f18f.png"},5397:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tpm4-142e726b37fba5f4f9abb93cc957fb4a.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>r});var a=n(7294);const i={},o=a.createContext(i);function r(e){const t=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e647254d.87ddbedd.js b/assets/js/e647254d.87ddbedd.js new file mode 100644 index 000000000..460931fdc --- /dev/null +++ b/assets/js/e647254d.87ddbedd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4182],{8010:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>u,frontMatter:()=>c,metadata:()=>s,toc:()=>d});var i=o(5893),t=o(1151);const c={sidebar_label:"Include cloud-config from removable devices",title:""},l=void 0,s={id:"removable-device-cloudconfig",title:"",description:"How to include cloud-config files from removable devices",source:"@site/versioned_docs/version-1.2/removable-device-cloudconfig.md",sourceDirName:".",slug:"/removable-device-cloudconfig",permalink:"/1.2/removable-device-cloudconfig",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Include cloud-config from removable devices",title:""},sidebar:"docs",previous:{title:"How to use Elemental with Rancher and VMware",permalink:"/1.2/rancher-vmware"},next:{title:"Add a custom certificate",permalink:"/1.2/custom-certificate"}},a={},d=[{value:"How to include cloud-config files from removable devices",id:"how-to-include-cloud-config-files-from-removable-devices",level:3},{value:"Include non cloud-config data",id:"include-non-cloud-config-data",level:4}];function r(e){const n={a:"a",code:"code",em:"em",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,t.a)(),...e.components},{Head:o}=n;return o||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o,{children:(0,i.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/removable-device-cloudconfig"})}),"\n",(0,i.jsx)(n.h3,{id:"how-to-include-cloud-config-files-from-removable-devices",children:"How to include cloud-config files from removable devices"}),"\n",(0,i.jsxs)(n.p,{children:["Elemental Teal supports loading ",(0,i.jsx)(n.a,{href:"/1.2/cloud-config-reference",children:"cloud-config"})," files from specific block devices.\nIn particular supports loading cloud-config files from an ISO having ",(0,i.jsx)(n.code,{children:"CIDATA"})," as the volume ID or any vFAT formatted\ndevice labeled with ",(0,i.jsx)(n.code,{children:"CIDATA"}),". If a device matching this criteria is found on early boot the Elemental client will\nread it and look for a ",(0,i.jsx)(n.code,{children:"user-data"})," file in its root."]}),"\n",(0,i.jsx)(n.p,{children:"As an example an ISO including a cloud-config file can be created on a Linux host with the procedure below."}),"\n",(0,i.jsxs)(n.p,{children:["Create a ",(0,i.jsx)(n.code,{children:"user-data"})," file with the cloud-config data in it. In the example below we just set a\nproxy:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="user-data" showLineNumbers',children:'#cloud-config\nwrite_files:\n- path: /etc/sysconfig/proxy\n append: true\n content: |\n PROXY_ENABLED="yes"\n HTTP_PROXY=http://some.domain.org:8080\n HTTPS_PROXY=https://some.domain.org:8080\n NO_PROXY="localhost, 127.0.0.1"\n'})}),"\n",(0,i.jsxs)(n.p,{children:["Once the ",(0,i.jsx)(n.code,{children:"user-data"})," file exists create an ISO including only this file by using the ",(0,i.jsx)(n.code,{children:"mkisofs"})," Linux utility:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"mkisof -o cidata.iso -V CIDATA -J -r user-data\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The result is an ISO labeled with ",(0,i.jsx)(n.code,{children:"CIDATA"})," including the ",(0,i.jsx)(n.code,{children:"user-data"})," file."]}),"\n",(0,i.jsxs)(n.p,{children:["At boot the ",(0,i.jsx)(n.code,{children:"user-data"})," file will be copied as is to ",(0,i.jsx)(n.code,{children:"/oem/user-data"})," and in case it contains cloud-config data\nan extra copy will be added as ",(0,i.jsx)(n.code,{children:"/oem/user-data.yaml"}),". The file ",(0,i.jsx)(n.code,{children:"/oem/user-data.yaml"})," will be parsed\non any later cloud-init stage."]}),"\n",(0,i.jsxs)(n.p,{children:["Since the data is copied to ",(0,i.jsx)(n.code,{children:"/oem"})," it will be persistent, hence on follow up reboots the removable device is\nnot required to be present any more. If still present on follow up reboots, it just overwrites any\naleady pre-existing data."]}),"\n",(0,i.jsx)(n.h4,{id:"include-non-cloud-config-data",children:"Include non cloud-config data"}),"\n",(0,i.jsxs)(n.p,{children:["If the ",(0,i.jsx)(n.code,{children:"user-data"})," is not containing cloud-config data the Elemental client will just copy it as\nis to ",(0,i.jsx)(n.code,{children:"/oem/user-data"}),". Only ",(0,i.jsx)(n.code,{children:"*.yaml"})," files are parsed when executing cloud-init stages, so in that\ncase the file will be ignored by cloud-init services."]}),"\n",(0,i.jsxs)(n.p,{children:["If the ",(0,i.jsx)(n.code,{children:"user-data"})," contains a script the Elemental client will, in addition, try to execute it. The way\nElemental client determines if ",(0,i.jsx)(n.code,{children:"user-data"})," is a script or not is by the presence of a ",(0,i.jsx)(n.em,{children:"Shebang"})," in the\nfirst line. For example, the previous ",(0,i.jsx)(n.code,{children:"user-data"})," file could be rewritten as:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="user-data" showLineNumbers',children:'#!/bin/bash\n\ncat <> /etc/sysconfig/proxy\nPROXY_ENABLED="yes"\nHTTP_PROXY=http://some.domain.org:8080\nHTTPS_PROXY=https://some.domain.org:8080\nNO_PROXY="localhost, 127.0.0.1"\nEOF\n'})})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(r,{...e})}):r(e)}},1151:(e,n,o)=>{o.d(n,{Z:()=>s,a:()=>l});var i=o(7294);const t={},c=i.createContext(t);function l(e){const n=i.useContext(c);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),i.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e647254d.adc5fbbe.js b/assets/js/e647254d.adc5fbbe.js deleted file mode 100644 index 14d9933e7..000000000 --- a/assets/js/e647254d.adc5fbbe.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[4182],{8010:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>u,frontMatter:()=>c,metadata:()=>s,toc:()=>d});var o=i(5893),t=i(1151);const c={sidebar_label:"Include cloud-config from removable devices",title:""},l=void 0,s={id:"removable-device-cloudconfig",title:"",description:"How to include cloud-config files from removable devices",source:"@site/versioned_docs/version-1.2/removable-device-cloudconfig.md",sourceDirName:".",slug:"/removable-device-cloudconfig",permalink:"/1.2/removable-device-cloudconfig",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Include cloud-config from removable devices",title:""},sidebar:"docs",previous:{title:"How to use Elemental with Rancher and VMware",permalink:"/1.2/rancher-vmware"},next:{title:"Add a custom certificate",permalink:"/1.2/custom-certificate"}},a={},d=[{value:"How to include cloud-config files from removable devices",id:"how-to-include-cloud-config-files-from-removable-devices",level:3},{value:"Include non cloud-config data",id:"include-non-cloud-config-data",level:4}];function r(e){const n={a:"a",code:"code",em:"em",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h3,{id:"how-to-include-cloud-config-files-from-removable-devices",children:"How to include cloud-config files from removable devices"}),"\n",(0,o.jsxs)(n.p,{children:["Elemental Teal supports loading ",(0,o.jsx)(n.a,{href:"/1.2/cloud-config-reference",children:"cloud-config"})," files from specific block devices.\nIn particular supports loading cloud-config files from an ISO having ",(0,o.jsx)(n.code,{children:"CIDATA"})," as the volume ID or any vFAT formatted\ndevice labeled with ",(0,o.jsx)(n.code,{children:"CIDATA"}),". If a device matching this criteria is found on early boot the Elemental client will\nread it and look for a ",(0,o.jsx)(n.code,{children:"user-data"})," file in its root."]}),"\n",(0,o.jsx)(n.p,{children:"As an example an ISO including a cloud-config file can be created on a Linux host with the procedure below."}),"\n",(0,o.jsxs)(n.p,{children:["Create a ",(0,o.jsx)(n.code,{children:"user-data"})," file with the cloud-config data in it. In the example below we just set a\nproxy:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",metastring:'title="user-data" showLineNumbers',children:'#cloud-config\nwrite_files:\n- path: /etc/sysconfig/proxy\n append: true\n content: |\n PROXY_ENABLED="yes"\n HTTP_PROXY=http://some.domain.org:8080\n HTTPS_PROXY=https://some.domain.org:8080\n NO_PROXY="localhost, 127.0.0.1"\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Once the ",(0,o.jsx)(n.code,{children:"user-data"})," file exists create an ISO including only this file by using the ",(0,o.jsx)(n.code,{children:"mkisofs"})," Linux utility:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"mkisof -o cidata.iso -V CIDATA -J -r user-data\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The result is an ISO labeled with ",(0,o.jsx)(n.code,{children:"CIDATA"})," including the ",(0,o.jsx)(n.code,{children:"user-data"})," file."]}),"\n",(0,o.jsxs)(n.p,{children:["At boot the ",(0,o.jsx)(n.code,{children:"user-data"})," file will be copied as is to ",(0,o.jsx)(n.code,{children:"/oem/user-data"})," and in case it contains cloud-config data\nan extra copy will be added as ",(0,o.jsx)(n.code,{children:"/oem/user-data.yaml"}),". The file ",(0,o.jsx)(n.code,{children:"/oem/user-data.yaml"})," will be parsed\non any later cloud-init stage."]}),"\n",(0,o.jsxs)(n.p,{children:["Since the data is copied to ",(0,o.jsx)(n.code,{children:"/oem"})," it will be persistent, hence on follow up reboots the removable device is\nnot required to be present any more. If still present on follow up reboots, it just overwrites any\naleady pre-existing data."]}),"\n",(0,o.jsx)(n.h4,{id:"include-non-cloud-config-data",children:"Include non cloud-config data"}),"\n",(0,o.jsxs)(n.p,{children:["If the ",(0,o.jsx)(n.code,{children:"user-data"})," is not containing cloud-config data the Elemental client will just copy it as\nis to ",(0,o.jsx)(n.code,{children:"/oem/user-data"}),". Only ",(0,o.jsx)(n.code,{children:"*.yaml"})," files are parsed when executing cloud-init stages, so in that\ncase the file will be ignored by cloud-init services."]}),"\n",(0,o.jsxs)(n.p,{children:["If the ",(0,o.jsx)(n.code,{children:"user-data"})," contains a script the Elemental client will, in addition, try to execute it. The way\nElemental client determines if ",(0,o.jsx)(n.code,{children:"user-data"})," is a script or not is by the presence of a ",(0,o.jsx)(n.em,{children:"Shebang"})," in the\nfirst line. For example, the previous ",(0,o.jsx)(n.code,{children:"user-data"})," file could be rewritten as:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="user-data" showLineNumbers',children:'#!/bin/bash\n\ncat <> /etc/sysconfig/proxy\nPROXY_ENABLED="yes"\nHTTP_PROXY=http://some.domain.org:8080\nHTTPS_PROXY=https://some.domain.org:8080\nNO_PROXY="localhost, 127.0.0.1"\nEOF\n'})})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(r,{...e})}):r(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>s,a:()=>l});var o=i(7294);const t={},c=o.createContext(t);function l(e){const n=o.useContext(c);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),o.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ea530098.76121ba4.js b/assets/js/ea530098.76121ba4.js deleted file mode 100644 index ab1a200b1..000000000 --- a/assets/js/ea530098.76121ba4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7121],{4516:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>i,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var a=n(5893),t=n(1151);const o={sidebar_label:"Restore",title:""},s="Restore",c={id:"restore",title:"",description:"Follow this guide to restore an Elemental configuration from a backup with Rancher.",source:"@site/versioned_docs/version-1.2/restore.md",sourceDirName:".",slug:"/restore",permalink:"/1.2/restore",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Restore",title:""},sidebar:"docs",previous:{title:"Backup",permalink:"/1.2/backup"},next:{title:"Configure Wi-Fi",permalink:"/1.2/wifi"}},i={},l=[{value:"Prepare rancher-backup operator and backup files for restoring",id:"prepare-rancher-backup-operator-and-backup-files-for-restoring",level:2},{value:"Restore the Elemental configuration with rancher-backup operator",id:"restore-the-elemental-configuration-with-rancher-backup-operator",level:2}];function u(e){const r={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(r.h1,{id:"restore",children:"Restore"}),"\n",(0,a.jsx)(r.p,{children:"Follow this guide to restore an Elemental configuration from a backup with Rancher."}),"\n",(0,a.jsx)(r.h2,{id:"prepare-rancher-backup-operator-and-backup-files-for-restoring",children:"Prepare rancher-backup operator and backup files for restoring"}),"\n",(0,a.jsxs)(r.p,{children:["Go to official ",(0,a.jsx)(r.a,{href:"https://docs.ranchermanager.rancher.io/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/restore-rancher",children:"Rancher documentation"})," and make sure that ",(0,a.jsx)(r.code,{children:"rancher-backup operator"})," is installed and has access to backup files."]}),"\n",(0,a.jsxs)(r.p,{children:["You first have to follow this ",(0,a.jsx)(r.a,{href:"/1.2/backup",children:"documentation"})," to do a backup of Elemental resources."]}),"\n",(0,a.jsx)(r.h2,{id:"restore-the-elemental-configuration-with-rancher-backup-operator",children:"Restore the Elemental configuration with rancher-backup operator"}),"\n",(0,a.jsxs)(r.p,{children:["Create a ",(0,a.jsx)(r.code,{children:"restore object"})," (adapted to your needs) to restore the backup tarball."]}),"\n",(0,a.jsx)(r.pre,{children:(0,a.jsx)(r.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: resources.cattle.io/v1\nkind: Restore\nmetadata:\n name: elemental-restore\nspec:\n backupFilename: rancher-backup-430169aa-edde-4a61-85e8-858f625a755b-2022-10-17T05-15-00Z.tar.gz\n"})}),"\n",(0,a.jsx)(r.p,{children:"Apply manifest on Kubernetes."}),"\n",(0,a.jsx)(r.pre,{children:(0,a.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f elemental-restore.yaml\n"})}),"\n",(0,a.jsx)(r.p,{children:"Check logs from rancher-backup operator."}),"\n",(0,a.jsx)(r.pre,{children:(0,a.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl logs -n cattle-resources-system -l app.kubernetes.io/name=rancher-backup -f\n"})}),"\n",(0,a.jsx)(r.p,{children:"Verify if backup file was restore successfully."}),"\n",(0,a.jsx)(r.pre,{children:(0,a.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"...\nINFO[2022/10/31 06:34:50] Processing controllerRef apps/v1/deployments/rancher \nINFO[2022/10/31 06:34:50] Done restoring\n...\n"})}),"\n",(0,a.jsxs)(r.p,{children:["Continue with procedure from ",(0,a.jsx)(r.a,{href:"https://docs.ranchermanager.rancher.io/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/migrate-rancher-to-new-cluster",children:"Rancher documentation"})]})]})}function h(e={}){const{wrapper:r}={...(0,t.a)(),...e.components};return r?(0,a.jsx)(r,{...e,children:(0,a.jsx)(u,{...e})}):u(e)}},1151:(e,r,n)=>{n.d(r,{Z:()=>c,a:()=>s});var a=n(7294);const t={},o=a.createContext(t);function s(e){const r=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function c(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),a.createElement(o.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ea530098.8b46ebf3.js b/assets/js/ea530098.8b46ebf3.js new file mode 100644 index 000000000..f5d354cad --- /dev/null +++ b/assets/js/ea530098.8b46ebf3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[7121],{4516:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>i,contentTitle:()=>s,default:()=>p,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var t=n(5893),a=n(1151);const o={sidebar_label:"Restore",title:""},s="Restore",c={id:"restore",title:"",description:"Follow this guide to restore an Elemental configuration from a backup with Rancher.",source:"@site/versioned_docs/version-1.2/restore.md",sourceDirName:".",slug:"/restore",permalink:"/1.2/restore",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Restore",title:""},sidebar:"docs",previous:{title:"Backup",permalink:"/1.2/backup"},next:{title:"Configure Wi-Fi",permalink:"/1.2/wifi"}},i={},l=[{value:"Prepare rancher-backup operator and backup files for restoring",id:"prepare-rancher-backup-operator-and-backup-files-for-restoring",level:2},{value:"Restore the Elemental configuration with rancher-backup operator",id:"restore-the-elemental-configuration-with-rancher-backup-operator",level:2}];function d(e){const r={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,a.a)(),...e.components},{Head:n}=r;return n||function(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n,{children:(0,t.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/restore"})}),"\n",(0,t.jsx)(r.h1,{id:"restore",children:"Restore"}),"\n",(0,t.jsx)(r.p,{children:"Follow this guide to restore an Elemental configuration from a backup with Rancher."}),"\n",(0,t.jsx)(r.h2,{id:"prepare-rancher-backup-operator-and-backup-files-for-restoring",children:"Prepare rancher-backup operator and backup files for restoring"}),"\n",(0,t.jsxs)(r.p,{children:["Go to official ",(0,t.jsx)(r.a,{href:"https://docs.ranchermanager.rancher.io/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/restore-rancher",children:"Rancher documentation"})," and make sure that ",(0,t.jsx)(r.code,{children:"rancher-backup operator"})," is installed and has access to backup files."]}),"\n",(0,t.jsxs)(r.p,{children:["You first have to follow this ",(0,t.jsx)(r.a,{href:"/1.2/backup",children:"documentation"})," to do a backup of Elemental resources."]}),"\n",(0,t.jsx)(r.h2,{id:"restore-the-elemental-configuration-with-rancher-backup-operator",children:"Restore the Elemental configuration with rancher-backup operator"}),"\n",(0,t.jsxs)(r.p,{children:["Create a ",(0,t.jsx)(r.code,{children:"restore object"})," (adapted to your needs) to restore the backup tarball."]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-yaml",metastring:"showLineNumbers",children:"apiVersion: resources.cattle.io/v1\nkind: Restore\nmetadata:\n name: elemental-restore\nspec:\n backupFilename: rancher-backup-430169aa-edde-4a61-85e8-858f625a755b-2022-10-17T05-15-00Z.tar.gz\n"})}),"\n",(0,t.jsx)(r.p,{children:"Apply manifest on Kubernetes."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f elemental-restore.yaml\n"})}),"\n",(0,t.jsx)(r.p,{children:"Check logs from rancher-backup operator."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl logs -n cattle-resources-system -l app.kubernetes.io/name=rancher-backup -f\n"})}),"\n",(0,t.jsx)(r.p,{children:"Verify if backup file was restore successfully."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-shell",metastring:"showLineNumbers",children:"...\nINFO[2022/10/31 06:34:50] Processing controllerRef apps/v1/deployments/rancher \nINFO[2022/10/31 06:34:50] Done restoring\n...\n"})}),"\n",(0,t.jsxs)(r.p,{children:["Continue with procedure from ",(0,t.jsx)(r.a,{href:"https://docs.ranchermanager.rancher.io/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/migrate-rancher-to-new-cluster",children:"Rancher documentation"})]})]})}function p(e={}){const{wrapper:r}={...(0,a.a)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,r,n)=>{n.d(r,{Z:()=>c,a:()=>s});var t=n(7294);const a={},o=t.createContext(a);function s(e){const r=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function c(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),t.createElement(o.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/eba81707.088d8e94.js b/assets/js/eba81707.088d8e94.js deleted file mode 100644 index eb3b1422d..000000000 --- a/assets/js/eba81707.088d8e94.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[9508],{1290:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var s=n(5893),r=n(1151);const o={sidebar_label:"Release Notes",title:""},a="Release Notes",l={id:"release-notes",title:"",description:"The Elemental project stack is made of various components such as the Operator and UI for example.",source:"@site/versioned_docs/version-1.2/release-notes.md",sourceDirName:".",slug:"/release-notes",permalink:"/1.2/release-notes",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Release Notes",title:""},sidebar:"docs",previous:{title:"Upgrade",permalink:"/1.2/troubleshooting-upgrade"}},i={},c=[];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"release-notes",children:"Release Notes"}),"\n",(0,s.jsxs)(t.p,{children:["The Elemental project stack is made of various components such as the ",(0,s.jsx)(t.code,{children:"Operator"})," and ",(0,s.jsx)(t.code,{children:"UI"})," for example."]}),"\n",(0,s.jsx)(t.p,{children:"Each of these components have an independent development lifecycle with its own versioning. Once a new version is ready, meaning it fully integrates with the others components of the Elemental project stack, a release is made."}),"\n",(0,s.jsx)(t.p,{children:"Here's the different components, their latest version and a link to the respective release notes on GitHub:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Name"}),(0,s.jsx)(t.th,{children:"Version"}),(0,s.jsx)(t.th,{children:"Release Notes"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-operator/",children:"Elemental Operator"})}),(0,s.jsx)(t.td,{children:"v1.2.5"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-operator/releases/tag/v1.2.5",children:"Link"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-toolkit/",children:"Elemental Toolkit"})}),(0,s.jsx)(t.td,{children:"v0.10.7"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-toolkit/releases/tag/v0.10.7",children:"Link"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental",children:"Elemental Linux"})}),(0,s.jsx)(t.td,{children:"v1.1.5"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental/releases/tag/v1.1.5",children:"Link"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-ui",children:"Elemental UI"})}),(0,s.jsx)(t.td,{children:"v0.1.0"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-ui/releases/tag/desktop-0.1.0",children:"Link"})})]})]})]}),"\n",(0,s.jsx)(t.admonition,{title:"Information on docs versioning",type:"note",children:(0,s.jsxs)(t.p,{children:["The docs versioning is based on the ",(0,s.jsx)(t.code,{children:"Elemental Operator"}),' component as it\'s the user "entrypoint" to the Elemental project stack.']})})]})}function d(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>a});var s=n(7294);const r={},o=s.createContext(r);function a(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/eba81707.bc5892af.js b/assets/js/eba81707.bc5892af.js new file mode 100644 index 000000000..cbf7b02bd --- /dev/null +++ b/assets/js/eba81707.bc5892af.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[9508],{1290:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var s=n(5893),r=n(1151);const o={sidebar_label:"Release Notes",title:""},a="Release Notes",l={id:"release-notes",title:"",description:"The Elemental project stack is made of various components such as the Operator and UI for example.",source:"@site/versioned_docs/version-1.2/release-notes.md",sourceDirName:".",slug:"/release-notes",permalink:"/1.2/release-notes",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Release Notes",title:""},sidebar:"docs",previous:{title:"Upgrade",permalink:"/1.2/troubleshooting-upgrade"}},i={},c=[];function d(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.a)(),...e.components},{Head:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n,{children:(0,s.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/release-notes"})}),"\n",(0,s.jsx)(t.h1,{id:"release-notes",children:"Release Notes"}),"\n",(0,s.jsxs)(t.p,{children:["The Elemental project stack is made of various components such as the ",(0,s.jsx)(t.code,{children:"Operator"})," and ",(0,s.jsx)(t.code,{children:"UI"})," for example."]}),"\n",(0,s.jsx)(t.p,{children:"Each of these components have an independent development lifecycle with its own versioning. Once a new version is ready, meaning it fully integrates with the others components of the Elemental project stack, a release is made."}),"\n",(0,s.jsx)(t.p,{children:"Here's the different components, their latest version and a link to the respective release notes on GitHub:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Name"}),(0,s.jsx)(t.th,{children:"Version"}),(0,s.jsx)(t.th,{children:"Release Notes"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-operator/",children:"Elemental Operator"})}),(0,s.jsx)(t.td,{children:"v1.2.5"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-operator/releases/tag/v1.2.5",children:"Link"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-toolkit/",children:"Elemental Toolkit"})}),(0,s.jsx)(t.td,{children:"v0.10.7"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-toolkit/releases/tag/v0.10.7",children:"Link"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental",children:"Elemental Linux"})}),(0,s.jsx)(t.td,{children:"v1.1.5"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental/releases/tag/v1.1.5",children:"Link"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-ui",children:"Elemental UI"})}),(0,s.jsx)(t.td,{children:"v0.1.0"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/rancher/elemental-ui/releases/tag/desktop-0.1.0",children:"Link"})})]})]})]}),"\n",(0,s.jsx)(t.admonition,{title:"Information on docs versioning",type:"note",children:(0,s.jsxs)(t.p,{children:["The docs versioning is based on the ",(0,s.jsx)(t.code,{children:"Elemental Operator"}),' component as it\'s the user "entrypoint" to the Elemental project stack.']})})]})}function h(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>a});var s=n(7294);const r={},o=s.createContext(r);function a(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/eff9ec8d.2d5ea61d.js b/assets/js/eff9ec8d.2d5ea61d.js new file mode 100644 index 000000000..ec750a2cd --- /dev/null +++ b/assets/js/eff9ec8d.2d5ea61d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[3230],{7159:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>d,frontMatter:()=>l,metadata:()=>a,toc:()=>o});var r=n(5893),s=n(1151);const l={sidebar_label:"MachineInventorySelectorTemplate reference",title:""},c="MachineInventorySelectorTemplate reference",a={id:"machineinventoryselectortemplate-reference",title:"",description:"The MachineInventorySelectorTemplate is the resource responsible of defining the matching criteria to pair an inventoried machine with a Cluster resource.",source:"@site/docs/machineinventoryselectortemplate-reference.md",sourceDirName:".",slug:"/machineinventoryselectortemplate-reference",permalink:"/next/machineinventoryselectortemplate-reference",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"MachineInventorySelectorTemplate reference",title:""},sidebar:"docs",previous:{title:"MachineRegistration reference",permalink:"/next/machineregistration-reference"},next:{title:"Cluster reference",permalink:"/next/cluster-reference"}},i={},o=[{value:"template.spec.selector.matchLabels",id:"templatespecselectormatchlabels",level:4},{value:"template.spec.selector.matchExpressions",id:"templatespecselectormatchexpressions",level:4}];function h(e){const t={code:"code",h1:"h1",h4:"h4",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components},{Details:n,Head:l}=t;return n||p("Details",!0),l||p("Head",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(l,{children:(0,r.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/machineinventoryselectortemplate-reference"})}),"\n",(0,r.jsx)(t.h1,{id:"machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate reference"}),"\n",(0,r.jsx)(t.p,{children:"The MachineInventorySelectorTemplate is the resource responsible of defining the matching criteria to pair an inventoried machine with a Cluster resource."}),"\n",(0,r.jsxs)(t.p,{children:["The relevant key is the ",(0,r.jsx)(t.code,{children:"selector"})," which includes label selector expressions."]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",metastring:'title="MachineInventorySelectorTemplate" showLineNumbers',children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: my-machine-selector\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n ...\n"})}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:"template.spec.selector"})," can include ",(0,r.jsx)(t.code,{children:"matchLabels"})," and or ",(0,r.jsx)(t.code,{children:"matchExpressions"})," keys."]}),"\n",(0,r.jsx)(t.h4,{id:"templatespecselectormatchlabels",children:"template.spec.selector.matchLabels"}),"\n",(0,r.jsxs)(t.p,{children:["It is a map of ",(0,r.jsx)(t.code,{children:"{key,value}"})," pairs ",(0,r.jsx)(t.code,{children:"(map[string]string)"}),". When multiple labels are provided all labels must match."]}),"\n",(0,r.jsxs)(n,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",metastring:"showLineNumbers",children:"...\nspec:\n template:\n spec:\n selector:\n matchLabels:\n element: fire\n manufacturer: somevalue\n"})})]}),"\n",(0,r.jsx)(t.p,{children:"A Cluster defined with the above selector will only attempt to provision nodes inventoried including these two labels."}),"\n",(0,r.jsx)(t.h4,{id:"templatespecselectormatchexpressions",children:"template.spec.selector.matchExpressions"}),"\n",(0,r.jsx)(t.p,{children:"It is a list of label selectors, each label selectors can be defined as:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Key"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"key"}),(0,r.jsx)(t.td,{children:"string"}),(0,r.jsx)(t.td,{children:"This is the label key the selector applies on"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"operator"}),(0,r.jsx)(t.td,{children:"string"}),(0,r.jsx)(t.td,{children:"Represents the relationship of the key to a set of values. Valid operators are 'In', 'NotIn', 'Exists' and 'DoesNotExist'"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"values"}),(0,r.jsx)(t.td,{children:"[]string"}),(0,r.jsx)(t.td,{children:"Values is an array of string values. If the operator is 'In' or 'NotIn', the values array must be non-empty. If the operator is 'Exists' or 'DoesNotExist', the values array must be empty"})]})]})]}),"\n",(0,r.jsxs)(n,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",metastring:"showLineNumbers",children:"...\nspec:\n template:\n spec:\n selector:\n matchExpressions:\n - key: element\n operator: In\n values: [ 'fire' ]\n - key: manufacturer\n operator: Exists\n"})})]}),"\n",(0,r.jsxs)(t.p,{children:["A Cluster defined with the above selector will only attempt to provision nodes inventoried with the ",(0,r.jsx)(t.code,{children:"element=fire"})," label and including a ",(0,r.jsx)(t.code,{children:"manufacturer"})," label defined with any value."]})]})}function d(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}function p(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>c});var r=n(7294);const s={},l=r.createContext(s);function c(e){const t=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),r.createElement(l.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/eff9ec8d.57a7dfe8.js b/assets/js/eff9ec8d.57a7dfe8.js deleted file mode 100644 index 371fd7a49..000000000 --- a/assets/js/eff9ec8d.57a7dfe8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[3230],{7159:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>o});var r=n(5893),s=n(1151);const l={sidebar_label:"MachineInventorySelectorTemplate reference",title:""},c="MachineInventorySelectorTemplate reference",i={id:"machineinventoryselectortemplate-reference",title:"",description:"The MachineInventorySelectorTemplate is the resource responsible of defining the matching criteria to pair an inventoried machine with a Cluster resource.",source:"@site/docs/machineinventoryselectortemplate-reference.md",sourceDirName:".",slug:"/machineinventoryselectortemplate-reference",permalink:"/next/machineinventoryselectortemplate-reference",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{sidebar_label:"MachineInventorySelectorTemplate reference",title:""},sidebar:"docs",previous:{title:"MachineRegistration reference",permalink:"/next/machineregistration-reference"},next:{title:"Cluster reference",permalink:"/next/cluster-reference"}},a={},o=[{value:"template.spec.selector.matchLabels",id:"templatespecselectormatchlabels",level:4},{value:"template.spec.selector.matchExpressions",id:"templatespecselectormatchexpressions",level:4}];function h(e){const t={code:"code",h1:"h1",h4:"h4",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components},{Details:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate reference"}),"\n",(0,r.jsx)(t.p,{children:"The MachineInventorySelectorTemplate is the resource responsible of defining the matching criteria to pair an inventoried machine with a Cluster resource."}),"\n",(0,r.jsxs)(t.p,{children:["The relevant key is the ",(0,r.jsx)(t.code,{children:"selector"})," which includes label selector expressions."]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",metastring:'title="MachineInventorySelectorTemplate" showLineNumbers',children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: my-machine-selector\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n ...\n"})}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:"template.spec.selector"})," can include ",(0,r.jsx)(t.code,{children:"matchLabels"})," and or ",(0,r.jsx)(t.code,{children:"matchExpressions"})," keys."]}),"\n",(0,r.jsx)(t.h4,{id:"templatespecselectormatchlabels",children:"template.spec.selector.matchLabels"}),"\n",(0,r.jsxs)(t.p,{children:["It is a map of ",(0,r.jsx)(t.code,{children:"{key,value}"})," pairs ",(0,r.jsx)(t.code,{children:"(map[string]string)"}),". When multiple labels are provided all labels must match."]}),"\n",(0,r.jsxs)(n,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",metastring:"showLineNumbers",children:"...\nspec:\n template:\n spec:\n selector:\n matchLabels:\n element: fire\n manufacturer: somevalue\n"})})]}),"\n",(0,r.jsx)(t.p,{children:"A Cluster defined with the above selector will only attempt to provision nodes inventoried including these two labels."}),"\n",(0,r.jsx)(t.h4,{id:"templatespecselectormatchexpressions",children:"template.spec.selector.matchExpressions"}),"\n",(0,r.jsx)(t.p,{children:"It is a list of label selectors, each label selectors can be defined as:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Key"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"key"}),(0,r.jsx)(t.td,{children:"string"}),(0,r.jsx)(t.td,{children:"This is the label key the selector applies on"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"operator"}),(0,r.jsx)(t.td,{children:"string"}),(0,r.jsx)(t.td,{children:"Represents the relationship of the key to a set of values. Valid operators are 'In', 'NotIn', 'Exists' and 'DoesNotExist'"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"values"}),(0,r.jsx)(t.td,{children:"[]string"}),(0,r.jsx)(t.td,{children:"Values is an array of string values. If the operator is 'In' or 'NotIn', the values array must be non-empty. If the operator is 'Exists' or 'DoesNotExist', the values array must be empty"})]})]})]}),"\n",(0,r.jsxs)(n,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",metastring:"showLineNumbers",children:"...\nspec:\n template:\n spec:\n selector:\n matchExpressions:\n - key: element\n operator: In\n values: [ 'fire' ]\n - key: manufacturer\n operator: Exists\n"})})]}),"\n",(0,r.jsxs)(t.p,{children:["A Cluster defined with the above selector will only attempt to provision nodes inventoried with the ",(0,r.jsx)(t.code,{children:"element=fire"})," label and including a ",(0,r.jsx)(t.code,{children:"manufacturer"})," label defined with any value."]})]})}function d(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>i,a:()=>c});var r=n(7294);const s={},l=r.createContext(s);function c(e){const t=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),r.createElement(l.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f3d26829.46d6b853.js b/assets/js/f3d26829.46d6b853.js deleted file mode 100644 index 3c354fb7e..000000000 --- a/assets/js/f3d26829.46d6b853.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[2530],{1126:(e,n,t)=>{t.d(n,{ZP:()=>s});var r=t(5893),i=t(1151);function a(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components},{TabItem:t,Tabs:a}=n;return t||l("TabItem",!0),a||l("Tabs",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"install-elemental-operator",children:"Install Elemental Operator"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"elemental-operator"})," is the management endpoint, running the management\ncluster and taking care of creating inventories, registrations for machines and much more."]}),"\n",(0,r.jsx)(n.p,{children:"We will use the Helm package manager to install the elemental-operator chart into our cluster."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Now after a few seconds you should see the operator pod appear on the ",(0,r.jsx)(n.code,{children:"cattle-elemental-system"})," namespace:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl get pods -n cattle-elemental-system\nNAME READY STATUS RESTARTS AGE\nelemental-operator-64f88fc695-b8qhn 1/1 Running 0 16s\n"})}),"\n",(0,r.jsx)(n.admonition,{title:"Helm v3.8.0+ required",type:"info",children:(0,r.jsx)(n.p,{children:"The Elemental Operator chart is distributed via an OCI registry: Helm correctly supports OCI based registries starting from the v3.8.0 release."})}),"\n",(0,r.jsx)(n.admonition,{title:"Swap charts installation order when upgrading from elemental-operator release < 1.2.4",type:"warning",children:(0,r.jsx)(n.p,{children:"When upgrading from an elemental-operator release embedding the Elemental CRDs (version < 1.2.4) the elemental-operator-crds chart installation will fail.\nYou will need to upgrade the elemental-operator chart first, and only then install the elemental-operator-crds chart."})}),"\n",(0,r.jsx)(n.h3,{id:"non-stable-installations",children:"Non-stable installations"}),"\n",(0,r.jsxs)(n.p,{children:["Besides the Helm charts listed above, there are two other ",(0,r.jsx)(n.code,{children:"non-stable"}),"\nversions available."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Staging:"})," refers to the latest tagged release from Github. This is documented in the ",(0,r.jsx)(n.a,{href:"next/quickstart-ui",children:"Next"})," pages."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Development:"})," refers to the 'tip of HEAD' from Github. This is the ongoing development version and changes constantly."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(a,{children:[(0,r.jsx)(t,{value:"stagingOperator",label:"Staging version (x86-64, ARM64 (Raspberry Pi 4))",default:!0,children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.opensuse.org/isv/rancher/elemental/staging/charts/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.opensuse.org/isv/rancher/elemental/staging/charts/rancher/elemental-operator-chart\n"})})}),(0,r.jsxs)(t,{value:"develOperator",label:"Development version (x86-64, ARM64 (Raspberry Pi 4))",default:!0,children:[(0,r.jsx)(n.admonition,{title:"Reminder",type:"warning",children:(0,r.jsx)(n.p,{children:"The development version is not recommended for production environments. We welcome feedback via Slack or Github issues, but it could be unstable and contain experimental features that can be dropped without notice."})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.opensuse.org/isv/rancher/elemental/dev/charts/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install --set image.imagePullPolicy=Always elemental-operator oci://registry.opensuse.org/isv/rancher/elemental/dev/charts/rancher/elemental-operator-chart\n"})})]})]}),"\n",(0,r.jsx)(n.h3,{id:"installation-options",children:"Installation options"}),"\n",(0,r.jsxs)(n.p,{children:["There are a few options that can be set in the chart install but that is out of scope for this document. You can see all the values on the chart ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/elemental-operator/blob/main/charts/operator/values.yaml",children:"values.yaml"}),"."]})]})}function s(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}function l(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},8297:(e,n,t)=>{t.d(n,{ZP:()=>s});var r=t(5893),i=t(1151);function a(e){const n={a:"a",code:"code",h2:"h2",li:"li",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["A Rancher server (v2.7.0 or later) configured (server-url set)","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["To configure the Rancher ",(0,r.jsx)(n.code,{children:"server-url"})," please check the ",(0,r.jsx)(n.a,{href:"https://rancher.com/docs/rancher/v2.6/en/admin-settings/#first-log-in",children:"Rancher docs"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["A machine (bare metal or virtualized) with TPM 2.0","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Hint 1: Libvirt allows setting virtual TPMs for virtual machines ",(0,r.jsx)(n.a,{href:"tpm/#add-tpm-module-to-virtual-machine",children:"example here"})]}),"\n",(0,r.jsxs)(n.li,{children:["Hint 2: You can enable TPM emulation on bare metal machines missing the TPM 2.0 module ",(0,r.jsx)(n.a,{href:"tpm/#add-tpm-emulation-to-bare-metal-machine",children:"example here"})]}),"\n",(0,r.jsx)(n.li,{children:"Hint 3: Make sure you're using UEFI (not BIOS) on x86-64, or the ISO won't boot"}),"\n",(0,r.jsxs)(n.li,{children:["Hint 4: A minimum volume size of 25 GB is recommended. See the ",(0,r.jsx)(n.a,{href:"/1.2/installation#deployed-elemental-teal-partition-table",children:"Elemental Teal partition table"})," for more details"]}),"\n",(0,r.jsxs)(n.li,{children:["Hint 5: CPU and RAM requirements depend on the Kubernetes version installed, for example ",(0,r.jsx)(n.a,{href:"https://docs.k3s.io/installation/requirements#hardware",children:"K3s"})," or ",(0,r.jsx)(n.a,{href:"https://docs.rke2.io/install/requirements#hardware",children:"RKE2"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Helm Package Manager (",(0,r.jsx)(n.a,{href:"https://helm.sh/",children:"https://helm.sh/"}),")"]}),"\n",(0,r.jsxs)(n.li,{children:["For ARM (aarch64) - One SD-card (32 GB or more, must be ",(0,r.jsx)(n.strong,{children:"fast"})," - 40MB/s write speed is acceptable) and a USB-stick for installation"]}),"\n"]})]})}function s(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},131:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>g,contentTitle:()=>u,default:()=>j,frontMatter:()=>m,metadata:()=>p,toc:()=>f});var r=t(5893),i=t(1151),a=t(9548),s=t(4713),l=t(8260),o=t(3367),c=t(8297),h=t(1126),d=t(5974);const m={sidebar_label:"Elemental the command line way",title:""},u="Elemental the command line way",p={id:"quickstart-cli",title:"",description:"Follow this guide to have an auto-deployed cluster via rke2/k3s and managed by Rancher",source:"@site/versioned_docs/version-1.2/quickstart-cli.md",sourceDirName:".",slug:"/quickstart-cli",permalink:"/1.2/quickstart-cli",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Elemental the command line way",title:""},sidebar:"docs",previous:{title:"Elemental the visual way",permalink:"/1.2/quickstart-ui"},next:{title:"Architecture",permalink:"/1.2/architecture"}},g={},f=[{value:"Prepare your kubernetes resources",id:"prepare-your-kubernetes-resources",level:2},{value:"Preparing the installation (seed) image",id:"preparing-the-installation-seed-image",level:2},{value:"Retrieving the prebuilt seed image",id:"retrieving-the-prebuilt-seed-image",level:4},{value:"Verifying the download",id:"verifying-the-download",level:5},{value:"Injecting the registration information",id:"injecting-the-registration-information",level:4},{value:"Writing the seed image to a USB stick",id:"writing-the-seed-image-to-a-usb-stick",level:4},{value:"Booting the Raspberry Pi",id:"booting-the-raspberry-pi",level:4},{value:"Selecting the right machines to join a cluster",id:"selecting-the-right-machines-to-join-a-cluster",level:3},{value:"How can I choose the kubernetes version and deployer for the cluster?",id:"how-can-i-choose-the-kubernetes-version-and-deployer-for-the-cluster",level:2},{value:"How can I follow what is going on behind the scenes?",id:"how-can-i-follow-what-is-going-on-behind-the-scenes",level:2}];function x(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components},{CodeBlock:t,TabItem:m,Tabs:u}=n;return t||b("CodeBlock",!0),m||b("TabItem",!0),u||b("Tabs",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"elemental-the-command-line-way",children:"Elemental the command line way"}),"\n",(0,r.jsx)(n.p,{children:"Follow this guide to have an auto-deployed cluster via rke2/k3s and managed by Rancher\nwith the only help of an Elemental Teal ISO."}),"\n",(0,r.jsx)(c.ZP,{}),"\n",(0,r.jsx)(h.ZP,{}),"\n",(0,r.jsx)(n.h2,{id:"prepare-your-kubernetes-resources",children:"Prepare your kubernetes resources"}),"\n",(0,r.jsxs)(n.p,{children:["Node deployment starts with a ",(0,r.jsx)(n.code,{children:"MachineRegistration"}),", identifying a set of machines sharing the same configuration (disk drives, network, etc.)."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," is needed to perform the deployment of the Elemental OS on the target hosts. When booting up, each host registers to the Elemental Operator which tracks the new host with a ",(0,r.jsx)(n.code,{children:"MachineInventory"})," resource."]}),"\n",(0,r.jsxs)(n.p,{children:["Then it continues with having a Cluster resource that uses a ",(0,r.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," to know which machines are for that cluster."]}),"\n",(0,r.jsxs)(n.p,{children:["This selector is a simple matcher based on labels set in the ",(0,r.jsx)(n.code,{children:"MachineInventory"}),", so if your selector is matching on the label ",(0,r.jsx)(n.code,{children:"cluster-id"})," with a value ",(0,r.jsx)(n.code,{children:"cluster-id-val"}),"\nand your ",(0,r.jsx)(n.code,{children:"MachineInventory"})," has that same ",(0,r.jsx)(n.code,{children:"cluster-id"}),":",(0,r.jsx)(n.code,{children:"cluster-id-val"})," label, it will match and be bootstrapped as part of the cluster."]}),"\n",(0,r.jsxs)(n.p,{children:["In this quickstart we are going to deploy the resources to provision a cluster named ",(0,r.jsx)(n.em,{children:"volcano"})," that will match on ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s with the label ",(0,r.jsx)(n.em,{children:"element"}),":",(0,r.jsx)(n.em,{children:"fire"}),"."]}),"\n",(0,r.jsxs)(u,{children:[(0,r.jsxs)(m,{value:"manualYaml",label:"Manually creating the resource yamls",default:!0,children:[(0,r.jsx)(n.p,{children:"You will need to create the following files:"}),(0,r.jsx)(t,{language:"yaml",title:"selector.yaml",showLineNumbers:!0,children:o.Z}),(0,r.jsxs)(n.p,{children:["As you can see this is a very simple selector that looks for ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s having a label with the key ",(0,r.jsx)(n.code,{children:"element"})," and the value ",(0,r.jsx)(n.code,{children:"fire"}),"."]}),(0,r.jsx)(t,{language:"yaml",title:"cluster.yaml",showLineNumbers:!0,children:a.Z}),(0,r.jsxs)(n.p,{children:["As you can see the ",(0,r.jsx)(n.code,{children:"machineConfigRef"})," is of kind ",(0,r.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," with the name ",(0,r.jsx)(n.code,{children:"fire-machine-selector"}),": it matches the selector we created."]}),(0,r.jsxs)(n.p,{children:["You can get more information about cluster options like ",(0,r.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/reference-guides/cluster-configuration/rancher-server-configuration/rke2-cluster-configuration#machineglobalconfig",children:(0,r.jsx)(n.code,{children:"machineGlobalConfig"})})," or ",(0,r.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/reference-guides/cluster-configuration/rancher-server-configuration/rke2-cluster-configuration#machineselectorconfig",children:(0,r.jsx)(n.code,{children:"machineSelectorConfig"})})," directly in the ",(0,r.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com",children:"Rancher Manager documentation"}),"."]}),(0,r.jsxs)(u,{children:[(0,r.jsx)(m,{value:"normalRegistration",label:"Registration",default:!0,children:(0,r.jsx)(t,{language:"yaml",title:"registration.yaml",showLineNumbers:!0,children:s.Z})}),(0,r.jsxs)(m,{value:"rpiRegistration",label:"Registration for Raspberry Pi",default:!0,children:[(0,r.jsx)(t,{language:"yaml",title:"rpi-registration.yaml",showLineNumbers:!0,children:l.Z}),(0,r.jsxs)(n.p,{children:["For deployment on Raspberry Pi, you need to enable emulated TPM\n(except you have ",(0,r.jsx)(n.a,{href:"https://thepihut.com/products/letstrust-tpm-for-raspberry-pi",children:"a hardware TPM for Raspberry Pi"}),").\nYou also need to disable writing to the EFI store (since Raspberry Pi doesn't have one) via ",(0,r.jsx)(n.code,{children:"disable-boot-entry: true"}),"."]})]})]}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," defines the registration and installation configuration. Once created, the Elemental operator exposes a unique URL to be used with the ",(0,r.jsx)(n.code,{children:"elemental-register"})," binary to reach out to the management cluster and register the machine during installation: if the registration is successful, the operator creates a ",(0,r.jsx)(n.code,{children:"MachineInventory"})," tracking the machine, which can be used to provision the machine as a node of our cluster.\nWe define the label matching our selector here, although it can also be added later to the created ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s."]}),(0,r.jsxs)(n.admonition,{title:"warning",type:"warning",children:[(0,r.jsx)(n.p,{children:"Make sure to modify the registration.yaml above to set the proper install device to point to a valid device based on your node configuration (i.e. /dev/sda, /dev/vda, /dev/nvme0, etc...)."}),(0,r.jsxs)(n.p,{children:["The SD-card on a Raspberry Pi is usually ",(0,r.jsx)(n.code,{children:"/dev/mmcblk0"}),"."]})]}),(0,r.jsxs)(u,{children:[(0,r.jsxs)(m,{value:"seedImagex86",label:"Seed Image (x86_64)",default:!0,children:[(0,r.jsx)(t,{language:"yaml",title:"seedimage.yaml",showLineNumbers:!0,children:d.Z}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"SeedImage"})," is required to generate the ",(0,r.jsx)(n.em,{children:"seed image"})," (like a bootable ISO) that will boot and start the Elemental provisioning on the target machines."]}),(0,r.jsx)(n.p,{children:"Now that we have defined all the configuration files let's apply them to create the proper resources in Kubernetes:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f selector.yaml \nkubectl apply -f cluster.yaml \nkubectl apply -f registration.yaml\nkubectl apply -f seedimage.yaml\n"})})]}),(0,r.jsxs)(m,{value:"seedImagerpi",label:"Seed Image for Raspberry Pi",default:!0,children:[(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource, which automates the creation of an Elemental bootable image (the ",(0,r.jsx)(n.em,{children:"seed image"}),"), does not support Raspberry Pi yet.\nWe will generate a ",(0,r.jsx)(n.em,{children:"seed image"})," manually in the ",(0,r.jsx)(n.a,{href:"/1.2/quickstart-cli#preparing-the-installation-seed-image",children:"next section"}),"."]}),(0,r.jsx)(n.p,{children:"Now that we have defined all the configuration files let's apply them to create the proper resources in Kubernetes:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f selector.yaml \nkubectl apply -f cluster.yaml \nkubectl apply -f registration.yaml\n"})})]})]})]}),(0,r.jsxs)(m,{value:"repofiles",label:"Using quickstart files from Elemental docs repo directly",children:[(0,r.jsxs)(n.p,{children:["You can directly apply the quickstart example resource files from the ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/elemental-docs",children:"Elemental docs repository"}),"."]}),(0,r.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,r.jsxs)(n.p,{children:["The quickstart example resource files assume the default storage of the target host to be mapped to the ",(0,r.jsx)(n.code,{children:"/dev/sda"}),".\nIf your host storage device file is different, you have to change the registration.yaml file before applying it, changing the ",(0,r.jsx)(n.code,{children:"config.elemental.install.device"})," accordingly."]})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"kubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/selector.yaml\nkubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/cluster.yaml\nkubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/registration.yaml\nkubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/seedimage.yaml (not for aarch64 yet)\n"})})]})]}),"\n",(0,r.jsx)(n.h2,{id:"preparing-the-installation-seed-image",children:"Preparing the installation (seed) image"}),"\n",(0,r.jsx)(n.p,{children:"This is the last step: you need an Elemental Teal seed image that includes the initial registration config, so it can be auto registered, installed and fully deployed as part of your cluster."}),"\n",(0,r.jsxs)(n.admonition,{title:"note",type:"note",children:[(0,r.jsxs)(n.p,{children:["The initial registration config file is generated when you create a ",(0,r.jsx)(n.code,{children:"Machine Registration"}),"."]}),(0,r.jsx)(n.p,{children:"You can download it with:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:'wget --no-check-certificate `kubectl get machineregistration -n fleet-default fire-nodes -o jsonpath="{.status.registrationURL}"` -O initial-registration.yaml\n'})})]}),"\n",(0,r.jsx)(n.p,{children:"The contents of the registration config file are nothing more than the registration URL that the node needs to register, the proper server certificate and few options for the registration process."}),"\n",(0,r.jsx)(n.p,{children:"Once generated, a seed image can be used to provision any number of machines."}),"\n",(0,r.jsxs)(u,{children:[(0,r.jsxs)(m,{value:"download",label:"Downloading the quickstart ISO",children:[(0,r.jsxs)(n.p,{children:["The seed image created by the ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource above can be downloaded as an ISO via the following script:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:'kubectl wait --for=condition=ready pod -n fleet-default fire-img\nwget --no-check-certificate `kubectl get seedimage -n fleet-default fire-img -o jsonpath="{.status.downloadURL}"` -O elemental-teal.x86_64.iso\n'})}),(0,r.jsxs)(n.p,{children:["The first command waits for the ISO to be built and ready, the second one downloads it in the current directory with the name ",(0,r.jsx)(n.code,{children:"elemental-teal-x86_64.iso"}),"."]})]}),(0,r.jsxs)(m,{value:"manual_iso",label:"Preparing the seed image (x86_64) manually",children:[(0,r.jsxs)(n.p,{children:["If you created a ",(0,r.jsx)(n.a,{href:"customizing#create-a-custom-bootable-installation-media",children:"customized ISO"}),",\nyou can use the ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/elemental/blob/main/.github/elemental-iso-add-registration",children:(0,r.jsx)(n.code,{children:"elemental-iso-add-registration"})}),"\nscript to add the registration config file"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"elemental-iso-add-registration initial-registration.yaml my-customized.iso\n"})})]}),(0,r.jsxs)(m,{value:"manual_raw",label:"Preparing the seed image (aarch64) manually",children:[(0,r.jsx)(n.p,{children:"Elemental's support for Raspberry Pi is primarily for demonstration purposes at this point. Therefore the installation process is modelled similar to x86-64. You boot from a seed image (an USB stick in this case) and install to a storage medium (SD-card for Raspberry Pi)."}),(0,r.jsx)(n.h4,{id:"retrieving-the-prebuilt-seed-image",children:"Retrieving the prebuilt seed image"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable:/Teal53/images/rpi.raw\n"})}),(0,r.jsx)(n.h5,{id:"verifying-the-download",children:"Verifying the download"}),(0,r.jsx)(n.p,{children:"In order to verify the integrity of the downloaded artifacts, you\nshould do a checksum verification:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable:/Teal53/images/rpi.raw.sha256\nsha256sum -c rpi.raw.sha256\n"})}),(0,r.jsxs)(n.p,{children:["This should print ",(0,r.jsx)(n.code,{children:"rpi.raw: OK"})," as output."]}),(0,r.jsx)(n.h4,{id:"injecting-the-registration-information",children:"Injecting the registration information"}),(0,r.jsxs)(n.p,{children:["Adding the ",(0,r.jsx)(n.code,{children:"initial-registration.yaml"})," isn't scripted yet. This is still a manual process:"]}),(0,r.jsxs)(n.p,{children:["The written USB stick will have two partitions. ",(0,r.jsx)(n.code,{children:"RPI_BOOT"})," contains the boot loader files and ",(0,r.jsx)(n.code,{children:"COS_LIVE"})," the Elemental files.\nMount the ",(0,r.jsx)(n.code,{children:"COS_LIVE"})," partition and write ",(0,r.jsx)(n.code,{children:"initial-registration.yaml"})," as ",(0,r.jsx)(n.code,{children:"livecd-cloud-config.yaml"})," to this partition."]}),(0,r.jsx)(n.p,{children:"If you've mounted the USB stick with a file manager, this command should work to copy the registration information:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"sudo cp initial-registration.yaml /run/media/$USER/COS_LIVE/livecd-cloud-config.yaml\n"})}),(0,r.jsx)(n.p,{children:"If you prefer using some CLI tools:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"IMAGE=rpi.raw\nDEST=$(mktemp -d)\n\nSECTORSIZE=$(sfdisk -J ${IMAGE} | jq '.partitiontable.sectorsize')\nDATAPARTITIONSTART=$(sfdisk -J ${IMAGE} | jq '.partitiontable.partitions[1].start')\nsudo mount -o rw,loop,offset=$((${SECTORSIZE}*${DATAPARTITIONSTART})) ${IMAGE} ${DEST}\nsudo cp initial-registration.yaml ${DEST}/livecd-cloud-config.yaml\nsudo umount ${DEST}\nrmdir ${DEST}\n"})}),(0,r.jsx)(n.h4,{id:"writing-the-seed-image-to-a-usb-stick",children:"Writing the seed image to a USB stick"}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:".raw"})," image needs to be written to a USB stick to boot from. This can be done with ",(0,r.jsx)(n.code,{children:"dd"})," on the Linux command line if you're comfortable with this command.\n",(0,r.jsx)(n.a,{href:"https://www.opensuse.org",children:"openSUSE"})," has nice instructions on how to write an image to a storage medium for ",(0,r.jsx)(n.a,{href:"https://en.opensuse.org/SDB:Live_USB_stick",children:"Linux"}),",\n",(0,r.jsx)(n.a,{href:"https://en.opensuse.org/SDB:Create_a_Live_USB_stick_using_Windows",children:"Windows"}),", and ",(0,r.jsx)(n.a,{href:"https://en.opensuse.org/SDB:Create_a_Live_USB_stick_using_macOS",children:"OS X"}),"."]}),(0,r.jsx)(n.h4,{id:"booting-the-raspberry-pi",children:"Booting the Raspberry Pi"}),(0,r.jsx)(n.p,{children:"Now unmount the USB stick and plug it into your Raspberry Pi."}),(0,r.jsxs)(n.p,{children:["Plug a large (32 GB or more) and ",(0,r.jsx)(n.strong,{children:"fast"})," (!!) micro SD-card into the respective slot."]}),(0,r.jsx)(n.p,{children:"Connect the system to ethernet."}),(0,r.jsx)(n.p,{children:"A powercycle will reboot the Pi. Everything else is identical to x86-64."}),(0,r.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,r.jsx)(n.p,{children:"Make sure the micro SD-card is unpartitioned. Otherwise the Pi bootloader will try to boot from it and fail."})})]})]}),"\n",(0,r.jsx)(n.p,{children:"You can now boot your nodes with this image and they will:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Register with the registrationURL given and create a per-machine ",(0,r.jsx)(n.code,{children:"MachineInventory"})]}),"\n",(0,r.jsx)(n.li,{children:"Install Elemental Teal to the given device"}),"\n",(0,r.jsx)(n.li,{children:"Reboot"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"selecting-the-right-machines-to-join-a-cluster",children:"Selecting the right machines to join a cluster"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," selects the machines needed to provision the cluster from the ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s having the ",(0,r.jsxs)(n.em,{children:["element",":fire"]})," label.\nWe have added the ",(0,r.jsx)(n.em,{children:"element"}),":",(0,r.jsx)(n.em,{children:"fire"})," label in the ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," ",(0,r.jsx)(n.code,{children:"machineInventoryLabels"})," map, so all the ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s originated from it already have the label.\nOne could anyway skip the label from the ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," and add it later:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:'kubectl -n fleet-default label machineinventory $(kubectl get machineinventory -n fleet-default --no-headers -o custom-columns=":metadata.name") element=fire\n'})}),"\n",(0,r.jsxs)(n.p,{children:["As soon as ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s with the ",(0,r.jsx)(n.em,{children:"element"}),":",(0,r.jsx)(n.em,{children:"fire"})," are present, the corresponding machines auto-deploy the cluster via the chosen provider (k3s/rke)."]}),"\n",(0,r.jsx)(n.p,{children:"After a few minutes your new cluster will be fully provisioned!!"}),"\n",(0,r.jsx)(n.h2,{id:"how-can-i-choose-the-kubernetes-version-and-deployer-for-the-cluster",children:"How can I choose the kubernetes version and deployer for the cluster?"}),"\n",(0,r.jsxs)(n.p,{children:["In your cluster.yaml file there is a key in the ",(0,r.jsx)(n.code,{children:"Spec"})," called ",(0,r.jsx)(n.code,{children:"kubernetesVersion"}),". That sets the version and deployer that will be used for the cluster,\nfor example Kubernetes",(0,r.jsx)(n.code,{children:"v1.24.8"})," for rke2 would be ",(0,r.jsx)(n.code,{children:"v1.24.8+rke2r1"})," and for k3s ",(0,r.jsx)(n.code,{children:"v1.24.8+k3s1"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["To see all compatible versions check the ",(0,r.jsx)(n.a,{href:"https://www.suse.com/suse-rancher/support-matrix/all-supported-versions/",children:"Rancher Support Matrix"})," PDF for rke/rke2/k3s versions and their components."]}),"\n",(0,r.jsxs)(n.p,{children:["You can also check our ",(0,r.jsx)(n.a,{href:"/1.2/kubernetesversions",children:"Version doc"})," to know how to obtain those versions."]}),"\n",(0,r.jsxs)(n.p,{children:["Check our ",(0,r.jsx)(n.a,{href:"/1.2/cluster-reference",children:"Cluster Spec"})," page for more info about the ",(0,r.jsx)(n.code,{children:"Cluster"})," resource."]}),"\n",(0,r.jsx)(n.h2,{id:"how-can-i-follow-what-is-going-on-behind-the-scenes",children:"How can I follow what is going on behind the scenes?"}),"\n",(0,r.jsx)(n.p,{children:"You should be able to follow along what the machine is doing via:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["During ISO boot:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["ssh into the machine (user/pass: root/ros):","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -t elemental"})," shows you the progress of the registration (",(0,r.jsx)(n.em,{children:"elemental-register"}),") and the installation of Elemental (",(0,r.jsx)(n.em,{children:"elemental install"}),")."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Once the system is installed:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["On the Rancher UI -> ",(0,r.jsx)(n.code,{children:"Cluster Management"})," allows you to see your new cluster and the ",(0,r.jsx)(n.code,{children:"Provisioning Log"})," in the cluster details"]}),"\n",(0,r.jsxs)(n.li,{children:["ssh into the machine (user/pass: Whatever your configured on the registration.yaml under ",(0,r.jsx)(n.code,{children:"Spec.config.cloud-config.users"}),"):","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -u elemental-system-agent"})," shows the output of the initial elemental config and the installation of the ",(0,r.jsx)(n.code,{children:"rancher-system-agent"})]}),"\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -u rancher-system-agent"})," shows the output of the boostrap of cluster components like k3s"]}),"\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -u k3s"})," shows the logs of the k3s deployment"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]})]})}function j(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(x,{...e})}):x(e)}function b(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},9548:(e,n,t)=>{t.d(n,{Z:()=>r});const r="kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: volcano\n namespace: fleet-default\nspec:\n rkeConfig:\n machineGlobalConfig:\n etcd-expose-metrics: false\n profile: null\n machinePools:\n - controlPlaneRole: true\n etcdRole: true\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: fire-machine-selector\n name: fire-pool\n quantity: 1\n unhealthyNodeTimeout: 0s\n workerRole: true\n machineSelectorConfig:\n - config:\n protect-kernel-defaults: false\n registries: {}\n kubernetesVersion: v1.24.8+k3s1\n"},4713:(e,n,t)=>{t.d(n,{Z:()=>r});const r='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'},8260:(e,n,t)=>{t.d(n,{Z:()=>r});const r='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/mmcblk0\n debug: true\n disable-boot-entry: true\n registration:\n emulate-tpm: true\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'},5974:(e,n,t)=>{t.d(n,{Z:()=>r});const r="apiVersion: elemental.cattle.io/v1beta1\nkind: SeedImage\nmetadata:\n name: fire-img\n namespace: fleet-default\nspec:\n baseImage: registry.suse.com/rancher/elemental-teal-iso/5.4:1.2.2\n registrationRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineRegistration\n name: fire-nodes\n namespace: fleet-default\n"},3367:(e,n,t)=>{t.d(n,{Z:()=>r});const r="apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: fire-machine-selector\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n matchExpressions:\n - key: element\n operator: In\n values: [ 'fire' ]\n"},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>s});var r=t(7294);const i={},a=r.createContext(i);function s(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f3d26829.dd481f36.js b/assets/js/f3d26829.dd481f36.js new file mode 100644 index 000000000..295ebbe03 --- /dev/null +++ b/assets/js/f3d26829.dd481f36.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[2530],{1126:(e,n,t)=>{t.d(n,{ZP:()=>s});var r=t(5893),i=t(1151);function a(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components},{TabItem:t,Tabs:a}=n;return t||l("TabItem",!0),a||l("Tabs",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"install-elemental-operator",children:"Install Elemental Operator"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"elemental-operator"})," is the management endpoint, running the management\ncluster and taking care of creating inventories, registrations for machines and much more."]}),"\n",(0,r.jsx)(n.p,{children:"We will use the Helm package manager to install the elemental-operator chart into our cluster."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.suse.com/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.suse.com/rancher/elemental-operator-chart\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Now after a few seconds you should see the operator pod appear on the ",(0,r.jsx)(n.code,{children:"cattle-elemental-system"})," namespace:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl get pods -n cattle-elemental-system\nNAME READY STATUS RESTARTS AGE\nelemental-operator-64f88fc695-b8qhn 1/1 Running 0 16s\n"})}),"\n",(0,r.jsx)(n.admonition,{title:"Helm v3.8.0+ required",type:"info",children:(0,r.jsx)(n.p,{children:"The Elemental Operator chart is distributed via an OCI registry: Helm correctly supports OCI based registries starting from the v3.8.0 release."})}),"\n",(0,r.jsx)(n.admonition,{title:"Swap charts installation order when upgrading from elemental-operator release < 1.2.4",type:"warning",children:(0,r.jsx)(n.p,{children:"When upgrading from an elemental-operator release embedding the Elemental CRDs (version < 1.2.4) the elemental-operator-crds chart installation will fail.\nYou will need to upgrade the elemental-operator chart first, and only then install the elemental-operator-crds chart."})}),"\n",(0,r.jsx)(n.h3,{id:"non-stable-installations",children:"Non-stable installations"}),"\n",(0,r.jsxs)(n.p,{children:["Besides the Helm charts listed above, there are two other ",(0,r.jsx)(n.code,{children:"non-stable"}),"\nversions available."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Staging:"})," refers to the latest tagged release from Github. This is documented in the ",(0,r.jsx)(n.a,{href:"next/quickstart-ui",children:"Next"})," pages."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Development:"})," refers to the 'tip of HEAD' from Github. This is the ongoing development version and changes constantly."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(a,{children:[(0,r.jsx)(t,{value:"stagingOperator",label:"Staging version (x86-64, ARM64 (Raspberry Pi 4))",default:!0,children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.opensuse.org/isv/rancher/elemental/staging/charts/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.opensuse.org/isv/rancher/elemental/staging/charts/rancher/elemental-operator-chart\n"})})}),(0,r.jsxs)(t,{value:"develOperator",label:"Development version (x86-64, ARM64 (Raspberry Pi 4))",default:!0,children:[(0,r.jsx)(n.admonition,{title:"Reminder",type:"warning",children:(0,r.jsx)(n.p,{children:"The development version is not recommended for production environments. We welcome feedback via Slack or Github issues, but it could be unstable and contain experimental features that can be dropped without notice."})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.opensuse.org/isv/rancher/elemental/dev/charts/rancher/elemental-operator-crds-chart\nhelm upgrade --create-namespace -n cattle-elemental-system --install --set image.imagePullPolicy=Always elemental-operator oci://registry.opensuse.org/isv/rancher/elemental/dev/charts/rancher/elemental-operator-chart\n"})})]})]}),"\n",(0,r.jsx)(n.h3,{id:"installation-options",children:"Installation options"}),"\n",(0,r.jsxs)(n.p,{children:["There are a few options that can be set in the chart install but that is out of scope for this document. You can see all the values on the chart ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/elemental-operator/blob/main/charts/operator/values.yaml",children:"values.yaml"}),"."]})]})}function s(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}function l(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},8297:(e,n,t)=>{t.d(n,{ZP:()=>s});var r=t(5893),i=t(1151);function a(e){const n={a:"a",code:"code",h2:"h2",li:"li",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["A Rancher server (v2.7.0 or later) configured (server-url set)","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["To configure the Rancher ",(0,r.jsx)(n.code,{children:"server-url"})," please check the ",(0,r.jsx)(n.a,{href:"https://rancher.com/docs/rancher/v2.6/en/admin-settings/#first-log-in",children:"Rancher docs"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["A machine (bare metal or virtualized) with TPM 2.0","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Hint 1: Libvirt allows setting virtual TPMs for virtual machines ",(0,r.jsx)(n.a,{href:"tpm/#add-tpm-module-to-virtual-machine",children:"example here"})]}),"\n",(0,r.jsxs)(n.li,{children:["Hint 2: You can enable TPM emulation on bare metal machines missing the TPM 2.0 module ",(0,r.jsx)(n.a,{href:"tpm/#add-tpm-emulation-to-bare-metal-machine",children:"example here"})]}),"\n",(0,r.jsx)(n.li,{children:"Hint 3: Make sure you're using UEFI (not BIOS) on x86-64, or the ISO won't boot"}),"\n",(0,r.jsxs)(n.li,{children:["Hint 4: A minimum volume size of 25 GB is recommended. See the ",(0,r.jsx)(n.a,{href:"/1.2/installation#deployed-elemental-teal-partition-table",children:"Elemental Teal partition table"})," for more details"]}),"\n",(0,r.jsxs)(n.li,{children:["Hint 5: CPU and RAM requirements depend on the Kubernetes version installed, for example ",(0,r.jsx)(n.a,{href:"https://docs.k3s.io/installation/requirements#hardware",children:"K3s"})," or ",(0,r.jsx)(n.a,{href:"https://docs.rke2.io/install/requirements#hardware",children:"RKE2"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Helm Package Manager (",(0,r.jsx)(n.a,{href:"https://helm.sh/",children:"https://helm.sh/"}),")"]}),"\n",(0,r.jsxs)(n.li,{children:["For ARM (aarch64) - One SD-card (32 GB or more, must be ",(0,r.jsx)(n.strong,{children:"fast"})," - 40MB/s write speed is acceptable) and a USB-stick for installation"]}),"\n"]})]})}function s(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},131:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>g,contentTitle:()=>u,default:()=>j,frontMatter:()=>m,metadata:()=>p,toc:()=>f});var r=t(5893),i=t(1151),a=t(9548),s=t(4713),l=t(8260),o=t(3367),c=t(8297),h=t(1126),d=t(5974);const m={sidebar_label:"Elemental the command line way",title:""},u="Elemental the command line way",p={id:"quickstart-cli",title:"",description:"Follow this guide to have an auto-deployed cluster via rke2/k3s and managed by Rancher",source:"@site/versioned_docs/version-1.2/quickstart-cli.md",sourceDirName:".",slug:"/quickstart-cli",permalink:"/1.2/quickstart-cli",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Elemental the command line way",title:""},sidebar:"docs",previous:{title:"Elemental the visual way",permalink:"/1.2/quickstart-ui"},next:{title:"Architecture",permalink:"/1.2/architecture"}},g={},f=[{value:"Prepare your kubernetes resources",id:"prepare-your-kubernetes-resources",level:2},{value:"Preparing the installation (seed) image",id:"preparing-the-installation-seed-image",level:2},{value:"Retrieving the prebuilt seed image",id:"retrieving-the-prebuilt-seed-image",level:4},{value:"Verifying the download",id:"verifying-the-download",level:5},{value:"Injecting the registration information",id:"injecting-the-registration-information",level:4},{value:"Writing the seed image to a USB stick",id:"writing-the-seed-image-to-a-usb-stick",level:4},{value:"Booting the Raspberry Pi",id:"booting-the-raspberry-pi",level:4},{value:"Selecting the right machines to join a cluster",id:"selecting-the-right-machines-to-join-a-cluster",level:3},{value:"How can I choose the kubernetes version and deployer for the cluster?",id:"how-can-i-choose-the-kubernetes-version-and-deployer-for-the-cluster",level:2},{value:"How can I follow what is going on behind the scenes?",id:"how-can-i-follow-what-is-going-on-behind-the-scenes",level:2}];function x(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components},{CodeBlock:t,Head:m,TabItem:u,Tabs:p}=n;return t||b("CodeBlock",!0),m||b("Head",!0),u||b("TabItem",!0),p||b("Tabs",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(m,{children:(0,r.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/quickstart-cli"})}),"\n","\n","\n",(0,r.jsx)(n.h1,{id:"elemental-the-command-line-way",children:"Elemental the command line way"}),"\n",(0,r.jsx)(n.p,{children:"Follow this guide to have an auto-deployed cluster via rke2/k3s and managed by Rancher\nwith the only help of an Elemental Teal ISO."}),"\n",(0,r.jsx)(c.ZP,{}),"\n",(0,r.jsx)(h.ZP,{}),"\n",(0,r.jsx)(n.h2,{id:"prepare-your-kubernetes-resources",children:"Prepare your kubernetes resources"}),"\n",(0,r.jsxs)(n.p,{children:["Node deployment starts with a ",(0,r.jsx)(n.code,{children:"MachineRegistration"}),", identifying a set of machines sharing the same configuration (disk drives, network, etc.)."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," is needed to perform the deployment of the Elemental OS on the target hosts. When booting up, each host registers to the Elemental Operator which tracks the new host with a ",(0,r.jsx)(n.code,{children:"MachineInventory"})," resource."]}),"\n",(0,r.jsxs)(n.p,{children:["Then it continues with having a Cluster resource that uses a ",(0,r.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," to know which machines are for that cluster."]}),"\n",(0,r.jsxs)(n.p,{children:["This selector is a simple matcher based on labels set in the ",(0,r.jsx)(n.code,{children:"MachineInventory"}),", so if your selector is matching on the label ",(0,r.jsx)(n.code,{children:"cluster-id"})," with a value ",(0,r.jsx)(n.code,{children:"cluster-id-val"}),"\nand your ",(0,r.jsx)(n.code,{children:"MachineInventory"})," has that same ",(0,r.jsx)(n.code,{children:"cluster-id"}),":",(0,r.jsx)(n.code,{children:"cluster-id-val"})," label, it will match and be bootstrapped as part of the cluster."]}),"\n",(0,r.jsxs)(n.p,{children:["In this quickstart we are going to deploy the resources to provision a cluster named ",(0,r.jsx)(n.em,{children:"volcano"})," that will match on ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s with the label ",(0,r.jsx)(n.em,{children:"element"}),":",(0,r.jsx)(n.em,{children:"fire"}),"."]}),"\n",(0,r.jsxs)(p,{children:[(0,r.jsxs)(u,{value:"manualYaml",label:"Manually creating the resource yamls",default:!0,children:[(0,r.jsx)(n.p,{children:"You will need to create the following files:"}),(0,r.jsx)(t,{language:"yaml",title:"selector.yaml",showLineNumbers:!0,children:o.Z}),(0,r.jsxs)(n.p,{children:["As you can see this is a very simple selector that looks for ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s having a label with the key ",(0,r.jsx)(n.code,{children:"element"})," and the value ",(0,r.jsx)(n.code,{children:"fire"}),"."]}),(0,r.jsx)(t,{language:"yaml",title:"cluster.yaml",showLineNumbers:!0,children:a.Z}),(0,r.jsxs)(n.p,{children:["As you can see the ",(0,r.jsx)(n.code,{children:"machineConfigRef"})," is of kind ",(0,r.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," with the name ",(0,r.jsx)(n.code,{children:"fire-machine-selector"}),": it matches the selector we created."]}),(0,r.jsxs)(n.p,{children:["You can get more information about cluster options like ",(0,r.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/reference-guides/cluster-configuration/rancher-server-configuration/rke2-cluster-configuration#machineglobalconfig",children:(0,r.jsx)(n.code,{children:"machineGlobalConfig"})})," or ",(0,r.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com/reference-guides/cluster-configuration/rancher-server-configuration/rke2-cluster-configuration#machineselectorconfig",children:(0,r.jsx)(n.code,{children:"machineSelectorConfig"})})," directly in the ",(0,r.jsx)(n.a,{href:"https://ranchermanager.docs.rancher.com",children:"Rancher Manager documentation"}),"."]}),(0,r.jsxs)(p,{children:[(0,r.jsx)(u,{value:"normalRegistration",label:"Registration",default:!0,children:(0,r.jsx)(t,{language:"yaml",title:"registration.yaml",showLineNumbers:!0,children:s.Z})}),(0,r.jsxs)(u,{value:"rpiRegistration",label:"Registration for Raspberry Pi",default:!0,children:[(0,r.jsx)(t,{language:"yaml",title:"rpi-registration.yaml",showLineNumbers:!0,children:l.Z}),(0,r.jsxs)(n.p,{children:["For deployment on Raspberry Pi, you need to enable emulated TPM\n(except you have ",(0,r.jsx)(n.a,{href:"https://thepihut.com/products/letstrust-tpm-for-raspberry-pi",children:"a hardware TPM for Raspberry Pi"}),").\nYou also need to disable writing to the EFI store (since Raspberry Pi doesn't have one) via ",(0,r.jsx)(n.code,{children:"disable-boot-entry: true"}),"."]})]})]}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," defines the registration and installation configuration. Once created, the Elemental operator exposes a unique URL to be used with the ",(0,r.jsx)(n.code,{children:"elemental-register"})," binary to reach out to the management cluster and register the machine during installation: if the registration is successful, the operator creates a ",(0,r.jsx)(n.code,{children:"MachineInventory"})," tracking the machine, which can be used to provision the machine as a node of our cluster.\nWe define the label matching our selector here, although it can also be added later to the created ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s."]}),(0,r.jsxs)(n.admonition,{title:"warning",type:"warning",children:[(0,r.jsx)(n.p,{children:"Make sure to modify the registration.yaml above to set the proper install device to point to a valid device based on your node configuration (i.e. /dev/sda, /dev/vda, /dev/nvme0, etc...)."}),(0,r.jsxs)(n.p,{children:["The SD-card on a Raspberry Pi is usually ",(0,r.jsx)(n.code,{children:"/dev/mmcblk0"}),"."]})]}),(0,r.jsxs)(p,{children:[(0,r.jsxs)(u,{value:"seedImagex86",label:"Seed Image (x86_64)",default:!0,children:[(0,r.jsx)(t,{language:"yaml",title:"seedimage.yaml",showLineNumbers:!0,children:d.Z}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"SeedImage"})," is required to generate the ",(0,r.jsx)(n.em,{children:"seed image"})," (like a bootable ISO) that will boot and start the Elemental provisioning on the target machines."]}),(0,r.jsx)(n.p,{children:"Now that we have defined all the configuration files let's apply them to create the proper resources in Kubernetes:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f selector.yaml \nkubectl apply -f cluster.yaml \nkubectl apply -f registration.yaml\nkubectl apply -f seedimage.yaml\n"})})]}),(0,r.jsxs)(u,{value:"seedImagerpi",label:"Seed Image for Raspberry Pi",default:!0,children:[(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource, which automates the creation of an Elemental bootable image (the ",(0,r.jsx)(n.em,{children:"seed image"}),"), does not support Raspberry Pi yet.\nWe will generate a ",(0,r.jsx)(n.em,{children:"seed image"})," manually in the ",(0,r.jsx)(n.a,{href:"/1.2/quickstart-cli#preparing-the-installation-seed-image",children:"next section"}),"."]}),(0,r.jsx)(n.p,{children:"Now that we have defined all the configuration files let's apply them to create the proper resources in Kubernetes:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"kubectl apply -f selector.yaml \nkubectl apply -f cluster.yaml \nkubectl apply -f registration.yaml\n"})})]})]})]}),(0,r.jsxs)(u,{value:"repofiles",label:"Using quickstart files from Elemental docs repo directly",children:[(0,r.jsxs)(n.p,{children:["You can directly apply the quickstart example resource files from the ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/elemental-docs",children:"Elemental docs repository"}),"."]}),(0,r.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,r.jsxs)(n.p,{children:["The quickstart example resource files assume the default storage of the target host to be mapped to the ",(0,r.jsx)(n.code,{children:"/dev/sda"}),".\nIf your host storage device file is different, you have to change the registration.yaml file before applying it, changing the ",(0,r.jsx)(n.code,{children:"config.elemental.install.device"})," accordingly."]})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:"showLineNumbers",children:"kubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/selector.yaml\nkubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/cluster.yaml\nkubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/registration.yaml\nkubectl apply -f https://raw.githubusercontent.com/rancher/elemental-docs/main/examples/quickstart/seedimage.yaml (not for aarch64 yet)\n"})})]})]}),"\n",(0,r.jsx)(n.h2,{id:"preparing-the-installation-seed-image",children:"Preparing the installation (seed) image"}),"\n",(0,r.jsx)(n.p,{children:"This is the last step: you need an Elemental Teal seed image that includes the initial registration config, so it can be auto registered, installed and fully deployed as part of your cluster."}),"\n",(0,r.jsxs)(n.admonition,{title:"note",type:"note",children:[(0,r.jsxs)(n.p,{children:["The initial registration config file is generated when you create a ",(0,r.jsx)(n.code,{children:"Machine Registration"}),"."]}),(0,r.jsx)(n.p,{children:"You can download it with:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:'wget --no-check-certificate `kubectl get machineregistration -n fleet-default fire-nodes -o jsonpath="{.status.registrationURL}"` -O initial-registration.yaml\n'})})]}),"\n",(0,r.jsx)(n.p,{children:"The contents of the registration config file are nothing more than the registration URL that the node needs to register, the proper server certificate and few options for the registration process."}),"\n",(0,r.jsx)(n.p,{children:"Once generated, a seed image can be used to provision any number of machines."}),"\n",(0,r.jsxs)(p,{children:[(0,r.jsxs)(u,{value:"download",label:"Downloading the quickstart ISO",children:[(0,r.jsxs)(n.p,{children:["The seed image created by the ",(0,r.jsx)(n.code,{children:"SeedImage"})," resource above can be downloaded as an ISO via the following script:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:'kubectl wait --for=condition=ready pod -n fleet-default fire-img\nwget --no-check-certificate `kubectl get seedimage -n fleet-default fire-img -o jsonpath="{.status.downloadURL}"` -O elemental-teal.x86_64.iso\n'})}),(0,r.jsxs)(n.p,{children:["The first command waits for the ISO to be built and ready, the second one downloads it in the current directory with the name ",(0,r.jsx)(n.code,{children:"elemental-teal-x86_64.iso"}),"."]})]}),(0,r.jsxs)(u,{value:"manual_iso",label:"Preparing the seed image (x86_64) manually",children:[(0,r.jsxs)(n.p,{children:["If you created a ",(0,r.jsx)(n.a,{href:"customizing#create-a-custom-bootable-installation-media",children:"customized ISO"}),",\nyou can use the ",(0,r.jsx)(n.a,{href:"https://github.com/rancher/elemental/blob/main/.github/elemental-iso-add-registration",children:(0,r.jsx)(n.code,{children:"elemental-iso-add-registration"})}),"\nscript to add the registration config file"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"elemental-iso-add-registration initial-registration.yaml my-customized.iso\n"})})]}),(0,r.jsxs)(u,{value:"manual_raw",label:"Preparing the seed image (aarch64) manually",children:[(0,r.jsx)(n.p,{children:"Elemental's support for Raspberry Pi is primarily for demonstration purposes at this point. Therefore the installation process is modelled similar to x86-64. You boot from a seed image (an USB stick in this case) and install to a storage medium (SD-card for Raspberry Pi)."}),(0,r.jsx)(n.h4,{id:"retrieving-the-prebuilt-seed-image",children:"Retrieving the prebuilt seed image"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable:/Teal53/images/rpi.raw\n"})}),(0,r.jsx)(n.h5,{id:"verifying-the-download",children:"Verifying the download"}),(0,r.jsx)(n.p,{children:"In order to verify the integrity of the downloaded artifacts, you\nshould do a checksum verification:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"wget -q https://download.opensuse.org/repositories/isv:/Rancher:/Elemental:/Stable:/Teal53/images/rpi.raw.sha256\nsha256sum -c rpi.raw.sha256\n"})}),(0,r.jsxs)(n.p,{children:["This should print ",(0,r.jsx)(n.code,{children:"rpi.raw: OK"})," as output."]}),(0,r.jsx)(n.h4,{id:"injecting-the-registration-information",children:"Injecting the registration information"}),(0,r.jsxs)(n.p,{children:["Adding the ",(0,r.jsx)(n.code,{children:"initial-registration.yaml"})," isn't scripted yet. This is still a manual process:"]}),(0,r.jsxs)(n.p,{children:["The written USB stick will have two partitions. ",(0,r.jsx)(n.code,{children:"RPI_BOOT"})," contains the boot loader files and ",(0,r.jsx)(n.code,{children:"COS_LIVE"})," the Elemental files.\nMount the ",(0,r.jsx)(n.code,{children:"COS_LIVE"})," partition and write ",(0,r.jsx)(n.code,{children:"initial-registration.yaml"})," as ",(0,r.jsx)(n.code,{children:"livecd-cloud-config.yaml"})," to this partition."]}),(0,r.jsx)(n.p,{children:"If you've mounted the USB stick with a file manager, this command should work to copy the registration information:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"sudo cp initial-registration.yaml /run/media/$USER/COS_LIVE/livecd-cloud-config.yaml\n"})}),(0,r.jsx)(n.p,{children:"If you prefer using some CLI tools:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:"IMAGE=rpi.raw\nDEST=$(mktemp -d)\n\nSECTORSIZE=$(sfdisk -J ${IMAGE} | jq '.partitiontable.sectorsize')\nDATAPARTITIONSTART=$(sfdisk -J ${IMAGE} | jq '.partitiontable.partitions[1].start')\nsudo mount -o rw,loop,offset=$((${SECTORSIZE}*${DATAPARTITIONSTART})) ${IMAGE} ${DEST}\nsudo cp initial-registration.yaml ${DEST}/livecd-cloud-config.yaml\nsudo umount ${DEST}\nrmdir ${DEST}\n"})}),(0,r.jsx)(n.h4,{id:"writing-the-seed-image-to-a-usb-stick",children:"Writing the seed image to a USB stick"}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:".raw"})," image needs to be written to a USB stick to boot from. This can be done with ",(0,r.jsx)(n.code,{children:"dd"})," on the Linux command line if you're comfortable with this command.\n",(0,r.jsx)(n.a,{href:"https://www.opensuse.org",children:"openSUSE"})," has nice instructions on how to write an image to a storage medium for ",(0,r.jsx)(n.a,{href:"https://en.opensuse.org/SDB:Live_USB_stick",children:"Linux"}),",\n",(0,r.jsx)(n.a,{href:"https://en.opensuse.org/SDB:Create_a_Live_USB_stick_using_Windows",children:"Windows"}),", and ",(0,r.jsx)(n.a,{href:"https://en.opensuse.org/SDB:Create_a_Live_USB_stick_using_macOS",children:"OS X"}),"."]}),(0,r.jsx)(n.h4,{id:"booting-the-raspberry-pi",children:"Booting the Raspberry Pi"}),(0,r.jsx)(n.p,{children:"Now unmount the USB stick and plug it into your Raspberry Pi."}),(0,r.jsxs)(n.p,{children:["Plug a large (32 GB or more) and ",(0,r.jsx)(n.strong,{children:"fast"})," (!!) micro SD-card into the respective slot."]}),(0,r.jsx)(n.p,{children:"Connect the system to ethernet."}),(0,r.jsx)(n.p,{children:"A powercycle will reboot the Pi. Everything else is identical to x86-64."}),(0,r.jsx)(n.admonition,{title:"warning",type:"warning",children:(0,r.jsx)(n.p,{children:"Make sure the micro SD-card is unpartitioned. Otherwise the Pi bootloader will try to boot from it and fail."})})]})]}),"\n",(0,r.jsx)(n.p,{children:"You can now boot your nodes with this image and they will:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Register with the registrationURL given and create a per-machine ",(0,r.jsx)(n.code,{children:"MachineInventory"})]}),"\n",(0,r.jsx)(n.li,{children:"Install Elemental Teal to the given device"}),"\n",(0,r.jsx)(n.li,{children:"Reboot"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"selecting-the-right-machines-to-join-a-cluster",children:"Selecting the right machines to join a cluster"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"MachineInventorySelectorTemplate"})," selects the machines needed to provision the cluster from the ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s having the ",(0,r.jsxs)(n.em,{children:["element",":fire"]})," label.\nWe have added the ",(0,r.jsx)(n.em,{children:"element"}),":",(0,r.jsx)(n.em,{children:"fire"})," label in the ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," ",(0,r.jsx)(n.code,{children:"machineInventoryLabels"})," map, so all the ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s originated from it already have the label.\nOne could anyway skip the label from the ",(0,r.jsx)(n.code,{children:"MachineRegistration"})," and add it later:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",metastring:"showLineNumbers",children:'kubectl -n fleet-default label machineinventory $(kubectl get machineinventory -n fleet-default --no-headers -o custom-columns=":metadata.name") element=fire\n'})}),"\n",(0,r.jsxs)(n.p,{children:["As soon as ",(0,r.jsx)(n.code,{children:"MachineInventory"}),"s with the ",(0,r.jsx)(n.em,{children:"element"}),":",(0,r.jsx)(n.em,{children:"fire"})," are present, the corresponding machines auto-deploy the cluster via the chosen provider (k3s/rke)."]}),"\n",(0,r.jsx)(n.p,{children:"After a few minutes your new cluster will be fully provisioned!!"}),"\n",(0,r.jsx)(n.h2,{id:"how-can-i-choose-the-kubernetes-version-and-deployer-for-the-cluster",children:"How can I choose the kubernetes version and deployer for the cluster?"}),"\n",(0,r.jsxs)(n.p,{children:["In your cluster.yaml file there is a key in the ",(0,r.jsx)(n.code,{children:"Spec"})," called ",(0,r.jsx)(n.code,{children:"kubernetesVersion"}),". That sets the version and deployer that will be used for the cluster,\nfor example Kubernetes",(0,r.jsx)(n.code,{children:"v1.24.8"})," for rke2 would be ",(0,r.jsx)(n.code,{children:"v1.24.8+rke2r1"})," and for k3s ",(0,r.jsx)(n.code,{children:"v1.24.8+k3s1"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["To see all compatible versions check the ",(0,r.jsx)(n.a,{href:"https://www.suse.com/suse-rancher/support-matrix/all-supported-versions/",children:"Rancher Support Matrix"})," PDF for rke/rke2/k3s versions and their components."]}),"\n",(0,r.jsxs)(n.p,{children:["You can also check our ",(0,r.jsx)(n.a,{href:"/1.2/kubernetesversions",children:"Version doc"})," to know how to obtain those versions."]}),"\n",(0,r.jsxs)(n.p,{children:["Check our ",(0,r.jsx)(n.a,{href:"/1.2/cluster-reference",children:"Cluster Spec"})," page for more info about the ",(0,r.jsx)(n.code,{children:"Cluster"})," resource."]}),"\n",(0,r.jsx)(n.h2,{id:"how-can-i-follow-what-is-going-on-behind-the-scenes",children:"How can I follow what is going on behind the scenes?"}),"\n",(0,r.jsx)(n.p,{children:"You should be able to follow along what the machine is doing via:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["During ISO boot:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["ssh into the machine (user/pass: root/ros):","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -t elemental"})," shows you the progress of the registration (",(0,r.jsx)(n.em,{children:"elemental-register"}),") and the installation of Elemental (",(0,r.jsx)(n.em,{children:"elemental install"}),")."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Once the system is installed:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["On the Rancher UI -> ",(0,r.jsx)(n.code,{children:"Cluster Management"})," allows you to see your new cluster and the ",(0,r.jsx)(n.code,{children:"Provisioning Log"})," in the cluster details"]}),"\n",(0,r.jsxs)(n.li,{children:["ssh into the machine (user/pass: Whatever your configured on the registration.yaml under ",(0,r.jsx)(n.code,{children:"Spec.config.cloud-config.users"}),"):","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -u elemental-system-agent"})," shows the output of the initial elemental config and the installation of the ",(0,r.jsx)(n.code,{children:"rancher-system-agent"})]}),"\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -u rancher-system-agent"})," shows the output of the boostrap of cluster components like k3s"]}),"\n",(0,r.jsxs)(n.li,{children:["running ",(0,r.jsx)(n.code,{children:"journalctl -f -u k3s"})," shows the logs of the k3s deployment"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]})]})}function j(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(x,{...e})}):x(e)}function b(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},9548:(e,n,t)=>{t.d(n,{Z:()=>r});const r="kind: Cluster\napiVersion: provisioning.cattle.io/v1\nmetadata:\n name: volcano\n namespace: fleet-default\nspec:\n rkeConfig:\n machineGlobalConfig:\n etcd-expose-metrics: false\n profile: null\n machinePools:\n - controlPlaneRole: true\n etcdRole: true\n machineConfigRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineInventorySelectorTemplate\n name: fire-machine-selector\n name: fire-pool\n quantity: 1\n unhealthyNodeTimeout: 0s\n workerRole: true\n machineSelectorConfig:\n - config:\n protect-kernel-defaults: false\n registries: {}\n kubernetesVersion: v1.24.8+k3s1\n"},4713:(e,n,t)=>{t.d(n,{Z:()=>r});const r='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/sda\n debug: true\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'},8260:(e,n,t)=>{t.d(n,{Z:()=>r});const r='apiVersion: elemental.cattle.io/v1beta1\nkind: MachineRegistration\nmetadata:\n name: fire-nodes\n namespace: fleet-default\nspec:\n config:\n cloud-config:\n users:\n - name: root\n passwd: root\n elemental:\n install:\n reboot: true\n device: /dev/mmcblk0\n debug: true\n disable-boot-entry: true\n registration:\n emulate-tpm: true\n machineInventoryLabels:\n element: fire\n manufacturer: "${System Information/Manufacturer}"\n productName: "${System Information/Product Name}"\n serialNumber: "${System Information/Serial Number}"\n machineUUID: "${System Information/UUID}"\n'},5974:(e,n,t)=>{t.d(n,{Z:()=>r});const r="apiVersion: elemental.cattle.io/v1beta1\nkind: SeedImage\nmetadata:\n name: fire-img\n namespace: fleet-default\nspec:\n baseImage: registry.suse.com/rancher/elemental-teal-iso/5.4:1.2.2\n registrationRef:\n apiVersion: elemental.cattle.io/v1beta1\n kind: MachineRegistration\n name: fire-nodes\n namespace: fleet-default\n"},3367:(e,n,t)=>{t.d(n,{Z:()=>r});const r="apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: fire-machine-selector\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n matchExpressions:\n - key: element\n operator: In\n values: [ 'fire' ]\n"},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>s});var r=t(7294);const i={},a=r.createContext(i);function s(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f86526c6.e5951dc1.js b/assets/js/f86526c6.d48d5fad.js similarity index 91% rename from assets/js/f86526c6.e5951dc1.js rename to assets/js/f86526c6.d48d5fad.js index 07a80038b..60f08eb4c 100644 --- a/assets/js/f86526c6.e5951dc1.js +++ b/assets/js/f86526c6.d48d5fad.js @@ -1 +1 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[3839],{8559:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var l=n(5893),i=n(1151);const s={sidebar_label:"Installation",title:""},r="Installation",a={id:"installation",title:"",description:"Overview",source:"@site/versioned_docs/version-1.2/installation.md",sourceDirName:".",slug:"/installation",permalink:"/1.2/installation",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Installation",title:""},sidebar:"docs",previous:{title:"Architecture",permalink:"/1.2/architecture"},next:{title:"Upgrade",permalink:"/1.2/upgrade"}},d={},c=[{value:"Overview",id:"overview",level:2},{value:"Elemental Operator Installation",id:"elemental-operator-installation",level:2},{value:"Prepare Kubernetes Resources",id:"prepare-kubernetes-resources",level:2},{value:"Prepare Installation Media",id:"prepare-installation-media",level:2},{value:"Start Installation Process",id:"start-installation-process",level:2},{value:"Deployed Elemental Teal Partition Table",id:"deployed-elemental-teal-partition-table",level:2},{value:"Elemental Teal Immutable Root",id:"elemental-teal-immutable-root",level:2}];function o(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components},{Vars:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Vars",!0),(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(t.h1,{id:"installation",children:"Installation"}),"\n",(0,l.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,l.jsxs)(t.p,{children:["Elemental stack provides OS management using OCI containers and Kubernetes. The Elemental\nstack installation encompasses the installation of the ",(0,l.jsx)(n,{name:"elemental_operator_name"})," into the\nmanagement cluster and the creation and use of Elemental Teal installation media to\nprovide the OS into the Cluster Nodes. See ",(0,l.jsx)(t.a,{href:"/1.2/architecture",children:"Architecture"})," section to read about the\ninteraction of the components."]}),"\n",(0,l.jsxs)(t.p,{children:["The installation configuration is mostly applied and set as part of the registration process.\nThe registration process is done by the ",(0,l.jsx)(t.code,{children:"elemental-register"})," (the ",(0,l.jsx)(n,{name:"elemental_operator_name"})," client part)\nwho is the responsible to register nodes in a Rancher management cluster and fetch the installation configuration."]}),"\n",(0,l.jsxs)(t.p,{children:["Please refer to the ",(0,l.jsx)(t.a,{href:"/1.2/quickstart-cli",children:"Quick Start"})," guide for simple step by step deployment instructions."]}),"\n",(0,l.jsx)(t.h2,{id:"elemental-operator-installation",children:"Elemental Operator Installation"}),"\n",(0,l.jsxs)(t.p,{children:["The ",(0,l.jsx)(n,{name:"elemental_operator_name"})," is responsible for managing the Elemental versions and\nmaintaining a machine inventory to assist with edge or bare metal installations. ",(0,l.jsx)(n,{name:"elemental_operator_name"}),"\nrequires a cluster including the Rancher Manager and it can be installed with a helm chart."]}),"\n",(0,l.jsxs)(t.p,{children:["See ",(0,l.jsx)(n,{name:"elemental_operator_name"})," ",(0,l.jsx)(t.a,{href:"/1.2/elementaloperatorchart-reference",children:"helm chart reference"})," for install,\nuninstall, upgrade and configuration details."]}),"\n",(0,l.jsx)(t.h2,{id:"prepare-kubernetes-resources",children:"Prepare Kubernetes Resources"}),"\n",(0,l.jsxs)(t.p,{children:["Once the ",(0,l.jsx)(n,{name:"elemental_operator_name"})," is up and running within the management cluster a couple of kubernetes\nresources are required in order to prepare an Elemental based cluster deployment."]}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsxs)(t.li,{children:["\n",(0,l.jsxs)(t.p,{children:[(0,l.jsx)(t.a,{href:"/1.2/machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate"}),":\nThis resource identifies the criteria to match registered boxes (listed as part of the MachineInventory)\nagainst available Rancher 2.6 Clusters. As soon as there is a match the selected kubernetes cluster takes\nownership of the registered box."]}),"\n"]}),"\n",(0,l.jsxs)(t.li,{children:["\n",(0,l.jsxs)(t.p,{children:[(0,l.jsx)(t.a,{href:"/1.2/machineregistration-reference",children:"MachineRegistration"}),":\nThis resource defines OS deployment details for any machine attempting to register. The machine\nregistration is the entrance for Elemental nodes as it handles the authentication (based on TPM),\nthe Elemental Teal deployment and the node inclusion into to the MachineInventory so it can be added\nto a cluster when there is a match based on a MachineInventorySelectorTemplate. The MachineRegistration\nobject includes the machine registration URL that nodes use to register against it."]}),"\n"]}),"\n"]}),"\n",(0,l.jsxs)(t.p,{children:["A Rancher Cluster resource is also required to deploy Elemental, it can be manually created as exemplified in\nthe ",(0,l.jsx)(t.a,{href:"/1.2/quickstart-cli",children:"Quick Start"})," guide or created from the Rancher 2.6 UI."]}),"\n",(0,l.jsx)(t.h2,{id:"prepare-installation-media",children:"Prepare Installation Media"}),"\n",(0,l.jsxs)(t.p,{children:["The installation media is the media that will be used to kick start an Elemental Teal deployment. Currently\nthe supported media is a live ISO. The live ISO must include the registration configuration yaml hence it must\ncrafted once the MachineRegistration is created. The installation media is created by using the ",(0,l.jsx)(t.a,{href:"https://github.com/rancher/elemental/blob/main/.github/elemental-iso-add-registration",children:(0,l.jsx)(t.code,{children:"elemental-iso-add-registration"})}),"\nhelper script (see ",(0,l.jsx)(t.a,{href:"/1.2/quickstart-cli#preparing-the-iso",children:"quick start"})," guide)\nor by using the ",(0,l.jsx)(t.code,{children:"elemental build-iso"})," command line utility included as part of the ",(0,l.jsx)(n,{name:"elemental_toolkit_name",link:"elemental_toolkit_url/docs/creating-derivatives/build_iso"}),"."]}),"\n",(0,l.jsxs)(t.p,{children:["Within MachineRegistration only a subset of OS installation parameters can be configured, all available parameters are listed\nat ",(0,l.jsx)(t.a,{href:"/1.2/machineregistration-reference",children:"MachineRegistration"})," reference page."]}),"\n",(0,l.jsxs)(t.p,{children:["In order to configure the installation beyond the common options provided within the\n",(0,l.jsx)(t.a,{href:"/1.2/machineregistration-reference#configelementalinstall",children:(0,l.jsx)(t.code,{children:"elemental.install"})})," section a ",(0,l.jsx)(t.code,{children:"config.yaml"}),"\nconfiguration file can be included into the ISO (see ",(0,l.jsx)(t.a,{href:"/1.2/customizing#custom-elemental-client-configuration-file",children:"Custom Images"}),").\nNote any configuration applied as part of ",(0,l.jsx)(t.code,{children:"elemental.install"})," section of the MachineRegistration will be\napplied on top of the settings included in any custom ",(0,l.jsx)(t.code,{children:"config.yaml"})," file."]}),"\n",(0,l.jsxs)(t.p,{children:["Most likely the cloud-init configuration is enough to configure and set the deployed node at boot, however\nif for some reason firstboot actions or scripts are required it is possible to also include\nRancher System Agent plans into the installation media. Refer to the ",(0,l.jsx)(t.a,{href:"/1.2/elemental-plans",children:"Elemental Plans"})," section for details and\nsome example plans. The plans could be included into the squashed rootfs at ",(0,l.jsx)(t.code,{children:"/var/lib/elemental/agent/plans"}),"\nfolder and they would be seen by the system agent at firstboot."]}),"\n",(0,l.jsx)(t.h2,{id:"start-installation-process",children:"Start Installation Process"}),"\n",(0,l.jsxs)(t.p,{children:["The installation starts by booting the installation media on a node. Once the installation media has booted it will\nattempt to contact the management cluster and register to it by calling ",(0,l.jsx)(t.code,{children:"elemental-register"})," command.\nAs the registration yaml configuration is already included into the ISO ",(0,l.jsx)(t.code,{children:"elemental-register"})," knows the registration URL and\nany other required data for the registration."]}),"\n",(0,l.jsx)(t.p,{children:"On a succeeded registration the installation media will start the Elemental Teal installation into the host based\non the configuration already included in the media and the MachineRegistration parameters. As soon as the installation\nis done the node is ready to reboot. The deployed Elemental Teal includes a system agent plan to\nkick start a regular rancher provisioning process to install the selected kubernetes version, once booted, after\nsome minutes the node installation is finalized and the node is included into the cluster and visible through\nthe Rancher UI."}),"\n",(0,l.jsx)(t.h2,{id:"deployed-elemental-teal-partition-table",children:"Deployed Elemental Teal Partition Table"}),"\n",(0,l.jsx)(t.p,{children:"Once Elemental Teal is installed the OS partition table, according to default values, will look like"}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{children:"Label"}),(0,l.jsx)(t.th,{children:"Default Size"}),(0,l.jsx)(t.th,{children:"Contains"})]})}),(0,l.jsxs)(t.tbody,{children:[(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"COS_GRUB"}),(0,l.jsx)(t.td,{children:"64 MiB"}),(0,l.jsx)(t.td,{children:"UEFI Boot partition"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"COS_STATE"}),(0,l.jsx)(t.td,{children:"15 GiB"}),(0,l.jsx)(t.td,{children:"A/B bootable file system images constructed from OCI images"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"COS_OEM"}),(0,l.jsx)(t.td,{children:"64 MiB"}),(0,l.jsx)(t.td,{children:"OEM cloud-config files and other data"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"COS_RECOVERY"}),(0,l.jsx)(t.td,{children:"8 GiB"}),(0,l.jsx)(t.td,{children:"Recovery file system image if COS_STATE is destroyed"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"COS_PERSISTENT"}),(0,l.jsx)(t.td,{children:"Remaining space"}),(0,l.jsx)(t.td,{children:"All contents of the persistent folders"})]})]})]}),"\n",(0,l.jsxs)(t.p,{children:["Note this is the basic structure of any OS built by the ",(0,l.jsx)(n,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})]}),"\n",(0,l.jsx)(t.h2,{id:"elemental-teal-immutable-root",children:"Elemental Teal Immutable Root"}),"\n",(0,l.jsx)(t.p,{children:"One of the characteristics of Elemental OSes is the setup of an immutable root filesystem where some ephemeral or\npersistent locations are applied on top of it. Elemental Teal default folders structure is listed in the\nmatrix below."}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{children:"Path"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"Read-Only"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"Ephemeral"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"Persistent"})]})}),(0,l.jsxs)(t.tbody,{children:[(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/etc"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/etc/cni"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/etc/iscsi"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/etc/rancher"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/etc/ssh"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/etc/systemd"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/srv"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/home"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/opt"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/root"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/var"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/usr/libexec"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/var/lib/cni"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/var/lib/kubelet"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/var/lib/longhorn"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/var/lib/rancher"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/var/lib/elemetal"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/var/lib/NetworkManager"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/var/lib/calico"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/var/log"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]})]})]})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,l.jsx)(t,{...e,children:(0,l.jsx)(o,{...e})}):o(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>r});var l=n(7294);const i={},s=l.createContext(i);function r(e){const t=l.useContext(s);return l.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),l.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[3839],{8559:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var l=n(5893),i=n(1151);const s={sidebar_label:"Installation",title:""},r="Installation",a={id:"installation",title:"",description:"Overview",source:"@site/versioned_docs/version-1.2/installation.md",sourceDirName:".",slug:"/installation",permalink:"/1.2/installation",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"Installation",title:""},sidebar:"docs",previous:{title:"Architecture",permalink:"/1.2/architecture"},next:{title:"Upgrade",permalink:"/1.2/upgrade"}},d={},c=[{value:"Overview",id:"overview",level:2},{value:"Elemental Operator Installation",id:"elemental-operator-installation",level:2},{value:"Prepare Kubernetes Resources",id:"prepare-kubernetes-resources",level:2},{value:"Prepare Installation Media",id:"prepare-installation-media",level:2},{value:"Start Installation Process",id:"start-installation-process",level:2},{value:"Deployed Elemental Teal Partition Table",id:"deployed-elemental-teal-partition-table",level:2},{value:"Elemental Teal Immutable Root",id:"elemental-teal-immutable-root",level:2}];function o(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components},{Head:n,Vars:s}=t;return n||x("Head",!0),s||x("Vars",!0),(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n,{children:(0,l.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/installation"})}),"\n",(0,l.jsx)(t.h1,{id:"installation",children:"Installation"}),"\n",(0,l.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,l.jsxs)(t.p,{children:["Elemental stack provides OS management using OCI containers and Kubernetes. The Elemental\nstack installation encompasses the installation of the ",(0,l.jsx)(s,{name:"elemental_operator_name"})," into the\nmanagement cluster and the creation and use of Elemental Teal installation media to\nprovide the OS into the Cluster Nodes. See ",(0,l.jsx)(t.a,{href:"/1.2/architecture",children:"Architecture"})," section to read about the\ninteraction of the components."]}),"\n",(0,l.jsxs)(t.p,{children:["The installation configuration is mostly applied and set as part of the registration process.\nThe registration process is done by the ",(0,l.jsx)(t.code,{children:"elemental-register"})," (the ",(0,l.jsx)(s,{name:"elemental_operator_name"})," client part)\nwho is the responsible to register nodes in a Rancher management cluster and fetch the installation configuration."]}),"\n",(0,l.jsxs)(t.p,{children:["Please refer to the ",(0,l.jsx)(t.a,{href:"/1.2/quickstart-cli",children:"Quick Start"})," guide for simple step by step deployment instructions."]}),"\n",(0,l.jsx)(t.h2,{id:"elemental-operator-installation",children:"Elemental Operator Installation"}),"\n",(0,l.jsxs)(t.p,{children:["The ",(0,l.jsx)(s,{name:"elemental_operator_name"})," is responsible for managing the Elemental versions and\nmaintaining a machine inventory to assist with edge or bare metal installations. ",(0,l.jsx)(s,{name:"elemental_operator_name"}),"\nrequires a cluster including the Rancher Manager and it can be installed with a helm chart."]}),"\n",(0,l.jsxs)(t.p,{children:["See ",(0,l.jsx)(s,{name:"elemental_operator_name"})," ",(0,l.jsx)(t.a,{href:"/1.2/elementaloperatorchart-reference",children:"helm chart reference"})," for install,\nuninstall, upgrade and configuration details."]}),"\n",(0,l.jsx)(t.h2,{id:"prepare-kubernetes-resources",children:"Prepare Kubernetes Resources"}),"\n",(0,l.jsxs)(t.p,{children:["Once the ",(0,l.jsx)(s,{name:"elemental_operator_name"})," is up and running within the management cluster a couple of kubernetes\nresources are required in order to prepare an Elemental based cluster deployment."]}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsxs)(t.li,{children:["\n",(0,l.jsxs)(t.p,{children:[(0,l.jsx)(t.a,{href:"/1.2/machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate"}),":\nThis resource identifies the criteria to match registered boxes (listed as part of the MachineInventory)\nagainst available Rancher 2.6 Clusters. As soon as there is a match the selected kubernetes cluster takes\nownership of the registered box."]}),"\n"]}),"\n",(0,l.jsxs)(t.li,{children:["\n",(0,l.jsxs)(t.p,{children:[(0,l.jsx)(t.a,{href:"/1.2/machineregistration-reference",children:"MachineRegistration"}),":\nThis resource defines OS deployment details for any machine attempting to register. The machine\nregistration is the entrance for Elemental nodes as it handles the authentication (based on TPM),\nthe Elemental Teal deployment and the node inclusion into to the MachineInventory so it can be added\nto a cluster when there is a match based on a MachineInventorySelectorTemplate. The MachineRegistration\nobject includes the machine registration URL that nodes use to register against it."]}),"\n"]}),"\n"]}),"\n",(0,l.jsxs)(t.p,{children:["A Rancher Cluster resource is also required to deploy Elemental, it can be manually created as exemplified in\nthe ",(0,l.jsx)(t.a,{href:"/1.2/quickstart-cli",children:"Quick Start"})," guide or created from the Rancher 2.6 UI."]}),"\n",(0,l.jsx)(t.h2,{id:"prepare-installation-media",children:"Prepare Installation Media"}),"\n",(0,l.jsxs)(t.p,{children:["The installation media is the media that will be used to kick start an Elemental Teal deployment. Currently\nthe supported media is a live ISO. The live ISO must include the registration configuration yaml hence it must\ncrafted once the MachineRegistration is created. The installation media is created by using the ",(0,l.jsx)(t.a,{href:"https://github.com/rancher/elemental/blob/main/.github/elemental-iso-add-registration",children:(0,l.jsx)(t.code,{children:"elemental-iso-add-registration"})}),"\nhelper script (see ",(0,l.jsx)(t.a,{href:"/1.2/quickstart-cli#preparing-the-iso",children:"quick start"})," guide)\nor by using the ",(0,l.jsx)(t.code,{children:"elemental build-iso"})," command line utility included as part of the ",(0,l.jsx)(s,{name:"elemental_toolkit_name",link:"elemental_toolkit_url/docs/creating-derivatives/build_iso"}),"."]}),"\n",(0,l.jsxs)(t.p,{children:["Within MachineRegistration only a subset of OS installation parameters can be configured, all available parameters are listed\nat ",(0,l.jsx)(t.a,{href:"/1.2/machineregistration-reference",children:"MachineRegistration"})," reference page."]}),"\n",(0,l.jsxs)(t.p,{children:["In order to configure the installation beyond the common options provided within the\n",(0,l.jsx)(t.a,{href:"/1.2/machineregistration-reference#configelementalinstall",children:(0,l.jsx)(t.code,{children:"elemental.install"})})," section a ",(0,l.jsx)(t.code,{children:"config.yaml"}),"\nconfiguration file can be included into the ISO (see ",(0,l.jsx)(t.a,{href:"/1.2/customizing#custom-elemental-client-configuration-file",children:"Custom Images"}),").\nNote any configuration applied as part of ",(0,l.jsx)(t.code,{children:"elemental.install"})," section of the MachineRegistration will be\napplied on top of the settings included in any custom ",(0,l.jsx)(t.code,{children:"config.yaml"})," file."]}),"\n",(0,l.jsxs)(t.p,{children:["Most likely the cloud-init configuration is enough to configure and set the deployed node at boot, however\nif for some reason firstboot actions or scripts are required it is possible to also include\nRancher System Agent plans into the installation media. Refer to the ",(0,l.jsx)(t.a,{href:"/1.2/elemental-plans",children:"Elemental Plans"})," section for details and\nsome example plans. The plans could be included into the squashed rootfs at ",(0,l.jsx)(t.code,{children:"/var/lib/elemental/agent/plans"}),"\nfolder and they would be seen by the system agent at firstboot."]}),"\n",(0,l.jsx)(t.h2,{id:"start-installation-process",children:"Start Installation Process"}),"\n",(0,l.jsxs)(t.p,{children:["The installation starts by booting the installation media on a node. Once the installation media has booted it will\nattempt to contact the management cluster and register to it by calling ",(0,l.jsx)(t.code,{children:"elemental-register"})," command.\nAs the registration yaml configuration is already included into the ISO ",(0,l.jsx)(t.code,{children:"elemental-register"})," knows the registration URL and\nany other required data for the registration."]}),"\n",(0,l.jsx)(t.p,{children:"On a succeeded registration the installation media will start the Elemental Teal installation into the host based\non the configuration already included in the media and the MachineRegistration parameters. As soon as the installation\nis done the node is ready to reboot. The deployed Elemental Teal includes a system agent plan to\nkick start a regular rancher provisioning process to install the selected kubernetes version, once booted, after\nsome minutes the node installation is finalized and the node is included into the cluster and visible through\nthe Rancher UI."}),"\n",(0,l.jsx)(t.h2,{id:"deployed-elemental-teal-partition-table",children:"Deployed Elemental Teal Partition Table"}),"\n",(0,l.jsx)(t.p,{children:"Once Elemental Teal is installed the OS partition table, according to default values, will look like"}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{children:"Label"}),(0,l.jsx)(t.th,{children:"Default Size"}),(0,l.jsx)(t.th,{children:"Contains"})]})}),(0,l.jsxs)(t.tbody,{children:[(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"COS_GRUB"}),(0,l.jsx)(t.td,{children:"64 MiB"}),(0,l.jsx)(t.td,{children:"UEFI Boot partition"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"COS_STATE"}),(0,l.jsx)(t.td,{children:"15 GiB"}),(0,l.jsx)(t.td,{children:"A/B bootable file system images constructed from OCI images"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"COS_OEM"}),(0,l.jsx)(t.td,{children:"64 MiB"}),(0,l.jsx)(t.td,{children:"OEM cloud-config files and other data"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"COS_RECOVERY"}),(0,l.jsx)(t.td,{children:"8 GiB"}),(0,l.jsx)(t.td,{children:"Recovery file system image if COS_STATE is destroyed"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"COS_PERSISTENT"}),(0,l.jsx)(t.td,{children:"Remaining space"}),(0,l.jsx)(t.td,{children:"All contents of the persistent folders"})]})]})]}),"\n",(0,l.jsxs)(t.p,{children:["Note this is the basic structure of any OS built by the ",(0,l.jsx)(s,{name:"elemental_toolkit_name",link:"elemental_toolkit_url"})]}),"\n",(0,l.jsx)(t.h2,{id:"elemental-teal-immutable-root",children:"Elemental Teal Immutable Root"}),"\n",(0,l.jsx)(t.p,{children:"One of the characteristics of Elemental OSes is the setup of an immutable root filesystem where some ephemeral or\npersistent locations are applied on top of it. Elemental Teal default folders structure is listed in the\nmatrix below."}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{children:"Path"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"Read-Only"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"Ephemeral"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"Persistent"})]})}),(0,l.jsxs)(t.tbody,{children:[(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/etc"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/etc/cni"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/etc/iscsi"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/etc/rancher"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/etc/ssh"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/etc/systemd"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/srv"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/home"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/opt"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/root"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/var"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/usr/libexec"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/var/lib/cni"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/var/lib/kubelet"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/var/lib/longhorn"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/var/lib/rancher"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/var/lib/elemetal"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/var/lib/NetworkManager"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/var/lib/calico"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{children:"/var/log"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]})]})]})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,l.jsx)(t,{...e,children:(0,l.jsx)(o,{...e})}):o(e)}function x(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>r});var l=n(7294);const i={},s=l.createContext(i);function r(e){const t=l.useContext(s);return l.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),l.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fdc326ca.a82b89f4.js b/assets/js/fdc326ca.a82b89f4.js new file mode 100644 index 000000000..b638644fa --- /dev/null +++ b/assets/js/fdc326ca.a82b89f4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[9103],{9266:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>d,frontMatter:()=>l,metadata:()=>a,toc:()=>o});var r=n(5893),s=n(1151);const l={sidebar_label:"MachineInventorySelectorTemplate reference",title:""},c="MachineInventorySelectorTemplate reference",a={id:"machineinventoryselectortemplate-reference",title:"",description:"The MachineInventorySelectorTemplate is the resource responsible of defining the matching criteria to pair an inventoried machine with a Cluster resource.",source:"@site/versioned_docs/version-1.2/machineinventoryselectortemplate-reference.md",sourceDirName:".",slug:"/machineinventoryselectortemplate-reference",permalink:"/1.2/machineinventoryselectortemplate-reference",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"MachineInventorySelectorTemplate reference",title:""},sidebar:"docs",previous:{title:"Machineregistration reference",permalink:"/1.2/machineregistration-reference"},next:{title:"Cluster reference",permalink:"/1.2/cluster-reference"}},i={},o=[{value:"template.spec.selector.matchLabels",id:"templatespecselectormatchlabels",level:4},{value:"template.spec.selector.matchExpressions",id:"templatespecselectormatchexpressions",level:4}];function h(e){const t={code:"code",h1:"h1",h4:"h4",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components},{Details:n,Head:l}=t;return n||p("Details",!0),l||p("Head",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(l,{children:(0,r.jsx)("link",{rel:"canonical",href:"https://elemental.docs.rancher.com/machineinventoryselectortemplate-reference"})}),"\n",(0,r.jsx)(t.h1,{id:"machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate reference"}),"\n",(0,r.jsx)(t.p,{children:"The MachineInventorySelectorTemplate is the resource responsible of defining the matching criteria to pair an inventoried machine with a Cluster resource."}),"\n",(0,r.jsxs)(t.p,{children:["The relevant key is the ",(0,r.jsx)(t.code,{children:"selector"})," which includes label selector expressions."]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",metastring:'title="MachineInventorySelectorTemplate" showLineNumbers',children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: my-machine-selector\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n ...\n"})}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:"template.spec.selector"})," can include ",(0,r.jsx)(t.code,{children:"matchLabels"})," and or ",(0,r.jsx)(t.code,{children:"matchExpressions"})," keys."]}),"\n",(0,r.jsx)(t.h4,{id:"templatespecselectormatchlabels",children:"template.spec.selector.matchLabels"}),"\n",(0,r.jsxs)(t.p,{children:["It is a map of ",(0,r.jsx)(t.code,{children:"{key,value}"})," pairs ",(0,r.jsx)(t.code,{children:"(map[string]string)"}),". When multiple labels are provided all labels must match."]}),"\n",(0,r.jsxs)(n,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",metastring:"showLineNumbers",children:"...\nspec:\n template:\n spec:\n selector:\n matchLabels:\n element: fire\n manufacturer: somevalue\n"})})]}),"\n",(0,r.jsx)(t.p,{children:"A Cluster defined with the above selector will only attempt to provision nodes inventoried including these two labels."}),"\n",(0,r.jsx)(t.h4,{id:"templatespecselectormatchexpressions",children:"template.spec.selector.matchExpressions"}),"\n",(0,r.jsx)(t.p,{children:"It is a list of label selectors, each label selectors can be defined as:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Key"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"key"}),(0,r.jsx)(t.td,{children:"string"}),(0,r.jsx)(t.td,{children:"This is the label key the selector applies on"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"operator"}),(0,r.jsx)(t.td,{children:"string"}),(0,r.jsx)(t.td,{children:"Represents the relationship of the key to a set of values. Valid operators are 'In', 'NotIn', 'Exists' and 'DoesNotExist'"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"values"}),(0,r.jsx)(t.td,{children:"[]string"}),(0,r.jsx)(t.td,{children:"Values is an array of string values. If the operator is 'In' or 'NotIn', the values array must be non-empty. If the operator is 'Exists' or 'DoesNotExist', the values array must be empty"})]})]})]}),"\n",(0,r.jsxs)(n,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",metastring:"showLineNumbers",children:"...\nspec:\n template:\n spec:\n selector:\n matchExpressions:\n - key: element\n operator: In\n values: [ 'fire' ]\n - key: manufacturer\n operator: Exists\n"})})]}),"\n",(0,r.jsxs)(t.p,{children:["A Cluster defined with the above selector will only attempt to provision nodes inventoried with the ",(0,r.jsx)(t.code,{children:"element=fire"})," label and including a ",(0,r.jsx)(t.code,{children:"manufacturer"})," label defined with any value."]})]})}function d(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}function p(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>c});var r=n(7294);const s={},l=r.createContext(s);function c(e){const t=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),r.createElement(l.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fdc326ca.ffd08fda.js b/assets/js/fdc326ca.ffd08fda.js deleted file mode 100644 index 3ee93b864..000000000 --- a/assets/js/fdc326ca.ffd08fda.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelemental_docs=self.webpackChunkelemental_docs||[]).push([[9103],{9266:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>l,metadata:()=>c,toc:()=>o});var r=n(5893),s=n(1151);const l={sidebar_label:"MachineInventorySelectorTemplate reference",title:""},i="MachineInventorySelectorTemplate reference",c={id:"machineinventoryselectortemplate-reference",title:"",description:"The MachineInventorySelectorTemplate is the resource responsible of defining the matching criteria to pair an inventoried machine with a Cluster resource.",source:"@site/versioned_docs/version-1.2/machineinventoryselectortemplate-reference.md",sourceDirName:".",slug:"/machineinventoryselectortemplate-reference",permalink:"/1.2/machineinventoryselectortemplate-reference",draft:!1,unlisted:!1,tags:[],version:"1.2",frontMatter:{sidebar_label:"MachineInventorySelectorTemplate reference",title:""},sidebar:"docs",previous:{title:"Machineregistration reference",permalink:"/1.2/machineregistration-reference"},next:{title:"Cluster reference",permalink:"/1.2/cluster-reference"}},a={},o=[{value:"template.spec.selector.matchLabels",id:"templatespecselectormatchlabels",level:4},{value:"template.spec.selector.matchExpressions",id:"templatespecselectormatchexpressions",level:4}];function d(e){const t={code:"code",h1:"h1",h4:"h4",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components},{Details:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"machineinventoryselectortemplate-reference",children:"MachineInventorySelectorTemplate reference"}),"\n",(0,r.jsx)(t.p,{children:"The MachineInventorySelectorTemplate is the resource responsible of defining the matching criteria to pair an inventoried machine with a Cluster resource."}),"\n",(0,r.jsxs)(t.p,{children:["The relevant key is the ",(0,r.jsx)(t.code,{children:"selector"})," which includes label selector expressions."]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",metastring:'title="MachineInventorySelectorTemplate" showLineNumbers',children:"apiVersion: elemental.cattle.io/v1beta1\nkind: MachineInventorySelectorTemplate\nmetadata:\n name: my-machine-selector\n namespace: fleet-default\nspec:\n template:\n spec:\n selector:\n ...\n"})}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:"template.spec.selector"})," can include ",(0,r.jsx)(t.code,{children:"matchLabels"})," and or ",(0,r.jsx)(t.code,{children:"matchExpressions"})," keys."]}),"\n",(0,r.jsx)(t.h4,{id:"templatespecselectormatchlabels",children:"template.spec.selector.matchLabels"}),"\n",(0,r.jsxs)(t.p,{children:["It is a map of ",(0,r.jsx)(t.code,{children:"{key,value}"})," pairs ",(0,r.jsx)(t.code,{children:"(map[string]string)"}),". When multiple labels are provided all labels must match."]}),"\n",(0,r.jsxs)(n,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",metastring:"showLineNumbers",children:"...\nspec:\n template:\n spec:\n selector:\n matchLabels:\n element: fire\n manufacturer: somevalue\n"})})]}),"\n",(0,r.jsx)(t.p,{children:"A Cluster defined with the above selector will only attempt to provision nodes inventoried including these two labels."}),"\n",(0,r.jsx)(t.h4,{id:"templatespecselectormatchexpressions",children:"template.spec.selector.matchExpressions"}),"\n",(0,r.jsx)(t.p,{children:"It is a list of label selectors, each label selectors can be defined as:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Key"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"key"}),(0,r.jsx)(t.td,{children:"string"}),(0,r.jsx)(t.td,{children:"This is the label key the selector applies on"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"operator"}),(0,r.jsx)(t.td,{children:"string"}),(0,r.jsx)(t.td,{children:"Represents the relationship of the key to a set of values. Valid operators are 'In', 'NotIn', 'Exists' and 'DoesNotExist'"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"values"}),(0,r.jsx)(t.td,{children:"[]string"}),(0,r.jsx)(t.td,{children:"Values is an array of string values. If the operator is 'In' or 'NotIn', the values array must be non-empty. If the operator is 'Exists' or 'DoesNotExist', the values array must be empty"})]})]})]}),"\n",(0,r.jsxs)(n,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",metastring:"showLineNumbers",children:"...\nspec:\n template:\n spec:\n selector:\n matchExpressions:\n - key: element\n operator: In\n values: [ 'fire' ]\n - key: manufacturer\n operator: Exists\n"})})]}),"\n",(0,r.jsxs)(t.p,{children:["A Cluster defined with the above selector will only attempt to provision nodes inventoried with the ",(0,r.jsx)(t.code,{children:"element=fire"})," label and including a ",(0,r.jsx)(t.code,{children:"manufacturer"})," label defined with any value."]})]})}function h(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>i});var r=n(7294);const s={},l=r.createContext(s);function i(e){const t=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(l.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.43bce24f.js b/assets/js/runtime~main.e601b306.js similarity index 57% rename from assets/js/runtime~main.43bce24f.js rename to assets/js/runtime~main.e601b306.js index 34ddb63ff..b4f4e24bb 100644 --- a/assets/js/runtime~main.43bce24f.js +++ b/assets/js/runtime~main.e601b306.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,c,f,b,d={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={exports:{}};return d[e].call(c.exports,c,c.exports,r),c.exports}r.m=d,e=[],r.O=(a,c,f,b)=>{if(!c){var d=1/0;for(i=0;i=b)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[c,f,b]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var d={};a=a||[null,c({}),c([]),c(c)];for(var t=2&f&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>d[a]=()=>e[a]));return d.default=()=>e,r.d(b,d),b},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({13:"5d57b743",49:"5f11e417",53:"935f2afb",98:"acc249a7",360:"aa67c710",366:"906c60a4",381:"b02e4210",652:"2a824f8b",710:"98a47304",803:"1b33c654",827:"82d729f6",847:"db6512d3",939:"4601e8b1",1019:"578c0857",1345:"e24c3caa",1888:"3238e5ae",1898:"b3210992",2256:"33b676a1",2310:"8699bfc7",2347:"dd6e5f02",2530:"f3d26829",2644:"17f29b2a",2846:"3f318b85",2923:"b037c97a",2936:"d49b78bc",3148:"06b06a7e",3206:"008566e2",3217:"3b8c55ea",3230:"eff9ec8d",3304:"866c3a03",3384:"8d83cde9",3594:"3d72abfc",3839:"f86526c6",3920:"1c67841d",4020:"43c9fc1f",4182:"e647254d",4223:"34e5c9d0",4368:"a94703ab",4454:"0c9f3389",4580:"93551644",4619:"54dca98f",4793:"76faf03d",4837:"c395c3b1",4859:"d0681c17",4897:"c395f53e",4953:"cc55a3ba",5278:"314a742e",5489:"1b0f8c91",5532:"d8f7dbb7",5556:"ccc14432",5713:"72c75985",5870:"65295181",5927:"5281b7a2",6261:"41a53309",6292:"475573de",6609:"3cb329d3",6625:"807ea154",6747:"8d09d3e9",6777:"ce8372b3",6836:"410f4fd3",6844:"a584eeb7",6859:"9ff227f5",6870:"ae61c247",6971:"c377a04b",6994:"6ffb9ece",7012:"44234b90",7023:"515d27de",7108:"007e4478",7121:"ea530098",7139:"aa481173",7269:"5792c77d",7353:"426e6027",7384:"26511e9d",7479:"b80d3b11",7775:"bd2c0bea",7803:"0ec254a1",7844:"7f011206",7869:"9de08282",7918:"17896441",7920:"1a4e3797",8332:"1e6929a8",8399:"639e78ad",8518:"a7bd4aaa",8531:"aba5156d",8632:"a555a233",8639:"8a54026e",8677:"6654e683",8681:"1b128653",8793:"5c2870c5",8795:"5eb1fa47",8883:"70b99476",8886:"01042c73",8963:"99ca7d3f",8994:"8a4439a6",9103:"fdc326ca",9165:"d68e3ab2",9323:"6e738032",9365:"53c63982",9491:"c541ae51",9508:"eba81707",9638:"bb3fbf9f",9656:"cf169a96",9661:"5e95c892",9793:"353df350",9875:"ef801d26"}[e]||e)+"."+{13:"2e83a67c",49:"1d785b6d",53:"a1032e86",98:"cc1e5360",360:"115ad5fd",366:"de82c8fe",381:"3999e4a9",652:"d3a263b3",710:"99903d3a",803:"a5895cab",827:"ab7b499c",847:"97a04736",939:"d6bdb742",1019:"399a357b",1345:"61457071",1426:"aca17e4c",1772:"f333d556",1888:"9c6f1068",1898:"a1e96a74",2256:"107946a2",2310:"22e7e3ee",2347:"afb00e23",2530:"46d6b853",2644:"13d720c8",2846:"7d4d1836",2923:"3a868624",2936:"c73752a2",3148:"de2342b6",3206:"171e7aa9",3217:"2c8c5b1d",3230:"57a7dfe8",3304:"acaff01e",3384:"6ce3e5b9",3594:"db76b006",3839:"e5951dc1",3920:"6f3ca700",4020:"7230944f",4182:"adc5fbbe",4223:"7676da55",4368:"5c2529f2",4454:"3e3e7520",4580:"73cd7e74",4619:"39c023f6",4793:"0a6be094",4837:"192df8fe",4859:"30b8173a",4897:"362e7fcd",4953:"6e943ecb",5278:"138abbcd",5489:"51385573",5532:"3cfc277a",5556:"e631397b",5713:"a1c9f42c",5870:"fe80ffe0",5927:"6e0ce740",6261:"20b7ee18",6292:"93ee040e",6609:"7dd00817",6625:"7ff7d588",6747:"08d1d35e",6777:"e6766f01",6836:"d472f304",6844:"52a1567f",6859:"36665cef",6870:"b9473023",6945:"13155258",6971:"4f79ac86",6994:"ffdefc5e",7012:"e22542ac",7023:"cfaeb529",7108:"243025d0",7121:"76121ba4",7139:"b7eff4da",7269:"c1638897",7353:"d7be71b0",7384:"80d13872",7479:"006544bf",7775:"229ff471",7803:"68e2ea59",7844:"0f957a55",7869:"a251a46b",7918:"0f1b267b",7920:"b5892801",8332:"bbd13471",8399:"2a3212a7",8518:"da9b48bf",8531:"11ba512e",8632:"3b00468c",8639:"14fb0e94",8677:"c868b00c",8681:"42b5656b",8793:"2c517fd4",8795:"7532541a",8883:"0b97e05f",8886:"2cdc191c",8894:"685f5584",8963:"2c4623ef",8994:"c1c15b37",9103:"ffd08fda",9165:"7f182de8",9229:"a62663af",9323:"90ced99b",9365:"b49bcb14",9491:"9051816f",9508:"088d8e94",9638:"62f24dad",9656:"27586135",9661:"726271aa",9793:"edec58d7",9875:"493b6526"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},b="elemental-docs:",r.l=(e,a,c,d)=>{if(f[e])f[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var b=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(c))),a)return a(c)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=u.bind(null,t.onerror),t.onload=u.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"7918",65295181:"5870",93551644:"4580","5d57b743":"13","5f11e417":"49","935f2afb":"53",acc249a7:"98",aa67c710:"360","906c60a4":"366",b02e4210:"381","2a824f8b":"652","98a47304":"710","1b33c654":"803","82d729f6":"827",db6512d3:"847","4601e8b1":"939","578c0857":"1019",e24c3caa:"1345","3238e5ae":"1888",b3210992:"1898","33b676a1":"2256","8699bfc7":"2310",dd6e5f02:"2347",f3d26829:"2530","17f29b2a":"2644","3f318b85":"2846",b037c97a:"2923",d49b78bc:"2936","06b06a7e":"3148","008566e2":"3206","3b8c55ea":"3217",eff9ec8d:"3230","866c3a03":"3304","8d83cde9":"3384","3d72abfc":"3594",f86526c6:"3839","1c67841d":"3920","43c9fc1f":"4020",e647254d:"4182","34e5c9d0":"4223",a94703ab:"4368","0c9f3389":"4454","54dca98f":"4619","76faf03d":"4793",c395c3b1:"4837",d0681c17:"4859",c395f53e:"4897",cc55a3ba:"4953","314a742e":"5278","1b0f8c91":"5489",d8f7dbb7:"5532",ccc14432:"5556","72c75985":"5713","5281b7a2":"5927","41a53309":"6261","475573de":"6292","3cb329d3":"6609","807ea154":"6625","8d09d3e9":"6747",ce8372b3:"6777","410f4fd3":"6836",a584eeb7:"6844","9ff227f5":"6859",ae61c247:"6870",c377a04b:"6971","6ffb9ece":"6994","44234b90":"7012","515d27de":"7023","007e4478":"7108",ea530098:"7121",aa481173:"7139","5792c77d":"7269","426e6027":"7353","26511e9d":"7384",b80d3b11:"7479",bd2c0bea:"7775","0ec254a1":"7803","7f011206":"7844","9de08282":"7869","1a4e3797":"7920","1e6929a8":"8332","639e78ad":"8399",a7bd4aaa:"8518",aba5156d:"8531",a555a233:"8632","8a54026e":"8639","6654e683":"8677","1b128653":"8681","5c2870c5":"8793","5eb1fa47":"8795","70b99476":"8883","01042c73":"8886","99ca7d3f":"8963","8a4439a6":"8994",fdc326ca:"9103",d68e3ab2:"9165","6e738032":"9323","53c63982":"9365",c541ae51:"9491",eba81707:"9508",bb3fbf9f:"9638",cf169a96:"9656","5e95c892":"9661","353df350":"9793",ef801d26:"9875"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,c)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var b=new Promise(((c,b)=>f=e[a]=[c,b]));c.push(f[2]=b);var d=r.p+r.u(a),t=new Error;r.l(d,(c=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var b=c&&("load"===c.type?"missing":c.type),d=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+b+": "+d+")",t.name="ChunkLoadError",t.type=b,t.request=d,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var f,b,d=c[0],t=c[1],o=c[2],n=0;if(d.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(c);n{"use strict";var e,a,c,f,d,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={exports:{}};return b[e].call(c.exports,c,c.exports,r),c.exports}r.m=b,e=[],r.O=(a,c,f,d)=>{if(!c){var b=1/0;for(i=0;i=d)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[c,f,d]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var b={};a=a||[null,c({}),c([]),c(c)];for(var t=2&f&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(d,b),d},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({13:"5d57b743",49:"5f11e417",53:"935f2afb",98:"acc249a7",360:"aa67c710",366:"906c60a4",381:"b02e4210",652:"2a824f8b",710:"98a47304",803:"1b33c654",827:"82d729f6",847:"db6512d3",939:"4601e8b1",1019:"578c0857",1345:"e24c3caa",1888:"3238e5ae",1898:"b3210992",2256:"33b676a1",2310:"8699bfc7",2347:"dd6e5f02",2530:"f3d26829",2644:"17f29b2a",2846:"3f318b85",2923:"b037c97a",2936:"d49b78bc",3148:"06b06a7e",3206:"008566e2",3217:"3b8c55ea",3230:"eff9ec8d",3304:"866c3a03",3384:"8d83cde9",3594:"3d72abfc",3839:"f86526c6",3920:"1c67841d",4020:"43c9fc1f",4182:"e647254d",4223:"34e5c9d0",4368:"a94703ab",4454:"0c9f3389",4580:"93551644",4619:"54dca98f",4793:"76faf03d",4837:"c395c3b1",4859:"d0681c17",4897:"c395f53e",4953:"cc55a3ba",5278:"314a742e",5489:"1b0f8c91",5532:"d8f7dbb7",5556:"ccc14432",5713:"72c75985",5870:"65295181",5927:"5281b7a2",6261:"41a53309",6292:"475573de",6609:"3cb329d3",6625:"807ea154",6747:"8d09d3e9",6777:"ce8372b3",6836:"410f4fd3",6844:"a584eeb7",6859:"9ff227f5",6870:"ae61c247",6971:"c377a04b",6994:"6ffb9ece",7012:"44234b90",7023:"515d27de",7108:"007e4478",7121:"ea530098",7139:"aa481173",7269:"5792c77d",7353:"426e6027",7384:"26511e9d",7479:"b80d3b11",7775:"bd2c0bea",7803:"0ec254a1",7844:"7f011206",7869:"9de08282",7918:"17896441",7920:"1a4e3797",8332:"1e6929a8",8399:"639e78ad",8518:"a7bd4aaa",8531:"aba5156d",8632:"a555a233",8639:"8a54026e",8677:"6654e683",8681:"1b128653",8793:"5c2870c5",8795:"5eb1fa47",8883:"70b99476",8886:"01042c73",8963:"99ca7d3f",8994:"8a4439a6",9103:"fdc326ca",9165:"d68e3ab2",9323:"6e738032",9365:"53c63982",9491:"c541ae51",9508:"eba81707",9638:"bb3fbf9f",9656:"cf169a96",9661:"5e95c892",9793:"353df350",9875:"ef801d26"}[e]||e)+"."+{13:"83252c7b",49:"767dd3d1",53:"a1032e86",98:"afd79e0a",360:"7943bc71",366:"1e13a403",381:"4e3a7699",652:"83c55e0a",710:"0f7fffba",803:"2500b11c",827:"0cd8c1ba",847:"97a04736",939:"cacc4273",1019:"2b190e0d",1345:"01159749",1426:"aca17e4c",1772:"f333d556",1888:"812bec08",1898:"6de473be",2256:"e72c30e3",2310:"03fc0ce4",2347:"66edbd80",2530:"dd481f36",2644:"c3e81c17",2846:"a0aef04d",2923:"4d238169",2936:"b9ef8d5a",3148:"866ad55d",3206:"91610a07",3217:"fe236857",3230:"2d5ea61d",3304:"dda3f66f",3384:"5857bbea",3594:"1d97420d",3839:"d48d5fad",3920:"a8723990",4020:"9b61099e",4182:"87ddbedd",4223:"30eab101",4368:"5c2529f2",4454:"9ebc0052",4580:"24080d59",4619:"86d3ed35",4793:"4bb09eca",4837:"52a88a05",4859:"02a14704",4897:"1cd7f8e1",4953:"a189dbc9",5278:"cd01912c",5489:"9f2ba2e3",5532:"e6c89814",5556:"0181111c",5713:"e28c9fa5",5870:"5f3359a1",5927:"82cee175",6261:"38b3ecaa",6292:"fbef9d21",6609:"cad8a96d",6625:"6f3e93e5",6747:"676d4bf2",6777:"abcf1913",6836:"0a373c7d",6844:"f6572b3a",6859:"153b5cfb",6870:"0289edab",6945:"13155258",6971:"5dad62c5",6994:"14ec47c0",7012:"b9123fb8",7023:"243480e3",7108:"f7288912",7121:"8b46ebf3",7139:"f471fe49",7269:"be7b3b80",7353:"fdfd164c",7384:"33d49855",7479:"9ab9cb25",7775:"9d4b0195",7803:"96646f8a",7844:"bb1c2c22",7869:"c2eda208",7918:"0f1b267b",7920:"b5892801",8332:"b476ea49",8399:"f78e1fd7",8518:"da9b48bf",8531:"6e6090a6",8632:"d5bb2818",8639:"c3648038",8677:"a9af6535",8681:"6056253e",8793:"603ee4c7",8795:"9994edd5",8883:"31ab229c",8886:"7c197e98",8894:"685f5584",8963:"911cc353",8994:"f877937c",9103:"a82b89f4",9165:"16be6c5c",9229:"a62663af",9323:"93d70adc",9365:"b49bcb14",9491:"26ea00c1",9508:"bc5892af",9638:"35ae4380",9656:"82fda36c",9661:"726271aa",9793:"edec58d7",9875:"493b6526"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},d="elemental-docs:",r.l=(e,a,c,b)=>{if(f[e])f[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var d=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(c))),a)return a(c)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=u.bind(null,t.onerror),t.onload=u.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"7918",65295181:"5870",93551644:"4580","5d57b743":"13","5f11e417":"49","935f2afb":"53",acc249a7:"98",aa67c710:"360","906c60a4":"366",b02e4210:"381","2a824f8b":"652","98a47304":"710","1b33c654":"803","82d729f6":"827",db6512d3:"847","4601e8b1":"939","578c0857":"1019",e24c3caa:"1345","3238e5ae":"1888",b3210992:"1898","33b676a1":"2256","8699bfc7":"2310",dd6e5f02:"2347",f3d26829:"2530","17f29b2a":"2644","3f318b85":"2846",b037c97a:"2923",d49b78bc:"2936","06b06a7e":"3148","008566e2":"3206","3b8c55ea":"3217",eff9ec8d:"3230","866c3a03":"3304","8d83cde9":"3384","3d72abfc":"3594",f86526c6:"3839","1c67841d":"3920","43c9fc1f":"4020",e647254d:"4182","34e5c9d0":"4223",a94703ab:"4368","0c9f3389":"4454","54dca98f":"4619","76faf03d":"4793",c395c3b1:"4837",d0681c17:"4859",c395f53e:"4897",cc55a3ba:"4953","314a742e":"5278","1b0f8c91":"5489",d8f7dbb7:"5532",ccc14432:"5556","72c75985":"5713","5281b7a2":"5927","41a53309":"6261","475573de":"6292","3cb329d3":"6609","807ea154":"6625","8d09d3e9":"6747",ce8372b3:"6777","410f4fd3":"6836",a584eeb7:"6844","9ff227f5":"6859",ae61c247:"6870",c377a04b:"6971","6ffb9ece":"6994","44234b90":"7012","515d27de":"7023","007e4478":"7108",ea530098:"7121",aa481173:"7139","5792c77d":"7269","426e6027":"7353","26511e9d":"7384",b80d3b11:"7479",bd2c0bea:"7775","0ec254a1":"7803","7f011206":"7844","9de08282":"7869","1a4e3797":"7920","1e6929a8":"8332","639e78ad":"8399",a7bd4aaa:"8518",aba5156d:"8531",a555a233:"8632","8a54026e":"8639","6654e683":"8677","1b128653":"8681","5c2870c5":"8793","5eb1fa47":"8795","70b99476":"8883","01042c73":"8886","99ca7d3f":"8963","8a4439a6":"8994",fdc326ca:"9103",d68e3ab2:"9165","6e738032":"9323","53c63982":"9365",c541ae51:"9491",eba81707:"9508",bb3fbf9f:"9638",cf169a96:"9656","5e95c892":"9661","353df350":"9793",ef801d26:"9875"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,c)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var d=new Promise(((c,d)=>f=e[a]=[c,d]));c.push(f[2]=d);var b=r.p+r.u(a),t=new Error;r.l(b,(c=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var d=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+d+": "+b+")",t.name="ChunkLoadError",t.type=d,t.request=b,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var f,d,b=c[0],t=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(c);n -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
      Version: 1.3

      Backup

      +
      Version: 1.3
      +

      Backup

      Since Elemental runs as part of Rancher, the Elemental resources are bundled in the Rancher backup.
      For more details about Rancher backups, restore, and disaster recovery options, please follow the official Rancher documentation.

      Install rancher-backup operator for Rancher​

      diff --git a/cloud-config-reference/index.html b/cloud-config-reference/index.html index 64fcd5c45..6bd436734 100644 --- a/cloud-config-reference/index.html +++ b/cloud-config-reference/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -
      Version: 1.3

      Cloud-config Reference

      +
      Version: 1.3
      +

      Cloud-config Reference

      All custom configuration applied on top of a fresh deployment should come from the cloud-config section in a MachineRegistration.

      This will get run by elemental-cli run-stage during the boot stage, and diff --git a/cluster-reference/index.html b/cluster-reference/index.html index 0d7f95d5e..847f2d65d 100644 --- a/cluster-reference/index.html +++ b/cluster-reference/index.html @@ -3,18 +3,21 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -

      Version: 1.3

      Cluster reference

      +
      Version: 1.3
      + + +

      Cluster reference

      A Cluster definition includes a kubernetesVersion and a list of machinePools to deploy the cluster to.

      For how to select a kubernetesVersion please check our Kubernetes Versions page.

      A machinePool is a bundle of configuration with a ObjectReference so the cluster is deployed to those machinePools @@ -29,7 +32,7 @@

      A minimum of quantity set to one is required for this pool to be used. Basically translates to how many nodes from this pool are going to be setup for this cluster.

      Example
      kind: Cluster
      apiVersion: provisioning.cattle.io/v1
      metadata:
      name: cluster-example
      namespace: example-default
      spec:
      rkeConfig:
      machinePools:
      - name: examplePool
      controlPlaneRole: true
      etcdRole: true
      workerRole: false
      quantity: 3
      unhealthyNodeTimeout: 0s
      machineConfigRef:
      apiVersion: elemental.cattle.io/v1beta1
      kind: MachineInventorySelectorTemplate
      name: exampleSelector
      -

      machineConfigRef Spec Reference​

      +

      machineConfigRef Spec Reference​

      A machineConfigRef is a generic k8s ObjectReference which usually contain a kind name and apiVersion to point to a different object.

      In Elemental, we set this to a MachineInventorySelectorTemplate. diff --git a/custom-certificate/index.html b/custom-certificate/index.html index 1b07e9a91..86802fccf 100644 --- a/custom-certificate/index.html +++ b/custom-certificate/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -

      Version: 1.3

      How to add a custom certificate​

      +
      Version: 1.3
      +

      How to add a custom certificate​

      Prerequisite: A certificate in .pem format

      Goal: Make a custom certificate available system-wide

      This is for certificates used by system-level services.

      Kubernetes workloads should bring their certificates within the diff --git a/customizing/index.html b/customizing/index.html index 3e93a9ef2..e087229ab 100644 --- a/customizing/index.html +++ b/customizing/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -

      Version: 1.3

      Customize Elemental Install

      +
      Version: 1.3
      +

      Customize Elemental Install

      Elemental Teal images can be customized in different ways. One option is to provide additional resources within the installation media so that during installation, or diff --git a/elemental-plans/index.html b/elemental-plans/index.html index 33ecac97b..af26ee4cd 100644 --- a/elemental-plans/index.html +++ b/elemental-plans/index.html @@ -3,18 +3,19 @@ -Elemental - Immutable Linux for Rancher +Elemental - Immutable Linux for Rancher - + -

      Version: 1.3

      Introduction​

      +
      Version: 1.3
      +

      Introduction​

      Elemental uses the Rancher System Agent, renamed to Elemental System Agent, to initially bootstrap the node with a simple plan.

      The plan will apply the following configurations: