

 **Ayude a mejorar esta página** 

Para contribuir a esta guía del usuario, elija el enlace **Edit this page on GitHub** que se encuentra en el panel derecho de cada página.

# Implementación de una aplicación de muestra en Windows
<a name="sample-deployment-win"></a>

En este tema, implementará una aplicación de muestra a su clúster en nodos de Windows.

## Requisitos previos
<a name="_prerequisites"></a>
+ 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](getting-started.md). Debe tener la [compatibilidad con Windows](windows-support.md) habilitada para el clúster y al menos en un nodo de Windows de Amazon EC2.
+  `Kubectl` instalado en su equipo. Para obtener más información, consulte [Configuración de `kubectl` y `eksctl`](install-kubectl.md).
+  `Kubectl` configurado para comunicarse con el clúster. Para obtener más información, consulte [Conexión de kubectl a un clúster de EKS mediante la creación de un archivo kubeconfig](create-kubeconfig.md).
+ Si planea implementar su carga de trabajo de muestra en Fargate, debe tener una [perfil de Fargate](fargate-profile.md) 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 a Amazon EKS](getting-started.md) 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.

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 mediante el cambio de otros valores.

## Creación de un espacio de nombres de
<a name="_create_a_namespace"></a>

Un espacio de nombres permite agrupar recursos en Kubernetes. Para obtener más información, consulte [Espacios de nombres](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) en la documentación de Kubernetes. Si planea implementar su aplicación de muestra para [Simplificación de la administración de computación con AWS Fargate](fargate.md), asegúrese de que el valor de `namespace` en su [Definición de qué pods usarán AWS Fargate cuando se lancen](fargate-profile.md) sea `eks-sample-app`.

```
kubectl create namespace eks-sample-app
```

## Cree una implementación de Kubernetes
<a name="_create_a_kubernetes_deployment"></a>

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](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) en la documentación de Kubernetes.

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 [Uso del almacenamiento de datos de aplicaciones para un clúster](storage.md).
   + `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](https://kubernetes.io/docs/reference/labels-annotations-taints/) 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: 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
     ```

1. Aplique el manifiesto de implementación al clúster.

   ```
   kubectl apply -f eks-sample-deployment.yaml
   ```

## Crear un servicio
<a name="_create_a_service"></a>

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](https://kubernetes.io/docs/concepts/services-networking/service/) 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 AWS IAM. Al especificar cuentas de servicio, los pods tienen solo los permisos mínimos que especifica para interactuar con otros servicios. Para obtener más información, consulte [Roles de IAM para cuentas de servicio](iam-roles-for-service-accounts.md).

1. Guarde los siguientes contenidos en un archivo llamado `eks-sample-service.yaml`. Kubernetes asigna al servicio su propia dirección IP a la que se puede acceder solo desde dentro del clúster. Para acceder al servicio desde fuera del clúster, implemente el [Controlador del equilibrador de carga de AWS](aws-load-balancer-controller.md) para que equilibre la carga de la [aplicación](alb-ingress.md) o del tráfico de [red](network-load-balancing.md) del servicio.

   ```
   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
   ```

1. Aplique el manifiesto de servicio al clúster.

   ```
   kubectl apply -f eks-sample-service.yaml
   ```

## Revise los recursos creados
<a name="sample-app-view-namespace-win"></a>

1. 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.

   ```
   NAME                                               READY   STATUS    RESTARTS   AGE
   pod/eks-sample-windows-deployment-65b7669776-m6qxz   1/1     Running   0          27m
   pod/eks-sample-windows-deployment-65b7669776-mmxvd   1/1     Running   0          27m
   pod/eks-sample-windows-deployment-65b7669776-qzn22   1/1     Running   0          27m
   
   NAME                               TYPE         CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
   service/eks-sample-windows-service   ClusterIP    10.100.74.8     <none>        80/TCP    32m
   
   NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
   deployment.apps/eks-sample-windows-deployment 3/3     3            3           27m
   
   NAME                                                      DESIRED   CURRENT   READY   AGE
   replicaset.apps/eks-sample-windows-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 sobre los pods, consulte [Pods](https://kubernetes.io/docs/concepts/workloads/pods/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](https://kubernetes.io/docs/concepts/workloads/controllers/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 escale verticalmente los recursos de computación de los pods, utilice el [Escalado de las implementaciones de pods con el Escalador automático horizontal de pods](horizontal-pod-autoscaler.md) y [Ajuste los recursos del pod con el Escalador automático vertical de pods](vertical-pod-autoscaler.md) para hacerlo.

1. Consulte los detalles del servicio implementado.

   ```
   kubectl -n eks-sample-app describe service eks-sample-windows-service
   ```

   Un ejemplo de salida sería el siguiente.

   ```
   Name:              eks-sample-windows-service
   Namespace:         eks-sample-app
   Labels:            app=eks-sample-windows-app
   Annotations:       <none>
   Selector:          app=eks-sample-windows-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 del clúster, pero no se puede acceder a ella desde fuera del clúster. Los valores de `Endpoints` son direcciones IP asignadas desde la VPC a los pods que forman parte del servicio.

1. Vea los detalles de uno de los pods que aparecen en la salida de cuando [vio el espacio de nombres](sample-deployment.md#sample-app-view-namespace) en un paso anterior. Reemplace {{776d8f8fd8-78w66}} por el valor que devuelve uno de sus pods.

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

   Ejemplo abreviado de salida

   ```
   Name:         eks-sample-windows-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-windows-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-windows-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 [Implementación de pods en subredes alternativas con redes personalizadas](cni-custom-network.md). 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 Consola de administración de AWS. Para obtener más información, consulte [Visualización de los recursos de Kubernetes en la Consola de administración de AWS](view-kubernetes-resources.md).

## Ejecute un intérprete de comandos en un pod
<a name="_run_a_shell_on_a_pod"></a>

1. Ejecute un shell en el pod que describió en el paso anterior y reemplace {{65b7669776-m6qxz}} con el ID de uno de sus pods.

   ```
   kubectl exec -it eks-sample-windows-deployment-65b7669776-m6qxz -n eks-sample-app -- powershell.exe
   ```

1. Desde el intérprete de comandos 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.

   ```
   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 >
   ```

1. Desde el shell del pod, vea el servidor de DNS del pod.

   ```
   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 servidor de DNS para todos los pods implementados en el clúster.

1. Puede desconectarse del pod al escribir `exit`.

1. 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
<a name="sample-deployment-win-next-steps"></a>

Después de implementar la aplicación de ejemplo, es posible que desee intentar alguno de los siguientes ejercicios:
+  [Dirección de la aplicación y el tráfico de HTTP con los equilibradores de carga de aplicación](alb-ingress.md) 
+  [Dirija el tráfico de TCP y UDP con equilibradores de carga de red](network-load-balancing.md) 