Infra/Kubernetes

EKS로 배포하기

서머스 2022. 8. 4. 12:40

Docker Host 대신 EKS를 이용해 배포해 본다.

 

jenkins, ansible 서버를 켜고, 새로운 eks-server를 만든다.

v

 

#!/bin/bash
timedatectl set-timezone Asia/Seoul
hostnamectl set-hostname eks-server
cd /tmp
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
./aws/install
curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.21.2/2021-07-05/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv ./kubectl /usr/local/bin
echo "source <(kubectl completion bash)" >> /home/ec2-user/.bashrc
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
mv /tmp/eksctl /usr/local/bin

사용자 데이터

 

 

sudo vi /etc/ssh/sshd_config

yes.로 바꾼 후 sudo systemctl restart sshd 한다.

 

 

IAM에서 역할 생성한다.

AmazonEC2FullAccess

IAMFullAccess

AdministratorAccess

AWSCloudFormationFullAccess

4 개를 체크한다.

 

만든 역할을  인스턴스에적용한다.

 

 

2a, 2c 퍼블릭 세브넷을 조사해서 첨부한다.

클러스터를 만든다.

eksctl create cluster --name EKS-CLUSTER --region ap-northeast-2 --version 1.21 --vpc-public-subnets subnet-05ccd1b1e205bae9f,subnet-064d5bd3269f87c1f --without-nodegroup
eksctl create nodegroup \
  --cluster EKS-CLUSTER \
  --region ap-northeast-2 \
  --name NODEGROUP \
  --node-type t2.micro \
  --nodes 4 \
  --nodes-min 4 \
  --nodes-max 8 \
  --ssh-access \
  --ssh-public-key aws_key

cluster와 노드그룹을 만든다.

 

콘솔에 들어가보면 생겨 있다.

 

ansible-server의 Docker 디렉터리로 간다

vi build.yml

- hosts: ansible-server

  tasks:
  - name: remove docker image
    command: docker rmi -f hyun141/mytomcat:latest

  - name: create docker image
    command: docker build -t hyun141/mytomcat:latest .
    args:
      chdir: /opt/docker

  - name: push docker image
    command: docker push hyun141/mytomcat:latest

 

sudo vi /etc/ansible/hosts

[eks-server]
10.29.15.94

[docker-host]
10.33.46.187

[ansible-server]
10.29.3.91

각각의 private ip 입력한다.

 

 

 

ssh-copy-id [eks-server의 ip]

 

ping했을 때 docker 빼고 다 되는게 정상

 

 

ansible-playbook build.yml

만약 안되면 docker login

 

 

eks-server에서 작성한다.

mkdir test && cd $_

vi deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-site-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web-site-deployment
  template:
    metadata:
      name: web-site-deployment
      labels:
        app: web-site-deployment
    spec:
      containers:
      - name: web-site-deployment-container
        image: hyun141/mytomcat:latest
        imagePullPolicy: Always

 

vi svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-deployment
spec:
  type: LoadBalancer
  selector:
    app: web-site-deployment
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080

 

kubectl apply -f deployment.yaml
kubectl apply -f svc.yaml

 

이러고 해당 loadbalancer 사이트에 들어가면 tomcat이 나오고, /webapp을 붙이면 부트스트랩 사이트가 나온다.

 

kubectl delete -f .

 

ansible-server에서 작업한다.

vi kube-deploy-svc.yml

- hosts: eks-server

  tasks:
  - name: remove deploy
    command: kubectl delete -f /home/ec2-user/test/deployment.yaml
    ignore_errors: yes
  - name: kube deploy
    command: kubectl apply -f /home/ec2-user/test/deployment.yaml
  - name: kube svc
    command: kubectl apply -f /home/ec2-user/test/svc.yaml
  - name: update
    command: kubectl rollout restart deployment/web-site-deployment

kubenetes에서 deploy와 svc를 작동하게 하는 yml파일.

 

기존에 있는 것들을 삭제하고 - 다시 deploy.yml과 svc.yml을 apply하는 작업

ignore_error : yes를 해서 error를 해도 중단되지 않도록 한다. => 삭제할 게 없어도 그냥 진행하도록 한다.

 

ansible-playbook kube-deploy-svc.yml

 

한 후 kubectl get svc 한다.

이러고 해당 loadbalancer 사이트에 들어가면 tomcat이 나오고, /webapp을 붙이면 부트스트랩 사이트가 나온다.

 

Jenkins에 로그인해서 새로운 Item을 만든다.

ansible-server의 opt/docker에 webapp/target/의 war파일을 넘기는데, 경로는 제외하고 war파일만 넘기도록 한다.

 

deploy와 달리 service는 다시 만들어지지 않으므로 end-point는 바뀌지 않는다

즉, 경로(주소)는 바뀌지 않아야 한다.

 

빌드한 뒤, eks-server에서 확인해본다.

수초 전에 생성된 것을 볼 수 있다

 

 

엔드 포인트가 고정되었으므로 레코드를 생성한다.

 

www.~로 접속해 본다.

 

기존에 클론했던 저장소를 지우고 새로 클론한다.

변화를 확인하기 위해 index.jsp 파일을 수정한다.

commit 후 push한다. =>그러면 젠킨스에서 자동으로 빌드가 된다.

 

다시 들어가 보면 새로 커밋한 걸로 뜬다.

 

 

정리하기

eks-server에서 작업한다.

 

kubectl delete all -all
eksctl delete cluster EKS-CLUSTER --region ap-northeast-2

콘솔에서는 Nodegroup을 지워야 eks cluster를 지울 수 있지만, cli에서는 바로 eks cluster를 지울 수 있다.


S3

S3에 접근할 때는 인터넷이 필요하다. 내부망을 사용하지 않는다.

 

Properties > 맨 밑에 정적 웹사이트 활성화 [Edit]

 

그러면 이렇게 웹사이트 주소가 나온다.

Route53에서 레코드 추가해준다.

 

ping이 잘 간다.

 

인스턴스에 역할이 들어 있기 때문에 eks-server에서 접근이 가능하다

하지만 만약 이 인스턴스가 프라이빗 서브넷에 있었다면 s3에 접근되지 않았을 것이다.

 

private subnet 2a의 인스턴스를 만든다.

 

ansible-server에 접속하도록 키를 옮기고, 접속해 본다.

ping을 쳐 보면 안간다.

 

역할을 부여해 본다.

 

credentials이 되더라도 인터넷이 안돼서 접속이 안된다.

내가 소유자여도 인터넷으로 접속하므로 -> data transfer 로 인한 아웃바운드 트래픽 발생 ->요금 부과

=> 엔드포인트에 대한 정보를 줘서 인터넷을 거치지 않고 내부 망으로 endpoint를 거쳐 연결할 수 있도록 한다.

-> 요금이 준다. => 비용효율적

=> 보안 강화

 

VPC > 엔드포인트

엔드포인트를 생성한다.

 

이 중 Gateway를 선택한다.

Gateway를 통해 내부망으로 S3에 연결할 수 있다.

 

Private subnet을 선택한 뒤 생성한다.

 

라우트 테이블에 생긴 pl~ 이 엔드포인트이다.

 

다시 해보면 ping이 간다.

'Infra > Kubernetes' 카테고리의 다른 글

Kafka & Redis on Kubernetes  (0) 2023.06.12
kubernetes 9  (0) 2022.07.25
kubernetes 8  (0) 2022.07.22
kubernetes 7  (0) 2022.07.21
kubernetes 5  (0) 2022.07.20