Pozdrav, Habr zajednice! Kubernetes je jedan od ključnih elemenata moderne oblačne ekosustave. Ova tehnologija osigurava pouzdanost, skalabilnost i otpornost kontejnerske virtualizacije. John Arundel i Justin Domingus govore o Kubernetes ekosustavu i predstavljaju provjerena rješenja svakodnevnih problema. Korak po korak izgradit ćete vlastitu oblačno orijentiranu aplikaciju i stvoriti infrastrukturu koja će je podržati, konfigurirati razvojno okruženje i kontinuirani deploy pipeline koji će vam koristiti pri radu na sljedećim aplikacijama.
• Započet ćete rad s kontejnerima i Kubernetesom od samog početka: nije potrebno nikakvo posebno iskustvo za učenje ove teme. • Pokrenite vlastite klastere ili odaberite upravljanu Kubernetes uslugu pružatelja kao što su Amazon, Google i drugi. • Primijenite Kubernetes za upravljanje životnim ciklusom kontejnera i potrošnjom resursa. • Optimizirajte klastere prema troškovima, performansama, otpornosti, snazi i skalabilnosti. • Istražite najbolje alate za razvoj, testiranje i implementaciju vaših aplikacija. • Iskoristite ažurirane industrijske prakse za osiguranje i kontrolu. • Uspostavite DevOps principe u tvrtki kako bi razvojni timovi djelovali agilnije, brže i učinkovitije.
Za koga je knjiga namijenjena
Knjiga je najrelevantnija za zaposlenike administrativnih odjela odgovorne za poslužitelje, aplikacije i usluge, kao i za programere koji se bave ili izradom novih oblačnih usluga ili migracijom postojećih aplikacija u Kubernetes i oblak. Ne brinite, nije potrebno znati raditi s Kubernetesom i kontejnerima — naučit ćemo vas svemu.
Iskusni korisnici Kubernetes-a također će pronaći mnogo korisnog: ovdje se duboko razmatraju teme kao što su RBAC, kontinuirano implementiranje, upravljanje povjerljivim podacima i promatranje. Nadamo se da će na stranicama knjige sigurno biti nešto zanimljivo i za vas, bez obzira na vaše vještine i iskustvo.
Na koja pitanja knjiga odgovara
Tijekom planiranja i pisanja knjige razgovarali smo o cloud tehnologijama i Kubernetesu s stotinama ljudi, komunicirali s liderima i stručnjacima iz ove industrije, ali i s potpunim početnicima. Ispod su navedena pitanja na koja bi željeli vidjeti odgovore u ovom izdanju.
- „Zanima me zašto bih trebao trošiti vrijeme na ovu tehnologiju. Koje probleme će ona pomoći riješiti meni i mom timu?“
- „Kubernetes se čini zanimljivim, ali ima prilično visoku granicu prijema. Pripremiti jednostavan primjer nije teško, ali daljnje administriranje i otklanjanje grešaka zastrašuju. Željeli bismo dobiti pouzdane savjete o tome kako ljudi upravljaju Kubernetes klasterima u stvarnim uvjetima i s kojim se problemima najvjerojatnije možemo suočiti.“
- „Bilo bi korisno imati subjektivni savjet. Ekosustav Kubernetes nudi novim timovima previše opcija za odabir. Kada se isto može učiniti na nekoliko načina, kako znati koji je od njih najbolji? Kako donijeti odluku?“
I, vjerojatno, najvažnije od svih pitanja:
- „Kako koristiti Kubernetes, a da ne ometam rad moje tvrtke?“
Izvadak. Konfiguracija i objekti Secret
Mogućnost odvajanja logike Kubernetes aplikacije od njene konfiguracije (tj. od svih vrijednosti ili postavki koje se s vremenom mogu promijeniti) vrlo je korisna. Konfiguracijske vrijednosti obično uključuju parametre namijenjene određenom okolišu, DNS adrese vanjskih usluga i vjerodajnice za autentifikaciju.
Naravno, sve to se može smjestiti izravno u kod, ali takav pristup nije dovoljno fleksibilan. Na primjer, za promjenu konfiguracijske vrijednosti tada bi bilo potrebno ponovno sastaviti i rasporediti vaš kod. Puno bolje rješenje bilo bi odvojiti konfiguraciju od koda i čitati je iz datoteke ili varijabli okoline.
Kubernetes pruža nekoliko različitih načina upravljanja konfiguracijom. Prvo, možete proslijediti vrijednosti aplikaciji putem varijabli okoline, navedenih u specifikaciji pod-kontejnera (vidi odjeljak „Varijable okoline“ na str. 192). Drugo, konfiguracijske podatke možete pohraniti izravno u Kubernetes koristeći objekte ConfigMap i Secret.
U ovom poglavlju detaljno istražujemo ove objekte i razmatramo neka praktična rješenja za upravljanje konfiguracijom i osjetljivim podacima na primjeru demonstracijske aplikacije.
Ažuriranje pod-omota pri promjeni konfiguracije.
Zamislite da u vašem klasteru postoji raspoređivanje i želite promijeniti neke vrijednosti u njegovom ConfigMap. Ako koristite Helm chart (vidi dio 'Helm: upravitelj paketa za Kubernetes' na str. 102), možete automatski otkriti promjenu konfiguracije i ponovno pokrenuti vaše pod-omote pomoću jednog elegantnog trika. Dodajte sljedeću anotaciju u specifikaciju svog raspoređivanja:
checksum/config: {{ include (print $.Template.BasePath "\/configmap.yaml") .
| sha256sum }}Sada predložak raspoređivanja sadrži kontrolnu sumu konfiguracijskih parametara: kada se parametri promijene, suma će se ažurirati. Ako izvršite naredbu helm upgrade, Helm će otkriti da se specifikacija raspoređivanja promenila i ponovo pokrenuti sve pod-omote.
Osjetljivi podaci u Kubernetesu.
Već znamo da objekt ConfigMap pruža fleksibilan mehanizam za pohranu i pristup konfiguracijskim podacima u klasteru. Međutim, većina aplikacija sadrži informacije koje su tajne i osjetljive: na primjer, lozinke ili API ključevi. Može se pohraniti i u ConfigMap, ali to nije idealno rješenje.
Umjesto toga, Kubernetes nudi poseban tip objekta namijenjen za pohranu osjetljivih podataka: Secret. Dalje ćemo razmotriti na primjeru kako se ovaj objekt može primijeniti u našoj demonstracijskoj aplikaciji.
Za početak, pogledajte manifest Kubernetes za objekt Secret (vidi hello-secret-env/k8s/secret.yaml):
apiVersion: v1
kind: Secret
metadata:
name: demo-secret
stringData:
magicWord: xyzzy
U ovom primjeru tajni ključ magicWord ima vrijednost xyzzy (en.wikipedia.org/wiki/Xyzzy_(computing)). Riječ xyzzy je zapravo vrlo korisna u svijetu računala. Na sličan način kao u ConfigMap, u objektu Secret može se pohraniti mnogo ključeva i vrijednosti. Ovdje iz jednostavnosti koristimo samo jedan par 'ključ - vrijednost'.
Korištenje objekata Secret kao varijabli okruženja.
Kao i ConfigMap, objekt Secret može biti dostupan unutar kontejnera u obliku varijabli okruženja ili datoteke na njegovom disku. U sljedećem primjeru dodjeljujemo varijabli okruženja vrijednost iz Secret:
spec:
containers:
- name: demo
image: cloudnatived/demo:hello-secret-env
ports:
- containerPort: 8888
env:
- name: GREETING
valueFrom:
secretKeyRef:
name: demo-secret
key: magicWordIzvršite sljedeću naredbu u demo repozitoriju za primjenu manifestacija:
kubectl apply -f hello-secret-env/k8s/
deployment.extensions "demo" konfiguriran
secret "demo-secret" stvorenKao i prije, preusmjerite lokalnu port na implementaciju da biste vidjeli rezultat u svom pregledniku:
kubectl port-forward deploy/demo 9999:8888
Preusmjeravanje s 127.0.0.1:9999 -> 8888
Preusmjeravanje s [::1]:9999 -> 8888Kada otvorite adresu :9999/ trebali biste vidjeti sljedeće:
Čarobna riječ je "xyzzy"
Zapisivanje objekata Secret u datoteke
U ovom primjeru povezujemo objekt Secret s kontejnerom u obliku datoteke. Kod se nalazi u mapi hello-secret-file repozitorija demo.
Da bismo povezali Secret u obliku datoteke, koristit ćemo sljedeću implementaciju:
spec:
containers:
- name: demo
image: cloudnatived/demo:hello-secret-file
ports:
- containerPort: 8888
volumeMounts:
- name: demo-secret-volume
mountPath: "/secrets/"
readOnly: true
volumes:
- name: demo-secret-volume
secret:
secretName: demo-secretKao u pododjeljku „Izrada konfiguracijskih datoteka iz objekata ConfigMap” na str. 240, stvaramo volumen (u ovom slučaju demo-secret-volume) i povezujemo ga s kontejnerom u dijelu specifikacije volumeMounts. U polju mountPath navedeno je /secrets, tako da će Kubernetes stvoriti jedan datoteku za svaku par „ključ — vrijednost” definiranu u objektu Secret.
U našem primjeru definirali smo samo jedan par „ključ — vrijednost” s imenom magicWord, stoga će manifest stvoriti jednu datoteku /secrets/magicWord s povjerljivim podacima dostupnim isključivo za čitanje.
Ako primijenite ovaj manifest na isti način kao u prethodnom primjeru, trebali biste dobiti isti rezultat:
Čarobna riječ je "xyzzy"
Čitanje objekata Secret
U prethodnom odjeljku koristili smo naredbu kubectl describe za ispis sadržaja ConfigMap. Može li se isto učiniti s Secret?
kubectl describe secret/demo-secret
Name: demo-secret
Namespace: default
Labels:
Annotations:
Type: Opaque
Data
====
magicWord: 5 bytesObratite pažnju da se sami podaci ne prikazuju. Objekti Secret u Kubernetesu imaju tip Opaque: to znači da se njihov sadržaj ne prikazuje u izlazu kubectl describe, zapisima i terminalu, čime se sprečava slučajno otkrivanje povjerljivih informacija.
Da biste pregledali kodiranu verziju povjerljivih podataka u YAML formatu, koristite naredbu kubectl get:
kubectl get secret/demo-secret -o yaml
apiVersion: v1
data:
magicWord: eHl6enk=
kind: Secret
metadata:
...
type: Opaquebase64
Što je eHl6enk=, nije nimalo slično našem izvornoj vrijednosti? U stvari, to je Secret objekt prikazan u base64 kodiranju. Base64 je shema kodiranja proizvoljnih binarnih podataka u obliku niza znakova.
Budući da povjerljive informacije mogu biti binarne i nedostupne za ispis (kao što je slučaj s TLS ključem), Secret objekti uvijek se pohranjuju u base64 formatu.
Tekst beHl6enk= je verzija naše tajne riječi xyzzy, kodirane u base64. To možete provjeriti izvršavanjem sljedeće naredbe u terminalu:
echo "eHl6enk=" | base64 --decode
xyzzyDakle, iako Kubernetes štiti vas od slučajnog ispisa povjerljivih podataka u terminalu ili zapisima, ako imate prava za čitanje Secret objekata u određenom namespaceu, te podatke možete dobiti u base64 formatu i kasnije ih dešifrirati.
Ako trebate kodirati neki tekst u base64 (npr. da ga stavite u Secret), koristite naredbu base64 bez argumenata:
echo xyzzy | base64
eHl6enkKPristup Secret objektima
Tko može čitati i uređivati Secret objekte? To određuje RBAC — mehanizam kontrole pristupa (detaljno ćemo o tome razgovarati u odjeljku "Uvod u upravljanje pristupom temeljenom na ulogama" na str. 258). Ako koristite klaster u kojem RBAC sustav nije prisutan ili nije uključen, svi vaši Secret objekti dostupni su svim korisnicima i kontejnerima (kasnije ćemo objasniti da ne biste trebali imati industrijski klaster bez RBAC).
Pasivno šifriranje podataka
A što je s onima koji imaju pristup etcd bazi podataka, u kojoj Kubernetes pohranjuje sve svoje informacije? Mogu li pročitati povjerljive podatke, nemajući prava na čitanje Secret objekata preko API-ja?
Od verzije 1.7, Kubernetes podržava pasivno šifriranje podataka. To znači da se poverljive informacije unutar etcd čuvaju na disku u šifrovanom obliku i ne mogu se pročitati čak ni od strane onih koji imaju direktan pristup bazi podataka. Za dešifrovanje je potreban ključ koji ima samo API server Kubernetes-a. U pravilno konfigurisanom klasteru, pasivno šifriranje treba da bude omogućeno.
Možete proveriti da li pasivno šifriranje radi u vašem klasteru na sledeći način:
kubectl describe pod -n kube-system -l component=kube-apiserver |grep encryption
--experimental-encryption-provider-config=...Ako ne vidite flag experimental-encryption-provider-config, pasivno šifriranje nije omogućeno. Kada koristite Google Kubernetes Engine ili druge usluge za upravljanje Kubernetes-om, vaši podaci se šifruju pomoću drugog mehanizma, tako da flag neće biti prisutan. Pitajte svog provajdera Kubernetes-a da li se sadržaj etcd šifruje.
Čuvanje poverljivih podataka
Postoje određeni resursi Kubernetes-a koje nikada ne biste trebali brisati iz klastera: na primer, posebno važni objekti Secret. Možete zaštititi resurs od brisanja pomoću anotacije koju pruža Helm menadžer:
kind: Secret
metadata:
annotations:
"helm.sh/resource-policy": keepStrategije upravljanja objektima Secret
U primeru iz prethodnog odeljka, poverljivi podaci su zaštićeni od neovlašćenog pristupa odmah nakon što su sačuvani u klasteru. Međutim, u datotekama manifestacija čuvali su se u obliku običnog teksta.
Nikada ne biste trebali stavljati poverljive informacije u datoteke koje se nalaze u sistemu kontrole verzija. Kako da bezbedno upravljate i čuvate takve informacije pre nego što ih primenite na klaster Kubernetes?
Možete odabrati bilo koji alat ili strategiju za rad sa poverljivim podacima u svojim aplikacijama, ali ćete i dalje morati da odgovorite barem na sledeća pitanja.
- Gde čuvati poverljive podatke da bi bili visoko dostupni?
- Kako učiniti poverljive podatke dostupnim za vaše aktivne aplikacije?
- Šta treba da se desi sa vašim aplikacijama kada zamenjujete ili uređujete poverljive podatke?
O autorima
Džon Arundel je konzultant s 30-godišnjim iskustvom u računalnoj industriji. Napisao je nekoliko knjiga i surađivao je s brojnim kompanijama iz različitih zemalja, savjetujući ih o pitanjima oblaka orijentirane infrastrukture i Kubernetes-a. U slobodno vrijeme uživa u surfanju, dobro puca iz pištolja i amaterski svira klavir. Živi u bajkovitom vikendici u Cornwallu, Engleska.
Justin Domingus — inženjer sustava koji radi u DevOps okruženju s Kubernetes-om i oblačnim tehnologijama. Voli provoditi vrijeme na otvorenom, piti kavu, loviti rakove i sjediti za računalom. Živi u Seattleu, Washington, zajedno sa svojim prekrasnim mačkom i još prekrasnijom suprugom koja mu je i najbolji prijatelj, Adriann.
» Detaljnije s knjigom možete se upoznati na
»
»
Za Habr korisnike popust od 25% uz kupon — Kubernetes
Nakon što uspješno platite fizičku verziju knjige, na e-mail će vam biti poslana elektronička knjiga.
Izvor: habr.com
