[AWS]EKS

차보경·2023년 6월 19일
0

AWS

목록 보기
13/13
post-thumbnail

컨트롤 플레인 -> 명령어를 받아서, 데이터 플레인 어떤 EC2를 배포할지 작업함

  • kuber는 직접 설치해서 사용해야하지만, EKS는 자동화가 되어있음!
    • 컨트롤 플레인(노드)는 직접 설치하기도 힘듦....
    • 고가용성을 위해 기본 3개 작업자노드(worker node)로 설정함.
    • EKS 사용시 컨트롤 플레인은 완전자동관리됨(설정할 수 없음)
  • 데이터 플레인도 자동화 시킨다면, AWS Fargate!
    • 알아서 배포하고 관리해줌...!
    • 우리가 할 일이 없어진다.
    • Fatgate는 좋지만 모든 것을 커버할 수 없음. 구조상 kuber의 모든 기능을 사용할 수 있는게 제한적임. -> Fargate랑 Workernode를 나눠서 사용함
  • Fargate
    • 컨테이너에 적합한 서버리스 컴퓨팅
    • 빠르고 간편하며 완전 관리형이라 좋음
    • 자동화 할 수 있는건 최대한 자동화하는 방향으로 가쟈

관리형 컨테이너 서비스 배포

Kubernates Object

  • 쿠버의 기능을 알아야한다.

Pod(파드)

  • 컨테이너를 파드 단위로 배포함.
  • 파드관리업무가 주
  • pod안에 여러 컨테이너를 감싸서 사용함(일반적)
  • APIVersion : 그냥 붙혀넣는 부분 (Pod 관리버젼)
  • Kind: Object 이름 (yaml 문법을 사용해서 띄어쓰기도 주의해야함)
  • metadata: metadata임
  • spec: 중요
    • 어떤 컨테이너를 사용해서 pod을 구성하는지 알려주는 부분
    • manufastfile 이라 쓰다보면 길어짐
    • name은 자유롭게 쓸 수 있지만, image는 제공하는 이미지이름을 정확하게 넣어줘야함(internet으로 다운받아서 실행하기 때문에)
  • pod 만드는 방법? 지금은 선언형. 명령형도 있음(선언하면서 사용)

ReplicaSet(레플리카셋)

  • 하나의 pod이 돌아가고 있다면, 하나를 지우면 장애가 발생하게 됨. Pod을 여러개 배포하지만 갯수를 고정해서 유지하고 싶다면 사용하는 것.
  • spec: -> 리플리카의 스펙 // 아래는 pod의 스펙임
    • replicas: 3 (복제복을 3개 만들겠다는 것)
    • selector:
      • 3개의 pod이 만들어지고 select로 그룹핑을 함. -> 장애가 나도 삭제해도 갯수 3개가 유지되게 자동으로 만들어줌

Deployment(디플로이먼트)

  • Kind 이름만 다르고 Replicaset이랑 동일함
  • 만든 app을 이미지로 패킹하고 새 버전의 이미지를 배포할 때, 기존의 pod에서 옮기고 트래픽 뚫어주는게 귀찮음... 그걸 편하게 해주는게 디플로이먼트!

디플로이먼트 구조

Service

  • Pod들을 외부에 노출시키는 방법
  • spec: 이렇게 load balbance를 만들면 자동으로 생성이 되고, 어떤 pod에 들어오는 트래픽을 넣어줄지 정해주는 것(selector에 보내줘!)
  • select, label의 개념이 중요함!
  • port번호는 잘 맞춰서 적어주기만하면 됨!

서비스의 구조

다시 말해 컨테이너 호스팅은 크게 EC2와 Fargate로 나눠볼 수 있고 Fargate는 완전관리형 컨테이너 호스팅 서비스이며 컨테이너 Serverless 라고도 말합니다.


실습해보기!

cloud9을 사용해서 환경생성하기

  • 이름을 정해주고 t3.small을 선택해 환경을 만들어준다
  • 열림을 눌러준다

    ㄷ두둥탁 인터페이스 등장

    아래 터미널 창이 있음

AWS는 독립적인 서비스라 다른 서비스를 접근할 때 권한을 줘야한다.

  • IAM에서 admin롤 주고(test용), ec2 - instance선택 - 작업 - 보안 - IAM역할수정

  • 80, 2000 port를 사용예정이기에 Ec2 보안으로 이동해서 port를 열어준다

EKS 설치

EKS를 설치 하고 EKS에 명령을 날리기 위한 유틸리티 kubectl를 설치 하자.

#  kubectl 다운로드
sudo curl -o /usr/local/bin/kubectl https://s3.us-west-2.amazonaws.com/amazon-eks/1.23.13/2022-10-31/bin/linux/amd64/kubectl

# 실행권한 주기
sudo chmod +x /usr/local/bin/kubectl

# 버전확인
kubectl version --client=true --short=true

# eksctl 다운로드, 압축풀기
curl --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp

# eksctl을 /usr/local/bin 디렉터리로 이동
sudo mv -v /tmp/eksctl /usr/local/bin

# 설치확인
eksctl version

#현재 리전의 정보를 환경변수에 저장
export AWS_REGION=$(curl --silent http://169.254.169.254/latest/meta-data/placement/region) && echo $AWS_REGION

# eks 배표 -> 이 명령어를 통해 vpc, ec2 배포 등을 자동화함
eksctl create cluster --name myeks --version 1.23 --region ${AWS_REGION}

# 노드의 리스트 확인
kubectl get nodes

#아래처럼 노드의 리스트가 나와야함
ip-192-168-51-108.ap-northeast-2.compute.internal   Ready    <none>   115s   v1.23.17-eks-0a21954
ip-192-168-69-32.ap-northeast-2.compute.internal    Ready    <none>   100s   v1.23.17-eks-0a21954

# 안되면 리소스 삭제하고, eks 배포 다시해줌

설치 완료!

Docker

  • 이미 CLoud9에는 Docker가 설치되어 있음
    docker search nginx을 검색해 이미지를 확인하고 스타가 많은 nginx를 설치한다

  • docker pull nginx

  • 이미지 확인 docker images

    • 이건 docker hub에 있는 registory에서 다운받아 사용하는 것.
  • 이 이미지를 기반해서 container 만들기 docker run --name apple -d -p 80:80 nginx

    • —-name: 컨테이너의 이름을 지정(생략하면 랜덤하게 만듭니다)
    • -d: 백그라운드에서 실행
    • -p 80:80: 앞에 80번 포트로 접근하면 컨테이너의 80번 포트로 연결하라는 포트 매핑하는 옵션
      • 앞에 80은 80 노출할 것 말하는 것. 뒤에 80은 nginx를 도커 80(내부)를 노출할 거라는 것
    • nginx: 풀(다운)받을 이미지 이름
  • 그럼 이제 cloud9이 돌아가고 있는 EC2엔 nginx가 돌아가고 있을 것!
    -> EC2인스턴스 이동 후 퍼블릭 IPv4로 이동

    첫번째 인스턴스 배포 완료! (pull 하지 않아도 docker run을 사용하면 돌아감)

  • docker ps 실행되고 있는 컨테이너 확인!

  • docker stop apple 컨테이너 정지

    • IPv4 들어가면 안들어가지는것이 보인다

      -docker ps -a 하면 상태가 Exited가 된 것을 확인 할 수 있음
      -docker start apple 다시 실행시키기

플러스! 컨테이너 하나 더 열어보기

하나의 인스턴스로 많은 컨테이너 연결?

  • docker run --name orange -d -p 2000:80 nginx : 2000 번 port를 받아서 80번 포트로 넘김!

    • :2000으로 들어가도 nginx의 화면이 잘보이는 것을 알 수 있다.
  • docker stop apple : 도커 다시 스톱 (삭제 전 stop을 해야 삭제가 가능하다)

  • rm으로 삭제시켜준다!

Docker 이미지 build

  • git clone https://github.com/gabrielecirulli/2048으로 2048게임을 클론
  • cd ~/environment/2048 디렉토리 이동
  • Dockerfile 만들기
cat <<EOF > Dockerfile  # EOF라는 단어 나올 때 까지 중간 내용을 Dockerfile로 저장
FROM nginx:latest

COPY . /usr/share/nginx/html # 현재 디렉토리 모든 파일을 ~~html 디렉토리로 옮김(nginx의 홈 디렉토리)

EXPOSE 80
EOF
  • docker build -t web2048 . : 도커파일을 읽어서 web2048이라는 이름의 이미지를 만들자

  • docker images로 잘 만들어졌는지 확인!

    • nginx위에 올려야하기때문에 같이 만들어진 것을 알 수 있다
  • docker run --name web2048 -dp 80:80 web2048 다음 명령어로 nginx 이미지를 기반으로 컨테이너를 실행! 그리고 브라우저에 Cloud9 인스턴스의 Public IP 주소를 입력하여 2048 게임 화면이 제대로 나오는지 확인해본다

  • 다음 실습을 위해 컨테이너 지우기! `docker rm -f $(docker ps -aq)'

    • 이건 cloud9에만 존재함. 다른데서 쓰려면 레지스트리에 올리고 다운받아 쓰는 작업을 해야한다.
  • 이미지 지우기 docker rmi -f $(docker images -q)


ECR 만들어보기

  • 회사 코드는 Private하게 만들어줘야함:)!
  • repo 이름을 적어서 레포지토리를 만들어준다
  • 푸시명령어 보기를 눌러서 순서대로 작성해준다


  • 이게 실 레포지토리의 주소임.
  • ECR에 들어가보면
    이렇게 다운되어 있는 것이 보인다.
  • 부여된 URI를 통해 이 레포지토리를 당겨서 다운받을 수 있다

ECR URI를 이용해 docker 설치해보기

  • 앞의 내용을 다 지워주고
docker rm -f $(docker ps -aq)
docker rmi -f $(docker images -q)
  • docker run --name 2048 -dp 80:80 [본인 이미지] 를 입력해주면 잘 설치가 되는 것이 보인다!!! wow

  • 오ㅐ 내 ECR 주소는 길까...? -> 레지스토리 주소를 전체 입력해 레포로 들어가는게 맞음! 하지만 dockerhub는 이미 docker설치할 때, 긴 주소가 저장되어 있기 때문에 자동으로 입력되는 거였음!!!ㅋㅋㅋㅋㅋ fake다 요놈

  • 이제 이 하나의 컨테이너로는 많은 서비스의 유저 input을 감당할 수 없음! 그래서 kuber로 관리해주는거


Pod 기본 명령어

  • `kubectl run nginx-apple --image=nginx

    • kubectl: 쿠버네티스에 명령어를 보내는 유틸리티
    • run: 실행 명령어
    • nginx-apple: Pod의 이름
    • --image=nginx: nginx 컨테이너 이미지를 사용한다는 뜻.
  • kubectl get pods

    • restart
  • 이제 선언형(yaml)을 만들어서 pod을 제작해보자

cat <<EOF > nginx-orange.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-orange
  labels:
    run: nginx-orange
spec:
  containers:
    - name: orange
      image: nginx
EOF
  • kubectl apply -f nginx-orange.yaml
    • -f 파일에서 apply 하겠다는 것
  • kubectl get pods -o wide : 어느 노드에 배포되었는지 확인 (-wide를 붙이면 node의 정보도 길게 볼 수 있다)
    • 두게가 같은 노드에 배포된 것이 보인다~ (이건 랜덤임)
  • kubectl get pods --show-labels : 레이블 확인
  • pod 지우기!
    • 이름으로 지우기 kubectl delete pods nginx-apple
    • 레이블로 지우기(현업에선 많아서 레이블로 한번에 지우는걸 많이 쓴다 -> 레이블을 잘알고있어야함!)
      kubectl delete pods -l run=nginx-orange

ReplicaSet 배포

  • yaml 정의
cat <<EOF > replicaset.yaml 
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-replicaset
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-replicaset
  template:
    metadata:
      labels:
        app: nginx-replicaset
    spec:
      containers:
        - name: nginx-container
          image: nginx
EOF


profile
차보의 Data Engineer 도전기♥ (근데 기록을 곁들인)

0개의 댓글