Kubernetes a cert-manager
Driver kubernetes — predvolený — komunikuje s Kubernetes API priamo cez HTTP klient Laravelu, bez SDK. Certifikát vystaví tak, že do Ingressu pridá TLS záznam a pravidlá pre hostiteľov, certifikát do secretu vystaví cert-manager a stav aj zoznam sa čítajú z Certificate zdrojov cert-managera:
CERTIFICATES_DRIVER=kubernetes
CERTIFICATES_K8S_NAMESPACE=tenants
CERTIFICATES_K8S_ISSUER=letsencrypt
CERTIFICATES_K8S_ISSUER_KIND=ClusterIssuer
CERTIFICATES_K8S_INGRESS_NAME=tenant-domains
CERTIFICATES_K8S_INGRESS_CLASS=nginx
CERTIFICATES_K8S_SERVICE_NAME=web
CERTIFICATES_K8S_SERVICE_PORT=80use RoundlyConsulting\Certificates\Facades\Certificates;
$certificate = Certificates::for('shop.example.com')->using('kubernetes')->issue();
Certificates::statusReport('shop.example.com', driver: 'kubernetes'); // Ready condition + notAftercert-manager vystavuje asynchrónne, takže prvé issue() aktualizuje Ingress a vráti záznam stále v stave requested — cert-manager ešte Certificate nevytvoril alebo nedokončil. Keď je Ready, výsledok zapíšete cez certificates:sync (alebo Certificates::sync('kubernetes')).
Kľúče drivera
| Kľúč | Env | Predvolené | Účel |
|---|---|---|---|
base_url | CERTIFICATES_K8S_BASE_URL | https://kubernetes.default.svc | URL Kubernetes API servera. |
token | CERTIFICATES_K8S_TOKEN | null | Bearer token; má prednosť pred token_path. |
token_path | CERTIFICATES_K8S_TOKEN_PATH | token SA v klastri | Súbor, z ktorého sa token načíta, keď je token prázdny. |
ca_path | CERTIFICATES_K8S_CA_PATH | CA SA v klastri | CA balík pre TLS API servera; null alebo prázdna hodnota použije systémový balík, overovanie vypne len false (0, off, no). |
namespace | CERTIFICATES_K8S_NAMESPACE | default | Namespace Ingressu a Certificate zdrojov — pre všetky certifikáty tohto drivera. |
issuer | CERTIFICATES_K8S_ISSUER | letsencrypt | Názov vydavateľa v cert-manageri — pre všetky certifikáty tohto drivera. |
issuer_kind | CERTIFICATES_K8S_ISSUER_KIND | ClusterIssuer | ClusterIssuer alebo Issuer — určuje anotáciu. |
ingress.name | CERTIFICATES_K8S_INGRESS_NAME | null | Spravovaný Ingress — nastavte ho. |
ingress.class | CERTIFICATES_K8S_INGRESS_CLASS | nginx | Anotácia triedy na novovytvorenom Ingresse. |
service.name | CERTIFICATES_K8S_SERVICE_NAME | null | Backend služba pre nových hostiteľov. |
service.port | CERTIFICATES_K8S_SERVICE_PORT | 80 | Port backend služby. |
Vydavateľ a namespace platia pre všetky certifikáty drivera. Pre druhého vydavateľa alebo iný namespace zaregistrujte ďalší driver cez Certificates::extend() a zvoľte ho cez using().
Autentifikácia
Predvolene sa driver autentifikuje tokenom service accountu v klastri a API server overuje voči CA balíku z klastra. Mimo klastra nastavte base_url a token zadajte priamo — priamy token má prednosť pred token_path — spolu s cestou k CA balíku:
CERTIFICATES_K8S_BASE_URL=https://k8s.example.com:6443
CERTIFICATES_K8S_TOKEN=service-account-token
CERTIFICATES_K8S_CA_PATH=/etc/ssl/k8s/ca.crtca_path je CA balík, voči ktorému sa overuje certifikát API servera. null (alebo prázdna hodnota) namiesto neho použije systémový CA balík a overovanie TLS vypne len hodnota false (CERTIFICATES_K8S_CA_PATH=false, prípadne 0, off, no) — neodporúčame. Chyby API aj nesprávna konfigurácia vyhodia KubernetesApiException s HTTP stavom a telom odpovede.
Ako vyzerá Ingress
Ak Ingress s názvom ingress.name ešte neexistuje, vytvorí sa s anotáciami triedy ingressu a vydavateľa cert-managera — cert-manager.io/cluster-issuer pre ClusterIssuer, inak cert-manager.io/issuer. Každé vystavenie pridá TLS záznam, ktorého secretName je odvodený názov certifikátu, a jedno pravidlo na hostiteľa smerujúce / na nakonfigurovanú službu:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tenant-domains # ingress.name
namespace: tenants # namespace
annotations:
kubernetes.io/ingress.class: nginx # ingress.class
cert-manager.io/cluster-issuer: letsencrypt # issuer + issuer_kind
spec:
tls:
- hosts:
- shop.example.com
secretName: generated-tls-shop-example-com
rules:
- host: shop.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web # service.name
port:
number: 80 # service.portExistujúci Ingress sa aktualizuje cez merge patch a ponechá si vlastné anotácie, preto skontrolujte, že už nesie anotáciu vydavateľa cert-managera. Ak Ingress už obsahuje TLS záznam pre daný secret, nič sa nezmení — secret ďalej obnovuje sám cert-manager.
Stav a zoznam
Stav pochádza z Certificate zdroja s rovnakým názvom a mapuje sa na životný cyklus registra:
- Ready=True — issued, alebo expired, keď už status.notAfter uplynul.
- Issuing=True — pending: vystavenie ešte prebieha.
- Issuing=False s dôvodom Failed alebo zaznamenaný lastFailureTime — failed.
- Všetko ostatné — expired, ak status.notAfter už uplynul, inak pending: samotná podmienka Ready=False (cert-manager ju hlási aj počas vystavovania), zatiaľ žiadne podmienky alebo ešte neexistujúci Certificate zdroj (ingress-shim ho vytvorí chvíľu po aktualizácii Ingressu). Pending nie je chyba.
expiresAt je status.notAfter a issuer je spec.issuerRef.name. get() vypíše každý Certificate v namespace podľa prvého dnsName (alebo commonName) — do registra ich prenesiete cez certificates:sync --driver=kubernetes. Report pending nikdy neposunie späť záznam, ktorý je už v stave requested alebo renewing.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.