ConfigMapy, secrety a sieť
ConfigMapy
$cluster->configMaps()
->setNamespace('shop')
->setName('checkout-config')
->setData([
'APP_ENV' => 'production',
'nginx.conf' => $nginxConfig,
])
->create();
$config = $cluster->configMaps()->setNamespace('shop')->withName('checkout-config')->find();
$config->getData(); // the whole map
$config->getData('nginx.conf'); // one key
$config->getData('MISSING', 'n/a'); // with a default
$config->addData('LOG_LEVEL', 'debug')
->removeData('APP_ENV')
->update();Kľúče dát sú názvy súborov — nginx.conf, app.env —, preto ich getData(), addData() aj removeData() vždy berú ako ploché kľúče, nikdy ako bodkové cesty atribútov. getData('0') prečíta položku "0"; celú mapu vráti len kľúč null. Mapa sa vždy zakóduje ako JSON objekt, aj s číselnými kľúčmi, a setData([]) či odstránenie posledného kľúča pole data úplne vynechá — prázdna mapa by sa zakódovala ako JSON zoznam [], ktorý apiserver odmietne.
Secrety
Secret::setData() a addData() hodnoty za vás zakódujú do base64 a getData() ich dekóduje, takže vždy pracujete s obyčajnými reťazcami. Kľúče ako tls.crt či .dockerconfigjson ostávajú ploché:
$cluster->secrets()
->setNamespace('shop')
->setName('checkout-db')
->setData(['username' => 'checkout', 'password' => $password]) // base64-encoded for you
->create();
$secret = $cluster->secrets()->setNamespace('shop')->withName('checkout-db')->find();
$secret->getData('password'); // the decoded plain string
$secret->getData(); // every key, decoded
$secret->addData('host', 'db.shop.svc.cluster.local')->update();TLS secrety s certifikátom
Secret podporuje typované pole type a pomocníka pre TLS, ktorý PEM certifikát a kľúč zakóduje do base64 v secrete kubernetes.io/tls — pripravenom pre ingress alebo TLSStore Traefiku:
$secret = $cluster->secrets()
->setNamespace('default')
->setName('wildcard-tls')
->asTlsCertificate($pemCertificate, $pemPrivateKey) // sets type + data['tls.crt'] / data['tls.key']
->create();
$secret->getType(); // "kubernetes.io/tls"
$secret->getData('tls.crt'); // the decoded PEM certificate
// Or set an arbitrary Secret type explicitly:
$cluster->secrets()->setName('dockercfg')->setType('kubernetes.io/dockerconfigjson');Služby
use RoundlyConsulting\KubernetesApi\Resources\Types\Port;
$cluster->services()
->setNamespace('shop')
->setName('checkout')
->setType('ClusterIP')
->setSelectors(['app' => 'checkout'])
->addPort(Port::http(8080)->setName('http')) // port 80 -> targetPort 8080, TCP
->addPort(Port::make()->setName('metrics')->setProtocol('TCP')->setPort(9090)->setTargetPort(9090))
->create();
$service = $cluster->services()->setNamespace('shop')->withName('checkout')->find();
$service->getClusterDns(); // checkout.shop.svc.cluster.local
$service->getType(); // 'ClusterIP'
$service->getPorts(); // Port[]
$service->getSelectors(); // ['app' => 'checkout']
// A LoadBalancer that keeps client source IPs
$cluster->services()
->setNamespace('shop')
->setName('checkout-public')
->setType('LoadBalancer')
->useLocalTrafficPolicy() // externalTrafficPolicy: Local
->setSelectors(['app' => 'checkout'])
->addPort(Port::http(8080)->setName('http'))
->create();Ingressy
addRule() jedným volaním zapíše host, cestu aj cieľovú službu; addTls() priradí zoznamu hostov secret s certifikátom:
$cluster->ingresses()
->setNamespace('shop')
->setName('checkout')
->setIngressClassName('nginx')
->addRule('shop.example.com', '/', 'checkout', 80) // pathType defaults to Prefix
->addRule('shop.example.com', '/api', 'checkout-api', 8080, 'Prefix')
->addTls(['shop.example.com'], 'wildcard-tls')
->create();
$ingress = $cluster->ingresses()->setNamespace('shop')->withName('checkout')->find();
$ingress->getRules();
$ingress->getTls();
$ingress->getLoadBalancerIngress(); // status.loadBalancer.ingressSieťové politiky a „vyber všetko“
Prázdny label selektor v Kubernetes znamená „vyber všetko“ a musí sa poslať ako prázdny objekt {}, nie [] — to apiserver odmietne. Settery selektorov to riešia za vás, takže prázdne pole sa serializuje správne:
// Default-deny / select-all: an empty podSelector matches every pod in the namespace.
$cluster->networkPolicies()
->setNamespace('shop')
->setName('default-deny')
->setPodSelector([]) // serialises to "podSelector": {}
->setPolicyTypes(['Ingress'])
->create();
// Then allow the ingress namespace to reach checkout on 8080.
$cluster->networkPolicies()
->setNamespace('shop')
->setName('allow-ingress-to-checkout')
->setPodSelector(['app' => 'checkout']) // podSelector.matchLabels
->setPolicyTypes(['Ingress'])
->addIngressRule([
'from' => [['namespaceSelector' => ['matchLabels' => ['kubernetes.io/metadata.name' => 'ingress']]]],
'ports' => [['protocol' => 'TCP', 'port' => 8080]],
])
->create();Service::setSelectors([]) sa serializuje rovnako. Selektory podov pri workloadoch sú iné: prázdny selektor apiserver pri workloadoch apps/v1 (Deployment, ReplicaSet, StatefulSet, DaemonSet) odmietne, preto im vždy dajte aspoň jeden label, napríklad setPodsSelectors(['app' => 'checkout']). Každý ďalší uzol, ktorý musí byť prázdnym objektom, nastavte na RoundlyConsulting\KubernetesApi\Resources\Types\EmptyObject — serializuje sa vždy na {}.
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.