Go 웹 애플리케이션 DevOpsifying: 엔드투엔드 가이드

WBOY
풀어 주다: 2024-09-06 06:39:02
원래의
958명이 탐색했습니다.

소개

이번 게시물에서는 Go 기반 웹 애플리케이션을 DevOpsifying하는 과정을 안내해 드리겠습니다. Docker를 사용한 애플리케이션 컨테이너화부터 Helm을 사용하여 Kubernetes 클러스터(AWS EKS)에 배포, GitHub Actions와의 지속적인 통합 설정, ArgoCD를 사용한 배포 자동화에 이르기까지 모든 것을 다룹니다. 이 튜토리얼이 끝나면 완벽하게 작동하는 CI/CD 지원 Go 웹 애플리케이션을 갖게 됩니다.

전제 조건

이 프로젝트를 시작하기 전에 다음 전제 조건을 충족하는지 확인하세요.

AWS 계정: Go 기반 애플리케이션을 배포하기 위해 EKS 클러스터를 생성하고 관리하려면 활성 AWS 계정이 필요합니다.

DockerHub 계정: Docker 이미지를 푸시하려면 DockerHub 계정이 있어야 합니다.

기본 DevOps 지식: CI/CD 파이프라인, 컨테이너화, 오케스트레이션, 클라우드 배포에 대한 이해를 포함하여 DevOps 개념과 실무에 대한 지식이 필수적입니다.

Helm: 애플리케이션을 패키징하고 배포하려면 Kubernetes 패키지 관리자인 Helm에 대한 기본 지식이 필요합니다.

이러한 전제 조건을 충족하면 이 가이드의 단계를 따르고 Go 기반 애플리케이션을 성공적으로 DevOpsify할 수 있는 준비가 된 것입니다!

1단계: 소스 코드 얻기

프로젝트를 시작하려면 GitHub 저장소에서 소스 코드를 복제해야 합니다. 프로젝트를 복제하려면 다음 명령을 사용하십시오.

git clone https://github.com/iam-veeramalla/go-web-app-devops.git
로그인 후 복사

이 저장소에는 이 가이드에 설명된 DevOps 방식을 사용하여 Go 기반 애플리케이션을 설정하고 배포하는 데 필요한 모든 파일과 구성이 포함되어 있습니다. 복제한 후에는 아래 단계를 탐색하고 이에 따라 애플리케이션을 컨테이너화, 배포 및 관리할 수 있습니다.

2단계: Go 웹 애플리케이션 컨테이너화

첫 번째 단계는 Go 애플리케이션을 컨테이너화하는 것입니다. 다단계 Dockerfile을 사용하여 Go 애플리케이션을 구축하고 프로덕션에 바로 사용할 수 있는 경량 이미지를 생성하겠습니다.

FROM golang:1.22.5 as build

WORKDIR /app

COPY go.mod .

RUN go mod download

COPY . .

RUN go build -o main .

FROM gcr.io/distroless/base

WORKDIR /app

COPY --from=build /app/main .

COPY --from=build /app/static ./static

EXPOSE 8080

CMD ["./main"]
로그인 후 복사

Docker 이미지 빌드 및 푸시 명령:

docker login
docker build . -t go-web-app
docker push go-web-app:latest
로그인 후 복사

이 Dockerfile의 첫 번째 단계에서는 Golang 이미지를 사용하여 애플리케이션을 빌드합니다. 두 번째 단계에서는 Go 애플리케이션을 실행하는 데 필요한 파일만 포함되어 훨씬 더 작고 더 안전한 distroless 기본 이미지를 사용합니다.

3단계: AWS EKS를 사용하여 Kubernetes에 배포

다음으로 컨테이너화된 애플리케이션을 Kubernetes 클러스터에 배포하겠습니다. 클러스터를 설정하고 앱을 배포하는 방법은 다음과 같습니다.

EKS 클러스터 생성:

eksctl create cluster --name demo-cluster --region us-east-1
로그인 후 복사

배포 구성(deployment.yaml):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-web-app
  labels:
    app: go-web-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: go-web-app
  template:
    metadata:
      labels:
        app: go-web-app
    spec:
      containers:
      - name: go-web-app
        image: iamamash/go-web-app:latest
        ports:
        - containerPort: 8080
로그인 후 복사

서비스 구성(service.yaml):

apiVersion: v1
kind: Service
metadata:
  name: go-web-app
  labels:
    app: go-web-app
spec:
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
  selector:
    app: go-web-app
  type: ClusterIP
로그인 후 복사

수신 구성(ingress.yaml):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-web-app
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - host: go-web-app.local
    http:
      paths: 
      - path: /
        pathType: Prefix
        backend:
          service:
            name: go-web-app
            port:
              number: 80
로그인 후 복사

kubectl을 사용하여 구성을 적용합니다.

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml

로그인 후 복사

Nginx 수신 컨트롤러 설정:

Kubernetes의 Ingress 컨트롤러는 클러스터 내 서비스에 대한 외부 액세스를 관리하며 일반적으로 HTTP 및 HTTPS 트래픽을 처리합니다. 중앙 집중식 라우팅을 제공하므로 트래픽이 서비스에 도달하는 방법에 대한 규칙을 정의할 수 있습니다. 이 프로젝트에서는 Nginx Ingress 컨트롤러를 사용하여 Kubernetes 클러스터에 배포된 Go 기반 애플리케이션에 대한 트래픽을 효율적으로 관리하고 라우팅합니다.

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.1/deploy/static/provider/aws/deploy.yaml
로그인 후 복사

4단계: Helm으로 패키징

Kubernetes 리소스를 보다 효과적으로 관리하기 위해 Kubernetes용 패키지 관리자인 Helm을 사용하여 애플리케이션을 패키징합니다.

헬름 차트 만들기:

helm create go-web-app-chart
로그인 후 복사

차트를 생성한 후 템플릿 디렉터리 내부의 모든 항목을 배포.yaml, service.yaml 및 ingress.yaml 파일로 바꿉니다.

values.yaml 업데이트: value.yaml 파일에는 Docker 이미지 태그와 같은 동적 값이 포함됩니다. 이 태그는 GitHub Actions 실행 ID를 기반으로 자동으로 업데이트되므로 각 배포가 고유하게 유지됩니다.

# Default values for go-web-app-chart.
replicaCount: 1

image:
  repository: iamamash/Go-Web-App
  pullPolicy: IfNotPresent
  tag: "10620920515" # Will be updated by CI/CD pipeline

ingress:
  enabled: false
  className: ""
  annotations: {}
  hosts:
    - host: chart-example.local
      paths:
        - path: /
          pathType: ImplementationSpecific
로그인 후 복사

헬름 배포:

kubectl delete -f k8s/.
helm install go-web-app helm/go-web-app-chart
kubectl get all
로그인 후 복사

5단계: GitHub Actions와의 지속적인 통합

애플리케이션 빌드 및 배포를 자동화하기 위해 GitHub Actions를 사용하여 CI/CD 파이프라인을 설정했습니다.

GitHub 작업 워크플로(.github/workflows/cicd.yaml):

name: CI/CD

on:
  push:
    branches:
      - main
    paths-ignore:
      - 'helm/**'
      - 'README.md'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout repository
      uses: actions/checkout@v4

    - name: Set up Go 1.22
      uses: actions/setup-go@v2
      with:
        go-version: 1.22

    - name: Build
      run: go build -o go-web-app

    - name: Test
      run: go test ./...

  push:
    runs-on: ubuntu-latest
    needs: build
    steps:
    - name: Checkout repository
      uses: actions/checkout@v4

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v1

    - name: Login to DockerHub
      uses: docker/login-action@v3
      with:
        username: ${{ secrets.DOCKERHUB_USERNAME }}
        password: ${{ secrets.DOCKERHUB_TOKEN }}

    - name: Build and Push action
      uses: docker/build-push-action@v6
      with:
        context: .
        file: ./Dockerfile
        push: true
        tags: ${{ secrets.DOCKERHUB_USERNAME }}/go-web-app:${{github.run_id}}

  update-newtag-in-helm-chart:
    runs-on: ubuntu-latest
    needs: push
    steps:
    - name: Checkout repository
      uses: actions/checkout@v4
      with:
        token: ${{ secrets.TOKEN }}

    - name: Update tag in Helm chart
      run: |
        sed -i 's/tag: .*/tag: "${{github.run_id}}"/' helm/go-web-app-chart/values.yaml

    - name: Commit and push changes
      run: |
        git config --global user.email "ansari2002ksp@gmail.com"
        git config --global user.name "Amash Ansari"
        git add helm/go-web-app-chart/values.yaml
        git commit -m "Updated tag in Helm chart"
        git push
로그인 후 복사

To securely store sensitive information like DockerHub credentials and Personal Access Tokens (PAT) in GitHub, you can use GitHub Secrets. To create a secret, navigate to your repository on GitHub, go to Settings > Secrets and variables > Actions > New repository secret. Here, you can add secrets like DOCKERHUB_USERNAME, DOCKERHUB_TOKEN, and TOKEN. Once added, these secrets can be accessed in your GitHub Actions workflows using ${{ secrets.SECRET_NAME }} syntax, ensuring that your sensitive data is securely managed during the CI/CD process.

Step 6: Continuous Deployment with ArgoCD

Finally, we implement continuous deployment using ArgoCD to automatically deploy the application whenever changes are pushed.

Install ArgoCD:

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
kubectl get svc argocd-server -n argocd
로그인 후 복사

Setup ArgoCD Project: To access the ArgoCD UI after setting it up, you first need to determine the external IP of the node where ArgoCD is running. You can obtain this by running the command:

kubectl get nodes -o wide
로그인 후 복사

Next, get the port number at which the ArgoCD server is running using:

kubectl get svc argocd-server -n argocd
로그인 후 복사

Once you have the external IP and port number, you can access the ArgoCD UI by navigating to http://:. For example, if the external IP is 54.161.25.151 and the port number is 30498, the URL to access ArgoCD UI would be http://54.161.25.151:30498.

To log in to the ArgoCD UI for the first time, use the default username admin. The password can be retrieved from the ArgoCD secrets using:

kubectl edit secret argocd-initial-admin-secret -n argocd
로그인 후 복사

Copy the encoded password from the data.password field and decode it using base64:

echo <encoded-password> | base64 --decode
로그인 후 복사

For example, if the encoded password is kjasdfbSNLnlkaW==, decoding it with:

echo kjasdfbSNLnlkaW== | base64 --decode
로그인 후 복사

will provide the actual password. Be sure to exclude any trailing % symbol from the decoded output when using the password to log in.

Now, after accessing the ArgoCD UI, since both ArgoCD and the application are in the same cluster, you can create a project. To do this, click on the "New App" button and fill in the required fields, such as:

  • App Name: Provide a name for your application.
  • Sync Policy: Choose between manual or automatic synchronization.
  • Self-Heal: Enable this option if you want ArgoCD to automatically fix any drift.
  • Source Path: Enter the GitHub repository URL where your application code resides.
  • Helm Chart Path: Specify the path to the Helm chart within your repository.
  • Destination: Set the Cluster URL and namespace where you want the application deployed.
  • Helm Values: Select the appropriate values.yaml file for your Helm chart.

After filling in these details, click on "Create" and wait for ArgoCD to create the project. ArgoCD will pick up the Helm chart and deploy the application to the Kubernetes cluster for you. You can verify the deployment using:

kubectl get all
로그인 후 복사

That's all you need to do!

Conclusion

Congratulations! You have successfully DevOpsified your Go web application. This end-to-end guide covered containerizing your application with Docker, deploying it with Kubernetes and Helm, automating builds with GitHub Actions, and setting up continuous deployments with ArgoCD. You are now ready to manage your Go application with full CI/CD capabilities.

DevOpsifying a Go Web Application: An End-to-End Guide

Feel free to leave your comments and feedback below! Happy DevOpsifying!

Reference

For a detailed video guide on deploying Go applications on AWS EKS, check out this video.

위 내용은 Go 웹 애플리케이션 DevOpsifying: 엔드투엔드 가이드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿