article thumbnail image
Published 2023. 12. 15. 20:05
 

Amazon EKS web application workshop

Building simple web application using Amazon EKS. This workshop covers from creating eks cluster to application's life cycle.

catalog.us-east-1.prod.workshops.aws

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

 

 

실습1-5. 콘솔에서 EKS Nodes 정보 보기

다음은 AWS 워크셥 자료를 참고해  공부하며 정리한  자료 입니다. Cloud9에서 CLI로 EKS 클러스터를 만들었다면, 웹 콘솔에서 node정보를 볼수 있도록 권한을 주어야한다. 참고 자료 https://aws-eks-web-a

brunch.co.kr

 

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
복사했습니다!