Hej, Habr-medlemmar! Kubernetes Àr en av de centrala komponenterna i dagens molnekosystem. Denna teknik sÀkerstÀller tillförlitlighet, skalbarhet och motstÄndskraft i containerbaserad virtualisering. John Arundel och Justin Domingus diskuterar Kubernetes-ekosystemet och presenterar beprövade lösningar pÄ vardagliga problem. Steg för steg bygger du din egen molnorienterade applikation och skapar infrastrukturen för dess stöd, sÀtter upp utvecklingsmiljön och en kontinuerlig distributionspipeline som kommer att vara till nytta nÀr du arbetar med kommande applikationer.
⹠Du börjar arbeta med containrar och Kubernetes frÄn grunden: ingen speciell erfarenhet krÀvs för att lÀra sig Àmnet. ⹠Starta dina egna kluster eller vÀlj en hanterad Kubernetes-tjÀnst frÄn Amazon, Google m.fl. ⹠AnvÀnd Kubernetes för att hantera livscykeln av containrar och resursanvÀndning. ⹠Optimera kluster baserat pÄ kostnad, prestanda, motstÄndskraft, kapacitet och skalbarhet. ⹠Utforska de bÀsta verktygen för att utveckla, testa och distribuera dina applikationer. ⹠Utnyttja aktuella branschpraxis för att sÀkerstÀlla sÀkerhet och kontroll. ⹠Implementera DevOps-principer i företaget sÄ att utvecklingsteam arbetar mer flexibelt, snabbt och effektivt.
För vem Àr boken avsedd
Boken Ă€r mest relevant för anstĂ€llda pĂ„ administrationsavdelningar som ansvarar för servrar, applikationer och tjĂ€nster, samt för utvecklare som antingen bygger nya molntjĂ€nster eller migrerar befintliga applikationer till Kubernetes och molnet. Oroa dig inte, att kunna arbeta med Kubernetes och containrar krĂ€vs inte â vi lĂ€r dig allt.
Erfarna anvÀndare av Kubernetes kommer ocksÄ att hitta mycket vÀrdefullt: detta verk avhandlar djupgÄende Àmnen som RBAC, kontinuerlig distribution, hantering av kÀnsliga data och insyn. Vi hoppas att det finns nÄgot intressant för dig pÄ sidorna i boken, oavsett dina fÀrdigheter och erfarenheter.
Vilka frÄgor besvarar boken
Under planering och skrivande av boken diskuterade vi molnteknologier och Kubernetes med hundratals mÀnniskor, talade bÄde med branschledare och experter och med fullstÀndiga nybörjare. Nedan följer specifika frÄgor vars svar de skulle vilja se i denna utgÄva.
- "Jag undrar varför jag ska lÀgga tid pÄ denna teknik. Vilka problem kommer den att hjÀlpa mig och mitt team att lösa?"
- "Kubernetes verkar intressant, men har en ganska hög tröskel för intrÀde. Det Àr inte svÄrt att förbereda ett enkelt exempel, men vidare administration och felsökning Àr skrÀmmande. Vi skulle vilja ha pÄlitliga rÄd om hur mÀnniskor hanterar Kubernetes-kluster i verkliga förhÄllanden och vilka problem vi sannolikt kommer att stöta pÄ."
- "Subjektivt rÄd skulle vara anvÀndbart. Kubernetes ekosystem erbjuder nybörjarteam för mÄnga alternativ att vÀlja mellan. NÀr samma sak kan göras pÄ flera sÀtt, hur förstÄr man vilket som Àr bÀst? Hur gör man valet?"
Och kanske den viktigaste av alla frÄgor:
- "Hur kan jag anvÀnda Kubernetes utan att störa min företagsverksamhet?"
Utdrag. Konfiguration och objekt Secret
Möjligheten att separera Kubernetes-applikationens logik frÄn dess konfiguration (dvs. frÄn vÀrden eller instÀllningar som kan Àndras över tid) Àr mycket anvÀndbar. KonfigurationsvÀrden omfattar vanligtvis parametrar avsedda för specifika miljöer, DNS-adresser för tredjepartstjÀnster och autentiseringsuppgifter.
SjÀlvklart kan allt detta placeras direkt i koden, men en sÄdan metod Àr inte tillrÀckligt flexibel. Till exempel skulle du behöva Äterkompilera och distribuera din kod för att Àndra ett konfigurationsvÀrde. Ett mycket bÀttre alternativ skulle vara att separera konfigurationen frÄn koden och lÀsa in den frÄn en fil eller miljövariabler.
Kubernetes erbjuder flera olika sÀtt att hantera konfiguration. För det första kan du överföra vÀrden till applikationen via miljövariabler som anges i pod-specifikationen (se avsnittet "Miljövariabler" pÄ s. 192). För det andra kan konfigurationsdata lagras direkt i Kubernetes med hjÀlp av objekten ConfigMap och Secret.
I detta kapitel kommer vi att noggrant undersöka dessa objekt och diskutera nÄgra praktiska metoder för hantering av konfiguration och kÀnslig information med hjÀlp av ett demonstrationsprogram.
Uppdatering av pod-wraps vid Àndring av konfiguration
TÀnk dig att du har en distribution i din kluster och vill Àndra vissa vÀrden i dess ConfigMap. Om du anvÀnder en Helm-chart (se avsnittet "Helm: pakethanterare för Kubernetes" pÄ s. 102), kan du automatiskt upptÀcka Àndringar i konfigurationen och starta om dina pod-wraps med hjÀlp av en elegant teknik. LÀgg till följande annotation i din distributionsspecifikation:
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") .
| sha256sum }}Nu innehÄller distributionsmallen en kontrollsumma av konfigurationsparametrarna: nÀr parametrarna Àndras, kommer summan att uppdateras. Om du kör kommandot helm upgrade, kommer Helm att upptÀcka att distributionsspecifikationen har Àndrats och starta om alla pod-wraps.
KĂ€nslig information i Kubernetes
Vi vet redan att ConfigMap-objektet erbjuder en flexibel funktion för lagring och Ätkomst till konfigurationsdata i klustret. Men de flesta applikationer har information som Àr hemlig och konfidentiell: till exempel lösenord eller API-nycklar. Det gÄr att lagra detta i en ConfigMap, men det Àr inte en idealisk lösning.
IstÀllet erbjuder Kubernetes ett speciellt typ av objekt som Àr avsett för lagring av kÀnslig information: Secret. LÄt oss titta pÄ ett exempel pÄ hur detta objekt kan anvÀndas i vÄr demonstrationsapplikation.
Först, ta en titt pÄ Kubernetes-manifestet för Secret-objektet (se hello-secret-env/k8s/secret.yaml):
apiVersion: v1
kind: Secret
metadata:
name: demo-secret
stringData:
magicWord: xyzzy
I detta exempel har den hemliga nyckeln magicWord vÀrdet xyzzy (en.wikipedia.org/wiki/Xyzzy_(computing)). Ordet xyzzy Àr faktiskt mycket anvÀndbart i datorsvÀrlden. PÄ samma sÀtt som i ConfigMap kan du placera mÄnga nycklar och vÀrden i Secret-objektet. HÀr anvÀnder vi bara ett par "nyckel - vÀrde" för enkelhetens skull.
AnvÀndning av Secret-objekt som miljövariabler
Precis som ConfigMap kan Secret-objekt göras tillgÀngliga i containern som miljövariabler eller som filer pÄ dess disk. I det följande exemplet kommer vi att tilldela en miljövariabel vÀrdet frÄn Secret:
spec:
containers:
- name: demo
image: cloudnatived/demo:hello-secret-env
ports:
- containerPort: 8888
env:
- name: GREETING
valueFrom:
secretKeyRef:
name: demo-secret
key: magicWordKör följande kommando i demo-repositoriet för att tillÀmpa manifesten:
kubectl apply -f hello-secret-env/k8s/
department.extensions "demo" konfigurerad
secret "demo-secret" skapadSom tidigare, vidarebefordra den lokala porten till distributionen för att se resultatet i din webblÀsare:
kubectl port-forward deploy/demo 9999:8888
Vidarebefordrar frÄn 127.0.0.1:9999 -> 8888
Vidarebefordrar frÄn [::1]:9999 -> 8888NÀr du öppnar adressen :9999/ bör du se följande:
Det magiska ordet Àr "xyzzy"
Skriva objekten Secret till filer
I det hÀr exemplet kopplar vi objektet Secret till containern som en fil. Koden finns i mappen hello-secret-file i demo-repositoriet.
För att koppla Secret som en fil anvÀnder vi följande distribution:
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-secretSom i avsnittet "Skapa konfigurationsfiler frÄn ConfigMap-objekt" pÄ s. 240 skapar vi en volym (i det hÀr fallet demo-secret-volume) och kopplar den till containern i avsnittet volumeMounts-specifikationerna. I fÀltet mountPath anges /secrets, sÄ Kubernetes skapar en fil i den mappen för varje "nyckel-vÀrde"-par definierat i Secret-objektet.
I vÄrt exempel har vi definierat endast ett "nyckel-vÀrde"-par med namnet magicWord, sÄ manifestet skapar en fil /secrets/magicWord i containern med konfidentiell data, tillgÀnglig som skrivskyddad.
Om du tillÀmpar detta manifest pÄ samma sÀtt som i det föregÄende exemplet, bör samma resultat erhÄllas:
Det magiska ordet Àr "xyzzy"
LĂ€sa objekten Secret
I det föregÄende avsnittet anvÀnde vi kommandot kubectl describe för att visa innehÄllet i ConfigMap. Kan vi göra samma sak med Secret?
kubectl describe secret/demo-secret
Namn: demo-secret
Namnrum: standard
Etiketter:
Anteckningar:
Typ: Opaque
Data
====
magicWord: 5 bytesObservera att sjÀlva datan inte visas. Secret-objekt i Kubernetes har typen Opaque: det innebÀr att deras innehÄll inte visas i utskriften av kubectl describe, loggar och terminalen, vilket förhindrar oavsiktlig avslöjande av konfidentiell information.
För att visa den kodade versionen av kÀnslig information i YAML-format, anvÀnd kommandot kubectl get:
kubectl get secret/demo-secret -o yaml
apiVersion: v1
data:
magicWord: eHl6enk=
kind: Secret
metadata:
...
type: Opaquebase64
Vad Àr eHl6enk=, som inte alls liknar vÄrt ursprungliga vÀrde? Det Àr faktiskt ett Secret-objekt, presenterat i base64-kodning. Base64 Àr ett kodningsschema för godtycklig binÀr data som representeras som en strÀng av tecken.
Eftersom kÀnslig information kan vara binÀr och otillgÀnglig för utdata (som i fallet med TLS-krypteringsnyckeln), lagras Secret-objekt alltid i base64-format.
Texten beHl6enk= Àr en version av vÄrt hemliga ord xyzzy, kodad i base64. Detta kan verifieras genom att köra kommandot base64 --decode i terminalen:
echo "eHl6enk=" | base64 --decode
xyzzySÄ trots att Kubernetes skyddar dig frÄn oavsiktlig utmatning av kÀnslig information i terminalen eller loggfiler, kan denna data, om man har lÀsrÀttigheter för Secret-objekt i ett visst namnrum, hÀmtas i base64-format och avkodas senare.
Om du behöver koda nÄgon text i base64 (t.ex. för att placera den i ett Secret), anvÀnd kommandot base64 utan argument:
echo xyzzy | base64
eHl6enkKĂ tkomst till Secret-objekt
Vem kan lĂ€sa och redigera Secret-objekt? Detta bestĂ€ms av RBAC â en Ă„tkomstkontrollmekanism (mer om detta i avsnittet "Introduktion till rollbaserad Ă„tkomstkontroll" pĂ„ s. 258). Om du anvĂ€nder en kluster dĂ€r RBAC-systemet saknas eller inte Ă€r aktiverat, Ă€r alla dina Secret-objekt tillgĂ€ngliga för alla anvĂ€ndare och containrar (vi förklarar senare att du inte bör ha nĂ„got produktionskluster utan RBAC).
Passiv datakryptering
Men vad sÀgs om dem som har tillgÄng till etcd-databasen dÀr Kubernetes lagrar all sin information? Kan de lÀsa kÀnsliga uppgifter utan lÀsrÀttigheter för Secret-objekt via API?
Sedan version 1.7 stöder Kubernetes passiv datakryptering. Det innebÀr att kÀnslig information inuti etcd lagras pÄ disk i krypterad form och inte kan lÀsas ens av dem som har direkt Ätkomst till databasen. För att dekryptera den krÀvs en nyckel som endast API-servern för Kubernetes har. I en korrekt konfigurerad kluster ska passiv kryptering vara aktiverad.
Du kan kontrollera om passiv kryptering fungerar i din kluster pÄ följande sÀtt:
kubectl describe pod -n kube-system -l component=kube-apiserver |grep encryption
--experimental-encryption-provider-config=...Om du inte ser flaggan experimental-encryption-provider-config Àr passiv kryptering inte aktiverad. NÀr du anvÀnder Google Kubernetes Engine eller andra tjÀnster för Kubernetes-hantering krypteras dina data med en annan mekanism, sÄ flaggan kommer att saknas. FrÄga din Kubernetes-leverantör om innehÄllet i etcd krypteras.
Lagring av kÀnsliga data
Det finns sÄdana Kubernetes-resurser som aldrig bör raderas frÄn klustret: till exempel sÀrskilt viktiga objekt Secret. Du kan skydda en resurs frÄn att raderas med en annotation som tillhandahÄlls av Helm-verktyget:
kind: Secret
metadata:
annotations:
"helm.sh/resource-policy": keepStrategier för hantering av Secret-objekt
I exemplet frÄn föregÄende avsnitt skyddades kÀnsliga data frÄn obehörig Ätkomst direkt efter lagring i klustret. Men i manifestfilerna lagrades de i klartext.
Du bör aldrig placera kÀnslig information i filer som finns i versionskontrollsystemet. Hur kan man sÀkert administrera och lagra sÄdan information tills den tillÀmpas pÄ klustret Kubernetes?
Du kan vÀlja vilka verktyg eller strategier som helst för att arbeta med kÀnsliga data i dina applikationer, men du mÄste fortfarande Ätminstone svara pÄ följande frÄgor.
- Var ska jag lagra kÀnsliga data sÄ att de Àr mycket tillgÀngliga?
- Hur gör jag kÀnsliga data tillgÀngliga för mina aktiva applikationer?
- Vad ska hÀnda med dina applikationer nÀr du byter ut eller redigerar kÀnsliga data?
Om författarna
John Arundel Àr en konsult med 30 Ärs erfarenhet inom datorindustrin. Han har skrivit flera böcker och arbetar med mÄnga företag frÄn olika lÀnder, dÀr han ger rÄd om molnbaserad infrastruktur och Kubernetes. PÄ sin fritid gillar han att surfa, skjuta pistoltavla och spela piano pÄ hobbybasis. Han bor i en sagolik stuga i Cornwall, England.
Justin Domingus Àr en systemadministrationsingenjör som arbetar i en DevOps-miljö med Kubernetes och molnteknologier. Han gillar att spendera tid utomhus, dricka kaffe, fÄnga krabbor och sitta vid datorn. Han bor i Seattle, Washington, tillsammans med sin fantastiska katt och sin Ànnu mer fantastiska fru och bÀsta vÀn Adrienn.
â För mer information om boken kan man lĂ€sa pĂ„
»
»
För Habr-följare Ă€r det 25 % rabatt med koden â Kubernetes
Vid betalning av den tryckta versionen av boken skickas en e-bok till e-post.
KĂ€lla: habr.com
