Cześć. Dzisiaj zaprezentuję Wam jak szybko możecie utworzyć klaster Kubernetes w AWS.
Wybór właściwego rozwiązania, w ramach którego uruchomić swoją aplikację lub serwis w chmurze AWS może być trudne. Bardzo dużo zależy tutaj od takich czynników jak wielkość serwisu, częstotliwość jego aktualizacji czy sposob wdrażania. Najczęściej wybierane możliwości to:
- Uruchomienie aplikacji w maszynach wirtualnych z wykorzystaniem AWS Elastic Compute Cloud (EC2).
- Uruchomienie aplikacji w trybie serverless z wykorzystaniem AWS Elastic Beanstalk, AWS App Runner czy AWS Fargate
- Uruchomienie aplikacji w kontenerach z wykorzystaniem AWS Elastic Container Service (ECS) lub Amazon Elastic Kubernetes Service (EKS).
Każda z dostępnych propozycji ma swoje plusy i minusy. Jednakże rozwiązaniem, które daje największe możliwości jest klaster Kubernetes w ramach Amazon Elastic Kubernetes Service (EKS). Dlatego też dzisiaj pokażę jak można szybko uruchomić prosty serwis oparty na Nginx.
Czym jest Kubernetes?
Kubernetes (K8s) to otwarte oprogramowanie do zarządzania chmurą obliczeniową. Jest to platforma do zarządzania kontenerami, która umożliwia automatyzację wdrażania, skalowania i zarządzania aplikacjami w chmurze. Kubernetes pozwala na tworzenie elastycznych i skalowalnych systemów opartych na kontenerach, które są łatwe do zarządzania i umożliwiają szybką wymianę komponentów.
Czym jest AWS EKS?
AWS Elastic Container Service for Kubernetes (Amazon EKS) to usługa AWS, która umożliwia łatwe uruchamianie i skalowanie klastra Kubernetes na platformie AWS. Amazon EKS jest kompatybilny z oryginalnym oprogramowaniem Kubernetes i umożliwia uruchamianie aplikacji bez konieczności zarządzania samodzielnie infrastrukturą. Amazon EKS automatyzuje wiele zadań związanych z utrzymaniem i skalowaniem klastrów Kubernetes, co pozwala na skupienie się na tworzeniu i uruchamianiu aplikacji.
Przygotowania
Przed rozpoczęciem pracy należy utworzyć konto w AWS oraz skonfigurować narzędzie AWS CLI. Przygotowałem poradnik na dev.to, w którym opisałem cały proces: https://dev.to/aws-builders/create-a-free-aws-account-and-configure-the-aws-cli-1khf .
Helm
Kolejnym narzędziem będzie Helm. Jest to narzędzie służące do zarządzania aplikacjami uruchomionymi w klastrze kontenerów w środowisku Kubernetes. Helm pozwala na łatwe instalowanie, aktualizowanie i usuwanie aplikacji, a także zarządzanie nimi za pomocą zestawów konfiguracyjnych zwanych „chartami”.
Samą instalację wykonujemy poprzez uruchomienie poniższych komend:
> curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
> chmod 700 get_helm.sh
> ./get_helm.sh
Po instalacji sprawdzamy czy aplikacja działa prawidłowo. W tym celu uruchomiamy poniższą komendą, która powinna pokazać aktualnie wykorzystywaną wersję Helma.
> helm version
version.BuildInfo{Version:"v3.8.2", GitCommit:"6e3701edea09e5d55a8ca2aae03a68917630e91b", GitTreeState:"clean", GoVersion:"go1.17.5"}
Kubectl
Następnym narzędziem, który będziemy instalować będzie Kubectl. Jest narzędzie, które umożliwia zarządzanie zasobami klastra z poziomu wiersza poleceń. W ten sposób deweloperzy i administratorzy mogą wdrażać, skalować i zarządzać aplikacjami uruchomionymi w klastrze Kubernetes poprzez wydawanie poleceń wiersza poleceń na jednym lub wielu węzłach klastra.
Instalujemy narzędzie za pomocą następujących komend:
> curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
> chmod +x ./kubectl
> sudo mv ./kubectl /usr/local/bin/kubectl
Po instalacji również sprawdzamy czy narzędzie działa prawidłowo sprawdzając jego wersję.
> kubectl version
Client Version: version.Info{Major:"1", Minor:"21+", GitVersion:"v1.21.2-13+d2965f0db10712", GitCommit:"d2965f0db1071203c6f5bc662c2827c71fc8b20d", GitTreeState:"clean", BuildDate:"2021-06-26T01:02:11Z", GoVersion:"go1.16.5", Compiler:"gc", Platform:"linux/amd64"}
Eksctl
Ostatnim narzędziem potrzebnym do uruchomienia klastra będzie Eksctl. Jest to narzędzie wiersza poleceń służące do tworzenia, zarządzania i skalowania klastrów Amazon Elastic Kubernetes Service (EKS). Za pomocą eksctl można łatwo tworzyć i usuwać klastry, dodawać i usuwać węzły, zarządzać zasobami klastra i aplikacjami, a także monitorować ich wydajność.
Tutaj instalacja również wymaga uruchomienia kilku instrukcji.
> curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
> sudo mv /tmp/eksctl /usr/local/bin
Podobnie jak w przypadku poprzednich narzędzi sprawdzamy wersję, żeby potwierdzić, że narzędzie działa.
> eksctl version
0.139.0
Uruchamiamy klaster EKS
Po przygotowaniu wszystkich narzędzi możemy przystąpić do uruchomienia naszego klastra. Wystarczy do tego jedna instrukacja:
> eksctl create cluster \
--name nginx-cluster \
--version 1.25 \
--region eu-central-1 \
--nodegroup-name k8s-nodes \
--node-type t2.micro \
--nodes 2
Podczas uruchamiania klastra musimy podać dodatkowe informację za pomocą flag. Poniżej przedstawiam wyjaśnienie tych flag:
- –name – Nazwa klastra EKS. Musi być unikalna w ramach regionu AWS.
- –region – Region AWS, w którym zostanie utworzony klaster.
- –version – Wersja Kubernetes, która ma być zainstalowana na klastrze EKS.
- –nodegroup-name – Nazwa grupy węzłów. Grupa węzłów to grupa wirtualnych maszyn, które działają w klastrze EKS.
- –node-type – Typ instancji EC2, który będzie używany do uruchomienia węzłów klastra.
- –nodes – Liczba węzłów w grupie węzłów. Domyślnie 2.
Po ok 10 minutach klaster zostanie utworzony a my dostaniemy informację o tym w konsoli:
Stan klastra możemy przejrzeć również w konsoli AWS: https://eu-central-1.console.aws.amazon.com/eks. Po zalogowaniu pamiętajcie o sprawdzeniu regionu, w którym ma zostać uruchomiony klaster.
Po kliknięciu nazwy klastra wejdziemy na stronę ze szczegółami. Na górze strony może pojawić się informacja: „Your current IAM principal doesn’t have access to Kubernetes objects on this cluster.„. Komunikat ten informuję, że twoje konto roota nie ma uprawnień do odczytu informacji na temat obiektów w klastrze. Aby nadać takie uprawnienia należy:
- skopiować account id nasze konta (id dostępne jest w konsoli AWS – górny prawy róg, po kliknięciu nazwy konta)
- uruchomić poniższą komendę w konsoli:
> kubectl edit configmap aws-auth -n kube-system
Po uruchomieniu komendy pojawi się edytor VI umożliwiający edycję config mapy dotyczącej autoryzacji w AWS. Naszym zadaniem jest dodanie poniższego kodu w strukturze data:
mapUsers: |
- userarn: arn:aws:iam::888253778090:root
groups:
- system:masters
Po dodaniu nowego kodu Yaml z konfiguracją będzie wyglądał mniej więcej tak (w [account_id] wpiszcie id swojego konta):
apiVersion: v1
data:
mapRoles: |
- groups:
- system:bootstrappers
- system:nodes
rolearn: arn:aws:iam::[account_id]:role/eksctl-nginx-cluster-nodegroup-k8-NodeInstanceRole-XXXXX
username: system:node:{{EC2PrivateDNSName}}
mapUsers: |
- userarn: arn:aws:iam::[account_id]:root
groups:
- system:masters
kind: ConfigMap
metadata:
creationTimestamp: "2023-05-02T09:48:52Z"
name: aws-auth
namespace: kube-system
resourceVersion: "3220"
uid: XXX
Po zapisaniu zmian możemy przejść do konsoli AWS i zweryfikować, czy mamy już dostęp do szczegółów klastra:
Instalujemy serwer Nginx na klastrze EKS
Po uruchomieniu klastra możemy przystąpić do instalacji serwera Nginx. W tym celu skorzystamy z Helm Charts.
W pierwszym kroku dodamy do naszego lokalnego repozytorium instrukcję opisującą w jaki sposób uruchomić serwer Nginx. Robimy to uruchamiając komendę:
> helm repo add bitnami-repo https://charts.bitnami.com/bitnami
"bitnami-repo" has been added to your repositories
W następnym kroku uruchamiamy już sam serwer Nginx za pomocą komendy:
> helm install nginx-release my-repo/nginx
NAME: nginx-release
LAST DEPLOYED: Tue May 2 12:09:15 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: nginx
CHART VERSION: 14.1.0
APP VERSION: 1.24.0
Stan instalacji możemy sprawdzić za pomocą poniższej komendy, która wyświetli informację na temat kubernetes deployment:
> kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-release 1/1 1 1 53s
Pod z serwerem Nginx będzie też widoczny w konsoli AWS.
Wystawiamy na świat serwer Nginx na klastrze EKS
Po uruchomieniu serwera chcielibyśmy sprawdzić czy wszystko działa dobrze. W tym celu możemy wystawić sewer na świat tworząc do tego odpowiedni serwis oraz loadbalancer. W tym celu musimy uruchomić poniższą instrukcję:
> kubectl expose deployment nginx-release --type=LoadBalancer --name=nginx-service-loadbalancer
service/nginx-service-loadbalancer exposed
Teraz możemy pobrać informację na temat adresu load balancera, za pomocą którego będziemy mogli połączyć się do naszego serwisu. Możemy to wykonać za pomocą instrukcji:
> kubectl get service/nginx-service-loadbalancer | awk {'print $1" " $2 " " $4 " " $5'} | column -t
NAME TYPE EXTERNAL-IP PORT(S)
nginx-service-loadbalancer LoadBalancer XXXXX.eu-central-1.elb.amazonaws.com 8080:31376/TCP
Kolumna EXTERNAL-IP zawiera adres naszego load balancera. Teraz możemy wpisać ten adres w przeglądarce dodając port 8080 na końcu lub też uruchomić komendę CURL, która pobierze nam tytuł strony.
> curl -silent XXXXX.eu-central-1.elb.amazonaws.com:8080 | grep title
<title>Welcome to nginx!</title>
Brawo! Uruchomiłeś właśnie swój pierwszy serwis na EKS.
Usuwanie klastra
Jeśli chcecie usunąć klaster EKS to najlepiej jest wykorzystać znowu narzędzie eksclt:
> kubectl delete service nginx-service-loadbalancer
service "nginx-service-loadbalancer" deleted
> eksctl delete cluster --name nginx-cluster --region eu-central-1
2023-05-02 12:34:10 [ℹ] waiting for CloudFormation stack "eksctl-nginx-cluster-nodegroup-k8s-nodes"
2023-05-02 12:34:11 [ℹ] will delete stack "eksctl-nginx-cluster-cluster"
2023-05-02 12:34:11 [✔] all cluster resources were deleted
Podsumowanie
W artykule omówiłem w jaki sposób można wdrożyć swoją aplikację na klaster EKS. Przygotowanie narzędzi do tego procesu nie jest trudne i wymaga tylko kilku kroków.
Pamiętajcie jednak, że jest to początek przygody z uruchamianiem i zarządzaniem aplikacjami w chmurze. Po uruchomieniu aplikacji trzeba zadbać o takie elementy jak monitoring czy skuteczne wdrażanie zmian poprzez CI/CD. Tutaj można skorzystać z poradnika opisującego jak zbudować swoją aplikację w AWS CodeBuild Jak przygotować pierwszy projekt CI w AWS CodeBuild?
Be First to Comment