Over de toenemende populariteit van Kubernetes

Hallo, Habr!

Aan het einde van de zomer willen we herinneren dat we doorgaan met het werken aan het onderwerp Kubernetes en hebben besloten om een artikel van Stackoverflow te publiceren, dat de stand van zaken in dit project begin juni toont.

Over de toenemende populariteit van Kubernetes

Prettige lectuur!

Op het moment dat dit artikel geschreven werd, is Kubernetes ongeveer zes jaar oud, en in de afgelopen twee jaar is de populariteit zo gegroeid dat het consistent tot ƩƩn van de meest geliefde platforms behoort. Dit jaar staat Kubernetes op de derde plaats. Ter herinnering: Kubernetes is een platform dat is ontworpen voor het draaien en orkestreren van container workload.

Containers zijn ontstaan als een speciale constructie voor procesisolatie in Linux; sinds 2007 bevatten containers cgroups, en sinds 2002 namespaces. Containers zijn nog beter vormgegeven in 2008, toen LXCbeschikbaar kwam, en Google ontwikkelde een interne mechanism genaamd Borg, waar "al het werk in containers plaatsvindt". We springen naar 2013, toen de eerste release van Docker plaatsvond en containers eindelijk populair werden als massale oplossingen. Op dat moment was het belangrijkste instrument voor het orkestreren van containers Mesos, hoewel het niet bijzonder populair was. De eerste release van Kubernetes vond plaats in 2015, waarna dit instrument de facto de standaard werd op het gebied van containerorkestratie.

Om te proberen te begrijpen waarom Kubernetes zo populair is, laten we proberen een paar vragen te beantwoorden. Wanneer was de laatste keer dat ontwikkelaars overeenstemming konden bereiken over hoe applicaties in productie moeten worden uitgerold? Hoeveel ontwikkelaars kent u die de tools gebruiken zoals ze "out of the box" worden aangeleverd? Hoeveel cloudbeheerders zijn er tegenwoordig die niet begrijpen hoe applicaties werken? De antwoorden op deze vragen zullen we in dit artikel behandelen.

Infrastructuur als YAML

In een wereld die van Puppet en Chef naar Kubernetes is gegaan, was een van de grootste veranderingen de overgang van "infrastructuur als code" naar "infrastructuur als data" — specifiek, als YAML. Alle bronnen in Kubernetes, zoals pods, configuraties, uitgerolde instanties, volumes, enzovoort, kunnen eenvoudig worden beschreven in een YAML-bestand. Bijvoorbeeld:

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

Met deze aanpak kunnen DevOps- of SRE-specialisten hun werkbelasting volledig uitdrukken, zonder dat ze programmeercode hoeven te schrijven in talen zoals Python of Javascript.

Andere voordelen van het organiseren van infrastructuur als data zijn als volgt:

  • GitOps of versiebeheer van Git Operations. Deze aanpak stelt je in staat om alle YAML-bestanden van Kubernetes in Git-repositories te houden, waardoor je precies kunt bijhouden wanneer een wijziging is aangebracht, wie deze heeft aangebracht en wat er precies is veranderd. Dit verhoogt de transparantie van de processen binnen de organisatie en verbetert de efficiĆ«ntie door ambiguĆÆteit weg te nemen, vooral waar medewerkers de benodigde bronnen moeten zoeken. Tegelijkertijd wordt het eenvoudiger om automatisch wijzigingen aan Kubernetes-resources aan te brengen door middel van een gewone pull-verzoek.
  • Schaalbaarheid. Wanneer resources zijn gedefinieerd in YAML, wordt het voor clusteroperators extreem eenvoudig om ƩƩn of twee cijfers in de Kubernetes-resource te wijzigen, waardoor de schaalprincipes ervan veranderen. Kubernetes heeft een mechanisme voor horizontale autoscaling van pods, waarmee je gemakkelijk kunt bepalen wat het minimum- en maximumaantal pods is dat nodig is in een specifieke uitgerolde configuratie om om te gaan met laag en hoog verkeersniveau. Bijvoorbeeld, als je een configuratie hebt uitgerold die extra capaciteit vereist vanwege een plotselinge verkeersstijging, kan de maxReplicas-waarde worden gewijzigd van 10 naar 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

  • Veiligheid en beheer. YAML is uitermate geschikt voor het beoordelen van hoe dingen worden uitgerold in Kubernetes. Een serieus probleem met de beveiliging heeft betrekking op de vraag of je werkbelastingen draaien vanuit een gebruiker zonder administratieve rechten. In dit geval kunnen tools zoals conftest, een YAML/JSON-validator, en Open Policy Agent, een beleidsvalidator die ervoor zorgt dat de context SecurityContext de werklast van uw containers staat niet toe dat ze met beheerdersrechten draaien. Indien nodig kunnen gebruikers een eenvoudige beleid toepassen. rego, zo:

package main

denie[msg] {
  input.kind = "Deployment"
  not input.spec.template.spec.securityContext.runAsNonRoot = true
  msg = "Containers mogen niet als root draaien"
}

  • Integratiemogelijkheden met cloudproviders. Een van de meest opvallende trends in moderne technologieĆ«n is het draaien van werklasten op de infrastructuur van publieke cloudproviders. Met de component cloud-provider Kubernetes stelt elke cluster in staat om te integreren met de cloudprovider waarvoor het is ingericht. Bijvoorbeeld, als een gebruiker een applicatie in Kubernetes op AWS heeft uitgevoerd en deze applicatie toegankelijk wil maken via een service, helpt de cloudprovider automatisch een service te creĆ«ren LoadBalancer, die automatisch een load balancer zal verstrekken Amazon Elastic Load Balancer, om het verkeer naar de applicatie-pods te routeren.

Schaalbaarheid

Kubernetes is zeer uitbreidbaar en dat is aantrekkelijk voor ontwikkelaars. Er is een set bestaande bronnen zoals pods, deployments, StatefulSets, secrets, ConfigMaps, enzovoort. Echter, gebruikers en ontwikkelaars kunnen ook andere bronnen toevoegen in de vorm van gebruikersgedefinieerde resource definitie.

Bijvoorbeeld, als we een resource willen definiƫren CronTab, zouden we iets kunnen doen zoals:

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

Later kunnen we een CronTab resource ongeveer als volgt creƫren:

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

Een andere mogelijkheid voor uitbreidbaarheid in Kubernetes is dat de ontwikkelaar zijn eigen operators kan schrijven. Operator is een speciaal proces in de Kubernetes-cluster dat werkt volgens het patroon "control plane". Met een operator kan de gebruiker het beheer van CRD (gebruikersgedefinieerde resource definities) automatiseren door informatie uit te wisselen met de Kubernetes API.

In de gemeenschap zijn er verschillende hulpmiddelen waarmee ontwikkelaars gemakkelijk hun eigen operators kunnen maken.Onder hen is er: Operator Framework en zijn Operator SDK. Deze SDK biedt een basis waar de ontwikkelaar snel aan de slag kan met het creƫren van een operator. Laten we zeggen dat je kunt beginnen met de opdrachtregel ongeveer zo:

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

Zo wordt de standaardcode voor jouw operator gecreƫerd, inclusief YAML-bestanden en code in 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

Vervolgens kun je de benodigde API en controller toevoegen, zo:

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

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

Daarna kun je eindelijk de operator bouwen en deze naar jouw containerregister sturen:

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

Als de ontwikkelaar nog meer controle wenst, kan hij de standaardcode in de Go-bestanden aanpassen. Bijv. om de specificiteit van de controller te wijzigen, kan je de wijzigingen aanbrengen in het bestand controller.go.

Een ander project, KUDO, stelt je in staat om operators te creƫren, waarbij je enkel declaratieve YAML-bestanden gebruikt. Bijvoorbeeld, een operator voor Apache Kafka zou ongeveer als volgt worden gedefinieerd: zo. Hiermee kun je met een paar commando's een Kafka-cluster bovenop Kubernetes installeren:

$ kubectl kudo install zookeeper
$ kubectl kudo install kafka

En vervolgens kun je deze configureren met nog een commando:

$ 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

Innovaties

In de afgelopen jaren zijn er grote releases van Kubernetes om de paar maanden – dat wil zeggen, drie tot vier grote releases per jaar. Het aantal nieuwe functies dat in elke release wordt geĆÆntroduceerd, neemt niet af. Sterker nog, er zijn zelfs geen tekenen van vertraging merkbaar, kijk maar naar de huidige activiteit van het Kubernetes-project op Github.

Nieuwe mogelijkheden maken het mogelijk om flexibeler te clusteren bij diverse werkbelastingen. Bovendien waarderen programmeurs meer controle bij het uitrollen van applicaties direct in productie.

Gemeenschap

Een andere belangrijke factor in de populariteit van Kubernetes is de kracht van de gemeenschap. In 2015, met de release van versie 1.0, werd Kubernetes gesponsord Cloud Native Computing Foundation.

Er bestaan ook verschillende gemeenschappen SIG (Special Interest Groups), gericht op het verkennen van verschillende gebieden van Kubernetes naarmate dit project zich ontwikkelt. Deze groepen blijven voortdurend nieuwe mogelijkheden toevoegen, waardoor werken met Kubernetes steeds gemakkelijker wordt.

De Cloud Native Foundation organiseert ook CloudNativeCon/KubeCon, die, op het moment van schrijven, de grootste open source conferentie ter wereld is. Het wordt meestal drie keer per jaar gehouden en verzamelt duizenden professionals die hun kennis van Kubernetes en zijn ecosysteem willen verbeteren, evenals nieuwe mogelijkheden willen leren die elke drie maanden verschijnen.

Bovendien is er binnen de Cloud Native Foundation Technisch Toezicht ComitƩ, dat, samen met SIGs, nieuwe en bestaande projecten projecten van de stichting, gericht op het cloud-ecosysteem. De meeste van deze projecten helpen om de sterke punten van Kubernetes te verbeteren.

Tot slot geloof ik dat Kubernetes niet zo'n succes zou hebben gehad zonder de bewuste inspanningen van de hele gemeenschap, waar mensen elkaar steunen, maar tegelijkertijd nieuwkomers met open armen verwelkomen.

Toekomst

Een van de grootste uitdagingen waar ontwikkelaars in de toekomst mee te maken zullen krijgen, is de vaardigheid om zich te concentreren op de details van de code zelf, in plaats van op de infrastructuur waarin deze draait. Deze trends beantwoorden aan de serverloze architectuurparadigma, die tegenwoordig een van de toonaangevende is. Er zijn al geavanceerde frameworks, zoals Knative en OpenFaas, die Kubernetes gebruiken om de infrastructuur van de ontwikkelaar te abstraheren.

In dit artikel hebben we slechts een algemeen overzicht gegeven van de huidige staat van Kubernetes – in werkelijkheid is dit slechts de top van de ijsberg. Gebruikers van Kubernetes hebben ook tal van andere middelen, mogelijkheden en configuraties tot hun beschikking.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster