O rosnącej popularności Kubernetes

Cześć, Habr!

Na koniec lata chcemy przypomnieć, że nadal pracujemy nad tematem Kubernetes i postanowiliśmy opublikować artykuł z Stackoverflow, ilustrujący stan tego projektu na początku czerwca.

O rosnącej popularności Kubernetes

Życzymy miłej lektury!

W momencie pisania tego artykułu Kubernetes ma około sześciu lat, a w ciągu ostatnich dwóch lat jego popularność wzrosła do tego stopnia, że nieprzerwanie znajduje się wśród najbardziej ulubionych platform. W tym roku Kubernetes zajmuje trzecie miejsce. Przypominamy: Kubernetes to platforma zaprojektowana do uruchamiania i orkiestracji obciążeń aplikacji kontenerowych.

Kontenery powstały jako specjalna konstrukcja do izolacji procesów w systemie Linux; od 2007 roku zawierają cgroups, a od 2002 są to przestrzenie nazw. Kontenery lepiej uformowały się w 2008 roku, kiedy stały się dostępne LXC, a w Google opracowano wewnętrzny mechanizm o nazwie Borg, gdzie „wszystkie operacje są wykonywane w kontenerach”. Przenieśmy się do 2013 roku, kiedy odbyła się pierwsza wersja Dockera, a kontenery ostatecznie przeszły do grupy popularnych rozwiązań masowych. Wówczas głównym narzędziem do orkiestracji kontenerów był Mesos, chociaż nie cieszył się dużą popularnością. Pierwsza wersja Kubernetes miała miejsce w 2015 roku, po czym to narzędzie de facto stało się standardem w dziedzinie orkiestracji kontenerów.

Aby spróbować zrozumieć, dlaczego Kubernetes jest tak popularny, spróbujmy odpowiedzieć na kilka pytań. Kiedy ostatni raz programiści byli w stanie dojść do porozumienia co do tego, jak wdrażać aplikacje w produkcji? Ilu znasz programistów, którzy używają narzędzi w takim stanie, w jakim są one dostarczane „prosto z pudełka”? Ilu jest dziś administratorów chmurowych, którzy nie rozumieją, jak działają aplikacje? Odpowiedzi na te pytania omówimy w tym artykule.

Infrastruktura jako YAML

W świecie, który przeszedł od Puppet i Chef do Kubernetes, jedną z największych zmian było przejście od „infrastruktury jako kodu” do „infrastruktury jako danych” — konkretnie, jako YAML. Wszystkie zasoby w Kubernetes, takie jak pod, konfiguracje, wdrożone egzemplarze, woluminy itd., można łatwo opisać w pliku YAML. Na przykład:

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

Dzięki takiemu podejściu specjaliści DevOps lub SRE mogą w pełni wyrażać swoje obciążenia robocze, bez konieczności pisania kodu w językach takich jak Python czy Javascript.

Inne zalety organizacji infrastruktury jako danych są następujące:

  • GitOps lub wersjonowanie operacji Git. Takie podejście pozwala trzymać wszystkie pliki YAML Kubernetes w repozytoriach git, co umożliwia dokładne śledzenie, kiedy dokonano zmian, kto je wprowadził i co dokładnie zostało zmienione. Dzięki temu zwiększa się przejrzystość działań w całej organizacji oraz efektywność pracy, poprzez eliminację niejasności, zwłaszcza w tym, gdzie pracownicy powinni szukać potrzebnych im zasobów. Z drugiej strony, łatwiej jest automatycznie wprowadzać zmiany do zasobów Kubernetes – poprzez standardowe łączenie pull-requestów.
  • Skalowalność. Gdy zasoby są definiowane w formacie YAML, operatorom klastra bardzo łatwo jest zmienić jedną lub dwie liczby w zasobie Kubernetes, zmieniając tym samym zasady jego skalowania. Kubernetes ma mechanizm poziomego automatycznego skalowania podów, który pozwala zdefiniować, jakie jest minimalne i maksymalne liczba podów potrzebnych w konkretnej wdrożonej konfiguracji, aby radzić sobie z niskim i wysokim poziomem ruchu. Na przykład, jeśli wdrożyłeś konfigurację, która wymaga dodatkowych zasobów z powodu nagłego wzrostu ruchu, to wskaźnik maxReplicas można zmienić z 10 na 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

  • Bezpieczeństwo i zarządzanie. YAML jest doskonały do oceny, jak różne elementy są wdrażane w Kubernetes. Na przykład, poważnym problemem związanym z zapewnieniem bezpieczeństwa jest to, czy Twoje obciążenia robocze są uruchamiane z użytkownika, który nie ma uprawnień administratora. W tym przypadku mogą być przydatne takie narzędzia jak conftest, walidator YAML/JSON, oraz Open Policy Agent, walidator polityk, który pozwala upewnić się, że kontekst SecurityContext Obciążenia robocze nie pozwalają na uruchamianie kontenera z uprawnieniami administratora. Jeśli jest to konieczne, użytkownicy mogą zastosować prostą politykę rego, w ten sposób:

package main

deny[msg] {
  input.kind = "Deployment"
  not input.spec.template.spec.securityContext.runAsNonRoot = true
  msg = "Kontenery nie mogą działać jako root"
}

  • Opcje integracji z dostawcą chmury. Jednym z najbardziej zauważalnych trendów w nowoczesnych technologiach jest uruchamianie obciążeń roboczych na zasobach publicznych dostawców chmur. Dzięki komponentowi cloud-provider Kubernetes pozwala każdemu klastrowi zintegrować się z tym dostawcą chmury, na którym działa. Na przykład, jeśli użytkownik uruchomił aplikację w Kubernetes na AWS i chce otworzyć dostęp do tej aplikacji przez usługę, dostawca chmury automatycznie pomaga utworzyć usługę LoadBalancer, która automatycznie udostępni balansujący ruch Amazon Elastic Load Balancer, aby przekierować ruch do podów aplikacji.

Rozszerzalność

Kubernetes jest bardzo dobrze skalowalny, co podoba się programistom. Istnieje zestaw dostępnych zasobów, takich jak pody, wdrożenia, StatefulSets, sekrety, ConfigMaps, itd. Prawda, użytkownicy i programiści mogą dodawać inne zasoby w formie niestandardowych definicji zasobów.

Na przykład, jeśli chcemy zdefiniować zasób CronTab, moglibyśmy zrobić coś takiego:

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

Później możemy tworzyć zasób CronTab mniej więcej w ten sposób:

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

Inną opcją rozszerzalności w Kubernetes jest to, że programista może pisać własne operatory. Operator – to specjalny proces w klastrze Kubernetes, działający według wzorca „kontrolna pętla”. Dzięki operatorowi użytkownik może zautomatyzować zarządzanie CRD (niestandardowymi definicjami zasobów), wymieniając informacje z API Kubernetes.

W społeczności istnieje kilka narzędzi, które umożliwiają programistom łatwe tworzenie własnych operatorów. Wśród nich znajduje się Operator Framework i jego Operator SDK. Ten SDK zapewnia podstawę, na której programista może bardzo szybko rozpocząć tworzenie operatora. Można na przykład rozpocząć od wiersza poleceń w ten sposób:

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

W ten sposób tworzony jest cały stereotypowy kod dla twojego operatora, w tym pliki YAML i kod w 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

Następnie można dodać potrzebne API i kontroler, w ten sposób:

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

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

A następnie, w końcu, skompilować operatora i przesłać go do rejestru twojego kontenera:

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

Jeśli programista potrzebuje jeszcze większej kontroli, może zmienić stereotypowy kod w plikach Go. Na przykład, aby zmienić specyfikację kontrolera, można wprowadzić zmiany w pliku controller.go.

Inny projekt, KUDO, umożliwia tworzenie operatorów przy użyciu wyłącznie deklaratywnych plików YAML. Na przykład operator dla Apache Kafka można zdefiniować mniej więcej w ten sposób: tak. Dzięki temu można zainstalować klaster Kafka na Kubernetes w zaledwie kilku komendach:

$ kubectl kudo install zookeeper
$ kubectl kudo install kafka

A następnie skonfigurować go za pomocą jeszcze jednej komendy:

$ 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

Innowacje

W ciągu ostatnich kilku lat większe wydania Kubernetes odbywają się co kilka miesięcy – czyli około trzy-cztery duże wydania w roku. Liczba nowych funkcji wprowadzanych w każdym z nich nie maleje. Co więcej, nie widać oznak spowolnienia nawet w tych trudnych czasach – zobacz, jaka jest teraz aktywność projektu Kubernetes na Githubie.

Nowe możliwości pozwalają na bardziej elastyczne klasterowanie operacji przy różnorodnych obciążeniach roboczych. Ponadto programiści cenią sobie pełniejszą kontrolę przy wdrażaniu aplikacji bezpośrednio w środowisku produkcyjnym.

Społeczność

Kolejnym istotnym aspektem popularności Kubernetes jest siła jego społeczności. W 2015 roku, po osiągnięciu wersji 1.0, Kubernetes został sponsorowany Cloud Native Computing Foundation.

Istnieją również różnorodne społeczności SIG (specjalne grupy zainteresowań), które koncentrują się na rozwoju różnych obszarów Kubernetes, w miarę jak projekt się rozwija. Grupy te nieustannie dodają nowe możliwości, co sprawia, że praca z Kubernetes staje się coraz bardziej komfortowa.

Cloud Native Foundation organizuje również CloudNativeCon/KubeCon, która, w momencie pisania tego tekstu, jest największą konferencją open source na świecie. Zazwyczaj odbywa się trzy razy w roku i gromadzi tysiące profesjonalistów, którzy pragną ulepszyć Kubernetes i jego ekosystem, a także poznać nowe możliwości pojawiające się co trzy miesiące.

Co więcej, w Cloud Native Foundation istnieje Komitet ds. Nadzoru Technicznego, który wspólnie z SIG-ami rozpatruje nowe i istniejące projekty fundacji, skupione na ekosystemie chmurowym. Większość z tych projektów pomaga wzmocnić możliwości Kubernetes.

W końcu wierzę, że Kubernetes nie odniósłby takiego sukcesu bez świadomych wysiłków całej społeczności, w której ludzie wspierają się nawzajem, ale jednocześnie chętnie przyjmują nowicjuszy.

Przyszłość

Jednym z głównych wyzwań, z którymi deweloperzy będą musieli zmierzyć się w przyszłości, jest umiejętność skupienia się na szczegółach samego kodu, a nie na infrastrukturze, w której działa. To właśnie tym trendom odpowiada architektura bezserwerowa, która jest dzisiaj jednym z wiodących rozwiązań. Już istnieją zaawansowane frameworki, takie jak Knative i OpenFaas, które wykorzystują Kubernetes do abstrahowania infrastruktury od dewelopera.

W tym artykule w zarysie przyjrzeliśmy się obecnemu stanowi Kubernetes – w rzeczywistości to tylko wierzchołek góry lodowej. Użytkownicy Kubernetes mają do dyspozycji wiele innych zasobów, możliwości i konfiguracji.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster