Monitorowanie Amazon EKS Anywhere za pomocą usługi Amazon Managed Service dla Prometheus i Amazon Managed Grafana

27 maja 2022

Ten artykuł zawiera przewodnik krok po kroku, jak monitorować skonteneryzowane obciążenie działające w Amazon EKS Anywhere przez publikowanie metryk w usłudze Amazon Managed Service dla Prometheus i używanie usługi Amazon Managed Grafana w celu wizualizacji.

Amazon EKS Anywhere to opcja wdrożenia dla Amazon EKS, która umożliwia łatwe tworzenie i obsługę klastrów Kubernetes w zarządzanym przez klienta środowisku vSphere (lub bare metal w 2022 r.). EKS Anywhere zapewnia instalowalny pakiet oprogramowania do tworzenia i obsługi klastrów Kubernetes lokalnie oraz narzędzia do automatyzacji do obsługi cyklu życia klastra. EKS Anywhere zapewnia spójne zarządzanie AWS w Twoim centrum danych, bazując na mocnych stronach Amazon EKS Distro, dystrybucji typu open-source dla Kubernetes używanej przez Amazon EKS.

Omówienie rozwiązania

Poniższy rysunek ilustruje ogólną architekturę konfiguracji serwera Prometheus w klastrze EKS Anywhere i Amazon Managed Service for Prometheus wraz z Amazon Managed Grafana w AWS Cloud:

Monitorowanie Amazon EKS Anywhere za pomocą usługi Amazon Managed Service dla Prometheus i Amazon Managed Grafana

Klienci decydujący się na uruchomienie EKS Anywhere w swojej infrastrukturze chcieliby uzyskać dostęp do usług AWS w swojej lokalizacji geograficznej dla różnych potrzeb, takich jak przechowywanie, obserwowalność lub włączanie sztucznej inteligencji. Aby uzyskać łączność sieciową między infrastrukturą klienta a chmurą AWS, dostępne są następujące opcje łączności:

  • AWS Direct Connect umożliwia ustanawianie dedykowanych połączeń z lokalnego środowiska do AWS. Dzięki Direct Connect możesz ominąć Internet, co często zmniejsza koszty sieci, poprawia przepustowość i zapewnia bardziej spójne działanie sieci. Możesz żądać połączeń 1, 10 lub 100 Gb/s bezpośrednio z usługi AWS, która obecnie obsługuje publiczny interfejs wirtualny. Publiczny interfejs wirtualny może uzyskać dostęp do wszystkich usług publicznych AWS przy użyciu publicznych adresów IP. To najbardziej zalecane podejście.
  • Bezpośredni dostęp do usług AWS przez publiczną białą listę internetową z lokalnym stanem bezpieczeństwa sieci dla punktów końcowych i adresów IP usług AWS.
  • AWS VPN umożliwia tworzenie tuneli VPN typu site-to-site IPsec z wirtualnej chmury prywatnej Amazon (Amazon VPC) do lokalnej bramy klienta, umożliwiając środowisko hybrydowe. Takie podejście wymaga bardziej złożonych konfiguracji sieciowych, takich jak punkty końcowe VPC w Amazon VPC, przekazywanie wszystkich lokalnych zapytań DNS związanych z dostępem do usług AWS do AWS, przychodzące punkty końcowe Route 53, reguły przeliczania Route 53 i tak dalej.

Po przyjęciu jednej z powyższych opcji sieciowych następnym krokiem w celu uzyskania dostępu do usług AWS jest uwierzytelnienie w AWS przy użyciu uprawnień. Role EKS IAM dla konta usługi (IRSA) umożliwiają aplikacjom działającym w klastrach uwierzytelnianie za pomocą usług AWS przy użyciu ról IAM. Aby włączyć IRSA dla klastra EKS Anywhere, należy utworzyć własnego dostawcę OIDC dla klastra i udostępniać klucz podpisywania konta usługi publicznej klastra. Klucze publiczne wraz z dokumentem wykrywania OIDC powinny być udostępniane w miejscu, w którym usługa AWS Security Token Service (AWS STS) może je wykryć. Więcej informacji na temat konfigurowania usługi IRSA w klastrze EKS Anywhere można znaleźć na stronie IAM for Pods configuration.

Następnie klienci korzystający z EKS Anywhere mogą używać Prometheusa do monitorowania swojego klastra Kubernetes i chcieliby użyć Grafana jako jednej z opcji wizualizacji metryk. Prometheus to popularne narzędzie do monitorowania typu open source, które zapewnia zaawansowane funkcje zapytań i ma szerokie wsparcie dla różnych obciążeń. Amazon Managed Service for Prometheus to w pełni zarządzana usługa AWS zgodna z Prometheus, która ułatwia bezpieczne i niezawodne monitorowanie środowisk, takich jak Amazon EKS, Amazon Elastic Container Service (Amazon ECS) i Amazon Elastic Compute Cloud (Amazon EC2). Amazon Managed Grafana to z kolei w pełni zarządzana i bezpieczna usługa wizualizacji danych dla oprogramowania Grafana o otwartym kodzie źródłowym, która umożliwia klientom natychmiastowe wyszukiwanie, korelowanie i wizualizację wskaźników operacyjnych, dzienników i śladów ich aplikacji z wielu źródeł danych. Amazon Managed Grafana integruje się z wieloma usługami bezpieczeństwa Amazon Web Services (AWS) i AWS Single Sign-On (AWS SSO) (AWS SSO). Dzięki temu oferuje jednokrotne logowanie w celu uzyskania dostępu do konsoli Grafana w przestrzeni roboczej Amazon Managed Grafana, zarządzania kontrolą dostępu, wyszukiwania danych i budowania wizualizacji.

Przedstawienie rozwiązania

Warunki wstępne

Aby wdrożyć rozwiązanie, musisz spełnić następujące warunki wstępne:

  • Komputer administracyjny skonfigurowany tak, aby mieć dostęp administratora AWS CLI w celu uzyskania dostępu do usług AWS
  • W pełni dostępny klaster EKS Anywhere z komputera administracyjnego
  • IRSA skonfigurowany w klastrze EKS Anywhere
  • Zainstaluj następujące narzędzia na komputerze administracyjnym
  • AWS CLI w wersji 2.2 lub nowszej
  • Helm
  • eksctl
  • eks-anywhere
  • kubectl

Zacznij od ustawienia kilku zmiennych środowiskowych:

AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
AWS_REGION=us-west-2 #<-- Change this to match your region
CLUSTER_NAME=<<Name of your EKSA Cluster>>
OIDC_PROVIDER=<<Name of OIDC Provider Configured>>

EKSA_AMP_WORKSPACE_NAME=AMG-EKSA-workspace

SERVICE_ACCOUNT_NAMESPACE=prometheus
SERVICE_ACCOUNT_AMP_INGEST_NAME=amp-iamproxy-ingest-service-account
SERVICE_ACCOUNT_IAM_AMP_INGEST_ROLE=amp-iamproxy-ingest-role
SERVICE_ACCOUNT_IAM_AMP_INGEST_POLICY=AMPIngestPolicy

KUBECONFIG=${PWD}/${CLUSTER_NAME}/${CLUSTER_NAME}-eks-a-cluster.kubeconfig

Aby utworzyć obszar roboczy Amazon Managed Service for Prometheus, użyj następującego polecenia AWS CLI:

aws amp create-workspace --alias $EKSA_AMP_WORKSPACE_NAME --region $AWS_REGION

Wskaźniki zdalnego zapisu do Amazon Managed Service for Prometheus

Uruchom polecenia w poniższym fragmencie kodu. Efektem będą następujące działania:

  • Utworzenie roli IAM z zasadą IAM, która posiada uprawnienia do zdalnego zapisu w obszarze roboczym Amazon Managed Service for Prometheus.
  • Utworzenie konta usługi Kubernetes z adnotacją z rolą IAM.
  • Utworzenie relacji zaufania między rolą IAM a dostawcą OIDC hostowanym w klastrze Amazon EKS-A.
# Set up a trust policy designed for a specific combination of K8s service account and namespace to sign in from a Kubernetes cluster which hosts the OIDC Idp.
#
cat <<EOF > TrustPolicy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::${AWS_ACCOUNT_ID}:oidc-provider/${OIDC_PROVIDER}"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "${OIDC_PROVIDER}:sub": "system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_AMP_INGEST_NAME}"
        }
      }
    }
  ]
}
EOF
#
# Set up the permission policy that grants ingest (remote write) permissions for all AMP workspaces
#
cat <<EOF > PermissionPolicyIngest.json
{
  "Version": "2012-10-17",
   "Statement": [
       {"Effect": "Allow",
        "Action": [
           "aps:RemoteWrite"
        ], 
        "Resource": "*"
      }
   ]
}
EOF

function getRoleArn() {
  OUTPUT=$(aws iam get-role --role-name $1 --query 'Role.Arn' --output text 2>&1)

  # Check for an expected exception
  if [[ $? -eq 0 ]]; then
    echo $OUTPUT
  elif [[ -n $(grep "NoSuchEntity" <<< $OUTPUT) ]]; then
    echo ""
  else
    >&2 echo $OUTPUT
    return 1
  fi
}

#
# Create the IAM Role for ingest with the above trust policy
#
SERVICE_ACCOUNT_IAM_AMP_INGEST_ROLE_ARN=$(getRoleArn $SERVICE_ACCOUNT_IAM_AMP_INGEST_ROLE)
if [ "$SERVICE_ACCOUNT_IAM_AMP_INGEST_ROLE_ARN" = "" ]; 
then
  #
  # Create the IAM role for service account
  #
  SERVICE_ACCOUNT_IAM_AMP_INGEST_ROLE_ARN=$(aws iam create-role \
  --role-name $SERVICE_ACCOUNT_IAM_AMP_INGEST_ROLE \
  --assume-role-policy-document file://TrustPolicy.json \
  --query "Role.Arn" --output text)
  #
  # Create an IAM permission policy
  #
  SERVICE_ACCOUNT_IAM_AMP_INGEST_ARN=$(aws iam create-policy --policy-name $SERVICE_ACCOUNT_IAM_AMP_INGEST_POLICY \
  --policy-document file://PermissionPolicyIngest.json \
  --query 'Policy.Arn' --output text)
  #
  # Attach the required IAM policies to the IAM role created above
  #
  aws iam attach-role-policy \
  --role-name $SERVICE_ACCOUNT_IAM_AMP_INGEST_ROLE \
  --policy-arn $SERVICE_ACCOUNT_IAM_AMP_INGEST_ARN  
else
    echo "$SERVICE_ACCOUNT_IAM_AMP_INGEST_ROLE_ARN IAM role for ingest already exists"
fi
echo $SERVICE_ACCOUNT_IAM_AMP_INGEST_ROLE_ARN

Amazon Managed Service for Prometheus nie pobiera bezpośrednio metryk operacyjnych ze skonteneryzowanych obciążeń w klastrze Kubernetes. Aby wykonać to zadanie, użytkownicy muszą wdrożyć i zarządzać standardowym serwerem Prometheus w ich klastrze.

Wykonaj następujące polecenia, aby wdrożyć serwer Prometheus w klastrze EKS:

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
kubectl create ns prometheus
EKSA_AMP_WORKSPACE_ID=$(aws amp list-workspaces --alias $EKSA_AMP_WORKSPACE_NAME --region=${AWS_REGION} --query 'workspaces[0].[workspaceId]' --output text)

Utwórz plik o nazwie amp_ingest_override_values.yaml z następującą zawartością. Jeśli używasz wersji Prometheusa wcześniejszej niż 2.26.0, postępuj zgodnie z tą dokumentacją w sekcji dotyczącej używania starszych wersji Prometheusa.

cat > amp_ingest_override_values.yaml << EOF
## The following is a set of default values for prometheus server helm chart which enable remoteWrite to AMP
## For the rest of prometheus helm chart values see: https://github.com/prometheus-community/helm-charts/blob/main/charts/prometheus/values.yaml
##
serviceAccounts:
  server:
    name: amp-iamproxy-ingest-service-account
    annotations: 
      eks.amazonaws.com/role-arn: ${SERVICE_ACCOUNT_IAM_AMP_INGEST_ROLE_ARN}
server:
  remoteWrite:
    - url: https://aps-workspaces.${AWS_REGION}.amazonaws.com/workspaces/${EKSA_AMP_WORKSPACE_ID}/api/v1/remote_write
      sigv4:
        region: ${AWS_REGION}
      queue_config:
        max_samples_per_send: 1000
        max_shards: 200
        capacity: 2500
EOF

Wykonaj następujące polecenie, aby zainstalować konfigurację serwera Prometheus i skonfigurować punkt końcowy remoteWrite.

helm install prometheus-for-amp prometheus-community/prometheus -n prometheus -f ./amp_ingest_override_values.yaml

AWS Single Sign-On (AWS SSO)

Aby korzystać z usługi Amazon Managed Grafana w sposób elastyczny i wygodny, zdecydowano się na użycie AWS Single Sign-On (AWS SSO) do zarządzania użytkownikami. Jednokrotne logowanie w AWS jest dostępne po ręcznym włączeniu organizacji AWS lub jest włączane automatycznie podczas konfigurowania AWS Control Tower.

Amazon Managed Grafana integruje się z AWS SSO, aby zapewnić związek tożsamości dla pracowników. Korzystając z usługi Amazon Managed Grafana i AWS SSO, użytkownicy są przekierowywani do istniejącego katalogu firmowego, aby zalogować się przy użyciu istniejących poświadczeń. Następnie są bezproblemowo logowani do swojego obszaru roboczego Amazon Managed Grafana. Zapewnia to egzekwowanie ustawień zabezpieczeń, takich jak zasady haseł i uwierzytelnianie dwuskładnikowe. Korzystanie z logowania jednokrotnego w AWS nie ma wpływu na istniejącą konfigurację uprawnień.

Utwórz obszar roboczy Amazon Managed Grafana i metryki zapytań z usługi Amazon Managed Service dla obszaru roboczego Prometheus

Możesz łatwo uruchamiać na żądanie, automatycznie skalowane obszary robocze Grafana (wirtualne serwery Grafana), które umożliwiają tworzenie ujednoliconych pulpitów nawigacyjnych dla wielu źródeł danych. Zanim będziesz mógł korzystać z usługi Amazon Managed Grafana, musisz ją skonfigurować. W poniższym przykładzie użyto konsoli AWS, aby przeprowadzić Cię przez wymagane kroki i skomentować kwestie, które należy wziąć pod uwagę podczas wykonywania każdego kroku.

Po wybraniu przycisku Utwórz obszar roboczy znajdującego się w prawym górnym rogu strony docelowej konsoli Amazon Managed Grafana, nadaj swojemu nowemu obszarowi roboczemu nazwę i opcjonalnie opis:

grafana

W tym kroku musisz również włączyć jednokrotne logowanie AWS (AWS SSO) dla usługi Amazon Managed Grafana, ponieważ w ten sposób zarządza się uwierzytelnianiem użytkowników w obszarach roboczych Grafana. Ponadto jako typ uprawnień wybierz Usługa zarządzana:

grafana

Na następnym ekranie wybierz następujące źródła danych i SNS jako kanał powiadomień. Następnie wybierz Dalej.

grafana

Na kolejnym ekranie wybierz Utwórz obszar roboczy bez żadnych wyborów, aby utworzyć obszar roboczy Amazon Managed Grafana.

Domyślnie użytkownik AWS SSO posiada uprawnienia do przeglądania. Ze względu na to, że będziesz dodawać nowe źródła danych i tworzyć pulpit nawigacyjny w Amazon Managed Grafana, chcesz zaktualizować typ użytkownika jako admin. Na karcie Uwierzytelnianie wybierz przycisk Konfiguruj użytkowników i grupy użytkowników, wybierz użytkownika logowania jednokrotnego, którego chcesz użyć do zalogowania się do usługi Grafana, i wybierz przycisk Utwórz administratora, jak pokazano na poniższym zrzucie ekranu:

grafana

Zapytanie o metryki z usługi Amazon Managed Service dla obszaru roboczego Prometheus

  • W sekcji Podsumowanie wybierz adres URL obszaru roboczego Grafana. Spowoduje to przejście do ekranu logowania AWS SSO, gdzie możesz podać identyfikator użytkownika i hasło skonfigurowanego użytkownika SSO.
  • Po zalogowaniu się do konsoli Amazon Managed Grafana przejdź do sekcji Konfiguracja znajdującej się na lewym pasku nawigacji. Wybierz Źródła danych, aby dodać źródło danych Amazon Managed Service for Prometheus.

Po prawej stronie wybierz przycisk Dodaj źródło danych i wybierz Prometheus, jak pokazano na poniższym zrzucie ekranu:

grafana

Skonfiguruj źródło danych Prometheus:

  • W polu Nazwa dodaj AMPDataSource lub dowolną inną nazwę.
  • W polu URL dodaj adres URL zdalnego zapisu w obszarze roboczym Prometheus usługi Amazon Managed Service z konta obciążenia A bez api/v1/remote_write na końcu.
  • Włącz SigV4auth.
  • W sekcji Szczegóły SigV4Auth:
  • Jako Region Domyślny wybierz region, w którym utworzono obszar roboczy usługi zarządzanej przez Amazon dla Prometheus
  • Wybierz opcję Zapisz i przetestuj. Powinno pojawić się działające źródło danych powiadomienia.

grafana

grafana

Zauważysz, że źródło danych Amazon Managed Service for Prometheus jest uwierzytelniane za pomocą protokołu SigV4. Grafana (7.3.5 i nowsze) ma wbudowane proxy AWS SigV4 jako wtyczkę, dzięki czemu jest to możliwe.

  • Teraz wybierz Eksploruj z lewego paska nawigacyjnego, aby zapytać o metryki i wprowadź następujące zapytanie w polu tekstowym: apiserver_current_inflight_requests. Zapoznaj się z EKS Control Plane w EKS Best Practices Guides, aby dowiedzieć się więcej o metrykach płaszczyzny kontroli Amazon EKS, które można monitorować za pomocą Prometheusa, aby zrozumieć wydajność klastra Amazon EKS.
  • Otrzymasz ekran podobny do tego na poniższym zrzucie ekranu, który pokazuje, że jesteś w stanie pomyślnie wysyłać zapytanie metryki z klastra EKSA za pośrednictwem obszaru roboczego Amazon Managed Service for Prometheus:

grafana

Możesz również zaimportować istniejący pulpit nawigacyjny, wybierając znak plus (+) na lewym pasku nawigacyjnym.

  1. Wybierz Importuj.
  2. Na ekranie Import wpisz „3119” w polu tekstowym Importuj przez grafana.com i wybierz opcję Importuj.
  3. Z listy rozwijanej na dole wybierz AMPDataSource i wybierz Importuj.

grafana

Po zakończeniu będziesz mógł potwierdzić, że pulpit Grafana przedstawia metryki z klastra EKSA za pośrednictwem źródła danych Amazon Managed Service for Prometheus, jak pokazano na poniższym zrzucie ekranu.

grafana

Porządkowanie

Użyj następujących poleceń, aby uporządkować utworzone zasoby AWS dla tej demonstracji:

# Clean up prometheus.
helm uninstall prometheus-for-amp -n prometheus

aws iam detach-role-policy --role-name $SERVICE_ACCOUNT_IAM_AMP_INGEST_ROLE --policy-arn $SERVICE_ACCOUNT_IAM_AMP_INGEST_ARN
aws iam delete-policy --policy-arn $SERVICE_ACCOUNT_IAM_AMP_INGEST_ARN
aws iam delete-role --role-name $SERVICE_ACCOUNT_IAM_AMP_INGEST_ROLE
rm -r amp_ingest_override_values.yaml
aws amp delete-workspace --workspace-id $EKSA_AMP_WORKSPACE_ID --region=$AWS_REGION

Na koniec przejdź do konsoli Amazon Managed Grafana, aby usunąć utworzony obszar roboczy Amazon Managed Grafana.

Podsumowanie

Na przykładzie tego artykułu twórcy zaprezentowali, jak skonfigurować usługę Amazon Managed Grafana w celu pobierania metryk z usługi Amazon Managed Service dla Prometheus, by pobierać metryki z obciążeń kontenerów działających w klastrze EKS-A Anywhere w centrum danych zarządzanym przez klienta. Jeśli chcesz dowiedzieć się więcej o EKS Anywhere, zapoznaj się z często zadawanymi pytaniami dotyczącymi EKS Anywhere.

źródło:AWS

Case Studies
Referencje

Firma Hostersi pozwoliła nam osadzić ogólne zagadnienia programu Well Architected Framework w kontekście naszej firmy. Oszczędziło nam to wiele czasu i pozwoliło znaleźć lepiej dopasowane rozwiązania do specyfiki naszego biznesu. WAF był świetnym katalizatorem do wprowadzenie szeregu zmian w obszarze niezawodności, szybkości i bezpieczeństwa edrone. 

Piotr Stachowicz
CTO
W skrócie o nas
Specjalizujemy się w dostarczaniu rozwiązań IT w obszarach projektowania infrastruktury serwerowej, wdrażania chmury obliczeniowej, opieki administracyjnej i bezpieczeństwa danych.