Usługi w Kubernetes

Usługi w Kubernetes

O tym, jak potężnym narzędziem jest Kubernetes, mogłeś się przekonać z naszego kursu. Dlatego najprawdopodobniej wiesz już, że dzięki Kubernetesowi jesteś w stanie zarządzać aplikacjami w kontenerach. Natomiast jedną z funkcji, którą chcę się w tym artykule zająć, są usługi (services). To dzięki nim kontenery mogą komunikować się ze sobą. Wszystko będę chciał wyjaśnić, na praktycznym przykładzie zakładając, że podstawowe zagadnienia związane z Kubernetes już znasz. Dlatego bez dłuższego wstępu przejdźmy do rzeczy. Poznaj najpopularniejsze usługi w Kubernetes.

 

Sprawdź, czego nauczysz się dzięki kursowi Grafany!

Udostępniamy darmowo ponad godzinny materiał z kursu. Przekonaj się, że jest idealny dla Ciebie!

Chcesz wziąć udział w kursie? Kliknij w link i obejrzyj co Cię czeka: https://asdevops.pl/demo-grafana/

 

 

 

 

Podstawowe założenie

Załóżmy, że mamy aplikację internetową, która składa się z kilku kontenerów. Najprościej załóżmy, że tych kontenerów jest przynajmniej 2. Pierwszy z nich jest to serwer WWW a drugi baza danych. Każdy z nich ma swój unikalny adres IP oraz numer portu. Niestety problem pojawia się dokładnie w tym miejscu. Otóż wspomniany adres IP może ulec zmianie w miarę dynamicznie poprzez dodawanie lub usuwanie nowych kontenerów. W ten sposób utrudniamy śledzenie adresów IP i portów każdego z kontenerów. Szczególnie gdy konieczna jest komunikacja między nimi.

Jak rozwiązać ten problem?

Aby rozwiązać ten problem, powinniśmy skorzystać z usług (services) Kubernetesa. To one zapewnią stały adres IP oraz numer portu. W ten sposób zapewnimy sprawną komunikację między nimi. Ten stabilny adres IP jest znany jako ClusterIP i jest przypisywany do usługi podczas tworzenia.

W ramach wyjaśnień…

Tak jak wspomniałem naszym założeniem jest to, że mamy serwer WWW i bazę danych. Następnie tworzymy usługę Kubernetes o przykładowej nazwie web-service do obsługi przychodzących żądań sieciowych. Zakładamy, że usługa ma przypisany ClusterIP 10.0.0.1. Kiedy wysyłane jest żądanie na porcie 80, Kubernetes kieruje ruch do jednego z kontenerów serwera sieciowego w podzie. Następnie zwiększając ich ilość, Kubernetes automatycznie przypisuje im nowe adresy IP i numery portów. Usługa web-service będzie nadal korzystać z tego samego ClusterIP, zapewniając, że wcześniejsze kontenery serwera sieciowego będą nadal dostępne za jego pośrednictwem. Oprócz wymienionego, usługi Kubernetes oferują również inne funkcje. Do takich możemy zaliczyć równoważenie obciążenia i wykrywanie usług. Równoważenie obciążenia zapewnia równomierny rozkład ruchu między kontenerami w zasobniku, a wykrywanie usług umożliwia innym kontenerom łatwe znajdowanie usługi i komunikowanie się z nią.

Tworzenie usługi w Kubernetes

W celu stworzenia usługi Kubernetes tak jak w przypadku wszystkich typów możemy skorzystać z pliku yaml. Dzięki instrukcjom w nim zawartym określimy nazwę usługi oraz inne elementy, przy pomocy których będziemy mogli korzystać z bardziej statycznych ustawień. Poniżej prezentuję przykład pliku yaml, dzięki któremu stworzymy usługę noszącą nazwę web-service z ustawioną etykietą app=web-server.

apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: web-server
  ports:
  - name: http
    port: 80
    targetPort: 80

Opis przykładu

Pomimo tego, że zakładam, iż wiesz co nieco już o Kubernetesie, to jednak nie byłbym sobą, gdybym nie opisał poszczególnych elementów, chociaż w skrócie. Dlatego, jeżeli rozumiesz prezentowany przykład, możesz pominąć tę część artykułu. Natomiast jeżeli masz jakieś wątpliwości, polecam zapoznać się z tym krótkim opisem.

apiVersion – wersja interfejsu API Kubernetes używana przez plik yaml. W tym przypadku jest to v1, czyli podstawowa wersja interfejsu.

kind – to rodzaj obiektu, który opisuje plik yaml. W tym przypadku jest to obiekt usługi.

metadata – metadane dotyczące obiektu usługi, w tym jego nazwa.

spec – specyfikacja obiektu usługi, która definiuje jego zachowanie.

selector – selektor etykiet, który określa, które pody są celem usługi. W tym przypadku jest kierowany na pody z etykietą app ustawioną na web-server.

ports: lista portów, na których nasłuchuje usługa. W tym przypadku definiujemy port o nazwie „http”, który nasłuchuje na porcie 80 i przekazuje ruch do portu 80 podów.

Gdy uruchomimy powyższy plik yaml, stworzymy obiekt usługi, który zapewni stały adres i nazwę DNS w celu uzyskania dostępu do podów, z ustawioną etykietą app: web-server. Dzięki temu inne pody mogą uzyskiwać dostęp do serwera WWW działającego w klastrze, nawet gdy pody są tworzone, skalowane lub zastępowane.

Tworzenie usługi

Aby stworzyć wspomnianą usługę lub jeżeli wolisz nazwę serwis, musisz powyższy plik zapisać pod dowolną nazwą z określeniem typu yaml. Ja wspomniany plik nazwałem usluga.yaml. Następnie korzystamy z polecenia do uruchomienia:

kubectl apply -f usluga.yaml
service/web-service created

W celu wyświetlenia listy dostępnych usług wystarczy, że skorzystamy z polecenia:

kubectl get svc
NAME      	TYPE    	CLUSTER-IP 	EXTERNAL-IP   PORT(S)   AGE
kubernetes	ClusterIP   10.96.0.1  	<none>    	443/TCP   48d
web-service   ClusterIP   10.101.134.3   <none>    	80/TCP	116s

Jak udowadnia to prezentowany przykład, stworzyliśmy własną usługę noszącą nazwę web-service.

Tworzymy serwer z bazą

W ramach przykładu za pomocą pliku yaml i Kubernetesa stworzymy serwer z apache2 i MySQL. Oto zawartość pliku yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-server
  template:
    metadata:
      labels:
        app: web-server
    spec:
      containers:
        - name: apache2
          image: httpd:latest
          ports:
            - containerPort: 80
        - name: mysql
          image: mysql:latest
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: "Passw0rd1"
            - name: MYSQL_DATABASE
              value: "serwer"
            - name: MYSQL_USER
              value: "user"
            - name: MYSQL_PASSWORD
              value: "user-password"
          ports:
            - containerPort: 3306

Dzięki ustawionej etykiecie powiązaliśmy nasz serwer z utworzoną przed chwilą usługą.

Sprawdzamy czy wszystko działa

W celu weryfikacji czy nasze pody zostały powiązane z usługą, na początku zobaczmy opis usługi:

kubectl describe service web-service
Name:          	web-service
Namespace:     	default
Labels:        	<none>
Annotations:   	<none>
Selector:      	app=web-server
Type:          	ClusterIP
IP Family Policy:  SingleStack
IP Families:   	IPv4
IP:            	10.101.134.3
IPs:           	10.101.134.3
Port:          	http  80/TCP
TargetPort:    	80/TCP
Endpoints:     	172.17.0.10:80,172.17.0.14:80,172.17.0.9:80
Session Affinity:  None
Events:        	<none>

Zwróćmy uwagę na Endpoints. W przykładzie stworzyliśmy trzy repliki. Zostały im przypisane tutaj adresy IP. W celu sprawdzenia, czy tak jest, wypiszmy listę podów:

kubectl get pod
NAME                            	READY   STATUS          	RESTARTS    	AGE
web-deployment-79957d5f49-55cd6 	2/2 	Running         	2 (6m49s ago)   23m
web-deployment-79957d5f49-njb58 	2/2 	Running         	2 (6m49s ago)   23m
web-deployment-79957d5f49-xc5x7 	2/2 	Running         	2 (7m7s ago)	23m

Teraz sprawdźmy, co otrzymamy, gdy zażądamy opisu na przykład pierwszego z listy:

IP: 172.17.0.9

Każdemu z wymienionych podów został przypisany statyczny adres IP. Aby łatwiej wypisać listę Endpointów, możemy posłużyć się poleceniem:

kubectl get endpoints
NAME      	ENDPOINTS                                 	AGE
kubernetes	192.168.49.2:8443                         	48d
web-service   172.17.0.10:80,172.17.0.14:80,172.17.0.9:80   60m

W ten oto sposób zarezerwowaliśmy adresy IP dla naszych podów.

Podsumowanie – Usługi w Kubernetes

Na łamach tego artykułu chciałem wyjaśnić podstawy działania usług Kubernetesa na prostym przykładzie. Ten artykuł ma na celu wprowadzić użytkownika do usług Kubernetesa oraz zademonstrować jego wykorzystanie przy pomocy przykładu.

Chcesz wiedzieć więcej na temat konteneryzacji? Przeczytaj nasze artykuły, a także weź udział w kursach!

 

 

 

Sprawdź, czego nauczysz się dzięki kursowi Grafany!

Udostępniamy darmowo ponad godzinny materiał z kursu. Przekonaj się, że jest idealny dla Ciebie!

Chcesz wziąć udział w kursie? Kliknij w link i obejrzyj co Cię czeka: https://asdevops.pl/demo-grafana/

 
 
 

Lekcja demo kursu Grafany!

X