Implementar una aplicación de muestra - Amazon EKS

Implementar una aplicación de muestra

En esta sección, implementará una aplicación de muestra en un clúster.

Requisitos previos
  • Un clúster de Kubernetes existente que tenga como mínimo un nodo. Si no dispone de un clúster de Amazon EKS existente, puede implementar uno mediante una de las guías de Introducción a Amazon EKS. Si va a implementar una aplicación Windows, debe tener Compatibilidad con Windows habilitada para el clúster y al menos un nodo Windows de Amazon EC2.

  • Kubectl instalado en su equipo. Para obtener más información, consulte Instalación o actualización del kubectl.

  • Kubectl configurado para comunicarse con el clúster. Para obtener más información, consulte Creación o actualización de un archivo kubeconfig para un clúster de Amazon EKS.

  • Si planea implementar su carga de trabajo de muestra en Fargate, debe tener una perfil de Fargate que incluya el mismo espacio de nombres creado en este tutorial, que es eks-sample-app, a menos que cambie el nombre. Si utilizó una de las guías de introducción para crear el clúster, tendrá que crear un nuevo perfil o agregar el espacio de nombres a su perfil existente, porque el perfil creado en las guías de introducción no especifica el espacio de nombres utilizado en este tutorial. La VPC debe tener también al menos una subred privada.

Para implementar una aplicación de muestra

Aunque muchas variables se pueden cambiar en los siguientes pasos, recomendamos cambiar solo los valores de las variables si se especifican. Una vez que conozca mejor los Pods, las implementaciones y los servicios de Kubernetes, puede experimentar cambiando otros valores.

  1. Cree un espacio de nombres de . Un espacio de nombres permite agrupar recursos en Kubernetes. Para obtener más información, consulte Espacios de nombres en la documentación de Kubernetes. Si planea implementar su aplicación de muestra en AWS Fargate, asegúrese de que el valor de namespace en su Perfil de AWS Fargate sea eks-sample-app.

    kubectl create namespace eks-sample-app
  2. Cree una implementación de Kubernetes. Esta implementación de muestra extrae una imagen de contenedor de un repositorio público e implementa tres réplicas (Pods individuales) de ella en su clúster. Para obtener más información, consulte Implementaciones en la documentación de Kubernetes. Puede implementar la aplicación en nodos Linux o Windows. Si va a implementar en Fargate, solo puede implementar una aplicación Linux.

    1. Guarde los siguientes contenidos en un archivo llamado eks-sample-deployment.yaml. Los contenedores de la aplicación de muestra no utilizan almacenamiento en red, pero es posible que tenga aplicaciones que lo necesiten. Para obtener más información, consulte Almacenamiento.

      Linux

      Los values amd64 o arm64 en kubernetes.io/arch significan que la aplicación se puede implementar en cualquiera de las arquitecturas de hardware (si tiene ambos en el clúster). Esto es posible porque esta imagen es una imagen de arquitectura múltiple, pero no todas lo son. Puede determinar la arquitectura de hardware con la que se admite la imagen a partir de los detalles de imagen en el repositorio del que lo está sacando. Al implementar imágenes que no admiten un tipo de arquitectura de hardware o en las que no desea que se implemente la imagen, elimine ese tipo del manifiesto. Para obtener más información, consulte Etiquetas, anotaciones y taints conocidas en la documentación de Kubernetes.

      El kubernetes.io/os: linux nodeSelector significa que si tuviera nodos Linux y Windows (por ejemplo) en el clúster, la imagen solo se implementaría en nodos Linux. Para obtener más información, consulte Etiquetas, anotaciones y taints conocidas en la documentación de Kubernetes.

      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

      El kubernetes.io/os: windows nodeSelector significa que si tuviera nodos Windows y Linux (por ejemplo) en el clúster, la imagen solo se implementaría en nodos Windows. Para obtener más información, consulte Etiquetas, anotaciones y taints conocidas en la documentación de Kubernetes.

      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. Aplique el manifiesto de implementación al clúster.

      kubectl apply -f eks-sample-deployment.yaml
  3. Cree un servicio. Un servicio le permite acceder a todas las réplicas a través de una única dirección IP o nombre. Para obtener más información, consulte Servicio en la documentación de Kubernetes. Aunque no se ha implementado en la aplicación de muestra, si tiene aplicaciones que necesitan interactuar con otros servicios de AWS, recomendamos que cree cuentas de servicio de Kubernetes para sus Pods y las asocie a cuentas de IAM de AWS. Si especifica cuentas de servicio, los Pods tendrán solo los permisos mínimos que usted especifique para que interactúen con otros servicios. Para obtener más información, consulte Roles de IAM para cuentas de servicio.

    1. Guarde el siguiente contenido en un archivo denominado eks-sample-service.yaml. Kubernetes asigna al servicio su propia dirección IP a la que se puede acceder solo desde el clúster. Para acceder al servicio desde fuera del clúster, implemente AWS Load Balancer Controller para que equilibre la carga de tráfico de aplicaciones o redes del servicio.

      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. Aplique el manifiesto de servicio al clúster.

      kubectl apply -f eks-sample-service.yaml
  4. Consulte todos los recursos que existen en el espacio de nombres eks-sample-app.

    kubectl get all -n eks-sample-app

    Un ejemplo de salida sería el siguiente.

    Si ha implementado recursos de Windows, todas las instancias de linux en la siguiente salida aparecerán como windows. Los otros valores de ejemplo pueden ser diferentes a los de la salida.

    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

    En la salida, verá el servicio y la implementación que se especificaron en los manifiestos de muestra implementados en pasos anteriores. También verá tres Pods. Esto se debe a que especificó 3 replicas en el manifiesto de ejemplo. Para obtener más información acerca de Pods, consulte Pod en la documentación de Kubernetes. Kubernetes crea automáticamente el recurso replicaset, aunque no se especifica en los manifiestos de ejemplo. Para obtener más información acerca de ReplicaSets, consulte ReplicaSet en la documentación de Kubernetes.

    nota

    Kubernetes mantiene el número de réplicas que se ha especificado en el manifiesto. Si se trata de una implementación de producción y desea que Kubernetes escale horizontalmente el número de réplicas o verticalmente los recursos informáticos de los Pods, utilice el Escalador automático de pods horizontales y Escalador automático vertical de pods para hacerlo.

  5. Consulte los detalles del servicio implementado. Si ha implementado un servicio de Windows, sustituya linux con windows.

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

    Un ejemplo de salida sería el siguiente.

    Si ha implementado recursos de Windows, todas las instancias de linux en la siguiente salida aparecerán como windows. Los otros valores de ejemplo pueden ser diferentes a los de la salida.

    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>

    En la salida anterior, el valor de IP: es una dirección IP única a la que se puede acceder desde cualquier nodo o Pod dentro del clúster, pero a la cual no se puede acceder desde fuera del clúster. Los valores de Endpoints son direcciones IP asignadas desde la VPC a los Pods que forman parte del servicio.

  6. Vea los detalles de uno de los Pods que aparecían en la salida cuando vio el espacio de nombres en un paso anterior. Si implementó una aplicación de Windows, reemplace linux por windows y 776d8f8fd8-78w66 por el valor devuelto para uno de sus Pods.

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

    Salida abreviada

    Si ha implementado recursos de Windows, todas las instancias de linux en la siguiente salida aparecerán como windows. Los otros example values pueden ser diferentes a los de la salida.

    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
    [...]

    En la salida anterior, el valor de IP: es una IP única que se asigna al Pod desde el bloque de CIDR asignado a la subred en la que se encuentra el nodo. Si prefiere asignar a los Pods direcciones IP de bloques de CIDR distintos, puede cambiar el comportamiento predeterminado. Para obtener más información, consulte Redes personalizadas para los pods. También puede ver que el programador de Kubernetes programó el Pod en el Node con la dirección IP 192.168.45.132.

    sugerencia

    En lugar de utilizar la línea de comandos, puede ver muchos detalles sobre los Pods, los servicios, las implementaciones y otros recursos de Kubernetes en la AWS Management Console. Para obtener más información, consulte Vea los recursos de Kubernetes.

  7. Ejecute un shell en el Pod que describió en el paso anterior y reemplace 65b7669776-m6qxz por el ID de uno de sus 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. Desde el shell del Pod, vea la salida del servidor web que se instaló con la implementación en un paso anterior. Solo tiene que especificar el nombre del servicio. CoreDNS lo resuelve en la dirección IP del servicio, que se implementa con un clúster de Amazon EKS de forma predeterminada.

    Linux
    curl eks-sample-linux-service

    Un ejemplo de salida sería el siguiente.

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

    Un ejemplo de salida sería el siguiente.

    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. Desde el shell del Pod, vea el servidor de DNS del Pod.

    Linux
    cat /etc/resolv.conf

    Un ejemplo de salida sería el siguiente.

    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

    En la salida anterior, 10.100.0.10 se asigna automáticamente como el nameserver para todos los Pods implementados en el clúster.

    Windows
    Get-NetIPConfiguration

    Salida abreviada

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

    En la salida anterior, 10.100.0.10 se asigna automáticamente como el servidor de DNS para todos los Pods implementados en el clúster.

  10. Puede desconectarse del Pod al escribir exit.

  11. Una vez que haya terminado de utilizar la aplicación de muestra, puede eliminar el espacio de nombres, el servicio y la implementación de muestra con el siguiente comando.

    kubectl delete namespace eks-sample-app

Siguientes pasos

Después de implementar la aplicación de ejemplo, es posible que desee intentar alguno de los siguientes ejercicios: