cat << EOF > bjc-eks-demo-cluster.yaml
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: bjc-eks-demo # 생성할 EKS 클러스터명
region: ${AWS_REGION} # 클러스터를 생성할 리전
version: "1.28"
vpc:
cidr: "10.0.0.0/16" # 클러스터에서 사용할 VPC의 CIDR
nat:
gateway: Single
managedNodeGroups:
- name: node-group # 클러스터의 노드 그룹명
instanceType: t3.small # 클러스터 워커 노드의 인스턴스 타입
desiredCapacity: 3 # 클러스터 워커 노드의 갯수
volumeSize: 20 # 클러스터 워커 노드의 EBS 용량 (단위: GiB)
privateNetworking: true
iam:
withAddonPolicies:
imageBuilder: true # Amazon ECR에 대한 권한 추가
albIngress: true # albIngress에 대한 권한 추가
cloudWatch: true # cloudWatch에 대한 권한 추가
autoScaler: true # auto scaling에 대한 권한 추가
ebs: true # EBS CSI Driver에 대한 권한 추가
iam:
withOIDC: true
EOF
eksctl create cluster -f bjc-eks-demo-cluster.yaml
eksctl로 만들면 CloudFormation으로 빌드해서 올린다.
ALB 컨트롤러 만들기
controller가 마스터 노드 위에서 동작되기 때문에 노드에서 IAM permissions를 통해, AWS ALB/NLB 리소스에 접근할 수 있도록 만들어야 합니다.
IAM permissions는 ServiceAccount를 위한 IAM roles를 설치하거나 워커 노드의 IAM roles에 직접적으로 붙일 수 있습니다.
OIDC
OIDC는 OAuth 2.0프로토콜을 기반으로 상위 계층에서 간편하게 인증을 처리하며, 신원 확인 서비스(IDP)를 통해 안전한 방식으로 사용자 정보를 제공할 수 있습니다.
여기서 IDP는 OP(OpenID Provider)를 의미하며, 카카오,네이버, 구글 등입니다.
AWS Identity and Access Management(IAM)와 ID 인증 및 권한 부여 표준인 OpenID Connect(OIDC)의 통합을 의미합니다. 이 통합을 통해 OIDC 자격 증명 공급자(IdP)를 사용하여 사용자가 AWS 리소스에 액세스하도록 인증하고 권한을 부여할 수 있습니다.
쉽게 정리하면 AWS가 IDP로써 AWS 리소스 엑세스 인증과 권한 부여이다.
aws eks describe-cluster --name bjc-eks-demo --query "cluster.identity.oidc.issuer" --output text
cli로 클러스터와 노드그룹을 만들면 콘솔화면에서는 보이지않기때문에 다음 명령어 실행이 필요합니다.
rolearn=$(aws cloud9 describe-environment-memberships --environment-id=$C9_PID | jq -r '.memberships[].userArn')
echo ${rolearn}
eksctl create iamidentitymapping --cluster bjc-eks-demo --arn ${rolearn} --group system:masters --username admin
kubectl describe configmap -n kube-system aws-auth
로드밸런서 컨트롤러 설치
로드밸런스 컨트롤러는 로드밸런서를 생성하는게 아니라 만들 수 있는 하나의 컨트롤 장치이다.
로드밸런서 컨트롤러는 마스터 노드에서 관리되며 ingress 관련 설정이 되면 자동으로 그에 대응하는 로드밸런서를 만든다.
eksctl utils associate-iam-oidc-provider \\
--region ${AWS_REGION} \\
--cluster bjc-eks-demo \\
--approve
curl -o iam-policy.json <https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.4/docs/install/iam_policy.json>
Reference
eksctl create iamserviceaccount \\
--cluster bjc-eks-demo \\
--namespace kube-system \\
--name aws-load-balancer-controller \\
--attach-policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAM \\
--override-existing-serviceaccounts \\
--approve
워크샵 프론트엔드 코드만 설정하였습니다.
aws ecr create-repository \\
--repository-name bjc-demo-frontend \\
--image-scanning-configuration scanOnPush=true \\
--region ${AWS_REGION}
cd /home/ec2-user/environment/amazon-eks-frontend
docker build -t bjc-demo-frontend .
docker tag bjc-demo-frontend $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/bjc-demo-frontend:2.0
docker push $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/bjc-demo-frontend:2.0
배포
deployment.yaml service.yaml ingress.yaml 3가지 모두 배포가 필요하며 각각의 설정은 다음과 같습니다
deployment: 쿠버네티스 클러스터 내에서 bjc-demo-frontend라는 이름의 애플리케이션을 배포와 실행환경을 설정하고, 이를 세 개의 레플리카로 유지 관리하는 역할을 합니다.
service: bjc-demo-frontend 애플리케이션에 대한 네트워크 액세스를 설정하여, 클러스터 내부 또는 외부에서 애플리케이션에 접근할 수 있도록 하는 서비스를 정의합니다
ingress: 트래픽을 bjc-demo-frontend 서비스로 라우팅하는 규칙을 정의하여, 외부 요청을 쿠버네티스 서비스로 연결하는 역할로 ALB컨트롤러를 설정해놓으면 annotation을 통해 자동으로 alb를 생성하고 연결합니다
cd /home/ec2-user/environment/manifests
cat <<EOF> frontend-deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: bjc-demo-frontend
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: bjc-demo-frontend
template:
metadata:
labels:
app: bjc-demo-frontend
spec:
containers:
- name: bjc-demo-frontend
image: $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/bjc-demo-frontend:1.0
imagePullPolicy: Always
ports:
- containerPort: 80
EOF
cat <<EOF> frontend-service.yaml
---
apiVersion: v1
kind: Service
metadata:
name: bjc-demo-frontend
annotations:
alb.ingress.kubernetes.io/healthcheck-path: "/"
spec:
selector:
app: bjc-demo-frontend
type: NodePort
ports:
- protocol: TCP
port: 80
targetPort: 80
EOF
cat <<EOF> frontend-ingress.yaml
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: "frontend-ingress"
namespace: default
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/group.name: eks-demo-group
alb.ingress.kubernetes.io/group.order: '3'
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: "bjc-demo-frontend"
port:
number: 80
EOF
정상적으로 동작하는지 확인 명령어
echo <http://$>(kubectl get ingress/frontend-ingress -o jsonpath='{.status.loadBalancer.ingress[*].hostname}')
이후 자동화된 배포는 CodePipeline과 ArgoCD를 통해 진행할 수 있지만 다음에 공부할겸 다시 만들어보기 위해 진행하지 않았습니다.
EKS가 어떤 역할을 하는지 기존 쿠버네티스에 비해 얼마나 편한건지 이해할 수 있었습니다
리소스 정리 명령어
cd ~/environment/manifests/
kubectl delete -f flask-ingress.yaml
kubectl delete -f nodejs-ingress.yaml
kubectl delete -f frontend-ingress.yaml
kubectl delete -f alb-ingress-controller/v2_5_4_full.yaml
eksctl delete cluster --name=<cluster-name>
aws ecr delete-repository --repository-name <repo-name> --force
에러
- Cloud9 환경 실행시 퍼블릭 ip가 필요합니다 > 서브넷에서 자동으로 ip를 할당할 수 있도록 설정 가능
- development, ingress, service yaml 파일은 변동사항이 없으면 작업을 수행하지 않는다
- rollout을 통한 강제 실행
- kubectl rollout restart deployment bjc-demo-frontend -n default
Amazon EKS로 간단한 웹 애플리케이션 구축하기 - 김주영 (AWS) :: AWS Community Day Online 2021
'TIL > AWS' 카테고리의 다른 글
전용 호스트와 전용 인스턴스 차이 (0) | 2024.01.29 |
---|---|
aws ec2 모든 타입에 대한 요약 (0) | 2024.01.15 |
AWS SAA-C03 문제풀이 (0) | 2023.07.11 |
AWS 백서 (0) | 2023.06.20 |
기타 AWS 서비스 (0) | 2023.06.19 |