카테고리 없음

[argoCD] - argoCD 를 이용한 kubenetes CD

yongyongMom 2024. 11. 18. 09:22
SMALL
  • Github : Git lab + action webhook
    • Git Ops : Git 을 이용한 자동 배포
      1. git action 을 이용해서 image build 하고 docker hub (private registry, public cloud image registry 사용 가능) 에 배포 
        + publick cloud 의 image 배포 서비스(ECS 서비스)
      2. git 의 webhook 과 jenkins Docker hub 에 배포
        + git pull request 를 이용해서 다른 repository(manifest 를 kubenetes 난 docker 이용) 알림 
      3. skaffold - 소스 코드에 변경이 발생하면 이미지 배포와 kubenetes 배포 
  • ansible 
    • -> 여러 개의 컴퓨터를 하나의 묶음으로 만들고 이 컴퓨터들에 동시에 명령을 수행하도록 하는 것
    • -> SSH 로 접속하고 python 으로 명령 수행
    • 구성 -> public cloud 에서 동적 inventory 구성, private cloud :: SSH 를 비밀번호 없이 접속하도록 구성

1. Kubenetes CD 도구

1) Argo CD

  • Git 저장소의 내용을 가지고 kubenetes 에 배포를 수행해주는 도구

실습

  • git 저장소에서 Repository 생성
  • Kubenetes Deployment 생성 : sample-cd-deployment.yaml
apiVersion: apps/v1

kind: Deployment

metadata:
  name: sample-cd-deployment

spec:
  replicas: 3
  selector:
    matchLabels:
      app: sample-cd-app
  template:
    metadata:
      labels:
        app: sample-cd-app
    spec:
      containers:
      - name: nginx-container
        image: nginx
  • Cluster IP 를 사용하는 서비스 생성 : sample-cd-clusterip.yaml
apiVersion: v1

kind: Service

metadata:
  name: sample-cd-clusterip

spec:
  type: ClusterIP
  ports:
  - name: "http-port"
    protocol: "TCP"
    port: 8080
    targetPort: 80
  selector:
    app: sample-cd-app
  • git push
  • argocd 배포 파일 생성 : sample-cd.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: sample-cd
  namespace: argocd
spec:
  project: default

  source:
    repoURL: https://github.com/itstudy001/argocd.git
    targetRevision: main
    path: samples
    directory:
      recurse: true

  destination:
    server: https://kubernetes.default.svc
    namespace: default

  syncPolicy:
    automated:
      prune: true
      selfHeal: true
  • 배포 명령 수행
kubectl apply -f sample-cd.yaml
  • Argo CD 도 Jenkins 처럼 Web Hook 을 등록할 수 있음
    • Web Hook 을 등록하게 됨녀 git hub repository 에서 코드 변경 발생 
    • 자동으로 다시 배포할 수 있도록 할 수 있음

 

2) skaffold

  • 소스 코드의 변경을 감지해서 Docker Image Build 를 수행
  • repository 에 업로드를 하고 쿠버네티스 배포를 자동으로 수행해주는 구글이 만든 OS
  • 설치
curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64 && \ \
sudo install skaffold /usr/local/bin/


skaffold version
  • go 설치

실습

  • main.go 파일을 생성
package main

import(
  "fmt"
  "net/http"
)

func handler(w http.ResponseWriter, r *http.Request){
        fmt.Fprintf(w, "Hello Go")
}

func main(){
        http.HandleFunc("/", handler)
        http.ListenAndServe(":8000", nil)
}
  • 실행 
go run main.go
  • 이미지를 만들기 위한 Dockerfile 을 생성
FROM golang:1.14-alpine3.11 as builder
COPY ./main.go ./
RUN go build -o /go-app ./main.go

FROM alpine:3.11
EXPOSE 8000
COPY --from=builder /go-app .
ENTRYPOINT ["./go-app]
  • 이미지 생성
    docker build -t 이미지이름 .
    • 이미지 이름을 사용할 때 테스트 할 때는 아무이름 상관없음
    • 배포 할 때는 서버주소/이미지이름의 형태
    • hub.docker.com 에 배포할 때는 아이디/레포지토리이름 
  • 도커 허브에 이미지를 푸시하기 위해서 저장소를 생성 
test-skaffold
  • 이미지를 푸시 : 도커 로그인이 되어 있어야 하고 이미지 이름이 계정/레포지토리이름 이어야 함
sudo docker login -u 아이디

sudo docker build -t 아이디/저장소이름

sudo docker push 아이디/저장소이름
  • pod 배포를 위한 deployment 파일 생성 : skaffold-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: skaffold-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: sample-skaffold
  template:
    metadata:
      labels:
        app: sample-skaffold
    spec:
      containers:
      - name: skaffold-container
        image: ggnagpae1/test-skaffold
  • skaffold 파일을 생성 : skaffold.yaml
apiVersion: skaffold/v2alpha3
kind: Config
build:
  artifacts:
  - image: ggnagpae1/test-skaffold
    docker:
      dockerfile: ./Dockerfile

  tagPolicy:
    dateTime: {}

  local:
    push: true

deploy:
  kubectl:
    manifests:
    - skaffold-*
  • skaffold 시작 : skaffold dev
    • 정상 수행이 되면 소스 코드를 감시하다가 소스 코드에 변경 발생 시
    • 도커 이미지 빌드 -> 푸시 
    • skaffold 로 시작하는 yaml 파일 전부 실행
반응형
LIST