샘플 애플리케이션 배포 - Amazon EKS

샘플 애플리케이션 배포

이 주제에서는 샘플 애플리케이션을 생성하고 클러스터에 배포합니다.

사전 조건

  • 노드가 하나 이상 있는 기존 Kubernetes 클러스터. 기존 Amazon EKS 클러스터가 없는 경우 Amazon EKS 시작하기 가이드 중 하나를 사용하여 Amazon EKS 클러스터를 배포할 수 있습니다. Windows 애플리케이션을 배포하는 경우 클러스터와 하나 이상의 Amazon EC2 Windows 노드에 대해 Windows 지원이 사용 설정되어 있어야 합니다.

  • 컴퓨터에 설치된 Kubectl. 자세한 내용은 kubectl 설치 또는 업데이트을 참조하세요.

  • 클러스터와 통신하도록 구성된 Kubectl. 자세한 내용은 Amazon EKS용 kubeconfig 생성을 참조하세요.

  • 샘플 워크로드를 Fargate에 배포하려는 경우 이름을 변경하지 않는 한 이 자습서에서 생성한 것과 동일한 네임스페이스(eks-sample-app)를 포함하는 기존 Fargate 프로파일이 있어야 합니다. 시작 안내서 중 하나를 사용하여 클러스터를 생성한 경우 시작 안내서에서 생성된 프로파일이 이 자습서에서 사용하는 네임스페이스를 지정하지 않기 때문에 새 프로파일을 생성하거나 기존 프로파일에 네임스페이스를 추가해야 합니다. 또한 VPC에 프라이빗 서브넷이 하나 이상 있어야 합니다.

샘플 애플리케이션을 배포하려면

다음 단계에서 많은 변수를 변경할 수 있지만 지정된 경우에만 변수 값을 변경하는 것이 좋습니다. Kubernetes pods, 배포, 서비스를 더 잘 이해하면 다른 값을 변경해 볼 수 있습니다.

  1. 네임스페이스를 생성합니다. 네임스페이스를 사용하면 Kubernetes에서 리소스를 그룹화할 수 있습니다. 자세한 내용은 Kubernetes 설명서의 네임스페이스를 참조하세요. 샘플 애플리케이션을 AWS Fargate에 배포하려는 경우 AWS Fargate 프로파일namespace 값이 eks-sample-app인지 확인합니다.

    kubectl create namespace eks-sample-app
  2. Kubernetes 배포를 생성합니다. 이 샘플 배포는 퍼블릭 리포지토리에서 컨테이너 이미지를 가져와 클러스터에 3개의 복제본(개별 pods)을 배포합니다. 자세한 내용은 Kubernetes 설명서의 배포를 참조하세요. 애플리케이션을 Linux 또는 Windows 노드에 배포할 수 있습니다. Fargate에 배포하는 경우 Linux 애플리케이션만 배포할 수 있습니다.

    1. 다음 콘텐츠를 eks-sample-deployment.yaml이라는 파일에 저장합니다. 샘플 애플리케이션의 컨테이너는 네트워크 스토리지를 사용하지 않지만 필요한 애플리케이션이 있을 수 있습니다. 자세한 내용은 스토리지을 참조하세요.

      Linux

      kubernetes.io/arch 키 아래의 amd64 또는 arm64 values는 애플리케이션을 하드웨어 아키텍처 중 하나에 배포할 수 있음을 의미합니다(클러스터에 둘 다 있는 경우). 이는 이 이미지가 다중 아키텍처 이미지이지만 모두가 그렇지는 않기 때문에 가능합니다. 이미지를 가져오는 리포지토리에서 이미지 세부 정보를 확인하여 이미지가 지원되는 하드웨어 아키텍처를 결정할 수 있습니다. 하드웨어 아키텍처 유형을 지원하지 않거나 이미지를 배포하지 않으려는 이미지를 배포하는 경우 매니페스트에서 해당 유형을 제거합니다. 자세한 내용은 Kubernetes 설명서의 잘 알려진 레이블, 주석, 테인트를 참조하세요.

      kubernetes.io/os: linux nodeSelector는 예를 들어 클러스터에 Linux 및 Windows 노드가 있는 경우 이미지가 Linux 노드에만 배포됨을 의미합니다. 자세한 내용은 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.21 ports: - name: http containerPort: 80 imagePullPolicy: IfNotPresent nodeSelector: kubernetes.io/os: linux
      Windows

      kubernetes.io/os: windows nodeSelector는 예를 들어 클러스터에 Windows 및 Linux 노드가 있는 경우 이미지가 Windows 노드에만 배포됨을 의미합니다. 자세한 내용은 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. 배포 매니페스트를 클러스터에 적용합니다.

      kubectl apply -f eks-sample-deployment.yaml
  3. 서비스 생성. 서비스를 사용하면 단일 IP 주소 또는 이름을 통해 모든 복제본에 액세스할 수 있습니다. 자세한 내용은 Kubernetes 설명서의 서비스를 참조하세요. 샘플 애플리케이션에서는 구현되지 않았지만 다른 AWS 서비스와 상호 작용해야 하는 애플리케이션이 있는 경우 pods에 대한 Kubernetes 서비스 계정을 생성하고 이를 AWS IAM 계정에 연결하는 것이 좋습니다. 서비스 계정을 지정하면 pods가 다른 서비스와 상호 작용하기 위해 지정한 최소 권한만 갖게 됩니다. 자세한 내용은 서비스 계정에 대한 IAM 역할을 참조하세요.

    1. 다음 콘텐츠를 eks-sample-service.yaml이라는 파일에 저장합니다. Kubernetes는 클러스터 내에서만 액세스할 수 있는 자체 IP 주소를 서비스에 할당합니다. 클러스터 외부에서 서비스에 액세스하려면 AWS Load Balancer Controller 로드 밸런서 애플리케이션 또는 네트워크 트래픽을 서비스에 배포합니다.

      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. 서비스 매니페스트를 클러스터에 적용합니다.

      kubectl apply -f eks-sample-service.yaml
  4. eks-sample-app 네임스페이스에 있는 모든 리소스를 봅니다.

    kubectl get all -n eks-sample-app

    출력 예는 다음과 같습니다.

    Windows 리소스를 배포한 경우 다음 출력에서 모든 linux 인스턴스는 windows입니다. 다른 예제 값은 출력과 다를 수 있습니다.

    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

    이 출력에는 이전 단계에서 배포된 샘플 매니페스트에 지정된 서비스 및 배포가 표시됩니다. 3개의 pods도 확인할 수 있습니다. 동일한 매니페스트에 3 replicas가 지정되었기 때문입니다. pods에 대한 자세한 내용은 Kubernetes 설명서의 포드를 참조하세요. Kubernetes는 샘플 매니페스트에서 지정되지 않은 경우에도 자동으로 replicaset 리소스를 생성합니다. ReplicaSets에 대한 자세한 내용은 Kubernetes 설명서의 ReplicaSet를 참조하세요.

    참고

    Kubernetes는 매니페스트에 지정된 복제본의 수를 유지합니다. 프로덕션 배포이고 Kubernetes가 복제본 수를 수평적 또는 수직적으로 조정하여 pods의 컴퓨팅 리소스를 조정하도록 하려는 경우 Horizontal Pod AutoscalerVertical Pod Autoscaler를 사용합니다.

  5. 배포된 서비스의 세부 정보를 확인합니다. Windows 서비스를 배포한 경우 linuxwindows로 바꿉니다.

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

    출력 예는 다음과 같습니다.

    Windows 리소스를 배포한 경우 다음 출력에서 모든 linux 인스턴스는 windows입니다. 다른 예제 값은 출력과 다를 수 있습니다.

    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>

    이전 출력에서 IP:의 값은 클러스터 내의 모든 노드 또는 pod에서 도달할 수 있는 고유한 IP 주소이지만 클러스터 외부에서는 도달할 수 없습니다. Endpoints의 값은 VPC 내에서 서비스의 일부인 pods에 할당된 IP 주소입니다.

  6. 이전 단계에서 네임스페이스를 볼 때 출력에 나열된 pods 중 하나의 세부 정보를 봅니다. Windows 앱을 배포한 경우 linuxwindows로 바꾸고 776d8f8fd8-78w66을 pods 중 하나에 대해 반환된 값으로 바꿉니다.

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

    간략한 출력

    Windows 리소스를 배포한 경우 다음 출력에서 모든 linux 인스턴스는 windows입니다. 다른 예제 값은 출력과 다를 수 있습니다.

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

    이전 출력에서 IP:의 값은 노드가 있는 서브넷에 할당된 CIDR 블록에서 pod에 할당되는 고유한 IP입니다. pods에 다른 CIDR 블록의 IP 주소를 할당하려면 기본 동작을 변경할 수 있습니다. 자세한 내용은 자습서: 사용자 지정 네트워킹을 참조하세요. Kubernetes 스케줄러가 IP 주소 192.168.45.132를 사용하여 Node의 pod를 예약했는지 확인할 수도 있습니다.

    작은 정보

    명령줄을 사용하는 대신 AWS Management Console에서 pods, 서비스, 배포, 기타 Kubernetes 리소스에 대한 많은 세부 정보를 볼 수 있습니다. 자세한 내용은 Kubernetes 리소스 보기을 참조하세요.

  7. 이전 단계에서 설명한 pod에서 셸을 실행하여 65b7669776-m6qxz를 pods 중 하나의 ID로 바꿉니다.

    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. pod 셸에서 이전 단계에서 배포와 함께 설치된 웹 서버의 출력을 봅니다. 서비스 이름만 지정하면 됩니다. 기본적으로 Amazon EKS 클러스터와 함께 배포되는 CoreDNS에 의해 서비스의 IP 주소로 확인됩니다.

    Linux
    curl eks-sample-linux-service

    출력 예는 다음과 같습니다.

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

    출력 예는 다음과 같습니다.

    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. pod 셸에서 pod의 DNS 서버를 봅니다.

    Linux
    cat /etc/resolv.conf

    출력 예는 다음과 같습니다.

    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

    이전 출력에서 10.100.0.10은 클러스터에 배포된 모든 pods의 nameserver로 자동 할당됩니다.

    Windows
    Get-NetIPConfiguration

    간략한 출력

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

    이전 출력에서 10.100.0.10은 클러스터에 배포된 모든 pods의 DNS 서버로 자동 할당됩니다.

  10. exit를 입력하여 pod에서 연결을 해제합니다.

  11. 샘플 애플리케이션 사용이 끝나면 다음 명령을 사용하여 샘플 네임스페이스, 서비스 및 배포를 제거할 수 있습니다.

    kubectl delete namespace eks-sample-app