ホームページ > バックエンド開発 > Golang > Gitops と Kubernetes を使用した Golang Web アプリ上の Devops パイプライン

Gitops と Kubernetes を使用した Golang Web アプリ上の Devops パイプライン

Patricia Arquette
リリース: 2024-10-24 02:44:29
オリジナル
419 人が閲覧しました

このブログ投稿では、CI/CD パイプラインと Gitops アプローチを使用して、Golang で Web アプリのデプロイを自動化する過程を説明します。

アプリのコンテナ化から kubernetes へのデプロイ、デプロイに ArgoCD を使用するまでを見ていきます。

要件

  1. kubernetes クラスター Kubernetes 用のクラウド プロバイダーのマネージド サービスのいずれかを使用できます。または、システムに Kubernetes クラスターをプロビジョニングするのに十分なリソースがある場合は、Minikube/kind
  2. を使用してローカル Kubernetes クラスターをセットアップできます。
  3. github アカウント 継続的インテグレーション (CI) に Github Actions を使用するため、無料アカウントで十分です
  4. dockerhub アカウント dockerhub を使用してコンテナ イメージをプルします
  5. 学習意欲
  6. 諦めないで これは問題に直面する際に重要であり、問​​題のトラブルシューティングを行って解決できる必要があります。このプロジェクトを完了するまでに、何度もトラブルシューティングを行う必要がありました。

始めましょう

マルチステージ Docker ビルドによるアプリのコンテナ化

Web アプリをすべてのマシンで利用できるようにするには、Web アプリをコンテナ化する必要があります。コンテナ化という言葉を使う場合、Docker よりも優れたものがあります。
アプリを実行するために Dockerfile を作成しましたが、マルチステージ形式を使用しました

なぜマルチステージビルドなのか?

理由は簡単です。単一ステージでイメージを作成すると、マシン上のより多くのスペースを消費することになりますが、マルチステージ ビルドを使用すると、ビルド環境とランタイム環境を分離することでイメージの最終的なサイズが最適化され、攻撃も軽減されます。セキュリティを強化するために画像の表面に表示されます

その方法は次のとおりです

  1. dockerfile を作成する
  2. ビルド段階でアプリケーションをコンパイルします
  3. コンパイルされたバイナリを最小限のベースイメージにコピーします
  4. イメージをビルドして dockerhub にプッシュすると、イメージが CI の Github Actions で使用できるようになります。
# 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 プッシュ 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> 
ログイン後にコピー
ログイン後にコピー

これにより、2 つの vCPU と 4 GB のメモリを持つノード グループのマシン タイプのみが選択されます

Helm チャートの作成と構成

すべてのリソースを 1 つずつデプロイできますが、スケールが大きくなると管理するのが難しくなります。ここで 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
ログイン後にコピー

Helm 部分は完了しました。CI のデプロイに進みましょう

Github Actions を使用した継続的インテグレーション (CI)

Github Actions を使用すると、プッシュ、プルなどのリポジトリ内のいくつかのイベントに基づいてアプリのビルド プロセスを自動化できます。

パイプライン ファイルを作成しましょう
ワークフロー ファイルは (.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 リポジトリから変更を取得してアプリ内で更新できるため、Cd パイプラインには argocd を使用します。

クラスターに argocd をインストールしましょう

kubectl create namespace 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 get Secret argocd-initial-admin-secret -n argocd -o jsonpath="{.data.password}" | base64 --decode

パスワードはbase64形式でエンコードされているため、このコマンドはパスワードを取得してデコードします

ログイン後、[新しいプロジェクト] をクリックします。プロジェクトの名前を追加します > argocd がリポジトリを同期できるようにリポジトリを追加します。argocd は自動的に値ファイルを検索し、それを選択します。その後、[送信] をクリックします

Devops pipeline on a Golang Web App with Gitops and Kubernetes

イングレスとDNSのマッピング

パイプラインを構築しましたが、アプリにアクセスするにはどうすればよいですか。アクセスするたびに EKS からクラスター URL を入力することはできません。これには Ingress を使用する必要があります。

アプリにアクセスできるように、AWS の Nginx Ingress を使用しています

クラスターに Ingress をデプロイします

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.1/deploy/static/provider/aws/deploy.yaml

これで Ingress がデプロイされ、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 は hosts ファイルで定義したものです

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 Web アプリ上の Devops パイプラインの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート