始めましょう
Web アプリをすべてのマシンで利用できるようにするには、Web アプリをコンテナ化する必要があります。コンテナ化という言葉を使う場合、Docker よりも優れたものがあります。
アプリを実行するために Dockerfile を作成しましたが、マルチステージ形式を使用しました
理由は簡単です。単一ステージでイメージを作成すると、マシン上のより多くのスペースを消費することになりますが、マルチステージ ビルドを使用すると、ビルド環境とランタイム環境を分離することでイメージの最終的なサイズが最適化され、攻撃も軽減されます。セキュリティを強化するために画像の表面に表示されます
その方法は次のとおりです
# 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 .
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 のメモリを持つノード グループのマシン タイプのみが選択されます
すべてのリソースを 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 を使用すると、プッシュ、プルなどのリポジトリ内のいくつかのイベントに基づいてアプリのビルド プロセスを自動化できます。
パイプライン ファイルを作成しましょう
ワークフロー ファイルは (.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 は 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 は自動的に値ファイルを検索し、それを選択します。その後、[送信] をクリックします
パイプラインを構築しましたが、アプリにアクセスするにはどうすればよいですか。アクセスするたびに 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 のアプリにアクセスできるようになりました
すべての手順が完了したので、アプリをテストしてみましょう
ご覧のとおり、上部の URL は hosts ファイルで定義したものです
アプリが実行されているので、何かを追加してリポジトリにコミットして、argocd がその変更を取得してアプリにデプロイできるようにします
リポジトリに変更を加えたので、パイプラインがトリガーされるはずです
パイプラインが開始されました。完了したら、argocd がその変更を認識するかどうかを確認してください
はい、アプリに変更が見られます。argocd は変更を取得し、アプリを最新の変更と同期しました。
ここまで進んだなら、おめでとうございます!!!
このプロジェクトは、AWS での kubernetes のデプロイから、パイプラインとデプロイの作成、トラブルシューティングに至るまで、私にとって素晴らしい学習体験でした。このプロジェクトは、Go アプリ用のエンドツーエンドの Devops パイプラインを作成するのに役立ちました。ニーズに応じて拡張可能です。 Terraform または CloudFormation スタックを使用して eks clutser をデプロイするなど、さらに検討し、さらに改良する予定です。
どこかで行き詰まった場合は、このリポジトリを参照してください
このパイプラインを構築した経験はどうでしたか、コメントで教えてください。
以上がGitops と Kubernetes を使用した Golang Web アプリ上の Devops パイプラインの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。