AWS User를 두 개 생성해야 한다.
전체적인 흐름을 담당할 유저를 admin 이라는 이름으로 만들었다.
https://catalog.us-east-1.prod.workshops.aws/workshops/9c0aa9ab-90a9-44a6-abe1-8dff360ae428/ko-KR/20-preq/100-account
위 링크대로 진행해 사용자를 만들어 로그인 후,
AWS IAM페이지 > 좌측 액세스 관리 메뉴 > 사용자 > admin > 보안 자격 증명 > 액세스 키를 만든다.
ArgoCD가 레포지토리를 모니터링하고 클러스터에 적용하는 데에 필요한 유저를 만든다.
https://catalog.us-east-1.prod.workshops.aws/workshops/9c0aa9ab-90a9-44a6-abe1-8dff360ae428/ko-KR/110-cicd/110-cicd
위 링크의 6. ArgoCD 설정 부분을 참조해 진행하고, Credentials을 다운받는 것까지 해둔다.
EKS를 생성해야 한다. 그러기 위해서 bastion server용도로 EC2를 하나 준비해보자.
EKS 구성을 위한 커맨드 타이핑작업은 다 이 EC2에서 이루어질 예정이다.
직접 콘솔에서 만들어도 되지만 terraform을 이용해 AWS세팅을 마쳤다. 테라폼을 한 번 써보고 싶어서 굳이 써봤다.
클릭노가다에서 해방될뿐만 아니라 뭔가 잘못됐을 때 곧바로 밀어버리기도 너무나 편해서 감격했다.
아래의 링크를 참조해 진행했다. 기초 튜토리얼임에도 이번 셋팅에 아무런 부족함이 없었다.
https://www.44bits.io/ko/post/terraform_introduction_infrastrucute_as_code
provider설정이 누군가에게 도움이 될 것 같아 남겨본다.
튜토리얼 그대로 진행하되 AMI를 최신화했고 resource 이름을 bastion으로 변경했다.
resource "aws_key_pair" "web_admin" {
key_name = "web_admin"
public_key = file("~/.ssh/web_admin.pub")
}
resource "aws_security_group" "ssh" {
name = "allow_ssh_from_all"
description = "Allow SSH port from all"
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
data "aws_security_group" "default" {
name = "default"
}
resource "aws_instance" "bastion" {
ami = "ami-05548f9cecf47b442" # aws 2023
instance_type = "t3.small"
key_name = aws_key_pair.web_admin.key_name
vpc_security_group_ids = [
aws_security_group.ssh.id,
data.aws_security_group.default.id
]
}
잘 만들어진 EC2의 public ip를 확인하고 접속한다.
terraform console
aws_instance.bastion.public_ip
>> {확인한 퍼블릭 ip}
exit
ssh -i ~/.ssh/web_admin ec2-user@{확인한 퍼블릭 ip}
서버에 들어간 이후부터는 아래의 링크를 참조해 EKS를 설정했다.
https://devocean.sk.com/blog/techBoardDetail.do?ID=163654
서버에 들어간 채로 아래의 명령어를 넣어 ArgoCD 설치과정을 마친다.
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/ha/install.yaml
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
이 이후의 자잘한 세부 설정과 실제 엔드포인트 확인방법은 https://devocean.sk.com/blog/techBoardDetail.do?ID=163661 를 참조했다.
ArgoCD에 대한 자세한 이해는 https://devocean.sk.com/blog/techBoardDetail.do?ID=164752&boardType=techBlog#none 링크를 참조했다.
하나의 서비스가 있을 때 레포지토리는 두 개 필요하다.
[소스 저장용 Repo가 저장하는 것들]
- 개발자의 피땀어린 소스코드
- Dockerfile
- buildspec.yaml <-- 이 파일대로 CodeBuild가 동작한다.
[GitOps용 Repo가 저장하는 것들]
- deployment.yaml <-- 이 파일 안에 이미지 태그가 있다.
- service.yaml
배포의 개념이.. 소스코드를 냅다 데몬으로 돌리는 게 아니라 이제 이미지 단위로 apply하는 개념으로 바뀐다.
AWS ECR에 repository를 하나 만든다.
AWS에서의 흐름은 다음과 같다.
- 개발자가 본인의 소스코드를 소스 레포에 push 한다.
- CodePipeline이 소스 레포를 지켜보고 있다. 그걸 감지하고, CodeBuild를 트리거한다.
3-1. CodeBuild는 buildspec 파일대로 컨테이너 이미지를 만들고, ECR에 푸시한다.
3-2. 이미지 푸시에 문제가 없다면 깃옵스 레포를 clone해온 뒤, deployment 파일 안의 이미지 태그만 변경해서 커밋한다.- ArgoCD는 깃옵스 레포를 지켜보고 있다. 깃옵스 레포가 업데이트되면(=새 이미지가 생기면) 그걸 가져와서 EKS에 kubectl apply한다.
파이프라인 구성은 https://may9noy.tistory.com/706 여기를 참조하는데, buildspec파일은 아래 코드대로 작성했다.
version: 0.2
env:
shell: bash
phases:
install:
runtime-versions:
docker: 20
pre_build:
commands:
- echo Logging in to Amazon ECR...
- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/
build:
commands:
- echo Building the Docker image
- DATE=$(date '+%Y%m%d%H%M%S')
- docker build --build-arg pip_user=$PIP_USER --build-arg pip_pass=$PIP_PASS --build-arg pip_host=$PIP_HOST -t $IMAGE_REPO_NAME:$IMAGE_TAG$DATE .
- docker tag $IMAGE_REPO_NAME:$IMAGE_TAG$DATE $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG$DATE
- docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG$DATE
post_build:
commands:
- AWS_ECR_URI=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG$DATE
- echo Build completed on $DATE
- git config --global credential.helper '!f() { echo "username=${GIT_USERNAME}"; echo "password=${GIT_PASSWORD}"; }; f'
- git clone https://$GIT_USERNAME@github.com/nexusai-kr/$OPS_REPO_NAME.git
- |
cd $OPS_REPO_NAME \
&& git checkout $ENV \
&& sed "s|image: .*|image: $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG$DATE|" deployment.yaml > tmpfile \
&& mv tmpfile deployment.yaml
- git config --global user.email 관리용@계정.kr
- git config --global user.name $GIT_USERNAME
- git add .
- git commit -m "update image tag $DATE"
- git push origin $ENV
ArgoCD가 깃옵스 레포를 보고 있을 수 있도록 설정한다.
이 내용은 https://aws-diary.tistory.com/52 여기를 참조했다.
3분에 한 번 가져오는 게 기본값인데, CodeBuild에서 웹훅을 던질 수도 있다고 한다.
일단은 수동 sync로 정책을 잡고 연결했다.

이제 개발자가 소스 레포에 푸시를 할 때마다 새로운 레플리카셋이 생기고, 문제가 없다면 파드가 생긴다.
위 사진은 시행착오를 겪는 동안 생긴 쓰레기 레플리카셋이 즐비한 모습이다.
다음은 여기에 쿠버네티스 관리정책을 붙여야 하고, grafana, prometheus를 붙이고, 테스트 자동화도 붙여야 한다.
argo rollout을 연동하는 것도 고려해봐야 한다.
일을 하나 끝냈는데 열 가지 일이 생겼다.
많은 도움이 되었습니다!