Pridruževanje vozlišč prostoru
Prostor teče na strojih, ki so vaši. Pridružitev je v treh korakih: pridobite vstopnico, pripravite stroj, zaženite pridružitev. Traja nekaj minut in poteka enako, naj bo škatla virtualka v oblaku ali strežnik v vaši omari.
Kaj stroj potrebuje
- Linux, 64-bitni, s systemd. Katera koli sodobna distribucija.
- Najmanj 2 GB RAM, 4 GB za kaj resnega. Dve jedri sta smiselno dno.
- Brez paketov Kubernetes. Skript za pridružitev namesti containerd in kubelet, ki ustreza različici vaše nadzorne ravnine. Stroj, ki že nosi stanje Kubernetesa, je treba najprej ponastaviti.
- Odhodni dostop do nadzorne ravnine vašega prostora po TCP 6443 in 8088, poleg tega DNS, NTP in HTTPS za prenos slik. Nič ne rabi biti dosegljivo z interneta: vozlišče pokliče ven in povezavo drži odprto.
- Izklopljen swap ali kubelet, ki ga prenese.
- Stalno ime. Izbrano ime je vpisano v vstopnico in ga pozneje ni mogoče spremeniti brez ponovne pridružitve.
Vaše vozlišče ne potrebuje javno dosegljivega naslova
kubehz se nikoli ne poveže do vašega vozlišča. Vse (tudi kubectl logs in kubectl exec) potuje nazaj po predoru, ki ga je odprlo vaše vozlišče. Zato vrata kubelet v spodnjem požarnem zidu ostanejo zaprta.
1. Ustvarite vstopnico za pridružitev
V nadzorni plošči odprite svoj prostor in izberite Dodaj vozlišče. Stroju dajte ime, ki ga bo nosil v gruči, in dobite vstopnico.
Z ukazno vrstico:
lo kubehz join worker-1Ukazna vrstica vstopnico ustvari za prostor, ki pripada aktivnemu imeniku gruče. Potrebuje štiri stvari: cluster.lok8s.yaml s kind: Kubehz in spec.kubehz.hosting: shared, končan lo provision za to gručo (ta ustvari prostor) in KUBEHZ_TOKEN, izvožen v vaši lupini (API žeton, ustvarjen v nadzorni plošči pod Dostop → API žetoni). Brez tega uporabite nadzorno ploščo.
Tri stvari o vstopnici, vse namerne:
- Prikaže se enkrat. Nikjer se ne shrani: ne v naši zbirki podatkov ne v nadzorni plošči. Če jo izgubite, ustvarite novo; „pokaži mi jo še enkrat" ne obstaja.
- Velja za eno vozlišče, enkrat, in je vezana na točno izbrano ime. Vstopnica za
worker-1ne more vpisatiworker-2. - Poteče v približno desetih minutah. Ustvarite jo, ko ste pri stroju, ne večer prej.
2. Pripravite stroj
Požarni zid vozlišča
Obod vozlišča je storitev za vas, ne nadzor nad vami: imate root in ga lahko spremenite ali odstranite. Dejanski nadzor platforme živi na strani gruče. Ta recept ohranja napadno površino stroja majhno in pusti omrežno tkanino gruče nedotaknjeno.
Shranite kot /etc/nftables.d/kubehz-node.nft in uveljavite z nft -f /etc/nftables.d/kubehz-node.nft. Ponovni zagon zamenja prejšnjo tabelo, zato ga je varno ponavljati in varen je tudi prek SSH, ker so vzpostavljene povezave sprejete najprej.
table inet kubehz_node {}
flush table inet kubehz_node
table inet kubehz_node {
chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
ct state invalid drop
iif "lo" accept
# Cluster fabric interfaces. Traffic on cilium_wg0 has already proved
# itself to WireGuard; dropping post-decryption flows here is how you
# break kubectl logs/exec without ever seeing why.
iifname "cilium_wg0" accept
iifname "cilium_vxlan" accept
iifname "cilium_host" accept
iifname "cilium_net" accept
iifname "lxc*" accept
# ICMP carries path-MTU discovery. Pod traffic is double-encapsulated, so
# the usable MTU is smaller than the wire's — block these and you get
# silent stalls instead of errors.
icmp type {
echo-request, echo-reply, destination-unreachable,
time-exceeded, parameter-problem
} accept
icmpv6 type {
echo-request, echo-reply, destination-unreachable,
time-exceeded, parameter-problem, packet-too-big,
nd-neighbor-solicit, nd-neighbor-advert,
nd-router-solicit, nd-router-advert
} accept
# WireGuard: every node-to-node path rides this. The peers are other
# machines in the cluster with arbitrary addresses, so the source cannot
# be pinned — WireGuard's own keys are the authentication.
udp dport 51871 accept
# VXLAN (pod traffic, normally inside WireGuard).
udp dport 8472 accept
# Your SSH. Pin it to your own addresses if you can:
# tcp dport 22 ip saddr { 203.0.113.0/24 } accept
tcp dport 22 accept
# NodePorts: closed. Uncomment only if you deliberately want to expose
# them on this machine's public address.
# tcp dport 30000-32767 accept
# udp dport 30000-32767 accept
counter
}
# Cilium's datapath owns pod forwarding — the perimeter must not fight the
# CNI. Pod-level rules belong in your NetworkPolicies.
chain forward { type filter hook forward priority filter; policy accept; }
chain output { type filter hook output priority filter; policy accept; }
}Dvoja vrata namenoma niso odprta:
- 10250 (kubelet).
kubectl logsinkubectl execprispeta po predoru, ki ga je odprlo vaše vozlišče, zato API kubelet nikoli ne rabi gledati v omrežje. Odpiranje prinese tveganje in nič koristi. - NodePorts. Zgoraj zakomentirano; vklopite le, če to res želite.
Če stroj stoji za požarnim zidom v oblaku (Hetzner Cloud Firewalls, varnostna skupina, naprava), preslikajte isto obliko tudi tja. Dve plasti, ki se ujemata, sta v redu; požarni zid v oblaku, ki tiho nasprotuje gostitelju, je razlog, da se vozlišče pridruži in je uro kasneje nedosegljivo.
Pot: virtualka Hetzner Cloud
Nič posebnega. cx22 ali večja s standardno sliko; skript za pridružitev prinese svoj containerd in kubelet. Če priklopite Hetzner Cloud Firewall, dovolite vhodno UDP 51871 in 8472 ter svoj SSH; odhodno lahko ostane odprto.
Pot: fizični strežnik ali stroj v lastni omari
Prav tako nič posebnega, z dvema stvarema za preveriti:
- NAT je v redu, simetrični NAT ne vedno. Vozlišče kliče ven, zato domači ali pisarniški NAT deluje. WireGuard med vašim in drugimi vozlišči potrebuje UDP 51871 skozi NAT v obe smeri. Večina to zmore, nekateri operaterski NAT-i ne.
- MTU. Če je vaša povezava že zmanjšana (PPPoE, predor), je promet podov vrh tega ovit dvakrat. Pustite ICMP odprt (zgornji recept to počne) in odkrivanje MTU po poti uredi ostalo.
3. Zaženite pridružitev
Sledite ukazu, prikazanemu z vstopnico. Skript namesti containerd in kubelet v različici, ki ustreza vaši nadzorni ravnini, sam pridobi potrdilo CA nadzorne ravnine in ga preveri z vašo vstopnico (stroj se lahko pridruži samo nadzorni ravnini, ki je vstopnico ustvarila, zato ni datoteke CA za prenos in ničesar za ročno primerjavo), zapiše zagonsko nastavitev, usmerjeno na nadzorno ravnino vašega prostora (join.endpoint na prostoru v API-ju), in zažene kubelet. Na stroju s systemd-resolved skript kubelet usmeri na /run/systemd/resolve/resolv.conf, tako da podi dobijo prave zunanje razreševalnike namesto vmesnika 127.0.0.53. Vozlišče nato:
- predloži vstopnico in dobi svoje odjemalsko potrdilo,
- se registrira pod imenom iz vstopnice,
- dobi oznako in madež za vašega najemnika: to odvrne pode drugih strank z vašega stroja in to nastavi platforma, ne vozlišče,
- dobi CNI in postane
Ready.
Prva pridružitev traja nekaj minut, večinoma zaradi prenosa slik.
Potem
- Vozlišče se s svojim stanjem pojavi na strani vašega prostora.
kubectl get nodesz vašo kubeconfig prikaže vaša vozlišča. - Odstranitev vozlišča je Odjavi v nadzorni plošči. Odvzame mu poverilnice in ga vzame iz gruče; vaša opravila se prerazporedijo na preostala vozlišča. Stroj še naprej teče: njegova zaustavitev in konec stroškov sta vaša naloga.
- Ponovna pridružitev z istim imenom deluje: odjavite, popravite stroj, ustvarite novo vstopnico za isto ime in se znova pridružite.
Ko se vozlišče ne pridruži
| Simptom | Običajen vzrok |
|---|---|
| Ukaz za pridružitev javi neveljavno vstopnico | Potekla je (deset minut), je bila že uporabljena ali je bila ustvarjena za drugo ime vozlišča. Ustvarite novo. |
| kubelet znova in znova poskuša in se nikoli ne registrira | Odhodni 6443 je blokiran ali se ime nadzorne ravnine na stroju ne razreši. Preverite s curl -v z vozlišča. |
| Podi ne razrešijo imen, vozlišče samo pa jih | Kubelet bere vmesni razreševalnik. Skript poskrbi za systemd-resolved; pri drugem lokalnem razreševalniku resolvConf v nastavitvi kubeleta usmerite na datoteko s pravimi zunanjimi strežniki. |
Vozlišče se registrira, a ostane NotReady | CNI se še zaganja ali so vrata tkanine (UDP 51871/8472) vhodno blokirana. Preverite požarni zid na obeh plasteh. |
kubectl logs/exec potečeta, vse drugo deluje | Predor stoji, a povratni promet je filtriran, običajno pravilo, ki zavrže vmesnik cilium_wg0. |
Podi na vozlišču Ready ostanejo Pending | Pod ne prenese madeža vašega najemnika. Nameščajte v imenski prostor svojega prostora, kjer so tolerance nastavljene za vas, in ne v imenski prostor, ustvarjen kako drugače. |
Status dokumenta
| Vidik | Podrobnost |
|---|---|
| Stanje | v živo: potek pridružitve kot izdan (vstopnica → priprava → pridružitev); požarni zid preverjen z nft |
| Zadnji pregled | 2026-09-05 |