카테고리 없음
[argoCD] - argoCD 를 이용한 kubenetes CD
yongyongMom
2024. 11. 18. 09:22
SMALL
- Github : Git lab + action webhook
- Git Ops : Git 을 이용한 자동 배포
- git action 을 이용해서 image build 하고 docker hub (private registry, public cloud image registry 사용 가능) 에 배포
+ publick cloud 의 image 배포 서비스(ECS 서비스) - git 의 webhook 과 jenkins Docker hub 에 배포
+ git pull request 를 이용해서 다른 repository(manifest 를 kubenetes 난 docker 이용) 알림 - skaffold - 소스 코드에 변경이 발생하면 이미지 배포와 kubenetes 배포
- git action 을 이용해서 image build 하고 docker hub (private registry, public cloud image registry 사용 가능) 에 배포
- Git Ops : Git 을 이용한 자동 배포
- 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