NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Certificates for Laravel

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=80
use RoundlyConsulting\Certificates\Facades\Certificates;

$certificate = Certificates::for('shop.example.com')->using('kubernetes')->issue();

Certificates::statusReport('shop.example.com', driver: 'kubernetes'); // Ready condition + notAfter

cert-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ľúčEnvPredvolenéÚčel
base_urlCERTIFICATES_K8S_BASE_URLhttps://kubernetes.default.svcURL Kubernetes API servera.
tokenCERTIFICATES_K8S_TOKENnullBearer token; má prednosť pred token_path.
token_pathCERTIFICATES_K8S_TOKEN_PATHtoken SA v klastriSúbor, z ktorého sa token načíta, keď je token prázdny.
ca_pathCERTIFICATES_K8S_CA_PATHCA SA v klastriCA balík pre TLS API servera; null alebo prázdna hodnota použije systémový balík, overovanie vypne len false (0, off, no).
namespaceCERTIFICATES_K8S_NAMESPACEdefaultNamespace Ingressu a Certificate zdrojov — pre všetky certifikáty tohto drivera.
issuerCERTIFICATES_K8S_ISSUERletsencryptNázov vydavateľa v cert-manageri — pre všetky certifikáty tohto drivera.
issuer_kindCERTIFICATES_K8S_ISSUER_KINDClusterIssuerClusterIssuer alebo Issuer — určuje anotáciu.
ingress.nameCERTIFICATES_K8S_INGRESS_NAMEnullSpravovaný Ingress — nastavte ho.
ingress.classCERTIFICATES_K8S_INGRESS_CLASSnginxAnotácia triedy na novovytvorenom Ingresse.
service.nameCERTIFICATES_K8S_SERVICE_NAMEnullBackend služba pre nových hostiteľov.
service.portCERTIFICATES_K8S_SERVICE_PORT80Port 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.crt

ca_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.port

Existujú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 kryptomien

Odoslaní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.