# CI/ CD 실습 1 명령서버 생성 쿠버네티스 생성 2 mkdir my-action-project cd my-action-project Git 초기화 및 환경 설정 이제 이 폴더를 Git 저장소로 만듭니다. # 1. Git 저장소 시작 git init # 2. 브랜치 이름을 main으로 설정 git branch -M main # 3. 내 정보 설정 (GitHub에 기록될 이름과 이메일) git config --global user.name "Your Name" git config --global user.email you@example.com git config --global user.name "topasvga1" git config --global user.email "topasvga@naver.com" 3 mkdir -p .github/workflows vi .github/workflows/hello-world.yml name: Hello Action on: [push] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: echo "성공적으로 실행되었습니다!" 4 GitHub 저장소와 연결 콘솔로 github에 로그온해서 저장소 s1을 만든다. git remote add origin https://github.com/사용자이름/저장소이름.git git remote add origin https://github.com/topasvga1/s1.git 5 첫 번째 커밋 및 푸시 이제 파일을 올립니다. 이 순간 GitHub Actions가 트리거됩니다! # 1. 상태 확인 (빨간색으로 파일들이 보일 거예요) git status # 2. 모든 파일을 바구니에 담기 git add . # 3. 저장(Commit) git commit -m "Initial commit: Add GitHub Action" # 4. GitHub로 보내기 git push -u origin main 참고 # 1. 기존에 잘못 등록된 origin 삭제 git remote remove origin # 2. 정확한 주소로 다시 등록 (둘 중 하나 선택) # 방법 A: HTTPS 사용 (권장) git remote add origin https://github.com/topasvga1/s1.git # 방법 B: SSH 사용 (이미 키 등록을 마치셨다면) git remote add origin git@github.com:topasvga1/s1.git <2> 비밀번호 대신 Personal Access 5 GitHub 토큰(PAT) 발급 방법 GitHub 웹사이트 우측 상단 프로필 클릭 → Settings 왼쪽 사이드바 맨 아래 Developer settings 클릭 Personal access tokens → Tokens (classic) 클릭 Generate new token → Generate new token (classic) 클릭 Note: "My EC2 Token" 등 적당한 이름 입력 Expiration: 기간 설정 (예: 30 days) Select scopes (중요): repo (전체 체크) workflow (GitHub Actions 수정 권한) 맨 아래 Generate token 클릭 나오는 문자열(ghp_...)을 반드시 따로 복사해두세요! (창을 닫으면 다시 볼 수 없습니다.) 6 이제 다시 push 명령어를 입력하고, 비밀번호 칸에 방금 복사한 토큰을 붙여넣으세요. git push -u origin main Username: topasvga1 (GitHub ID) Password: ghp_xxxxxxxxxxxx (방금 복사한 토큰 붙여넣기 - 입력할 때 화면에는 아무것도 안 보이지만 입력되고 있는 것입니다.) <3> # github action 사용법 vi hello-world.yml name: My First Hello World # 언제 이 워크플로우를 실행할지 결정합니다. (이벤트) on: push: branches: [ "main" ] # main 브랜치에 코드가 푸시될 때 실행 pull_request: branches: [ "main" ] # main 브랜치로 PR이 올 때 실행 # 실제 수행할 작업들을 정의합니다. jobs: say-hello-job: # 어떤 운영체제에서 실행할지 정합니다. (GitHub 제공 서버) runs-on: ubuntu-latest # 실행할 단계들을 순서대로 적습니다. steps: # 1단계: 저장소의 코드를 가상 머신으로 가져옵니다. - name: Checkout repository uses: actions/checkout@v4 # 2단계: 터미널 명령어를 실행합니다. - name: Run a greeting script run: | echo "Hello, GitHub Actions!" echo "현재 실행 중인 운영체제는 $(uname) 입니다." # 3단계: 다중 라인 명령어 예시 - name: Multi-line commands run: | echo "여러 줄의 명령어도" echo "이렇게 실행할 수 있습니다." git add . git commit -m "GitHub Action 워크플로우 추가" git push origin main 8 # 정리 # 1. 파일 담기 git add . # 2. 저장하기 git commit -m "3.add hello world workflow" # 3. GitHub로 보내기 git push -u origin main 9 # 1. 수정한 파일 확인 git status # 2. 파일 담기 git add . # 3. 저장하기 git commit -m "eat: hello world action 추가" # 4. GitHub로 전송 (이때 Actions 탭에서 실행 확인 가능!) git push origin main 10 <4> GitOps의 핵심: ArgoCD 연동 1 # ArgoCD 설치: 1 watch -d kubectl get no,svc,deploy,pods 2 kubectl create namespace argocd kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml k ns argocd <5> 실제 환경에서 첫 배포 3 aws ecr create-repository --repository-name my-web-app --region ap-northeast-2 4 kubectl port-forward svc/argocd-server -n argocd 8080:443 # lb로 변경 kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}' 5 # 문제시 확인 kubectl describe pod argocd-server-7fb8c5f74-wrtst -n argocd 6 # 노드 그룹 이름을 확인한 후 개수를 조절 - node가 작으면 argocd pod가 안뜸. eksctl scale nodegroup --cluster=my-eks-cluster --name=<노드그룹명> --nodes=5 eksctl get nodegroup --cluster=my-eks-cluster general-20260210103125336500000003 eksctl scale nodegroup --cluster=my-eks-cluster --name=general-20260210103125336500000003 --nodes=5 7 아고cd 로그인 - 로드밸런서로 admin kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo 8 GitHub Secrets 등록: GitHub 저장소 Settings > Secrets and variables > Actions에 다음 항목을 넣으세요. AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY VPC 태그 재확인: 로드밸런서(ALB)가 생성될 서브넷에 아래 태그가 있는지 꼭 확인하세요. Key: kubernetes.io/role/elb, Value: 1 (퍼블릭 서브넷 기준) 9 실제 환경에서 첫 배포 aws ecr create-repository --repository-name my-web-app --region ap-northeast-2 확인 aws ec2 describe-subnets \ --filters "Name=tag:kubernetes.io/role/elb,Values=1" \ --query "Subnets[*].{SubnetId:SubnetId, AvailabilityZone:AvailabilityZone, Name:Tags[?Key=='Name'].Value | [0]}" \ --output table 10 GitHub에 Deploy Key 등록 확인 (중요) 만약 여전히 repository not accessible 에러가 발생한다면, GitHub 쪽에서 접근을 거부하는 것입니다. 배스턴 호스트에서 공개키 내용을 확인합니다: cat ~/.ssh/id_rsa.pub GitHub 저장소(topasvga1/s1) 접속 -> Settings -> Deploy keys로 이동합니다. Add deploy key를 클릭하고 위에서 복사한 공개키 내용을 붙여넣어 등록합니다. 저장 권한 부여 하세요. 11 # argo cli # 1. Argo CD CLI 바이너리 다운로드 curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64 # 2. 실행 권한 부여 및 경로 이동 chmod +x argocd-linux-amd64 sudo mv argocd-linux-amd64 /usr/local/bin/argocd # 3. 설치 확인 argocd version --client 4. Argo CD UI에서 연결 상태 확인 브라우저에서 Argo CD에 접속하여 다음 경로를 확인해 보세요. Settings -> Repositories git@github.com:topasvga1/s1.git 항목의 Connection Status가 Successful로 표시되는지 확인합니다. http/https로 1차 확인 현재 상황 요약: 성공 시: Application이 생성되고 Synced, Healthy 상태가 됩니다. 12 모든 상태를 CLI(kubectl 또는 argocd)로 확인 가능합니다. 현재 argocd CLI 로그인이 안 된 상태를 가정하여, kubectl을 사용해 상태를 확인하는 방법부터 알려드릴게요. 1. 저장소 연결 상태 확인 (kubectl 사용) Argo CD는 저장소 연결 상태를 Secret의 status나 별도의 커스텀 리소스로 관리하지 않고, 내부적으로 캐싱합니다. 하지만 등록 여부는 아래 명령어로 확실히 알 수 있습니다. # Argo CD에 등록된 모든 저장소 Secret 리스트 확인 kubectl get secrets -n argocd -l argocd.argoproj.io/secret-type=repository 연결 성공 여부를 더 자세히 보려면 Argo CD 서버의 로그를 확인해야 합니다: # 저장소 연결 관련 에러가 있는지 로그 확인 kubectl logs -n argocd -l app.kubernetes.io/name=argocd-repo-server --tail=50 2. Argo CD CLI 로그인이 가능한 경우 만약 argocd login에 성공했다면, 아래 명령어가 가장 확실합니다. # 등록된 저장소 목록과 연결 상태(STATUS) 확인 argocd repo list STATUS가 Successful이면 정상입니다. Failed라면 SSH 키가 틀렸거나 GitHub의 Deploy Key 등록이 안 된 것입니다. 13 해결 방법 1: ArgoCD 서버 주소 다시 확인 kubectl get svc -n argocd argocd-server # 1. 먼저 기존 로그인 정보를 무시하고 다시 접속 시도 argocd login --username admin --insecure argocd login a839a7d5fa82e4a70859cd9f4339d78f-1240791977.ap-northeast-2.elb.amazonaws.com --username admin --insecure 14 # 인증키 등록 cat ~/.ssh/id_ed25519.pub ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFi2KUdS+YJNRhUSmj95jGv2zkx10o/LXHBQj0UdcCIG topasvga@naver.com GitHub 저장소에 등록된 키 확인 GitHub 저장소(s1) > Settings > Deploy keys로 이동합니다. 기존에 등록된 키가 있다면 삭제하고, Add deploy key를 눌러 위에서 복사한 내용을 붙여넣습니다. Allow write access는 필요 없다면 체크하지 않아도 되지만, 저장소 이름은 자유롭게(예: argo-key) 입력하고 저장합니다. argocd repo add git@github.com:topasvga1/s1.git --ssh-private-key-path ~/.ssh/id_ed25519 15 Application 생성 시도 (CLI) 저장소가 정상 등록되었다면, 이제 실제 애플리케이션을 생성해 봅니다. (이미 생성했다면 생략) argocd app create s7 \ --repo git@github.com:topasvga1/s1.git \ --path . \ --dest-server https://kubernetes.default.svc \ --dest-namespace default argocd app get s7 16 4. GitHub와 통신 확인 (네트워크 점검) 배스턴 호스트 자체에서 GitHub와 SSH 통신이 되는지도 확인해 볼 필요가 있습니다. ssh -T git@github.com 성공 메시지: Hi topasvga1! You've successfully authenticated, but GitHub does not provide shell access. 이 메시지가 나오지 않는다면 ~/.ssh/id_rsa 파일 자체가 GitHub에 등록되지 않은 것입니다. 17 참고 ---------- 등록된 정보: https://github.com/topasvga1/s1.git (HTTPS 방식, 성공) 명령어 입력: git@github.com:topasvga1/s1.git (SSH 방식) 해결 방법: HTTPS 주소로 앱 생성하기 이미 HTTPS 방식이 성공(Successful) 상태이므로, 앱 생성 명령어의 --repo 주소만 HTTPS 형식으로 바꿔주면 바로 해결됩니다. argocd app create s7 \ --repo https://github.com/topasvga1/s1.git \ --path . \ --dest-server https://kubernetes.default.svc \ --dest-namespace default \ --project default \ --sync-policy automated \ --self-heal \ --auto-prune 18 ------------ 만약 꼭 SSH(git@...)를 쓰고 싶다면? 현재 등록된 HTTPS 정보를 지우고 SSH 정보를 다시 등록해야 합니다. 기존 저장소 정보 삭제: argocd repo rm https://github.com/topasvga1/s1.git SSH 방식으로 다시 등록: argocd repo add git@github.com:topasvga1/s1.git --ssh-private-key-path ~/.ssh/id_rsa --------------------------- 재 배포법 단계: 기존의 꼬인 앱 삭제 먼저 설정이 잘못되었을 수 있는 기존 s7 앱을 깨끗하게 지웁니다. argocd app delete s7 2단계: Git 저장소 구조 확인 (중요) 배포 전에 GitHub 저장소(s1)의 구조를 확인해야 합니다. 만약 YAML 파일들이 저장소 루트(최상위)에 있다면 경로는 . 입니다. 만약 manifests/ 폴더 안에 있다면 경로는 manifests가 됩니다 ---------------- 3단계: 앱 재생성 및 강제 동기화 아래 명령어를 사용하여 앱을 다시 생성합니다. 이번에는 --path 설정을 정확히 입력하는 것이 핵심입니다. argocd app create s7 \ --repo https://github.com/topasvga1/s1.git \ --path charts/my-web-app \ --dest-server https://kubernetes.default.svc \ --dest-namespace default \ --project default \ --sync-policy automated \ --self-heal \ --auto-prune 19 4단계: 수동으로 한 번 더 밀어넣기 (Sync) 자동 동기화를 설정했더라도, 최초 1회는 수동으로 명령을 내려서 상태를 확인하는 것이 좋습니다. argocd app sync s7 20 ---------------- # 삭제 필요시 argocd app delete s7 21 argocd app sync s7 이제 Argo CD 대시보드에 접속해서 s7 앱을 클릭해 보세요. 이전에는 비어 있었지만, 이제는 Deployment, Service, ReplicaSet, 그리고 동그란 Pod 아이콘들이 트리 형태로 나타날 것입니다. 모든 아이콘이 초록색 하트가 될 때까지 잠시 기다려 주세요. 22 # 테스트1 - pod 삭제 k ns default k delete pod/my-web-app-5c9bb4b5f8-8gf67 23 # 테스트 2 argocd app list # 앱 삭제 argocd app delete s7 24 # 참고 - Deploy ssh 키 갱신 필요시 - ssh키 삭제후 재 생성시 # 1. 파일 푸시 (이제 성공할 것입니다!) git push origin main # 2. ArgoCD에 저장소 정보 갱신 (새 키를 사용하도록) argocd repo rm git@github.com:topasvga1/s1.git argocd repo add git@github.com:topasvga1/s1.git --ssh-private-key-path ~/.ssh/id_ed25519 # 3. 마리오 앱 동기화 argocd app sync mario-game