Gitops 및 Kubernetes를 사용하는 Golang 웹 앱의 Devops 파이프라인
이 블로그 게시물에서는 CI/CD 파이프라인과 Gitops 접근 방식을 사용하여 golang에서 웹 앱 배포를 자동화하는 과정을 안내하겠습니다.
앱을 컨테이너화하여 kubernetes에 배포하고 ArgoCD를 사용하여 배포하는 방법을 살펴보겠습니다.
요구사항
- Kubernetes 클러스터 kubernetes용 클라우드 제공업체의 관리형 서비스를 사용할 수 있습니다. 시스템에 kubernetes 클러스터를 프로비저닝할 수 있는 충분한 리소스가 있는 경우 Minikube/kind를 사용하여 로컬 kubernetes 클러스터를 설정할 수 있습니다
- github 계정 CI(지속적 통합)를 위해 Github Actions를 사용할 예정이므로 무료 계정이면 충분합니다
- dockerhub 계정 우리는 컨테이너 이미지를 가져오기 위해 dockerhub를 사용할 것입니다
- 배우려는 열정
- 포기하지 않음 이것은 문제에 직면하게 될 중요한 문제이며 문제를 해결하고 해결할 수 있어야 합니다. 이 프로젝트를 완료하기까지 여러 번 문제를 해결해야 했습니다.
시작해보자
다단계 Docker 빌드로 앱 컨테이너화
모든 컴퓨터에서 웹 앱을 사용할 수 있으려면 컨테이너화해야 하며, 컨테이너화가 docker보다 가장 좋은 경우에는 컨테이너화가 필요합니다.
앱을 실행하기 위해 Dockerfile을 만들었지만 다단계 형식을 사용했습니다
왜 다단계 빌드를 해야 할까요?
이유는 간단합니다. 단일 단계에서 이미지를 생성하면 머신에서 더 많은 공간을 소비하는 반면, 다단계 빌드를 사용하면 빌드 환경과 런타임 환경을 분리하여 이미지의 최종 크기를 최적화하고 공격도 줄입니다. 더 나은 보안을 위해 이미지를 노출하세요
이렇게 할 수 있습니다
- dockerfile 만들기
- 빌드 단계에서 애플리케이션 컴파일
- 컴파일된 바이너리를 최소 기본 이미지에 복사
- CI의 Github Actions에서 이미지를 사용할 수 있도록 이미지를 빌드하고 dockerhub에 푸시합니다.
# Start with a base image FROM golang:1.22 as base WORKDIR /app COPY go.mod ./ RUN go mod download COPY . . RUN go build -o main . ####################################################### # Reduce the image size using multi-stage builds # We will use a distroless image to run the application FROM gcr.io/distroless/base # Copy the binary from the previous stage COPY --from=base /app/main . # Copy the static files from the previous stage COPY --from=base /app/static ./static # Expose the port on which the application will run EXPOSE 8080 # Command to run the application CMD ["./main"]
이제 dockerfile이 있으므로 이를 빌드하고 dockerhub에 배포해 보겠습니다.
docker build -t pankaj892/webapp:v1 .
앱이 로컬 컴퓨터에서 예상대로 작동하는지 확인하려고 합니다
docker run -p 8080:8080 pankaj892-webapp:v1
dockerhub에 푸시해 보겠습니다
docker push pankaj892/webapp:v1 .
Kubernetes 클러스터 생성
mininkube/kind를 사용하여 로컬로 클러스터를 생성하거나 클라우드에서 관리형 솔루션 중 하나를 사용할 수 있습니다. 저는 AWS의 Elastic Kubernetes Service(EKS)를 사용할 예정입니다.
콘솔이나 명령줄을 사용하여 EKS에서 클러스터를 시작할 수 있습니다. 저는 명령줄을 사용하겠습니다
eksctl create cluster--instance-selector-vcpus=2 --instance-selector-memory=4 --name <name-of-cluster> --region <region-code>
이렇게 하면 vCPU가 2개이고 메모리가 4GB인 노드 그룹의 머신 유형만 선택됩니다
Helm 차트 생성 및 구성
모든 리소스를 하나씩 배포할 수 있지만 규모가 커지면 관리하기가 어려울 것입니다. 여기서 Helm은 차트를 사용하여 모든 리소스를 관리하는 패키지 관리자 역할을 합니다.
헬름 차트 만들기
# Start with a base image FROM golang:1.22 as base WORKDIR /app COPY go.mod ./ RUN go mod download COPY . . RUN go build -o main . ####################################################### # Reduce the image size using multi-stage builds # We will use a distroless image to run the application FROM gcr.io/distroless/base # Copy the binary from the previous stage COPY --from=base /app/main . # Copy the static files from the previous stage COPY --from=base /app/static ./static # Expose the port on which the application will run EXPOSE 8080 # Command to run the application CMD ["./main"]
Helm은 우리가 사용할 파일을 생성하지만 우리 프로젝트에는 대부분의 파일이 필요하지 않습니다.
다음 파일을 생성하고 helm 디렉토리에 추가하세요
배포
eksctl create cluster--instance-selector-vcpus=2 --instance-selector-memory=4 --name <name-of-cluster> --region <region-code>
서비스
helm create web-app
인그레스
# This is a sample deployment manifest file for a simple web application. apiVersion: apps/v1 kind: Deployment metadata: name: web-app labels: app: web-app spec: replicas: 1 selector: matchLabels: app: web-app template: metadata: labels: app: web-app spec: containers: - name: web-app image: {{ .Values.image.repository }}:{{ .Values.image.tag }} ports: - containerPort: 8080
값 파일을 다음으로 업데이트하세요
# Service for the application apiVersion: v1 kind: Service metadata: name: web-app labels: app: web-app spec: ports: - port: 80 targetPort: 8080 protocol: TCP selector: app: web-app type: ClusterIP
이제 투구 부분이 완료되었으며 CI 배포로 넘어갑니다
Github Actions를 사용한 CI(지속적 통합)
Github Actions를 사용하면 push, pull과 같은 저장소의 일부 이벤트를 기반으로 앱 빌드 프로세스를 자동화할 수 있습니다.
파이프라인 파일을 만들어 보겠습니다
워크플로 파일은 (.github/workflows/cicd.yml)
에 저장됩니다.
# Ingress resource for the application apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-app annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx rules: - host: web-app.local http: paths: - path: / pathType: Prefix backend: service: name: web-app port: number: 80
이 워크플로 파일은 먼저 dockerfile에서 이미지를 빌드한 다음 dockerhub에 푸시한 다음 helm의charts.yaml 파일에 있는 이미지 태그를 업데이트합니다.
지속적인 전달을 위한 ArgoCD 설정
argocd는 git repo에서 변경 사항을 가져와 앱에서 업데이트할 수 있으므로 CD 파이프라인에 argocd를 사용할 것입니다.
클러스터에 argocd를 설치해 보겠습니다
kubectl은 네임스페이스 argocd를 생성합니다
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
argocd 서버에 액세스하려면 서비스를 로드밸런서 유형으로 변경해야 합니다
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
Windows의 경우
입니다.
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
작동하지 않으면 kubectl을 통해 서비스를 편집하고 유형을 LoadBalancer로 변경하면 작동합니다
이제 서비스 IP를 받아보세요
kubectl get svc argocd-server -n argocd
IP를 얻었지만 argocd에 로그인하려면 비밀번호가 필요합니다
kubectl 비밀 가져오기 argocd-initial-admin-secret -n argocd -o jsonpath="{.data.password}" | base64 --디코드
이 명령은 비밀번호가 base64 형식으로 인코딩되므로 비밀번호를 가져오고 비밀번호를 디코딩합니다
로그인한 후 새 프로젝트 > 프로젝트 이름 추가 > argocd가 저장소를 동기화할 수 있도록 저장소를 추가하세요 argocd는 자동으로 값 파일을 찾고 제출을 클릭한 후 해당 파일을 선택합니다
수신 및 DNS 매핑
파이프라인을 구축했지만 앱에 액세스하는 방법은 액세스할 때마다 EKS의 클러스터 URL에 넣을 수 없으므로 이를 위해 인그레스를 사용해야 합니다
앱에 액세스하기 위해 AWS의 Nginx Ingress를 사용하고 있습니다
클러스터에 수신 배포
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.1/deploy/static/provider/aws/deploy.yaml
이제 수신이 배포되었으며 EKS의 클러스터 IP를 Linux용 로컬 호스트 파일, Windows용 /etc/hosts(C:WindowsSystem32etchosts에 있음)에 추가해야 합니다.
# Start with a base image FROM golang:1.22 as base WORKDIR /app COPY go.mod ./ RUN go mod download COPY . . RUN go build -o main . ####################################################### # Reduce the image size using multi-stage builds # We will use a distroless image to run the application FROM gcr.io/distroless/base # Copy the binary from the previous stage COPY --from=base /app/main . # Copy the static files from the previous stage COPY --from=base /app/static ./static # Expose the port on which the application will run EXPOSE 8080 # Command to run the application CMD ["./main"]
이제 web-app.local에서 앱에 액세스할 수 있습니다
모든 단계를 완료하여 앱을 테스트했습니다
보시다시피 상단의 URL은 호스트 파일에 정의한 것입니다
앱이 실행 중입니다. 무언가를 추가하고 리포지토리에 커밋하면 argocd가 해당 변경 사항을 선택하여 앱에 배포할 수 있습니다.
저장소를 변경했는데 이로 인해 파이프라인이 실행됩니다
파이프라인이 시작되었으며 완료 후 argocd가 해당 변경 사항을 적용하는지 확인합니다
예, 앱에 변경 사항이 있습니다 argocd가 변경 사항을 선택하고 앱을 최신 변경 사항과 동기화했습니다
여기까지 오셨다면 축하드립니다!!!
이 프로젝트는 AWS에 kubernetes를 배포하는 것부터 파이프라인과 배포를 생성하고 문제를 해결하는 것까지 나에게 훌륭한 학습 경험이었습니다. 이 프로젝트는 Go 앱을 위한 엔드투엔드 DevOps 파이프라인을 만드는 데 도움이 되었으며 필요에 따라 확장할 수 있습니다. Terraform 또는 Cloudformation 스택을 사용하여 eks clutser를 배포하는 등 더 많은 것을 탐색하고 더 개선할 계획입니다.
어딘가에 막히면 이 저장소를 참조할 수 있습니다
이 파이프라인을 구축한 경험이 어땠는지 댓글로 알려주세요.
위 내용은 Gitops 및 Kubernetes를 사용하는 Golang 웹 앱의 Devops 파이프라인의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

Golang은 성능과 확장 성 측면에서 Python보다 낫습니다. 1) Golang의 컴파일 유형 특성과 효율적인 동시성 모델은 높은 동시성 시나리오에서 잘 수행합니다. 2) 해석 된 언어로서 파이썬은 천천히 실행되지만 Cython과 같은 도구를 통해 성능을 최적화 할 수 있습니다.

Golang은 동시성에서 C보다 낫고 C는 원시 속도에서 Golang보다 낫습니다. 1) Golang은 Goroutine 및 Channel을 통해 효율적인 동시성을 달성하며, 이는 많은 동시 작업을 처리하는 데 적합합니다. 2) C 컴파일러 최적화 및 표준 라이브러리를 통해 하드웨어에 가까운 고성능을 제공하며 극도의 최적화가 필요한 애플리케이션에 적합합니다.

goisidealforbeginnersandsuitableforcloudandnetworkservicesduetoitssimplicity, 효율성, 및 콘크리 론 피처

Golang은 빠른 개발 및 동시 시나리오에 적합하며 C는 극도의 성능 및 저수준 제어가 필요한 시나리오에 적합합니다. 1) Golang은 쓰레기 수집 및 동시성 메커니즘을 통해 성능을 향상시키고, 고전성 웹 서비스 개발에 적합합니다. 2) C는 수동 메모리 관리 및 컴파일러 최적화를 통해 궁극적 인 성능을 달성하며 임베디드 시스템 개발에 적합합니다.

Golang과 Python은 각각 고유 한 장점이 있습니다. Golang은 고성능 및 동시 프로그래밍에 적합하지만 Python은 데이터 과학 및 웹 개발에 적합합니다. Golang은 동시성 모델과 효율적인 성능으로 유명하며 Python은 간결한 구문 및 풍부한 라이브러리 생태계로 유명합니다.

Golang과 C의 성능 차이는 주로 메모리 관리, 컴파일 최적화 및 런타임 효율에 반영됩니다. 1) Golang의 쓰레기 수집 메커니즘은 편리하지만 성능에 영향을 줄 수 있습니다. 2) C의 수동 메모리 관리 및 컴파일러 최적화는 재귀 컴퓨팅에서 더 효율적입니다.

Golang과 C는 각각 공연 경쟁에서 고유 한 장점을 가지고 있습니다. 1) Golang은 높은 동시성과 빠른 발전에 적합하며 2) C는 더 높은 성능과 세밀한 제어를 제공합니다. 선택은 프로젝트 요구 사항 및 팀 기술 스택을 기반으로해야합니다.

golangisidealforbuildingscalablesystemsdueToitsefficiencyandconcurrency
