220804

HyeonKi Jo·2022년 8월 4일
0
post-thumbnail

CI/CD Pipeline

  • CI / CD 파이프라인
  • 개발자가 소스 개발, 소스 수정 후 github에 커밋
  • Jenkins가 1분 간격으로 github의 변화를 리스닝하고, 변화가 있다면 자동으로 pull해서 build한다.

EKS

EKS-server 생성

인스턴스 생성

  • 이름: eks-server
  • AMI: Amazon Linux
  • t2.micro
  • 키페어 설정
  • 2c 가용영역
  • 보안그룹 설정 (기존에 있던 dev-SG)
  • 사용자데이터
#!/bin/bash
timedatectl set-timezone Asia/Seoul	#시간 세팅
hostnamectl set-hostname eks-server	# hostname세팅
cd /tmp								#tml폴더에서 작업한다.
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"	# awscliv2 다운로드
unzip awscliv2.zip
./aws/install						# awscli 설치
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					# kubectl 설치 및 실행권한 추가
mv ./kubectl /usr/local/bin			# 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		# eks ctl도 설치한다.

  • aws --version
  • kubectl version
  • eksctl version
    • 세가지가 모두 잘 설치됬는지 version을 출력해본다.

PasswordAuthrntication 설정

  • sudo passwd ec2-user
  • sudo vi /etc/ssh/sshd_config
    • 키 방식에서 비밀번호입력 방식을 추가해준다.
PasswordAuthentication yes
#PermitEmptyPasswords no
#PasswordAuthentication no
  • sudo systemctl restart sshd
    • sshd를 재시작해준다.

EKS master노드 IAM 역할 생성

  • eks에서 클러스터 생성 및 노드그룹을 생성하는데 시간이 어느정도 걸리게된다.

  • 넣어줄 권한 4가지를 체크해서 만들어준다.
AmazonEC2FullAccess
IAMFullAccess
AdministratorAccess
AWSCloudFormationFullAccess

  • 잘 생성되었다.
  • eks-server에 작업 -> 보안 -> IAM역할 수정으로 IAM역할을 부여한다.

EKS cluster, nodegroup생성

cluster

  • eksctl create cluster --name EKS-CLUSTER --region ap-northeast-2 --version 1.21 --vpc-public-subnets subnet-0e52f60ee610df2ec,subnet-041b9223c2dd2b490
    • 중간에 사용가능한 VPC영역내 내가 사용할 가용서브넷의 ID를 넣어준다. (,로 구분하고 띄어쓰기없다.)
    • eksctl로 cluster를 만들어준다.
    • 이름은 EKS-CLUSTER
    • 리전: 서울 리전
    • 사용할 서브넷: 2a, 2c의 ID

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 Docker-key

  • 노드그룹 생성

Ansible

  • ansible-server로 이동

인벤토리 확인

  • sudo vi /etc/ansible/hosts
[docker-host]
192.168.8.114

[ansible-server]
192.168.10.42

[eks-server]
192.168.39.195
  • 다행히 docker-server, ansible-server내부 IP는 바뀌지 않았다.
  • 여기서 eks-server의 내부 IP를 추가해준다.
  • ssh-copy-id 192.168.39.195
    • eks-server도 ssh 접속할 수 있도록 키를 보내준다.
  • ansible all -m ping
    • 연결확인
  • EKS-server, ansible-server는 잘 연결되었다.
  • 현재 docker-server는 인스턴스 중지상태라 에러가 나오는 것이 맞다.

vi build.yaml

- hosts: ansible-server

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

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

  - name: push docker image
    command: docker push jo1132/mytomcat:latest
  • ansible-playbook build.yaml
    • build.yaml을 실행한다.

eks-server

  • mkdir test && cd $_
    • 작업공간 만들기
  • 먼저 node들이 잘 생성되었는지 확인

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: jo1132/mytomcat:latest
        # jenkins에서 이미지를 Pull할 떄, 항상 image를 pull하도록 Always옵션을 넣는다. 이때, 항상 최신버전을 가져오기 위해 이미지는 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

eks-server에서 실행

  • kubectl apply -f deployment.yaml
    • deployment.yaml을 실행해서, jo1132/mytomcat을 가져와 tomcar을 실행해준다.
  • 로드밸런서 서비스도 생성되었다.
  • 로드밸런서 도메인주소:8080 주소로 접속하면 잘 접속된다.

ansible-server

vi kube-deploy-svc.yaml

- hosts: eks-server

  tasks:
  - name: remove deploy
    command: kubectl delete -f /home/ec2-user/test/deployment.yaml
    # 만약 deployment가 이미 있다면 에러가 나지만, ignore_errors옵션으로 에러를 무시한다.
    ignore_errors: yes
  - name: kube deploy
  # deployment를 다시 실행한다.
    command: kubectl apply -f /home/ec2-user/test/deployment.yaml
  - name: kube svc
  # svc를 다시 생성한다. 그러나, 이미 생성되어있다면 무시하게 된다.
    command: kubectl apply -f /home/ec2-user/test/svc.yaml
  - name: update
  # 업데이트 방식 (rollout)을 한번에 다바꾼다.
    command: kubectl rollout restart deployment/web-site-deployment
  • ansible-playbook kube-deploy-svc.yaml
    • kube-deploy-svc를 실행

Jenkins

새로운 프로젝트 생성

  • Item name: Deploy_On_Kube_Ansible
  • Copy from: Copy_Atifacts_onto_Ansible

General

소스코드 관리

빌드 유발

Build

빌드 후 조치

  • Exec command
cd /opt/docker;
ansible-playbook build.yaml;
sleep 10;
ansible-playbook kube-deploy-svc.yaml;

지금 빌드

  • 빌드 성공!

Route53

  • 위와 같이 www.cocudeny.shop으로 도메인을 만들어준다.
  • 도메인 주소로 잘 접속되었다.

빌드 유발 테스트

Github Update

  • index.jsp를 수정해준다.
  • cd ~
  • rm -rf hello-world/
  • git clone https://github.com/jo1132/hello-world.git
  • cd hello-world
  • vi webapp/src/main/webapp/index.jsp
  • git add webapp/src/main/webapp/index.jsp
  • git commit -m "title changed with anounce EKS test"
  • git push origin master

Jenkins

  • 자동 빌드 중이다.
  • 위 title이 EKS-server로 수정되었다.

정리

eks-server 정리

  • kubectl delete all --all
    • 노드그룹 삭제 속도를 올리기위해 pod, svc등 모두 지워준다.
  • eksctl delete cluster EKS-CLUSTER --region ap-northeast-2
    • eksctl을 이용해 cluster를 삭제한다.
    • CloudFormation을 이용해 모두 지워주는 것이다.
    • 생성할 때, CloudFormation으로 생성하여 노드그룹, Cluster를 한번에 생성했으니, 삭제할때도 한번에 삭제한다.
  • 클러스터가 잘 삭제되었다.
  • 노드그룹도 잘 종료된것으로 보인다

엔드포인트

  • 엔드포인트, 엔드포인트 서비스 이 두개는 뭘까

CloudTrail

  • 일반 사용자들의 Cloud 서비스 사용 기록

CloudConfig

  • 리소스 사용 로그

S3

  • S3는 언제나, 어느곳이든 인터넷을 통과한다.
  • S3를 생성할 떄, 리전을 설정하지만, 글로벌 서비스로 정의되어있다.

정적 웹 사이트 호스팅

  • 간단하게 S3를 생성했다.
  • 정적 웹 사이트 호스팅을 생성해준다.
  • 위와 같이 설정해주고 편집해준다.
  • Route53에서 도메인 레코드를 생성해준다.
  • 도메인 주소로 ping이 잘 나간다.

Private EC2로 접속해보기

  • 현재 S3를 같은 리전에 생성했으니, Private EC2로 접속이 가능해야 한다.
  • Private Subnet에서 EC2를 생성한다.
  • Ansible-server에 Docker-key를 올린다.
  • chmode 400 Docker-key 로 바꿔준다.
  • ssh명령어로 Private ec2에 접속한다.
  • ping s3.cocudeny.shop 하면 ping이 나가지 않는다.
  • aws s3 ls s3://s3.cocudeny.shop
    • aws명령어를 입력하면 permission에러가 나온다.
  • EC2에 IAM을 부여해서 접속을 시도한다.

엔드포인트

  • 도메인주소로 접속하면 결국 아웃바운드, 엔드유저(일반사용자, 외부에서 오는 사용자)의 접속과 같다.
    • 결국 인터넷을 통해 내용물을 가져오는 것이다.
    • 그래서 아웃바운드, 데이터트랜스퍼 비용이 발생한다.
  • 그러나 엔드포인트는 데이터트랜스퍼 비용이 발생하지 않는다.
    • 내부 사용자에서 사용하는 방법이다.
    • 인터넷을 통과하지 않는 방법이다.
    • 데이터 트랜스퍼 비용이 나가지 않아 저렴하다.
    • 또, 내부 망을 사용하기 때문에 외부의 접근을 차단하여 안전하게 사용할 수 있다.
    • 물론 엔드포인트 자체 비용이 존재하지만, 막대한 데이터트랜스퍼 비용만큼은 아니다.
  • 이 S3의 경우는 DynamoDB도 같다.

엔드포인트 생성


  • Gateway를 선택해준다.
    • Gateway를 통해 내부망에 연결된다.
  • 사용할 VPC를 선택해준다.
  • 엔드포인트 생성

엔드포인드 연결

  • subnet에서 라우팅 테이블을 확인한다.
  • Private 서브넷은 local을 대상으로하는 테이블밖에 없었는데, 엔드포인트 테이블이 새로 생겼다.
  • 또 ping이 나가기 시작했다.

정리

  • 엔드포인트 삭제
  • S3삭제
  • EC2 중지
profile
Talking Potato

0개의 댓글