Plattform
Den uppenbara lösningen var att använda Red Hat Enterprise Linux CoreOS (en variant av Red Hat Enterprise Linux) och CRI-O som standard, och här är varför...
Eftersom temat segling är mycket bra för att hitta analogier när man förklarar arbetet med Kubernetes och containrar, låt oss försöka prata om affärsproblemen som CoreOS och CRI-O löser med ett exempel
Föreställ dig nu om Brunel var tvungen att göra detta arbete för 20 olika fartygsmodeller (Kubernetes-versioner) och för fem olika planeter med helt olika havsströmmar och vindar (molnleverantörer). Dessutom krävdes att alla fartyg (OpenShift-kluster), oavsett på vilka planeter navigering utförs, ur befälhavarnas (operatörer som sköter driften av klustren) uppför sig likadant. För att fortsätta den maritima analogin bryr sig fartygskaptenerna inte alls vilken typ av riggblock (CRI-O) som används på deras fartyg - det viktigaste för dem är att dessa block är starka och pålitliga.
OpenShift 4, som en molnplattform, står inför en mycket liknande affärsutmaning. Nya noder måste skapas när klustret skapas, i händelse av ett fel i någon av noderna eller vid skalning av klustret. När en ny nod skapas och initieras måste kritiska värdkomponenter, inklusive CRI-O, konfigureras därefter. Som i all annan produktion måste ”råvaror” tillföras i början. När det gäller fartyg är råvarorna metall och trä. Men i fallet med att skapa en värd för att distribuera behållare i ett OpenShift 4-kluster måste du ha konfigurationsfiler och API-försedda servrar som indata. OpenShift kommer då att tillhandahålla den erforderliga nivån av automatisering genom hela livscykeln, erbjuda det nödvändiga produktstödet till slutanvändarna och på så sätt få tillbaka investeringen i plattformen.
OpenShift 4 skapades på ett sådant sätt att det ger möjligheten att bekvämt uppdatera systemet under hela plattformens livscykel (för version 4.X) för alla större molnbaserade leverantörer, virtualiseringsplattformar och till och med blankmetallsystem. För att göra detta måste noder skapas på basis av utbytbara element. När ett kluster kräver en ny version av Kubernetes, får det också motsvarande version av CRI-O på CoreOS. Eftersom CRI-O-versionen är kopplad direkt till Kubernetes, förenklar detta avsevärt alla permutationer för test-, felsöknings- eller supportändamål. Dessutom minskar detta tillvägagångssätt kostnaderna för slutanvändare och Red Hat.
Detta är ett fundamentalt nytt sätt att tänka på Kubernetes-kluster och lägger grunden för planering av några mycket användbara och övertygande nya funktioner. CRI-O (Container Runtime Interface - Open Container Initiative, förkortat CRI-OCI) visade sig vara det mest framgångsrika valet för massskapandet av noder som är nödvändigt för att arbeta med OpenShift. CRI-O kommer att ersätta den tidigare använda Docker-motorn, som erbjuder OpenShift-användare
En värld av öppna containrar
Världen har gått mot öppna containrar under lång tid. Oavsett om det är i Kubernetes eller på lägre nivåer,
Allt började med skapandet av Open Containers Initiative
Kubernetes-communityt utvecklade sedan en enda standard för ett pluggbart gränssnitt, kallad
Ingenjörer på Red Hat och Google såg ett marknadsbehov av en containermotor som kunde acceptera Kubelet-förfrågningar över CRI-protokollet och introducerade containrar som var kompatibla med OCI-specifikationerna ovan. Så
FIG. 1.
Innovation med CRI-O och CoreOS
I och med lanseringen av OpenShift 4-plattformen ändrades det
Vänta, hur är det här?
Det stämmer, med tillkomsten av OpenShift 4 finns det inte längre ett behov av att ansluta till enskilda värdar och installera en containermotor, konfigurera lagring, konfigurera sökservrar eller konfigurera ett nätverk. OpenShift 4-plattformen har gjorts om helt för att använda
Kubernetes har alltid tillåtit användare att hantera applikationer genom att definiera önskat tillstånd och använda
Genom att använda Operatörer i plattformen, ger OpenShift 4 detta nya paradigm (med konceptet set och faktisk tillstånd) till hanteringen av RHEL CoreOS och CRI-O. Uppgifterna att konfigurera och hantera versioner av operativsystemet och containermotorn automatiseras med hjälp av den sk
Körande containrar
Användare har haft möjlighet att använda CRI-O-motorn i OpenShift-plattformen sedan version 3.7 i Tech Preview-status och från version 3.9 i General Available-status (stöds för närvarande). Dessutom använder Red Hat massivt
Ris. 2. Hur behållare fungerar i ett Kubernetes-kluster
CRI-O förenklar skapandet av nya containervärdar genom att synkronisera hela toppnivån vid initialisering av nya noder och när nya versioner av OpenShift-plattformen släpps. Revidering av hela plattformen möjliggör transaktionsuppdateringar/återställningar och förhindrar även dödlägen i beroenden mellan containerns bakkärna, containermotorn, noderna (Kubelets) och Kubernetes Master-noden. Genom att centralt hantera alla plattformskomponenter, med kontroll och versionshantering, finns det alltid en tydlig väg från tillstånd A till tillstånd B. Detta förenklar uppdateringsprocessen, förbättrar säkerheten, förbättrar prestandarapporteringen och hjälper till att minska kostnaderna för uppdateringar och installationer av nya versioner .
Demonstrera kraften hos ersättningselement
Som tidigare nämnts, att använda Machine Config Operator för att hantera containervärden och containermotorn i OpenShift 4 ger en ny nivå av automatisering som tidigare inte var möjlig på Kubernetes-plattformen. För att demonstrera de nya funktionerna kommer vi att visa hur du kan göra ändringar i filen crio.conf. För att undvika att bli förvirrad av terminologi, försök att fokusera på resultaten.
Låt oss först skapa vad som kallas en containerruntime-konfiguration - Container Runtime Config. Se det som en Kubernetes-resurs som representerar konfigurationen för CRI-O. I verkligheten är det en specialiserad version av något som kallas MachineConfig, vilket är vilken konfiguration som helst som distribueras till en RHEL CoreOS-maskin som en del av ett OpenShift-kluster.
Denna anpassade resurs, kallad ContainerRuntimeConfig, skapades för att göra det enklare för klusteradministratörer att konfigurera CRI-O. Det här verktyget är tillräckligt kraftfullt för att det bara kan tillämpas på vissa noder beroende på MachineConfigPool-inställningarna. Se det som en grupp maskiner som tjänar samma syfte.
Lägg märke till de två sista raderna som vi kommer att ändra i filen /etc/crio/crio.conf. Dessa två rader är mycket lika raderna i filen crio.conf, de är:
vi ContainerRuntimeConfig.yaml
Slutsats:
apiVersion: machineconfiguration.openshift.io/v1
kind: ContainerRuntimeConfig
metadata:
name: set-log-and-pid
spec:
machineConfigPoolSelector:
matchLabels:
debug-crio: config-log-and-pid
containerRuntimeConfig:
pidsLimit: 2048
logLevel: debug
Låt oss nu skicka den här filen till Kubernetes-klustret och kontrollera att den faktiskt skapades. Observera att operationen är exakt densamma som med alla andra Kubernetes-resurser:
oc create -f ContainerRuntimeConfig.yaml
oc get ContainerRuntimeConfig
Slutsats:
NAME AGE
set-log-and-pid 22h
När vi väl har skapat ContainerRuntimeConfig måste vi modifiera en av MachineConfigPools för att signalera till Kubernetes att vi vill tillämpa denna konfiguration på en specifik grupp av maskiner i klustret. I det här fallet kommer vi att ändra MachineConfigPool för masternoderna:
oc edit MachineConfigPool/master
Slutsats (för tydlighetens skull är huvudessensen kvar):
...
metadata:
creationTimestamp: 2019-04-10T23:42:28Z
generation: 1
labels:
debug-crio: config-log-and-pid
operator.machineconfiguration.openshift.io/required-for-upgrade: ""
...
Vid denna tidpunkt börjar MCO skapa en ny crio.conf-fil för klustret. I det här fallet kan den helt färdiga konfigurationsfilen ses med hjälp av Kubernetes API. Kom ihåg att ContainerRuntimeConfig bara är en specialiserad version av MachineConfig, så vi kan se resultatet genom att titta på de relevanta raderna i MachineConfigs:
oc get MachineConfigs | grep rendered
Slutsats:
rendered-master-c923f24f01a0e38c77a05acfd631910b 4.0.22-201904011459-dirty 2.2.0 16h
rendered-master-f722b027a98ac5b8e0b41d71e992f626 4.0.22-201904011459-dirty 2.2.0 4m
rendered-worker-9777325797fe7e74c3f2dd11d359bc62 4.0.22-201904011459-dirty 2.2.0 16h
Observera att den resulterande konfigurationsfilen för masternoderna var en nyare version än de ursprungliga konfigurationerna. För att se det, kör följande kommando. I förbigående noterar vi att detta kanske är en av de bästa one-liners i Kubernetes historia:
python3 -c "import sys, urllib.parse; print(urllib.parse.unquote(sys.argv[1]))" $(oc get MachineConfig/rendered-master-f722b027a98ac5b8e0b41d71e992f626 -o YAML | grep -B4 crio.conf | grep source | tail -n 1 | cut -d, -f2) | grep pid
Slutsats:
pids_limit = 2048
Låt oss nu se till att konfigurationen har tillämpats på alla masternoder. Först får vi en lista över noder i klustret:
oc get node | grep master
Output:
ip-10-0-135-153.us-east-2.compute.internal Ready master 23h v1.12.4+509916ce1
ip-10-0-154-0.us-east-2.compute.internal Ready master 23h v1.12.4+509916ce1
ip-10-0-166-79.us-east-2.compute.internal Ready master 23h v1.12.4+509916ce1
Låt oss nu titta på den installerade filen. Du kommer att se att filen har uppdaterats med de nya värdena för pid- och debug-direktiven som vi angav i ContainerRuntimeConfig-resursen. Själva elegansen:
oc debug node/ip-10-0-135-153.us-east-2.compute.internal — cat /host/etc/crio/crio.conf | egrep 'debug||pid’
Slutsats:
...
pids_limit = 2048
...
log_level = "debug"
...
Alla dessa ändringar i klustret gjordes utan att ens köra SSH. Allt arbete gjordes genom att komma åt Kuberentes huvudnod. Det vill säga, dessa nya parametrar konfigurerades endast på masternoder. Arbetarnoderna ändrades inte, vilket visar fördelarna med Kubernetes-metoden att använda specificerade och faktiska tillstånd i förhållande till containervärdar och containermotorer med utbytbara element.
Exemplet ovan visar möjligheten att göra ändringar i ett litet OpenShift Container Platform 4-kluster med tre produktionsnoder eller ett enormt produktionskluster med 3000 4 noder. Hur som helst kommer mängden arbete att vara densamma - och mycket liten - bara konfigurera ContainerRuntimeConfig-filen och ändra en etikett i MachineConfigPool. Och du kan göra detta med vilken version av OpenShift Container Platform XNUMX.X som helst som kör Kubernetes under hela dess livscykel.
Ofta utvecklas teknikföretag så snabbt att vi inte kan förklara varför vi väljer vissa teknologier för de underliggande komponenterna. Containermotorer har historiskt sett varit den komponent som användare interagerar med direkt. Eftersom containers popularitet naturligtvis började med tillkomsten av containermotorer, visar användarna ofta intresse för dem. Detta är ytterligare en anledning till att Red Hat valde CRI-O. Containers utvecklas med fokus nu på orkestrering, och vi har funnit att CRI-O ger den bästa upplevelsen när du arbetar med OpenShift 4.
Källa: will.com