Windows에서 샘플 애플리케이션 배포
Windows에서 샘플 애플리케이션 배포
이 주제에서는 Windows 노드의 클러스터에 샘플 애플리케이션을 배포합니다.
출처: 문서
본문
사전 요구 사항
- 노드를 하나 이상 포함한 기존 Kubernetes 클러스터. 기존 Amazon EKS 클러스터가 없다면 Amazon EKS 시작하기(Get started with Amazon EKS)의 가이드 중 하나를 사용해 배포할 수 있습니다. 클러스터에 대해 Windows 지원이 활성화되어 있어야 하며 Amazon EC2 Windows 노드가 하나 이상 있어야 합니다.
- 컴퓨터에
Kubectl이 설치되어 있습니다. 자세한 내용은 kubectl 및 eksctl 설정을 참조하세요. Kubectl이 클러스터와 통신하도록 구성되어 있습니다. 자세한 내용은 kubeconfig 파일을 만들어 kubectl을 EKS 클러스터에 연결을 참조하세요.- 샘플 워크로드를 Fargate에 배포할 계획이라면 이 튜토리얼에서 만든 것과 같은 네임스페이스(이름을 바꾸지 않았다면
eks-sample-app)를 포함하는 기존 Fargate 프로필이 있어야 합니다. Amazon EKS 시작하기의 가이드 중 하나로 클러스터를 만들었다면 새 프로필을 만들거나 기존 프로필에 네임스페이스를 추가해야 합니다. 시작 가이드에서 만든 프로필은 이 튜토리얼에서 사용하는 네임스페이스를 지정하지 않기 때문입니다. VPC에도 프라이빗 서브넷이 하나 이상 있어야 합니다.
다음 단계에서 많은 변수를 변경할 수 있지만 지정된 곳에서만 변수 값을 변경할 것을 권장합니다. Kubernetes Pod, 배포, 서비스를 더 잘 이해하게 되면 다른 값 변경을 시험해 볼 수 있습니다.
네임스페이스 생성
네임스페이스를 사용하면 Kubernetes에서 리소스를 그룹화할 수 있습니다. 자세한 내용은 Kubernetes 문서의 네임스페이스(Namespaces)를 참조하세요. 샘플 애플리케이션을 AWS Fargate로 컴퓨팅 관리 간소화에 배포할 계획이라면 시작 시 AWS Fargate를 사용할 Pod 정의의 namespace 값이 eks-sample-app인지 확인하세요.
kubectl create namespace eks-sample-app
Kubernetes 배포 생성
이 샘플 배포는 퍼블릭 저장소에서 컨테이너 이미지를 가져와 복제본(개별 Pod) 3개를 클러스터에 배포합니다. 자세히 알아보려면 Kubernetes 문서의 배포(Deployments)를 참조하세요.
다음 내용을 eks-sample-deployment.yaml이라는 파일에 저장합니다. 샘플 애플리케이션의 컨테이너는 네트워크 스토리지를 사용하지 않지만, 스토리지가 필요한 애플리케이션이 있을 수 있습니다. 자세한 내용은 클러스터용 애플리케이션 데이터 스토리지 사용을 참조하세요.
kubernetes.io/os: windows nodeSelector는 클러스터에 Windows와 Linux 노드(예:)가 있다면 이미지가 Windows 노드에만 배포된다는 것을 의미합니다. 자세한 내용은 Kubernetes 문서의 Well-Known Labels, Annotations and Taints를 참조하세요.
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 'Hello EKS!!!' > C:\\inetpub\\wwwroot\\default.html; C:\\ServiceMonitor.exe 'w3svc'; "
nodeSelector:
kubernetes.io/os: windows
배포 매니페스트를 클러스터에 적용합니다.
kubectl apply -f eks-sample-deployment.yaml
서비스 생성
서비스는 단일 IP 주소나 이름으로 모든 복제본에 액세스할 수 있게 해줍니다. 자세한 내용은 Kubernetes 문서의 서비스(Service)를 참조하세요. 샘플 애플리케이션에서는 구현되지 않았지만, 다른 AWS 서비스와 상호 작용해야 하는 애플리케이션이 있다면 Pod용 Kubernetes 서비스 계정을 만들고 AWS IAM 계정에 연결할 것을 권장합니다. 서비스 계정을 지정하면 Pod는 다른 서비스와 상호 작용하기 위해 지정한 최소 권한만 갖게 됩니다. 자세한 내용은 서비스 계정용 IAM 역할(IAM roles for service accounts)을 참조하세요.
다음 내용을 eks-sample-service.yaml이라는 파일에 저장합니다. Kubernetes는 클러스터 안에서만 액세스할 수 있는 자체 IP 주소를 서비스에 할당합니다. 클러스터 밖에서 서비스에 액세스하려면 AWS Load Balancer Controller를 배포해 서비스에 애플리케이션 또는 네트워크 트래픽을 로드 밸런싱하세요.
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
서비스 매니페스트를 클러스터에 적용합니다.
kubectl apply -f eks-sample-service.yaml
생성된 리소스 검토
eks-sample-app 네임스페이스에 존재하는 모든 리소스를 봅니다.
kubectl get all -n eks-sample-app
예시 출력은 다음과 같습니다.
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 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
출력에서 이전 단계에서 배포한 샘플 매니페스트에 지정된 서비스와 배포를 볼 수 있습니다. 또한 Pod가 3개 보입니다. 이는 샘플 매니페스트에 3개의 replicas가 지정되었기 때문입니다. Pod에 대한 자세한 내용은 Kubernetes 문서의 Pods를 참조하세요. Kubernetes는 샘플 매니페스트에 지정되지 않았음에도 replicaset 리소스를 자동으로 만듭니다. ReplicaSets에 대한 자세한 내용은 Kubernetes 문서의 ReplicaSet을 참조하세요.
참고
Kubernetes는 매니페스트에 지정된 복제본 수를 유지합니다. 이것이 프로덕션 배포이고 복제본 수를 수평으로 스케일링하거나 Pod의 컴퓨팅 리소스를 수직으로 스케일링하려 한다면 Horizontal Pod Autoscaler로 Pod 배포 스케일링과 Vertical Pod Autoscaler로 Pod 리소스 조정을 사용하세요.
배포된 서비스의 세부 정보를 봅니다.
kubectl -n eks-sample-app describe service eks-sample-windows-service
예시 출력은 다음과 같습니다.
Name: eks-sample-windows-service
Namespace: eks-sample-app
Labels: app=eks-sample-windows-app
Annotations:
Selector: app=eks-sample-windows-app
Type: ClusterIP
IP Families:
IP: 10.100.74.8
IPs: 10.100.74.8
Port: 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:
이전 출력에서 IP: 값은 클러스터 안의 어떤 노드나 Pod에서도 도달할 수 있지만 클러스터 밖에서는 도달할 수 없는 고유 IP 주소입니다. Endpoints 값은 서비스의 일부인 Pod에 VPC 안에서 할당된 IP 주소입니다.
이전 단계에서 네임스페이스를 볼 때 출력에 나열된 Pod 중 하나의 세부 정보를 봅니다. 65b7669776-m6qxz를 Pod 중 하나에 대해 반환된 값으로 바꿉니다.
kubectl -n eks-sample-app describe pod eks-sample-windows-deployment-65b7669776-m6qxz
축약된 예시 출력
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
[...]
이전 출력에서 IP: 값은 노드가 있는 서브넷에 할당된 CIDR 블록에서 Pod에 할당된 고유 IP입니다. Pod에 다른 CIDR 블록의 IP 주소를 할당하고 싶다면 기본 동작을 변경할 수 있습니다. 자세한 내용은 사용자 지정 네트워킹으로 대체 서브넷에 Pod 배포를 참조하세요. 또한 Kubernetes 스케줄러가 IP 주소 192.168.45.132를 가진 Node에 Pod를 스케줄링한 것을 볼 수 있습니다.
팁
명령줄 대신 AWS Management Console에서 Pod, 서비스, 배포 및 기타 Kubernetes 리소스에 대한 많은 세부 정보를 볼 수 있습니다. 자세한 내용은 AWS Management Console에서 Kubernetes 리소스 보기를 참조하세요.
Pod에서 셸 실행
이전 단계에서 describe한 Pod에서 셸을 실행하고 65b7669776-m6qxz를 Pod 중 하나의 ID로 바꿉니다.
kubectl exec -it eks-sample-windows-deployment-65b7669776-m6qxz -n eks-sample-app -- powershell.exe
Pod 셸에서 이전 단계에서 배포와 함께 설치된 웹 서버의 출력을 봅니다. 서비스 이름만 지정하면 됩니다. Amazon EKS 클러스터와 함께 기본적으로 배포되는 CoreDNS가 이를 서비스의 IP 주소로 확인합니다.
Invoke-WebRequest -uri eks-sample-windows-service/default.html -UseBasicParsing
예시 출력은 다음과 같습니다.
StatusCode : 200
StatusDescription : OK
Content : H e l l o
E K S ! ! !
Pod 셸에서 Pod의 DNS 서버를 봅니다.
Get-NetIPConfiguration
축약된 출력
InterfaceAlias : vEthernet
[...]
IPv4Address : 192.168.63.14
[...]
DNSServer : 10.100.0.10
이전 출력에서 10.100.0.10은 클러스터에 배포된 모든 Pod의 DNS 서버로 자동 할당됩니다.
exit를 입력해 Pod 연결을 끊습니다.
샘플 애플리케이션이 끝나면 다음 명령으로 샘플 네임스페이스, 서비스, 배포를 제거할 수 있습니다.
kubectl delete namespace eks-sample-app
다음 단계
샘플 애플리케이션을 배포한 뒤 다음과 같은 연습을 시도해 볼 수 있습니다.
- Application Load Balancers로 애플리케이션 및 HTTP 트래픽 라우팅
- Network Load Balancers로 TCP 및 UDP 트래픽 라우팅