VMware & Tanzu

Treći deo: Produkcioni rad, bezbednost i upravljanje životnim ciklusom
VKS Standard Packages i package management – kompatibilna instalacija platformskih komponenti
IX. Registry, paketi, platform services i implementacija aplikacija
36. VKS Standard Packages i package management – kompatibilna instalacija platformskih komponenti

U prethodnoj lekciji uspostavljen je lanac poverenja od VKS klastera do container registry-ja. Ta osnova je neposredan preduslov za ovu lekciju: package manager preuzima OCI bundle-ove i image-e iz registry-ja, obrađuje deklarativne resurse i zatim stvarno stanje klastera usklađuje sa željenim. VKS Standard Packages predstavljaju verzionisanu i testiranu kolekciju platformskih komponenti za proširenje vSphere Kubernetes Service klastera, ali oznaka „standard” ne znači da je svaki paket automatski odgovarajući za svaku verziju VKS-a, Kubernetes-a ili za svaku topologiju.

Cilj administratora nije samo da komanda za instalaciju završi bez greške. Potrebno je dokazati poreklo repozitorijuma, kompatibilnost paketa, dostupnost svih zavisnih image-a, ispravnost konfiguracionih vrednosti, uspešan reconciliation i funkcionalnost servisa. Verzija repozitorijuma i verzija pojedinačnog paketa jesu dve različite odluke; obe moraju biti evidentirane i kontrolisane kroz change proces.

1. Terminologija i verzijski kontekst

Broadcom dokumentacija za aktuelna VMware Cloud Foundation 9 okruženja koristi naziv vSphere Kubernetes Service (VKS) i, zavisno od izdanja, VCF CLI komande oblika vcf package. Dokumentacija za vSphere 8 i ranija TKG Service okruženja često koristi nazive TKG Service i Tanzu Kubernetes Grid Service, kao i komande tanzu package. To nisu dva package manager-a koja treba paralelno koristiti, već generacije proizvoda, dokumentacije i klijentskih alata. Pre procedure proveravaju se verzija Supervisor-a, VKS servisa, workload klastera i instaliranog CLI plug-in-a.

Element Aktuelni VKS/VCF kontekst vSphere 8/TKG Service kontekst Administratorska odluka
CLI porodica vcf package ..., kada je isporučena za izdanje tanzu package ... Koristiti CLI i plug-in koji podržava ciljna verzija VKS-a; ne prevoditi komande mehanički.
Identifikator paketa Noviji paketi koriste <ime>.kubernetes.vmware.com Stariji paketi mogu koristiti <ime>.tanzu.vmware.com Identifikator preuzeti iz stvarnog kataloga, ne pretpostaviti ga iz naziva proizvoda.
Repozitorijum VKS Standard Packages release usklađen sa VKS matricom Odgovarajući Tanzu/VKS Standard repository za TKr/VKS nivo Proveriti release notes i compatibility matrix pre promene taga ili digest-a.
Namespace Repository, Package i PackageInstall su namespaced resursi. Za postupak koji zahteva tkg-system koristiti upravo taj namespace.
Važna verzijska napomena: prelazak na domen kubernetes.vmware.com zahteva odgovarajuću verziju package plug-in-a; Broadcom KB za migraciju navodi plug-in 3.4.0 ili noviji. Sadržaj kataloga nije stalan: Grafana je, na primer, uklonjena iz VKS Standard Package Repository od izdanja v1.23 u korist Helm implementacije. Pre nadogradnje repozitorijuma zato se proveravaju uklonjeni paketi i propisana migraciona putanja.

2. Arhitektura Carvel package management-a

VKS Standard Packages koriste Carvel format i deklarativni model koji izvršava kapp-controller. CLI je korisnički interfejs; izvor istine su Kubernetes custom resources. Razumevanje tih resursa omogućava dijagnostiku i kada CLI prikaže samo opštu poruku Reconcile failed.

Resurs ili komponenta Uloga Šta administrator proverava
PackageRepository Pokazuje na verzionisani OCI/imgpkg bundle sa definicijama paketa. URL ili digest, registry autentikaciju, CA poverenje, namespace i uspešan reconcile.
PackageMetadata Opisuje logički paket, identitet i namenu. Da li je očekivani refName vidljiv u ciljnom namespace-u.
Package Predstavlja određenu verziju, fetch/template/deploy tok, values schema-u i eventualna verzijska ograničenja. Dostupne verzije, uključeni softver i Kubernetes/kapp-controller constraints.
PackageInstall Deklariše instalaciju: paket, izbor verzije, ServiceAccount i Secret sa vrednostima. Conditions, poruku kontrolera, generisani App i primenjenu verziju.
App Izvršava fetch, template i deploy i periodično usklađuje stvarno sa željenim stanjem. Fetch/template/deploy grešku, drift, status i controller logove.
Secret sa values Čuva korisničku konfiguraciju koju PackageInstall prosleđuje paketu. Schema validnost, pristup i odsustvo tajni iz Git-a ili komandne istorije.

Kontroler preuzima repository bundle i iz njega objavljuje PackageMetadata i verzionisane Package objekte u namespace-u. PackageInstall bira verziju, a generisani App preuzima artefakte, renderuje konfiguraciju i primenjuje resurse. Kontroler periodično ponavlja proveru. Ručna izmena Deployment-a koji pripada paketu zato nije trajno rešenje: reconciliation je može vratiti, a drift otežava sledeći upgrade.

3. Kompatibilnost nije samo broj verzije

Podržana kombinacija zavisi od VKS Standard Packages release-a, Kubernetes/VKS verzije, verzije kapp-controller-a, paketa i njegovih zavisnosti. Package može sadržati kubernetesVersionSelection i kappControllerVersionSelection. Moderni kontroler odbija neusklađenu instalaciju, ali odsustvo tehničke blokade nije dokaz vendor podrške. Stariji kapp-controller pre 0.41.x ne sprovodi ova polja, a kapacitet, CNI, CSI, PSA, LoadBalancer i storage zahtevi mogu ostati van automatske provere.

Ne zaobilaziti constraints u produkciji: anotacije packaging.carvel.dev/ignore-kubernetes-version-selection i packaging.carvel.dev/ignore-kapp-controller-version-selection mogu prisiliti pokušaj instalacije, ali ne stvaraju kompatibilnost. Prihvatljive su samo u izolovanom laboratorijskom testu; u produkciji se bira podržana verzija paketa ili se platforma nadograđuje propisanim redosledom.

4. Repozitorijum, namespace i lifecycle odluke

PackageRepository je namespaced izvor kataloga. PackageInstall po pravilu vidi Package resurse u svom namespace-u; repository dodat u proizvoljan namespace ne rešava instalaciju u tkg-system ili drugom ciljnom namespace-u. To je čest osnovni uzrok greške „package not found”. Centralizovano upravljanje ne znači automatski globalnu vidljivost Package objekata.

U produkciji se pin-uje odobren repository release, a kada postupak podržava digest, nepromenljivom digest-u daje se prednost nad promenljivim tagom. Promena repository-ja može promeniti skup verzija, ukloniti paket ili uvesti novi package domain. Pre nje se pravi inventar svih PackageInstall objekata, proveravaju release notes i migracije, pa se promena testira u neprodukcijskom klasteru.

5. Bezbednost lanca isporuke

6. Administratorski CLI i dokazivanje stanja

Komande se izvršavaju sa administratorske radne stanice u kubeconfig kontekstu ciljnog VKS workload klastera. Sledeći blok je read-only. Najpre se proveravaju kontekst i verzije, pa se bira porodica vcf ili tanzu iz dokumentacije za stvarno izdanje.

kubectl config current-context
kubectl version
kubectl api-resources | grep -E 'packagerepositor|packagemetadata|packageinstall|packages'

# Aktuelni VKS/VCF CLI, ako ga izdanje podržava
vcf version
vcf package repository list -A
vcf package available list -A
vcf package installed list -A

# vSphere 8/TKG Service CLI generacija
tanzu version
tanzu plugin list
tanzu package repository list -A
tanzu package available list -A
tanzu package installed list -A

Direktni Kubernetes pregled je najvažniji dijagnostički sloj. Ove komande samo čitaju stanje; opcija -A sprečava zaključak da paket ne postoji samo zato što je administrator u drugom namespace-u.

kubectl get packagerepositories.packaging.carvel.dev -A
kubectl get packagemetadatas.data.packaging.carvel.dev -A
kubectl get packages.data.packaging.carvel.dev -A
kubectl get packageinstalls.packaging.carvel.dev -A
kubectl get apps.kappctrl.k14s.io -A

kubectl describe packagerepository STANDARD_REPO -n tkg-system
kubectl describe packageinstall PACKAGE_INSTALL -n tkg-system
kubectl get packageinstall PACKAGE_INSTALL -n tkg-system -o yaml

Za vrednosti se ne polazi od nasumičnog primera. Prvo se dobija values schema za tačan package refName i verziju. Sintaksa podkomande može se razlikovati između CLI generacija, pa je --help obavezni pre-check.

vcf package available get PACKAGE_REF -n tkg-system
vcf package available get PACKAGE_REF/VERSION --values-schema -n tkg-system

# Alternativa za Tanzu CLI generaciju
tanzu package available get PACKAGE_REF -n tkg-system
tanzu package available get PACKAGE_REF/VERSION --values-schema -n tkg-system
Napomena: konkretan repository URL, package refName i verzija namerno nisu fiksirani. To su release artefakti i moraju se preuzeti iz zvanične dokumentacije za instalirano izdanje. Primer za drugo izdanje može proizvesti tehnički uspešnu, ali nepodržanu kombinaciju.

7. Praktikum – kontrolisana instalacija paketa

7.1. Cilj, topologija i preduslovi

Cilj je registrovati odobren VKS Standard Packages repository, izabrati kompatibilan paket, instalirati ga deklarativno i dokazati funkcionalnost. Topologija obuhvata administratorsku Linux radnu stanicu, neprodukcijski VKS klaster, DNS/NTP, izlaz ka odobrenom Broadcom registry-ju ili internom mirror-u, funkcionalan CNI i, ako paket zahteva, LoadBalancer i StorageClass. Vežba je laboratorijska; produkcija zahteva odobren change, maintenance plan i paket-specifičan backup.

7.2. Pre-check i inventar

date -u
kubectl config current-context
kubectl get nodes -o wide
kubectl get --raw='/readyz?verbose'
kubectl get storageclass
kubectl get packagerepository,packageinstall -A
kubectl get events -A --sort-by=.lastTimestamp | tail -n 50

# Read-only snimak početnog stanja
kubectl get packagerepository,packageinstall -A -o yaml > package-state-before.yaml
kubectl get packages.data.packaging.carvel.dev -A -o wide > package-versions-before.txt

Node-ovi moraju biti Ready, API readiness provere uspešne i ne sme postojati aktivan package incident. Ako je klaster degradiran, instalacija se odlaže.

7.3. Dodavanje repozitorijuma

Sledeća operacija menja stanje. Placeholdere zameniti podacima iz zvanične dokumentacije za konkretan VKS release. Ne izvršavaju se obe CLI varijante.

# VCF CLI generacija
vcf package repository add STANDARD_REPO \
  --url APPROVED_REPOSITORY_URL \
  -n tkg-system

# ILI Tanzu CLI generacija
tanzu package repository add STANDARD_REPO \
  --url APPROVED_REPOSITORY_URL \
  -n tkg-system

Uspeh nije samo povratni kod: repository mora završiti reconcile, a Package i PackageMetadata moraju postati vidljivi.

kubectl get packagerepository STANDARD_REPO -n tkg-system -w
kubectl describe packagerepository STANDARD_REPO -n tkg-system
kubectl get packagemetadata,packages -n tkg-system
Očekivano:
- status repozitorijuma pokazuje uspešan reconcile;
- opis nema aktivnu fetch, TLS ili authentication grešku;
- katalog sadrži očekivani package refName i podržane verzije.

7.4. Izbor paketa i priprema vrednosti

Bira se paket koji postoji u katalogu release-a i čije zahteve laboratorija ispunjava. Najpre se pregledaju detalji i schema, zatim pravi minimalni values.yaml. Primer pokazuje obrazac, ne univerzalnu schema-u.

# values.yaml — uskladiti sa schema-om tačnog paketa
namespace: platform-package
# Package-specifične vrednosti dodati isključivo prema values schema-i.

Proveravaju se planirani namespace, PSA zahtevi, Service tip, storage potrošnja, replike, tolerations i cluster-wide privilegije. Tajne se ne upisuju u fajl ako paket podržava reference na postojeći Secret.

7.5. Instalacija i višeslojna validacija

Instalacija menja stanje. Tačna verzija se pin-uje umesto nekontrolisanog praćenja svakog novog izdanja. Naziv VCF podkomande proveriti sa vcf package installed --help, jer se CLI površina može menjati.

# VCF CLI obrazac za izdanje koje podržava create
vcf package installed create PACKAGE_INSTALL \
  --package PACKAGE_REF \
  --version PACKAGE_VERSION \
  --values-file values.yaml \
  -n tkg-system

# ILI Tanzu CLI generacija
tanzu package install PACKAGE_INSTALL \
  --package PACKAGE_REF \
  --version PACKAGE_VERSION \
  --values-file values.yaml \
  -n tkg-system

Validira se pet slojeva: PackageInstall, generisani App, Kubernetes workload, mrežna ili storage funkcija i Events.

kubectl get packageinstall PACKAGE_INSTALL -n tkg-system -o wide
kubectl describe packageinstall PACKAGE_INSTALL -n tkg-system
kubectl get apps.kappctrl.k14s.io -n tkg-system
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -n 80

# Zameniti stvarnim workload namespace-om i Deployment-om
kubectl rollout status deployment/DEPLOYMENT_NAME -n TARGET_NAMESPACE --timeout=5m
kubectl get all -n TARGET_NAMESPACE

Kriterijum završetka nije samo Running: PackageInstall i App moraju biti usklađeni, podovi spremni, Service endpoints popunjeni, PVC-ovi vezani i paket-specifičan test uspešan. Za ingress to je HTTP/TLS zahtev, za cert-manager izdavanje test sertifikata, a za log agent prijem kontrolisanog zapisa u backend-u.

7.6. Kontrolisana nadogradnja

Pre nadogradnje snimaju se manifest, redigovane values, funkcionalni rezultat i podaci. Proveravaju se ciljna verzija, release notes, breaking changes i zavisnosti. Repository upgrade i package upgrade razdvajaju se kada je moguće, jer se tako preciznije utvrđuje uzrok incidenta.

kubectl get packageinstall PACKAGE_INSTALL -n tkg-system -o yaml \
  > packageinstall-before-upgrade.yaml
kubectl get packageinstall PACKAGE_INSTALL -n tkg-system \
  -o jsonpath='{.spec.packageRef.versionSelection.constraints}{"\n"}'

# Read-only potvrda dostupnih verzija
vcf package available get PACKAGE_REF -n tkg-system

State-changing upgrade izvršava se sintaksom koju prikazuje instalirana generacija, na primer vcf package installed update --help ili tanzu package installed update --help. Zatim se ponavljaju sve validacije i proveravaju podaci i API ugovori korisničkih workload-a.

8. Troubleshooting – od simptoma do osnovnog uzroka

Dijagnostika počinje vremenom, poslednjom promenom, pogođenim klasterom i namespace-om. Ne brišu se odmah PackageInstall, App ili Secret: brisanje uklanja dokaze i može pokrenuti uklanjanje resursa. Redosled je status i Events, describe, App conditions, controller log, pa tek onda korekcija.

Simptom Neposredni uzrok Dokaz Bezbedna korekcija
Repository je Reconcile failed; nema kataloga. DNS, ruta, proxy, TLS CA, autentikacija ili pogrešan OCI URL. describe, Events i log sa x509, unauthorized, timeout ili manifest unknown. Ispraviti rutu/no-proxy, CA ili credential podržanim putem i potvrditi release URL; ne isključivati TLS.
Paket nije pronađen, repository je zdrav. Pogrešan namespace opseg ili stari refName domen. kubectl get packages -A i poređenje namespace-a/refName-a. Dodati repository u ciljni namespace i koristiti stvarni *.kubernetes.vmware.com ili legacy identifikator.
PackageInstall odbijen zbog version selection. Kubernetes ili kapp-controller van constraint-a. PackageInstall conditions i Package version-selection polja. Izabrati kompatibilnu verziju ili nadograditi platformu; ne ignorisati constraint u produkciji.
App pada u template fazi. Values ne odgovaraju schema-i ili overlay ne odgovara verziji. App status, controller log i schema iste verzije. Ispraviti values u izvoru istine; ne menjati renderovane resurse ručno.
Deploy uspe, podovi nisu Ready. ImagePull, PSA/RBAC, CNI, LB, CSI, quota ili kapacitet. Pod Events/log, endpoints, PVC i node conditions. Otkloniti dokazanu zavisnost; ne povećavati privilegije naslepo.
Ručna izmena se vraća. kapp-controller ispravlja drift. App reconciliation i poređenje željenog sa stvarnim. Promenu uneti kroz podržane values ili deklarativni izvor.

Namespace i label selektori kontrolera razlikuju se po izdanju, pa ih prvo treba otkriti. Komande su read-only:

kubectl get pods -A | grep -E 'kapp-controller|package'
kubectl get events -A --sort-by=.lastTimestamp | tail -n 100
kubectl describe app APP_NAME -n tkg-system

# Posle otkrivanja stvarnog namespace-a i pod-a
kubectl logs -n CONTROLLER_NAMESPACE CONTROLLER_POD \
  --since=30m --timestamps | grep -Ei 'PACKAGE_INSTALL|error|fail|x509|unauthorized|timeout'

Nalaz odvaja simptom, posledicu, neposredni uzrok, osnovni uzrok, privremeno rešenje i trajnu meru. Primer: simptom je neuspešan reconcile, neposredni uzrok TLS odbijanje, a osnovni uzrok izostala distribucija novog Root CA posle rotacije. Trajna mera nije ponovni pokušaj instalacije, već kontrolisana trust distribucija i monitoring isteka sertifikata.

9. Rollback i povratak laboratorije

Vraćanje PackageInstall verzije ne vraća automatski podatke, CRD schema migracije ili eksterni sistem. Stateful paket zahteva vendor-podržan rollback i restore plan. Za novu laboratorijsku instalaciju bez podataka prvo se čuva dokaz, zatim briše package instalacija, potvrđuje uklanjanje, pa se repository uklanja samo ako više nije potreban nijednom paketu u namespace-u.

# Read-only dokaz
kubectl get packageinstall PACKAGE_INSTALL -n tkg-system -o yaml \
  > packageinstall-final.yaml
kubectl describe app APP_NAME -n tkg-system > app-final.txt

# DESTRUKTIVNO: samo laboratorija bez potrebnih podataka
vcf package installed delete PACKAGE_INSTALL -n tkg-system

# Tek kada nijedna instalacija ne zavisi od repozitorijuma
vcf package repository delete STANDARD_REPO -n tkg-system

U Tanzu CLI generaciji koriste se dokumentovane komande tanzu package installed delete i tanzu package repository delete. Posle brisanja proveravaju se PackageInstall, App, package namespace, PVC/PV i cluster-scoped resursi. Preostali PVC ili CRD ne brišu se naslepo: mogu sadržati podatke ili ih koristiti drugi workload-i.

10. Administratorske prakse

11. Završna kontrolna tačka

Administrator je spreman za samostalan rad kada može da:

Zaključak

VKS Standard Packages daju deklarativan način za proširenje klastera platformskim komponentama, ali nisu zamena za arhitektonsku procenu i change governance. Pouzdana instalacija počinje podržanim repository release-om, ispravnim namespace opsegom i lancem poverenja, nastavlja se pinovanom verzijom i schema-validnim vrednostima, a završava funkcionalnim testom i dokazom reconciliation-a. Najveći rizici nastaju kada se pomešaju generacije CLI-ja i identifikatora, ignorišu constraints, ručno menja kontrolisani resurs ili pretpostavi da uspešan Pod znači zdrav servis. Odgovoran administrator zato upravlja kompletnim lifecycle-om: inventarom, kompatibilnošću, bezbednošću, observability-jem, nadogradnjom i oporavkom.

← Prethodna lekcija Povratak na sadržaj Sledeća lekcija →