찾다
백엔드 개발GolangGitops 및 Kubernetes를 사용하는 Golang 웹 앱의 Devops 파이프라인

이 블로그 게시물에서는 CI/CD 파이프라인과 Gitops 접근 방식을 사용하여 golang에서 웹 앱 배포를 자동화하는 과정을 안내하겠습니다.

앱을 컨테이너화하여 kubernetes에 배포하고 ArgoCD를 사용하여 배포하는 방법을 살펴보겠습니다.

요구사항

  1. Kubernetes 클러스터 kubernetes용 클라우드 제공업체의 관리형 서비스를 사용할 수 있습니다. 시스템에 kubernetes 클러스터를 프로비저닝할 수 있는 충분한 리소스가 있는 경우 Minikube/kind를 사용하여 로컬 kubernetes 클러스터를 설정할 수 있습니다
  2. github 계정 CI(지속적 통합)를 위해 Github Actions를 사용할 예정이므로 무료 계정이면 충분합니다
  3. dockerhub 계정 우리는 컨테이너 이미지를 가져오기 위해 dockerhub를 사용할 것입니다
  4. 배우려는 열정
  5. 포기하지 않음 이것은 문제에 직면하게 될 중요한 문제이며 문제를 해결하고 해결할 수 있어야 합니다. 이 프로젝트를 완료하기까지 여러 번 문제를 해결해야 했습니다.

시작해보자

다단계 Docker 빌드로 앱 컨테이너화

모든 컴퓨터에서 웹 앱을 사용할 수 있으려면 컨테이너화해야 하며, 컨테이너화가 docker보다 가장 좋은 경우에는 컨테이너화가 필요합니다.
앱을 실행하기 위해 Dockerfile을 만들었지만 다단계 형식을 사용했습니다

왜 다단계 빌드를 해야 할까요?

이유는 간단합니다. 단일 단계에서 이미지를 생성하면 머신에서 더 많은 공간을 소비하는 반면, 다단계 빌드를 사용하면 빌드 환경과 런타임 환경을 분리하여 이미지의 최종 크기를 최적화하고 공격도 줄입니다. 더 나은 보안을 위해 이미지를 노출하세요

이렇게 할 수 있습니다

  1. dockerfile 만들기
  2. 빌드 단계에서 애플리케이션 컴파일
  3. 컴파일된 바이너리를 최소 기본 이미지에 복사
  4. 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> 
</region-code></name-of-cluster>

이렇게 하면 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> 
</region-code></name-of-cluster>

서비스

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는 자동으로 값 파일을 찾고 제출을 클릭한 후 해당 파일을 선택합니다

Devops pipeline on a Golang Web App with Gitops and Kubernetes

수신 및 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에서 앱에 액세스할 수 있습니다

모든 단계를 완료하여 앱을 테스트했습니다

Devops pipeline on a Golang Web App with Gitops and Kubernetes

보시다시피 상단의 URL은 호스트 파일에 정의한 것입니다

Devops pipeline on a Golang Web App with Gitops and Kubernetes

앱이 실행 중입니다. 무언가를 추가하고 리포지토리에 커밋하면 argocd가 해당 변경 사항을 선택하여 앱에 배포할 수 있습니다.

저장소를 변경했는데 이로 인해 파이프라인이 실행됩니다

Devops pipeline on a Golang Web App with Gitops and Kubernetes

파이프라인이 시작되었으며 완료 후 argocd가 해당 변경 사항을 적용하는지 확인합니다

Devops pipeline on a Golang Web App with Gitops and Kubernetes

예, 앱에 변경 사항이 있습니다 argocd가 변경 사항을 선택하고 앱을 최신 변경 사항과 동기화했습니다

여기까지 오셨다면 축하드립니다!!!

이 프로젝트는 AWS에 kubernetes를 배포하는 것부터 파이프라인과 배포를 생성하고 문제를 해결하는 것까지 나에게 훌륭한 학습 경험이었습니다. 이 프로젝트는 Go 앱을 위한 엔드투엔드 DevOps 파이프라인을 만드는 데 도움이 되었으며 필요에 따라 확장할 수 있습니다. Terraform 또는 Cloudformation 스택을 사용하여 eks clutser를 배포하는 등 더 많은 것을 탐색하고 더 개선할 계획입니다.

어딘가에 막히면 ​​이 저장소를 참조할 수 있습니다

이 파이프라인을 구축한 경험이 어땠는지 댓글로 알려주세요.

위 내용은 Gitops 및 Kubernetes를 사용하는 Golang 웹 앱의 Devops 파이프라인의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
Golang과 Python : 차이점을 이해합니다Golang과 Python : 차이점을 이해합니다Apr 18, 2025 am 12:21 AM

Golang과 Python의 주요 차이점은 동시성 모델, 유형 시스템, 성능 및 실행 속도입니다. 1. Golang은 동시 작업에 적합한 CSP 모델을 사용합니다. Python은 I/O 집약적 인 작업에 적합한 멀티 스레딩 및 Gil에 의존합니다. 2. Golang은 정적 유형이며 Python은 동적 유형입니다. 3. Golang 컴파일 된 언어 실행 속도는 빠르며 파이썬 해석 언어 개발은 ​​빠릅니다.

Golang vs. C : 속도 차이 평가Golang vs. C : 속도 차이 평가Apr 18, 2025 am 12:20 AM

Golang은 일반적으로 C보다 느리지 만 Golang은 동시 프로그래밍 및 개발 효율에 더 많은 장점이 있습니다. 1) Golang의 쓰레기 수집 및 동시성 모델은 높은 동시 시나리오에서 잘 수행합니다. 2) C는 수동 메모리 관리 및 하드웨어 최적화를 통해 더 높은 성능을 얻지 만 개발 복잡성이 높습니다.

Golang : 클라우드 컴퓨팅 및 DevOps의 핵심 언어Golang : 클라우드 컴퓨팅 및 DevOps의 핵심 언어Apr 18, 2025 am 12:18 AM

Golang은 클라우드 컴퓨팅 및 DevOps에서 널리 사용되며 장점은 단순성, 효율성 및 동시 프로그래밍 기능에 있습니다. 1) 클라우드 컴퓨팅에서 Golang은 Goroutine 및 채널 메커니즘을 통해 동시 요청을 효율적으로 처리합니다. 2) DevOps에서 Golang의 빠른 편집 및 크로스 플랫폼 기능이 자동화 도구의 첫 번째 선택입니다.

Golang 및 C : 실행 효율성 이해Golang 및 C : 실행 효율성 이해Apr 18, 2025 am 12:16 AM

Golang과 C는 각각 성능 효율성에서 고유 한 장점을 가지고 있습니다. 1) Golang은 Goroutine 및 Garbage Collection을 통해 효율성을 향상 시키지만 일시 중지 시간을 도입 할 수 있습니다. 2) C는 수동 메모리 관리 및 최적화를 통해 고성능을 인식하지만 개발자는 메모리 누출 및 기타 문제를 처리해야합니다. 선택할 때는 프로젝트 요구 사항 및 팀 기술 스택을 고려해야합니다.

Golang vs. Python : 동시성 및 멀티 스레딩Golang vs. Python : 동시성 및 멀티 스레딩Apr 17, 2025 am 12:20 AM

Golang은 높은 동시성 작업에 더 적합하지만 Python은 유연성에 더 많은 장점이 있습니다. 1. Golang은 Goroutine 및 채널을 통해 동시성을 효율적으로 처리합니다. 2. Python은 GIL의 영향을받는 스레딩 및 Asyncio에 의존하지만 여러 동시성 방법을 제공합니다. 선택은 특정 요구 사항을 기반으로해야합니다.

Golang 및 C : 성능 상충Golang 및 C : 성능 상충Apr 17, 2025 am 12:18 AM

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

Golang vs. Python : 응용 프로그램 및 사용 사례Golang vs. Python : 응용 프로그램 및 사용 사례Apr 17, 2025 am 12:17 AM

선택 GOLANGFORHIGHERFERFERFORMANDCONDCURRENCY, TILDFORBECTERVICES 및 NNETWORKPRAMPHING; SELECTPYTHONFORRAPIDDEVENTURMENT, DATASCIENCE 및 MACHINEARNINGDUETOITSTINTIVENDEXTENDIVERIRIES.

Golang vs. Python : 주요 차이점과 유사성Golang vs. Python : 주요 차이점과 유사성Apr 17, 2025 am 12:15 AM

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

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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