Implementare un'applicazione di esempio - Amazon EKS

Aiutaci a migliorare questa pagina

Vuoi contribuire a questa guida per l'utente? Scorri fino alla fine di questa pagina e seleziona Modifica questa pagina su GitHub. I tuoi contributi contribuiranno a rendere la nostra guida utente migliore per tutti.

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Implementare un'applicazione di esempio

In questa sezione, imparerai a implementare un'applicazione di esempio sul cluster.

Prerequisiti
  • Un esistente Kubernetes cluster con almeno un nodo. Se non disponi di un EKS cluster Amazon esistente, puoi implementarne uno utilizzando una delle Inizia a usare Amazon EKS guide. Se stai implementando un Windows applicazione, allora devi avere Windows supporto abilitato per il tuo cluster e almeno un Amazon EC2 Windows nodo.

  • Kubectl installato sul computer. Per ulteriori informazioni, consulta Configurazione kubectl e eksctl.

  • Kubectl configurato per comunicare con il cluster. Per ulteriori informazioni, consulta Connessione kubectl a un EKS cluster creando un kubeconfig file.

  • Se si prevede di implementare il carico di lavoro di esempio in Fargate, è necessario disporre di un profilo Fargate che include lo stesso spazio dei nomi creato in questo tutorial, che è eks-sample-app, a meno che non cambi il nome. Se hai usato una delle guide alle operazioni di base per creare il cluster, dovrai creare un nuovo profilo o aggiungere lo spazio dei nomi al profilo esistente, poiché il profilo creato nelle guide introduttive non specifica lo spazio dei nomi utilizzato in questo tutorial. VPCÈ inoltre necessario disporre di almeno una sottorete privata.

Per implementare un'applicazione di esempio

Sebbene molte variabili siano modificabili nei passaggi seguenti, si consiglia di modificare solo i valori delle variabili, se specificato. Una volta che avrai una migliore comprensione di Kubernetes Pods, implementazioni e servizi, puoi sperimentare la modifica di altri valori.

  1. Crea uno spazio dei nomi . Un namespace consente di raggruppare le risorse in Kubernetes. Per ulteriori informazioni, vedete Namespace in Kubernetes documentazione. Se si prevede di implementare l'applicazione di esempio su Semplifica la gestione dell'elaborazione con AWS Fargate, assicurati che il valore per namespace nel Definisci quale Pods utilizzo al AWS Fargate momento del lancio sia eks-sample-app.

    kubectl create namespace eks-sample-app
  2. Crea un Kubernetes distribuzione. Questa implementazione di esempio estrae un'immagine del contenitore da un archivio pubblico e distribuisce tre repliche (singole). Pods) di esso nel tuo cluster. Per ulteriori informazioni, consulta Implementazioni nella Kubernetes documentazione. È possibile distribuire l'applicazione su Linux oppure Windows nodi. Se ti stai schierando a Fargate, puoi solo schierare un Linux applicazione.

    1. Salva i seguenti contenuti in un file denominato eks-sample-deployment.yaml. I container nell'applicazione di esempio non utilizzano l'archiviazione di rete, ma potrebbe essere necessaria per determinate applicazioni. Per ulteriori informazioni, consulta Archivia i dati delle applicazioni per il tuo cluster.

      Linux

      amd64 o arm64 values nella chiave kubernetes.io/arch significa che l'applicazione può essere implementata su entrambe le architetture hardware (se entrambe sono presenti nel cluster). Ciò è possibile perché questa immagine è un'immagine multi-architettura, ma non tutte lo sono. È possibile determinare l'architettura hardware su cui è supportata l'immagine visualizzando i dettagli dell'immagine nel repository da cui la stai estraendo. Quando si implementano immagini che non supportano un tipo di architettura hardware o che non si desidera implementare, rimuovere quel tipo ti architettura dal manifesto. Per ulteriori informazioni, vedere Etichette, annotazioni e sfumature ben note nel Kubernetes documentazione.

      kubernetes.io/os: linuxnodeSelectorSignifica che se lo avessi Linux e Windows nodi (ad esempio) del cluster, l'immagine verrebbe distribuita solo su Linux nodi. Per ulteriori informazioni, vedere Etichette, annotazioni e sfumature ben note nel Kubernetes documentazione.

      apiVersion: apps/v1 kind: Deployment metadata: name: eks-sample-linux-deployment namespace: eks-sample-app labels: app: eks-sample-linux-app spec: replicas: 3 selector: matchLabels: app: eks-sample-linux-app template: metadata: labels: app: eks-sample-linux-app spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/arch operator: In values: - amd64 - arm64 containers: - name: nginx image: public.ecr.aws/nginx/nginx:1.23 ports: - name: http containerPort: 80 imagePullPolicy: IfNotPresent nodeSelector: kubernetes.io/os: linux
      Windows

      kubernetes.io/os: windowsnodeSelectorSignifica che se lo avessi Windows e Linux nodi (ad esempio) del cluster, l'immagine verrebbe distribuita solo su Windows nodi. Per ulteriori informazioni, vedere Etichette, annotazioni e sfumature ben note nel Kubernetes documentazione.

      apiVersion: apps/v1 kind: Deployment metadata: name: eks-sample-windows-deployment namespace: eks-sample-app labels: app: eks-sample-windows-app spec: replicas: 3 selector: matchLabels: app: eks-sample-windows-app template: metadata: labels: app: eks-sample-windows-app spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: beta.kubernetes.io/arch operator: In values: - amd64 containers: - name: windows-server-iis image: mcr.microsoft.com/windows/servercore:ltsc2019 ports: - name: http containerPort: 80 imagePullPolicy: IfNotPresent command: - powershell.exe - -command - "Add-WindowsFeature Web-Server; Invoke-WebRequest -UseBasicParsing -Uri 'https://dotnetbinaries.blob.core.windows.net/servicemonitor/2.0.1.6/ServiceMonitor.exe' -OutFile 'C:\\ServiceMonitor.exe'; echo '<html><body><br/><br/><marquee><H1>Hello EKS!!!<H1><marquee></body><html>' > C:\\inetpub\\wwwroot\\default.html; C:\\ServiceMonitor.exe 'w3svc'; " nodeSelector: kubernetes.io/os: windows
    2. Applicare il manifesto di implementazione al cluster.

      kubectl apply -f eks-sample-deployment.yaml
  3. Crea un servizio. Un servizio consente di accedere a tutte le repliche tramite un unico indirizzo IP o nome. Per ulteriori informazioni, vedere Service in Kubernetes documentazione. Sebbene non sia implementato nell'applicazione di esempio, se disponi di applicazioni che devono interagire con altri AWS servizi, ti consigliamo di creare Kubernetes account di servizio per i tuoi Podse associarli agli AWS IAM account. Specificando gli account di servizio, il Pods dispongono solo delle autorizzazioni minime specificate per consentire loro di interagire con altri servizi. Per ulteriori informazioni, consulta Ruoli IAM per gli account di servizio.

    1. Salva i contenuti seguenti in un file denominato eks-sample-service.yaml. Kubernetes assegna al servizio il proprio indirizzo IP accessibile solo dall'interno del cluster. Per accedere al servizio dall'esterno del cluster, implementa il AWS Load Balancer Controllerper bilanciare il carico dell'applicazione o del traffico di rete verso il servizio.

      Linux
      apiVersion: v1 kind: Service metadata: name: eks-sample-linux-service namespace: eks-sample-app labels: app: eks-sample-linux-app spec: selector: app: eks-sample-linux-app ports: - protocol: TCP port: 80 targetPort: 80
      Windows
      apiVersion: v1 kind: Service metadata: name: eks-sample-windows-service namespace: eks-sample-app labels: app: eks-sample-windows-app spec: selector: app: eks-sample-windows-app ports: - protocol: TCP port: 80 targetPort: 80
    2. Applicare il manifesto del servizio al cluster.

      kubectl apply -f eks-sample-service.yaml
  4. Visualizzare tutte le risorse nello spazio dei nomi eks-sample-app.

    kubectl get all -n eks-sample-app

    Di seguito viene riportato un output di esempio:

    Se hai distribuito Windows risorse, quindi tutte le istanze dell'linuxoutput seguente sono. windows L'altro example values potrebbe essere diverso dal tuo output.

    NAME READY STATUS RESTARTS AGE pod/eks-sample-linux-deployment-65b7669776-m6qxz 1/1 Running 0 27m pod/eks-sample-linux-deployment-65b7669776-mmxvd 1/1 Running 0 27m pod/eks-sample-linux-deployment-65b7669776-qzn22 1/1 Running 0 27m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/eks-sample-linux-service ClusterIP 10.100.74.8 <none> 80/TCP 32m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/eks-sample-linux-deployment 3/3 3 3 27m NAME DESIRED CURRENT READY AGE replicaset.apps/eks-sample-linux-deployment-776d8f8fd8 3 3 3 27m

    Nell'output, è possibile visualizzare il servizio e l'implementazione specificati nel manifesto di esempio implementato nei passaggi precedenti. Ne vedi anche tre Pods. Questo perché 3 replicas sono stati specificati nel manifesto di esempio. Per ulteriori informazioni sull' Pods, vedete Pods in Kubernetes documentazione. Kubernetes crea automaticamente la replicaset risorsa, anche se non è specificata nei manifesti di esempio. Per ulteriori informazioni suReplicaSets, vedere ReplicaSetin Kubernetes documentazione.

    Nota

    Kubernetes mantiene il numero di repliche specificate nel manifesto. Se questa fosse una distribuzione di produzione e tu volessi Kubernetes per scalare orizzontalmente il numero di repliche o scalare verticalmente le risorse di elaborazione per Pods, usa Implementazione scalabile dei pod con Horizontal Pod Autoscaler e the per eseguire questa operazione. Modifica le risorse del pod con Vertical Pod Autoscaler

  5. Visualizzare i dettagli del servizio implementato. Se hai distribuito un Windows servizio, sostituire linux conwindows.

    kubectl -n eks-sample-app describe service eks-sample-linux-service

    Di seguito viene riportato un output di esempio:

    Se hai distribuito Windows risorse, quindi tutte le istanze dell'linuxoutput seguente sono. windows L'altro example values potrebbe essere diverso dal tuo output.

    Name: eks-sample-linux-service Namespace: eks-sample-app Labels: app=eks-sample-linux-app Annotations: <none> Selector: app=eks-sample-linux-app Type: ClusterIP IP Families: <none> IP: 10.100.74.8 IPs: 10.100.74.8 Port: <unset> 80/TCP TargetPort: 80/TCP Endpoints: 192.168.24.212:80,192.168.50.185:80,192.168.63.93:80 Session Affinity: None Events: <none>

    Nell'output precedente, il valore di IP: è un indirizzo IP univoco raggiungibile da qualsiasi nodo o Pod all'interno del cluster, ma non può essere raggiunto dall'esterno del cluster. I valori per Endpoints sono gli indirizzi IP assegnati dall'interno dell'utente VPC al Pods che fanno parte del servizio.

  6. Visualizza i dettagli di uno dei Pods elencato nell'output quando hai visualizzato il namespace in un passaggio precedente. Se hai distribuito un Windows app, sostituisci linux con windows e sostituisci 776d8f8fd8-78w66 con il valore restituito per uno dei tuoi Pods.

    kubectl -n eks-sample-app describe pod eks-sample-linux-deployment-65b7669776-m6qxz

    Output abbreviato

    Se hai distribuito Windows risorse, quindi tutte le istanze dell'linuxoutput seguente sono. windows Gli altri example values possono essere diversi dall'output.

    Name: eks-sample-linux-deployment-65b7669776-m6qxz Namespace: eks-sample-app Priority: 0 Node: ip-192-168-45-132.us-west-2.compute.internal/192.168.45.132 [...] IP: 192.168.63.93 IPs: IP: 192.168.63.93 Controlled By: ReplicaSet/eks-sample-linux-deployment-65b7669776 [...] Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True [...] Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 3m20s default-scheduler Successfully assigned eks-sample-app/eks-sample-linux-deployment-65b7669776-m6qxz to ip-192-168-45-132.us-west-2.compute.internal [...]

    Nell'output precedente, il valore di IP: è un IP univoco assegnato a Pod dal CIDR blocco assegnato alla sottorete in cui si trova il nodo. Se preferisci assegnare Pods Indirizzi IP di CIDR blocchi diversi, puoi modificare il comportamento predefinito. Per ulteriori informazioni, consulta Implementazione pods in sottoreti alternative con reti personalizzate. Puoi anche vedere che il Kubernetes lo scheduler ha pianificato il Pod sul Node con l'indirizzo IP 192.168.45.132.

    Suggerimento

    Piuttosto che usare la riga di comando, puoi visualizzare molti dettagli su Pods, servizi, implementazioni e altro Kubernetes risorse in. AWS Management Console Per ulteriori informazioni, consulta Vista Kubernetes risorse nel AWS Management Console.

  7. Esegui una shell su Pod che hai descritto nel passaggio precedente, sostituendolo 65b7669776-m6qxz con l'ID di uno dei tuoi Pods.

    Linux
    kubectl exec -it eks-sample-linux-deployment-65b7669776-m6qxz -n eks-sample-app -- /bin/bash
    Windows
    kubectl exec -it eks-sample-windows-deployment-65b7669776-m6qxz -n eks-sample-app -- powershell.exe
  8. Dal Pod shell, visualizza l'output del server Web installato con la distribuzione in un passaggio precedente. È necessario specificare solo il nome del servizio. Viene risolto nell'indirizzo IP del servizio da CoreDNS, che viene distribuito con un EKS cluster Amazon, per impostazione predefinita.

    Linux
    curl eks-sample-linux-service

    Di seguito viene riportato un output di esempio:

    <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [...]
    Windows
    Invoke-WebRequest -uri eks-sample-windows-service/default.html -UseBasicParsing

    Di seguito viene riportato un output di esempio:

    StatusCode : 200 StatusDescription : OK Content : < h t m l > < b o d y > < b r / > < b r / > < m a r q u e e > < H 1 > H e l l o E K S ! ! ! < H 1 > < m a r q u e e > < / b o d y > < h t m l >
  9. Dal Pod shell, visualizza il DNS server per il Pod.

    Linux
    cat /etc/resolv.conf

    Di seguito viene riportato un output di esempio:

    nameserver 10.100.0.10 search eks-sample-app.svc.cluster.local svc.cluster.local cluster.local us-west-2.compute.internal options ndots:5

    Nell'output precedente, 10.100.0.10 viene assegnato automaticamente come nameserver per tutti Pods distribuito nel cluster.

    Windows
    Get-NetIPConfiguration

    Output abbreviato

    InterfaceAlias : vEthernet [...] IPv4Address : 192.168.63.14 [...] DNSServer : 10.100.0.10

    Nell'output precedente, 10.100.0.10 viene assegnato automaticamente come DNS server per tutti Pods distribuito nel cluster.

  10. Disconnettersi da Pod exitdigitando.

  11. Una volta terminato l'uso dell'applicazione di esempio, sarà possibile rimuovere lo spazio dei nomi, il servizio e l'implementazione di esempio con il seguente comando.

    kubectl delete namespace eks-sample-app

Fasi successive

Dopo aver distribuito l'applicazione di esempio, potresti provare alcuni dei seguenti esercizi: