---
title: "Kubernetes a cert-manager — Certificates for Laravel | Roundly"
description: "Riaďte cert-manager z Laravelu — driver kubernetes doplní Ingress o TLS hostiteľov a stav Certificate zdrojov číta cez Kubernetes API."
url: https://roundly-consulting.com/sk/open-source/navody/certificates-for-laravel/kubernetes-a-cert-manager
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Certificates for Laravel](https://roundly-consulting.com/sk/open-source/navody/certificates-for-laravel.md)

# 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:

```bash
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
```

```php
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')): vyplní issued\_at a spustí CertificateIssued — alebo záznam presunie do stavu failed a spustí CertificateFailed. Pri tomto driveri ho naplánujte každých pár minút (pozri Artisan príkazy).

## 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:

```bash
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 pre každého hostiteľa, ktorého Ingress ešte nesmeruje, pravidlo smerujúce / na nakonfigurovanú službu — hostiteľ, ktorý pravidlo už má, si ho ponechá bez zmeny:

```yaml
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 s tými istými hostiteľmi a každý hostiteľ je smerovaný, nič sa nezmení — secret ďalej obnovuje sám cert-manager. Opätovné vystavenie so zmenenou sadou domén (alsoFor()) prepíše hostiteľov v tomto zázname a pre každého nového hostiteľa pridá pravidlo; pravidlá sa nikdy neodstraňujú.

Všetky certifikáty zdieľajú tento Ingress a zámok vystavenia platí pre každý certifikát zvlášť, preto keď zápis prehrá súboj s vystavením inej domény (409 Conflict, vrátane dvoch procesov, ktoré Ingress vytvárajú naraz), driver Ingress znova načíta a zmenu zopakuje až päťkrát, takže zostanú oba TLS záznamy. Po piatom konflikte vyhodí KubernetesApiException.

## 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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/certificates-for-laravel.md)
