Skip to content

Latest commit

 

History

History
376 lines (279 loc) · 11.9 KB

1.Setup.md

File metadata and controls

376 lines (279 loc) · 11.9 KB

실습

Event Engine 접속

베이스 Cloudformation 배포

  • 0-base-setup.yaml템플릿에 정의된 리소스를 CloudFormatio을 통해 실습에 필요한 기본적인 리소스 VPC, IAM role등을 배포합니다. Screenshot 2023-05-25 at 10 18 36 PM

Cloud9 Workspace 생성 및 권한 설정

  • 실습에 사용할 IDE 환경인 Cloud9 인스턴스를 생성합니다.

    VPC setting에서 Cloudformation을 통해 생성된 Private-A 서브넷에 생성합니다.

    Screenshot 2023-05-25 at 10 20 44 PM
  • Cloud9 인스턴스에 IAM Role 할당합니다.

    실습에 필요한 권한을 위해 Cloudformation을 통해 생성된 Role을 할당합니다.

    Screenshot 2023-05-25 at 10 43 03 PM
  • Cloud9 임시 권한을 삭제 합니다. Screenshot 2023-05-25 at 10 44 10 PM

  • Temp Credential 제거합니다.

    rm -vf ${HOME}/.aws/credentials
    
  • aws cli를 통해 알맞은 IAM Role이 설정되어 있는지 확인합니다.

    aws sts get-caller-identity 
    

Cloud9 Workspace에 필요한 툴 설치

  • kubectl 설치

    # Kubectl 1.27 설치
    sudo curl -o /usr/local/bin/kubectl https://s3.us-west-2.amazonaws.com/amazon-eks/1.27.1/2023-04-19/bin/linux/amd64/kubectl
    sudo chmod +x /usr/local/bin/kubectl
    kubectl version --short --client
    
  • awscli 업데이트

    curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
    unzip awscliv2.zip
    sudo ./aws/install
    source ~/.bashrc
    aws --version
    
  • jq 설치

    sudo yum -y install jq
    jq --version
    
  • eksctl 설치

    curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
    sudo mv -v /tmp/eksctl /usr/local/bin
    eksctl version
    
  • kubectl 자동완성 설정

    kubectl completion bash >>  ~/.bash_completion
    . /etc/profile.d/bash_completion.sh
    . ~/.bash_completion
    
  • Account ID, Region 설정

    export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
    export AWS_REGION=$(curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region')
    
  • k9s 설치

    K9S_VERSION=$(curl -s https://api.github.com/repos/derailed/k9s/releases/latest | jq -r '.tag_name')
    curl -sL https://github.com/derailed/k9s/releases/download/${K9S_VERSION}/k9s_Linux_amd64.tar.gz | sudo tar xfz - -C /usr/local/bin k9s
    
  • Bash profile 저장

    echo "export ACCOUNT_ID=${ACCOUNT_ID}" | tee -a ~/.bash_profile
    echo "export AWS_REGION=${AWS_REGION}" | tee -a ~/.bash_profile
    aws configure set default.region ${AWS_REGION}
    aws configure get default.region
    

GitHub Repo Clone

  • 실습에 필요한 자료를 GitHub를 통해 Clone

    git clone https://github.com/koDaegon/book-sample.git
    
  • Origin Remote 삭제

    cd book-sample
    git remote -v
    git remote remove origin
    

eksctl을 통한 EKS Cluster 생성

eks/eks-cluster 파일음 참조하여 eksctl을 통해 EKS 클러스터를 배포합니다.

  • Cluster 이름 및 Private Subnet 값 변경을 배포 전 꼭 확인합니다.

    apiVersion: eksctl.io/v1alpha5
    kind: ClusterConfig
    
    metadata:
      name: <CLUSTER_NAME> # 생성할 EKS 클러스터명
      region: ap-northeast-2 # 클러스터를 생성할 리전
      version: "1.27"
    
    vpc:
      subnets:
        private:
          ap-northeast-2a: { id: <Private-Subnet-id-1> } #Private Subnet A ID로 대체
          ap-northeast-2c: { id: <Private-Subnet-id-2> } #Private Subnet C ID로 대체
    
    managedNodeGroups:
      - name: node-group # 클러스터의 노드 그룹명
        instanceType: m5.xlarge # 클러스터 워커 노드의 인스턴스 타입
        desiredCapacity: 2 # 클러스터 워커 노드의 갯수
        volumeSize: 30  # 클러스터 워커 노드의 EBS 용량 (단위: GiB)
        privateNetworking: true
        labels:
          nodegroup-type: "worker-node"
        iam:
          instanceRoleName: "role-eks-test-node" # 노드그룹 Role 이름 
          withAddonPolicies:
            imageBuilder: true # Amazon ECR에 대한 권한 추가
            cloudWatch: true # cloudWatch에 대한 권한 추가
    
    cloudWatch:
      clusterLogging:
        enableTypes: ["api", "audit", "authenticator", "controllerManager", "scheduler"]
    
    iam:
      withOIDC: true
    
  • eksctl을 이용해 EKS Cluster를 생성합니다.

    Cluster 및 Nodegroup 생성에 15분 정도 소요됩니다.

    cd eksctl
    eksctl create cluster -f eks-cluster.yaml
    
  • 결과 예시 화면 image

  • 클러스터 및 노드 배포 확인 후 CLUSTER_NAME 설정합니다.

    생성한 클러스터 이름을 추후 실습을 위해 환경변수에 등록

    kubectl get nodes
    export CLUSTER_NAME=<CLUSTER_NAME>
    

AWS Load Balancer Controller 생성

참조사이트

  • IAM OIDC 생성 확인합니다.

    aws eks describe-cluster --name ${CLUSTER_NAME} --query "cluster.identity.oidc.issuer" --output text
    
  • IAM policy 생성합니다.

    cd ~/environment
    curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json
    aws iam create-policy \
        --policy-name AWSLoadBalancerControllerIAMPolicy \
        --policy-document file://iam_policy.json
    
  • AWS Load Balancer Controller를 위한 ServiceAccount 생성합니다.

    eksctl create iamserviceaccount \
        --cluster ${CLUSTER_NAME} \
        --namespace kube-system \
        --name aws-load-balancer-controller \
        --attach-policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy \
        --override-existing-serviceaccounts \
        --approve
    
  • eksctl을 통해 생성된 IAM Role 및 ServiceAccount를 확인합니다.

    Cloudformation을 통해 해당 IAM Role로 바로 이동 가능합니다.

    image
     kubectl get sa aws-load-balancer-controller -n kube-system -o yaml
    
  • AWS LB controller를 위한 Cert-manager 설치합니다.

    kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.yaml
    kubectl get pods -n cert-manager
    
  • AWS LB controller yaml 파일 다운로드합니다.

    wget https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.6.1/v2_6_1_full.yaml
    
  • 다운로드 받은 파일(v2_6_1_full.yaml)에서 cluster-name을 현재 클러스터 이름으로 변경합니다. (line 854)

    Screenshot 2023-07-05 at 12 10 26 AM
  • 또한, eksctl을 통해서 이미 service account를 생성하였기 때문에 manifest 파일에서 Service account부분(line 595~603) 삭제 후 저장합니다.

    Screenshot 2023-07-05 at 12 10 01 AM
  • AWS Load Balancer controller 파일을 배포 합니다.

    kubectl apply -f v2_6_1_full.yaml	
  • AWS Load Balancer Controller Add-on이 정상 배포되었는지 확인 합니다.

    kubectl get deployment aws-load-balancer-controller -n kube-system
  • Describe 명령을 통해 자세한 속성 값을 확인 할 수 있습니다.

    ALBPOD=$(kubectl get pod -n kube-system | egrep -o "aws-load-balancer[a-zA-Z0-9-]+")
    kubectl describe pod -n kube-system ${ALBPOD}
  • Ingress Test를 위해 ./game-2048.yaml 파일에 Public Subnet ID 변경 합니다.

    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: game-2048
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      namespace: game-2048
      name: deployment-2048
    spec:
      selector:
        matchLabels:
          app.kubernetes.io/name: app-2048
      replicas: 2
      template:
        metadata:
          labels:
            app.kubernetes.io/name: app-2048
        spec:
          containers:
          - image: public.ecr.aws/l6m2t8p7/docker-2048:latest
            imagePullPolicy: Always
            name: app-2048
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      namespace: game-2048
      name: service-2048
    spec:
      ports:
        - port: 80
          targetPort: 80
          protocol: TCP
      type: NodePort
      selector:
        app.kubernetes.io/name: app-2048
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      namespace: game-2048
      name: ingress-2048
      annotations:
        alb.ingress.kubernetes.io/ip-address-type: ipv4
        alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80}]'
        alb.ingress.kubernetes.io/load-balancer-attributes: idle_timeout.timeout_seconds=60
        alb.ingress.kubernetes.io/scheme: internet-facing
        alb.ingress.kubernetes.io/subnets: <public_subnet_id_1>, <public_subnet_id_2>
        alb.ingress.kubernetes.io/target-group-attributes: deregistration_delay.timeout_seconds=30
        alb.ingress.kubernetes.io/target-type: ip
        kubernetes.io/ingress.class: alb
        alb.ingress.kubernetes.io/backend-protocol: HTTP
    spec:
      rules:
        - http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: service-2048
                  port:
                    number: 80
    
  • game-2048.yaml 파일을 배포합니다.

     cd book-sample
     kubectl apply -f game-2048.yaml
  • 결과 화면

    IngressClass Docs

    image
  • IngressClass 및 IngressClassParams 매니페스트를 다운로드 후 클러스터에 배포합니다.

    curl -Lo v2_6_1_ingclass.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.6.1/v2_6_1_ingclass.yaml
    kubectl apply -f v2_6_1_ingclass.yaml
    
  • 아래와 같이 game-2048.ymal 파일에 ingressClassName을 추가하여 매니페스트를 배포합니다.

    image
  • ingress 배포 확인

    kubectl get ingress ingress-2048 -n game-2048 -o yaml
    Screenshot 2023-05-26 at 12 40 50 AM