한 개의 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을 남기지 않기 때문에 사용자가 따로 구성해야합니다.
4 vCPU, 30 GB Memory
가 최대 사용률입니다.대신 Statful한 서비스는 사용이 안됩니다.
예를 들어서, Fargate는 프런트 서비스 역할을 하며, EKS에서는 MySQL 등과 같이 상태를 저장해야되는 것을 서비스 즉, 담당하는 역할을 합니다.DaemonSet Object 사용이 불가
합니다.NLB/ELB 조합이 불가능
하며, ELB와 Ingreess를 조합해서는 사용이 가능합니다. 즉, ALB 사용이 가능하다는 의미입니다.Public Subnet에 생성이 불가능
합니다. 에러가 발생합니다. 즉, Private Subnet에만 구성해야하고, Private Subnet에는 NAT가 있어야합니다.어떠한 케이스에 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보다 우선적으로 한다는 특징이 있습니다.
FargateRole Create(FargateRole 은 Fargate Pod를 실행시킬수 있는 역할)
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Principal":{
"Service": "eks-fargate-pods.amazonaws.com"
},
"Action":"sts:AssumeRole",
"Condition":{
}
}
]
}
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
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]]
kubectl create namespace wsi-skills-namespace
watch -d kubectl get node,pod
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
FpPod1=$(kubectl get pod -n wsi-skills-namespace -oname | cut -d "/" -f 2)
kubectl describe pod -n wsi-skills-namespace $FpPod1
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개씩 만들어집니다.