Për popullaritetin në rritje të Kubernetes

Përshëndetje, Habr!

Në fund të verës, dëshirojmë të kujtojmë se vazhdojmë të punojmë mbi temën Kubernetes dhe kemi vendosur të publikojmë një artikull nga Stackoverflow, që tregon gjendjen e projektit në fillim të qershorit.

Për popullaritetin në rritje të Kubernetes

Lexim të këndshëm!

Në momentin kur po shkruhej ky artikull, mosha e Kubernetes është rreth gjashtë vjetësh, dhe në dy vitet e fundit, popullariteti i tij është rritur aq shumë sa që ai vazhdimisht renditet në mesin e platformave më të preferuara . Këtë vit, Kubernetes zë vendin e tretë. Kujtojmë: Kubernetes është një platformë e destinuar për ekzekutimin dhe orkestrimin e ngarkesave të punës në konteinerë.

Konteinerët kanë lindur si një konstrukt i veçantë për izolimin e proceseve në Linux; në përbërje të konteinerëve nga viti 2007 përfshihen cgroups, dhe nga viti 2002 – hapësirat emërore. Konteinerët u formësuan më mire deri në vitin 2008, kur u bë e mundur LXC, dhe në Google zhvilluan një mekanizëm të brendshëm të quajtur Borg, ku "të gjithë punët realizohen në konteinerë". Le të kalojmë në vitin 2013, kur u realizua publikimi i parë i Docker, dhe konteinerët përfundimisht kaluan në kategorinë e zgjidhjeve popullore masive. Në atë kohë, mjeti kryesor për orkestrimin e konteinerëve ishte Mesos, megjithatë, ai nuk ishte shumë i njohur. Publikimi i parë i Kubernetes u realizua në vitin 2015, pas të cilit ky mjet u bë de facto standard në fushën e orkestrimit të konteinerëve.

Për të përpiqen të kuptojnë se përse Kubernetes është kaq i njohur, le të mundohemi të përgjigjemi në disa pyetje. Kur ishte hera e fundit që zhvilluesit arritën me sukses të bien dakord për mënyrën e shtrirjes së aplikacioneve në prodhim? Sa shumë zhvillues njohin që përdorin mjetet ashtu siç ofrohen "nga kutia"? Sa shumë administrues të mjeteve në cloud sot nuk e kuptojnë se si funksionojnë aplikacionet? Të dhënat për këto pyetje do të shqyrtojmë në këtë artikull.

Infrastruktura si YAML

Në botën që kaloi nga Puppet dhe Chef në Kubernetes, një nga ndryshimet më të mëdha ishte kalimi nga "infrastruktura si kod" në "infrastruktura si të dhëna" — konkretisht, si YAML. Të gjitha burimet në Kubernetes, përfshirë pod-ët, konfigurimet, instancat e shpërndara, volumin e të tjerëve, mund të përshkruhen lehtësisht në një skedë YAML. Për shembull:

apiVersion: v1
kind: Pod
metadata:
  name: site
  labels:
    app: web
spec:
  containers:
    - name: front-end
      image: nginx
      ports:
        - containerPort: 80

Me një paraqitje të tillë, specialistëve në DevOps ose SRE u është lehtësuar të shprehin plotësisht ngarkesat e tyre të punës, pa pasur nevojë të shkruajnë kod programimi në gjuhë si Python ose Javascript.

Avantazhet e tjera të organizimit të infrastrukturës si të dhëna janë, në veçanti:

  • GitOps ose kontrolli i versioneve të Operacioneve Git. Kjo qasje lejon që të gjitha skedat YAML të Kubernetes të mbahen në repozita git, duke ju mundësuar të ndjekni me saktësi kohën kur është bërë një ndryshim, kush e ka bërë dhe çfarë është ndryshuar. Kjo rrit transparencën e operacioneve në të gjithë organizatën, rrit efikasitetin e punës për shkak të eliminimit të paqartësive, sidomos në atë se ku punonjësit duhet të kërkojnë burimet e nevojshme. Në të njëjtën kohë, bëhet më e lehtë të bëhen ndryshime automatikisht në burimet e Kubernetes — përmes bashkimit të zakonshëm të kërkesave pull.
  • Shkallëzueshmëria. Kur burimet përcaktohen si YAML, operatorëve të klasterit u bëj shumë e lehtë të ndryshojnë një ose dy numra në burimin e Kubernetes, duke ndryshuar kështu parimet e tij të shkallëzimit. Në Kubernetes ka mekanizmin për shkallëzimin horizontal automatik të pod-eve, me të cilin lehtësisht përcaktohet sesi është numri minimal dhe maksimal i pod-eve që kërkohet në një konfigurim të veçantë për të përballuar nivelet e ulëta dhe të larta të trafikut. Për shembull, nëse keni shpërndarë një konfigurim që ka nevojë për mundësi shtesë për shkak të një rritjeje të papritur të trafikut, numri i maxReplicas mund të ndryshohet nga 10 në 20:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: myapp
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp-deployment
  minReplicas: 1
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

  • Siguria dhe menaxhimi. YAML është mjaft e dobishme për të vlerësuar se si gjërat e caktuara janë të shpërndara në Kubernetes. Për shembull, një problem i rëndësishëm që ka të bëjë me sigurinë është, nëse ngarkesat tuaja të punës po ekzekutohen nga një përdorues që nuk ka të drejtat e administratorit. Në këtë rast, mund të na nevojiten mjete si conftest, një validar i YAML/JSON, plus Open Policy Agent, një validar politikash, i cili siguron që konteksti SecurityContext ngarkesat e juaja nuk lejon që kontejneri të funksionojë me privilegje administratori. Nëse kërkohet kjo, përdoruesit mund të aplikojnë njëPolitikë të thjeshtë rego, kështu:

package main

deny[msg] {
  input.kind = "Deployment"
  not input.spec.template.spec.securityContext.runAsNonRoot = true
  msg = "Kontejnerët nuk duhet të punojnë si përdorues root"
}

  • Mundësitë e integrimit me ofruesin e shërbimit në cloud. Një nga tendencat më të dukshme në teknologjinë e sotme është të ekzekutoni ngarkesat e punës në kapacitetin e ofruesve të shërbimit në cloud. Me ndihmën e komponentit cloud-provider Kubernetes lejon çdo klaster të integrohet me ofruesin e shërbimeve në cloud me të cilin funksionon. Për shembull, nëse përdoruesi ka nisur një aplikacion në Kubernetes në AWS dhe dëshiron të hapë akses në këtë aplikacion nëpërmjet një shërbimi, ofruesi i shërbimit ndihmon automatikisht në krijimin e një shërbimi LoadBalancer, i cili do të ofrojë automatikisht një balancues ngarkese Amazon Elastic Load Balancer, për të redirigjuar trafikun në pod-et e aplikacioneve.

Zgjerueshmëria

Kubernetes është shumë i zgjerueshëm, dhe kjo pëlqehet nga zhvilluesit. Ekziston një grup burimesh të disponueshme, si pod-et, deploy-et, StatefulSets, sekretet, ConfigMaps, etj. Megjithatë, përdoruesit dhe zhvilluesit mund të shtojnë burime të tjera në formën e definimeve të personalizuara të burimeve.

Për shembull, nëse dëshirojmë të përcaktojmë një burim CronTab, do të mund të bënim diçka të tillë:

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: crontabs.my.org
spec:
  group: my.org
  versions:
    - name: v1
      served: true
      storage: true
      Schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                cronSpec:
                  type: string
                  pattern: '^(d+|*)(\/d+)?(s+(d+|*)(\/d+)?){4}$'
                replicas:
                  type: integer
                  minimum: 1
                  maximum: 10
  scope: Namespaced
  names:
    plural: crontabs
    singular: crontab
    kind: CronTab
    shortNames:
    - ct

Më vonë, ne mund të krijojmë një burim CronTab në një mënyrë të ngjashme:

apiVersion: "my.org/v1"
kind: CronTab
metadata:
  name: my-cron-object
spec:
  cronSpec: "* * * * */5"
  image: my-cron-image
  replicas: 5

Një tjetër mundësi për zgjerueshmërinë në Kubernetes është që zhvilluesi mund të shkruajë operatorë të vetë. Operatori – është një proces i veçantë në klasterin Kubernetes, që funksionon sipas modelit "kontur kontrolli". Me ndihmën e operatorit, përdoruesi mund të automatizojë menaxhimin e CRD-ve (definimeve të personalizuara të burimeve), duke shkëmbyer informacion me Kubernetes API.

Në komunitet ekzistojnë disa mjete, me ndihmën e të cilave është e lehtë për zhvilluesit të krijojnë operatorë të vetë. Ndër to është Operator Framework dhe Operator SDK. Ky SDK ofron një bazë, nga e cila, zhvilluesi mund të fillojë shumë shpejt të krijojë një operator. Le të themi, mund të filloni nga komandat e linjës në këtë mënyrë:

$ operator-sdk new my-operator --repo github.com/myuser/my-operator

Këtu krijohet gjithë kodi standard për operatorin tuaj, përfshirë skedarët YAML dhe kodin në Golang:

.
|____cmd
| |____manager
| | |____main.go
|____go.mod
|____deploy
| |____role.yaml
| |____role_binding.yaml
| |____service_account.yaml
| |____operator.yaml
|____tools.go
|____go.sum
|____.gitignore
|____version
| |____version.go
|____build
| |____bin
| | |____user_setup
| | |____entrypoint
| |____Dockerfile
|____pkg
| |____apis
| | |____apis.go
| |____controller
| | |____controller.go

Më pas, mund të shtoni API dhe kontrollues të nevojshëm, kështu:

$ operator-sdk add api --api-version=myapp.com/v1alpha1 --kind=MyAppService

$ operator-sdk add controller --api-version=myapp.com/v1alpha1 --kind=MyAppService

Pas kësaj, përfundimisht ndjeni operatorin dhe dërgojeni në regjistrin e kontejnerëve tuaj:

$ operator-sdk build your.container.registry/youruser/myapp-operator

Nëse zhvilluesi ka nevojë për më shumë kontroll, mund të modifikojë kodin standard në skedarët në Go. Për shembull, nëse dëshiron të ndryshojë specifikat e kontrolluesit, mund të bëjë ndryshime në skedarin controller.go.

Një projekt tjetër, KUDO, lejon të krijoni operatorë duke përdorur vetëm skedarë YAML deklarativë. Për shembull, një operator për Apache Kafka do të përcaktohej në këtë mënyrë kështu. Me ndihmën e tij, mund të instaloni një klaster Kafka mbi Kubernetes me vetëm disa komanda:

$ kubectl kudo install zookeeper
$ kubectl kudo install kafka

Dhe më pas ta konfiguroni me një komandë tjetër:

$ kubectl kudo install kafka --instance=my-kafka-name 
            -p ZOOKEEPER_URI=zk-zookeeper-0.zk-hs:2181 
            -p ZOOKEEPER_PATH=/my-path -p BROKER_CPUS=3000m 
            -p BROKER_COUNT=5 -p BROKER_MEM=4096m 
            -p DISK_SIZE=40Gi -p MIN_INSYNC_REPLICAS=3 
            -p NUM_NETWORK_THREADS=10 -p NUM_IO_THREADS=20

Inovacionet

Gjatë disa viteve të fundit, lëshimet e mëdha të Kubernetes dalin çdo disa muaj – dmth, tri deri në katër lëshime të mëdha në vit. Numri i karakteristikave të reja që përfshihen në secilën nga ato nuk po zvogëlohet. Për më tepër, nuk ka shenja të ngadalësimit as në kohët tona të vështira – shihni se cila është tani aktiviteti i projektit Kubernetes në Github.

Karakteristika të reja lejojnë një menaxhim më fleksibël të klasterëve me ngarkesa të ndryshme punë. Për më tepër, zhvilluesve u pëlqen kontrolli më i plotë gjatë përhapjes së aplikacioneve drejtpërdrejt në prodhim.

Komuniteti

Një aspekt tjetër serioz i popullaritetit të Kubernetes është fuqia e komunitetit të tij. Në vitin 2015, pas arritjes së versionit 1.0, Kubernetes u sponsorua Cloud Native Computing Foundation.

Po ashtu, ekzistojnë disa komunitete SIG (grupet e interesa të veçanta), të cilat janë të destinuara për të shqyrtuar fusha të ndryshme të Kubernetes ndërsa ky projekt zhvillohet. Këto grupe vazhdimisht shtojnë mundësi të reja, duke e bërë përdorimin e Kubernetes më të lehtë e më të rehatshëm.

Fondi Cloud Native Foundation gjithashtu organizon CloudNativeCon/KubeCon, që, në momentin e shkrimit të këtij teksti, është konferenca më e madhe open-source në botë. Në përgjithësi, ajo organizohet tre herë në vit dhe mbledh mijëra profesionistë të interesuar për të përmirësuar Kubernetes dhe ekosistemin e tij, si dhe për të përvetësuar mundësi të reja që shfaqen çdo tre muaj.

Madje, në Cloud Native Foundation ekziston Komiteti për Mbikëqyrjen Teknike, i cili, së bashku me SIG, shqyrton projektet e reja dhe ato ekzistuese projektesh të fondit, të orientuara drejt ekosistemës në cloud. Shumica e këtyre projekteve ndihmojnë në përmirësimin e forcave të Kubernetes.

Në fund, besoj se Kubernetes nuk do të kishte pasur një sukses të tillë pa përpjekjet e vetëdijshme të gjithë komunitetit, ku njerëzit mbështesin njëri-tjetrin, por në të njëjtën kohë, me kënaqësi pranojnë gjithashtu fillestarët në radhët e tyre.

E ardhmja

Një nga sfidat kryesore me të cilat zhvilluesit do të përballen në të ardhmen është aftësia për t'u përqendruar në detajet e kodit të vet, e jo në infrastrukturën në të cilën funksionon. Kjo tendencë përputhet me paradigmën e arkitekturës pa server, e cila sot është një nga udhëheqëse. Tani ekzistojnë framework-e të avancuara, si p.sh., Knative dhe OpenFaas, të cilat përdorin Kubernetes për të abstaraktuar infrastrukturën nga zhvilluesi.

Në këtë artikull ne shqyrtuam vetëm në pika të përgjithshme gjendjen aktuale të Kubernetes – në të vërtetë, kjo është vetëm maja e ajsbergut. Përdoruesit e Kubernetes kanë një sërë burimesh, mundësish dhe konfiguracionesh në dispozicion.

Burimi: habr.com

Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS 🔥 Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS | ProHoster