EKS Fargate 유형

Hoju·2022년 8월 25일
1
post-custom-banner

Fargate 특징

한 개의 VM에 한 개의 컨테이너를 생성합니다. 즉, Fargate(Node) 하나당 하나의 Pod에 IP를 할당해줍니다.Fargate Node에 IP와 Pod에 IP가 1대1로 매칭 된다는 것입니다. Fargate Data Plane은 AWS에서 관리해줍니다. 즉, Fargate 유형에 Node를 생성하면 사용자가 관리하지 않아도 관리를 AWS 측에서 해준다는 의미입니다. 그러한 점에서 당연히 관리해야하는 가상에 EC2 Instance도 없습니다.
Fargate는 Pod가 올라가는 EC2도 AWS가 관리해줍니다. 즉, Cluster Autoscaler가 불필요하다는 의미입니다. 왜? AWS가 또 해줍니다.
특징 중 중요하게 생각해야한다는 점은, EC2와 Fargate가 혼합이 가능하다는 점입니다.

Fargate는 Firecracker를 사용합니다. AWS Lambda와 Fargate와 같은 서비스를 통해 자원 활용률과 고객 사용 환경을 개선하는 동시에 퍼블릭 클라우드 인프라에 필요한 보안 그리고 격리(isolation)을 제공하기 위해 AWS 개발자에 의해 구축이 되었습니다.
또한 Fargate는 따로 Logging을 남기지 않기 때문에 사용자가 따로 구성해야합니다.

Fargate 제약

  • 리소스마다 최대 4 vCPU, 30 GB Memory가 최대 사용률입니다.
  • Staless한 FrontEnd Service를 Fargate에서 서비스가 가능하며, ALB를 이용합니다. 대신 Statful한 서비스는 사용이 안됩니다. 예를 들어서, Fargate는 프런트 서비스 역할을 하며, EKS에서는 MySQL 등과 같이 상태를 저장해야되는 것을 서비스 즉, 담당하는 역할을 합니다.
  • DaemonSet Object 사용이 불가합니다.
  • NLB/ELB 조합이 불가능하며, ELB와 Ingreess를 조합해서는 사용이 가능합니다. 즉, ALB 사용이 가능하다는 의미입니다.
  • Fargate는 Public Subnet에 생성이 불가능합니다. 에러가 발생합니다. 즉, Private Subnet에만 구성해야하고, Private Subnet에는 NAT가 있어야합니다.

Fargate Profile

어떠한 케이스에 Fargate에 생성하도록 하는 파일을 말합니다. Pod 생성 시, Name Service가 A인 경우, Label이 B인 경우 생성하라는 프로파일로 지정합니다. 즉, Pod를 생성할 때 Pod Spec에Kubernetes Label을 추가하여 pod에서 사용할 프로파일을 지정할 수 있습니다. 그러나 pod는 Fargate에서 예약하려면 해당 프로필의 선택기와 계속 일치해야 합니다.

좀 더 쉽게 설명 드리겠습니다. Pod를 생성하는 과정에서 Fargate Profile과 일치하면 Fargate 안에 Pod를 생성하지만, Profile과 일치 하지 않다면? EC2(WorkerNode)에 생성해! 라는 의미입니다.

EC2 지정 프로파일에 반드시 생성하도록 하라고 지정할 수도 있습니다. EC2 지정 프로파일이 Fargate Profile보다 우선적으로 한다는 특징이 있습니다.


Fargate Worker Node Create

FargateRole Create(FargateRole 은 Fargate Pod를 실행시킬수 있는 역할)

  • 신뢰 관계
{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",

         "Principal":{

            "Service": "eks-fargate-pods.amazonaws.com"
         },
         "Action":"sts:AssumeRole",
         "Condition":{            
         }
      }
   ]
}
  • Role Create
FargateRole=$(aws iam create-role --role-name FargateRole --assume-role-policy-document file://fargaterole.json --output text --query 'Role.Arn')
echo $FargateRole
aws iam attach-role-policy --role-name FargateRole --policy-arn arn:aws:iam::aws:policy/AmazonEKSFargatePodExecutionRolePolicy

Fargate Profile Create

  • Yaml 형식으로 생성하도록 하겠습니다.
cat << EOF > fargateprofile.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
    name: wsi-eks-cluster
    region: ap-northeast-2

fargateProfiles:
  - name: skills-fargates
    selectors:
      - namespace: wsi-skills-namespace
		labels:
		  node: fargate
	podExecutionRoleArn: "$FargateRole"
EOF

eksctl create fargateprofile -f fargateprofile.yaml
  • 생성 확인 방법(1)

  • 생성 확인 방법(2) → eksctl get fargateprofile --cluster wsi-eks-cluster

  • 레이블 확인

    이렇게 설정하면 namespace가 wsi-skills-namespace이고, labels가 node: fargate가 매칭되면 Pod는 Fargate로 생성됩니다.

  • Bastion Instance에 대한 보안 그룹 Rule 추가

EKSSGID=$(aws eks describe-cluster --name wsi-eks-cluster --query cluster.resourcesVpcConfig.clusterSecurityGroupId --output text)
aws ec2 authorize-security-group-ingress --group-id $EKSSGID --protocol '-1' --cidr [[Bastion Host PrivateIP]]
  • 결과

  • 이제 Namespace를 생성한다음 Fargate에 Pod를 생성해보도록 하겠습니다.
kubectl create namespace wsi-skills-namespace
  • 실시간 Pod, Node 체크(현재는 Fargate에 Pod를 배포하지 않아서, Fargate 유형에 Node가 존재하지 않는 것을 확인할 수 있습니다.)
watch -d kubectl get node,pod

  • deployment.yaml
cat << EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-to-scaleout
	namespace: wsi-skills-namespace #profile ns 만족
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        service: nginx
        app: nginx
        node: fargate #profile Label 만족
    spec:
      containers:
      - image: nginx
        name: nginx-to-scaleout
        resources:
          limits:
            cpu: 500m
            memory: 512Mi
          requests:
            cpu: 500m
            memory: 512Mi
EOF
kubectl apply -f deployment.yaml
  • Fargate에 생성된 것을 확인할 수 있으며, Fargate Node IP가 Pod에 1대1로 배포된 것을 확인할 수 있습니다.
  • Pod 상세 정보 확인하기
FpPod1=$(kubectl get pod -n wsi-skills-namespace -oname | cut -d "/" -f 2)
kubectl describe pod -n wsi-skills-namespace $FpPod1

  • 이제 Fargate에 Pod를 늘려서 한번 1대1로 구성되는지 문제없는지 확인해보겠습니다
kubectl scale --replicas=10 deployment/nginx-to-scaleout -n wsi-skills-namespace

현재 Pod는 대기중에 있습니다. 왜냐? 아직 할당할 Fargate가 없기 때문입니다.

  • 그러나 잠시 뒤에 Fargate가 Pod에 갯수와 같이 생성되면서 Pod에 상태가 Running이 됩니다.

  • Console 확인해보겠습니다. 잘 생성 됩니다. 즉, Fargate의 node ip가  Pod IP와 동일합니다. 가상  VM이 1대 1로 매칭 되므로 Fargate는 micro VM 당 Pod가 1개씩 만들어집니다.

profile
Devops가 되고 싶은 청소년
post-custom-banner

0개의 댓글