視聴者:フリーランサーや小さなチームで、Kubernetesに信頼できる、安価な配達を必要としています. これは、コピーパステーブルなコードと追加の説明をたくさん含む長い、実践的なガイドです。 トップ > DR GitHub Actions で Docker 画像を構築し、Commit SHA で各画像をタグし、GitHub Container Registry (GHCR) を使用して GITHUB_TOKEN を組み込み、Helm で Kubernetes に展開します。 Kubernetes デプロイメントに依存してアップデートを回転させ、ワイヤーの準備 + ライバリティの探査機を搭載して、ポットが準備が整うまでトラフィックを取得しないようにしてください(そして、吊るされた場合に再起動してください)。 (1) shipping :latest、 (2) not waiting for rollouts, (3) giving CI cluster-admin. Fixes: tag or digest-pin images, wait on the rollout, and scope deploy permissions with RBAC in the target namespace. (Kubernetes) コンテンツテーブル なぜこのステックはフリーランサーに合うのか アーキテクチャ One Picture One-time setup & context you’ll need. あなたが必要とするインストール 実際に実行できる小さなサンプルアプリ(Node.js) Dockerfile: Multi-stage build, explained (ドッカーファイル:多段階構築、説明) ヘルメットグラフの構造と価値:何が起きているのか、そしてなぜか CI:GitHub Actions workflow to build/tag/push(キャッシュ付き) CD:ヘルメットのアップグレード、セキュアタイムアウト、ロールアウトチェック サプライズダウンタイムを防ぐ健康検査 Pitfalls I see weekly (and how to avoid them) 最低 RBAC for CI (no more cluster-admin) プライベートレジストリ & imagePullSecrets (GHCR note) Rollbacks, who does what, and a quick “am I healthy?” A reusable repo layout & a secrets checklist シークレット オプション: the same loop with Kustomize 附属書:追加CIステップ(テスト、同期、喫煙検査) 参照 1)なぜこのステックはフリーランサーに合うのか あなたがソロや小さなチームで働いているとき、あなたは 粘着ツールを一緒に費やすのは、あなたが請求できる時間です. 下記の組み合わせは、爆発半径を小さくし、移動する部品を理解できるようにします: ダン GitHub アクション + GHCR:あなたはすでにあなたのコードを GitHub に保存しています; Actions はあなたのビルドを実行し、GHCR はあなたの画像を同じ信頼の限界に保つ。 適切なワークフローの許可で、組み込みの GITHUB_TOKEN は画像を押すのに十分です - 回転するための追加のトークンはありません、管理するための追加のアカウントはありません。 グラフは、デフォルトの明確な場所(values.yaml)と、環境ごとにそれらを表す簡単な方法を持つテンプレートにすぎません。 Kubernetes Deployments: rolling updates are the default—Kubernetes gradually replaces old pods with new ones and only declares success after the new ReplicaSet becomes ready. (Kubernetes) 古い pods を新しい pods に徐々に置き換え、新しい ReplicaSet が準備が整った後にのみ成功を宣言します。 (2)1枚の写真の建築 最後のステップが重要: デプロイメントが実際に健全であるまで(あるいはタイムアウト)、つまり、グリーンパイプラインが健全なアプリケーションに並び、単に「適用された表現」ではないことを意味します。 ) your pipeline blocks キューブレット 3) One-time setup & context you will need kubectl on the runner and on your machine. Use the official install so versions match your cluster's supported skew (typically ±1 minor). (Kubernetes) Helm v3 on the runner. The official install page documents the script many people use in CI. (ヘルム) OCI ラベル org.opencontainers.image.source を Dockerfile に追加し、GHCR がパッケージを repo に自動リンクするようにします。 if your 後ろから先へ進むと、不思議なエラーを追いかけます。公式ドキュメントは「1マイナー内」のルールを呼びかけます。 ) Why versions/skew matters: kubectl キューブレット 4)実際に実行できる小さなサンプルアプリ(Node.js) Kubernetes 探査機に直接マップする 2 つのエンドポイント: // app/server.js import http from 'node:http'; const port = process.env.PORT || 3000; let ready = false; // Simulate warm-up work: DB connection, JIT, caches... setTimeout(() => (ready = true), 3000); const server = http.createServer((req, res) => { if (req.url === '/livez') return res.end('ok'); // liveness probe if (req.url === '/healthz') return res.end(ready ? 'ok' : 'starting'); // readiness probe res.writeHead(200, { 'content-type': 'text/plain' }); res.end('hello'); }); server.listen(port, () => console.log(`listening on ${port}`)); A 最小限 テストを迅速に行うことができます: package.json { "name": "demo-app", "type": "module", "scripts": { "start": "node app/server.js", "test": "node -e \"const http=require('http');http.get('http://127.0.0.1:3000',r=>process.exit(r.statusCode===200?0:1))\"" }, "dependencies": {} } ポイント of そして Kubernetes はそれらを異なる方法で扱う- ゲートトラフィック コンテナを再起動しますが、両方ともデプロイにワイヤーを送ります。 ) /healthz /livez readiness liveness キューブレット 5)Dockerfile: Multi-stage build, explained (ドッカーファイル:複数の段階の構築、説明) なぜ複数の段階なのか? 構築ツール(コンパイラ、バンドラー)は実行時に必要ありません。 そして ステージはより小さく、より速く、より安全な画像を生成します。公式のDockerドキュメントは、生産のための複数のステージビルドを明示的に推奨します。 ) build runtime Docker ドキュメンタリー # Dockerfile # -------- build stage -------- FROM node:20 AS build WORKDIR /app COPY package*.json ./ RUN npm ci --omit=dev COPY . . # leave only prod deps RUN npm prune --omit=dev # -------- runtime stage -------- FROM node:20-slim WORKDIR /app COPY --from=build /app ./ EXPOSE 3000 CMD ["node","app/server.js"] # helps GHCR link this image to your repo automatically LABEL org.opencontainers.image.source="https://github.com/your-org/your-repo" マルチアーキ画像(arm64 laptop、amd64 server)が必要な場合は、 QEMUは、これを1つのワークフローで可能にします。 ) Buildx Docker ドキュメンタリー 6)ヘルメットグラフの構造と価値:何が起きているのか、そしてなぜか Helm charts are folders with a specific layout; defaults live in. ヘルムグラフは、特定のレイアウトを持つフォルダです。 そして、寺院は下に住む。 環境ごとにデフォルトを上回ることができます。 INLINE ( ) ) values.yaml templates/ --values path.yaml --set key=value ヘルメット chart/Chart.yaml apiVersion: v2 name: app description: Minimal demo app type: application version: 0.1.0 # chart version appVersion: "0.1.0" # your app version (for humans; not enforced) (Defaults you will override in CI) chart/values.yaml image: repository: ghcr.io/your-org/your-repo/app tag: "CHANGE_ME" # CI will set this to the commit SHA pullPolicy: IfNotPresent service: type: ClusterIP port: 80 targetPort: 3000 replicaCount: 2 resources: requests: { cpu: 100m, memory: 128Mi } limits: { cpu: 500m, memory: 256Mi } # optional if using private images # imagePullSecrets: # - name: ghcr-pull (試用+ローリングアップデート) chart/templates/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: {{ include "app.fullname" . }} labels: app.kubernetes.io/name: {{ include "app.name" . }} spec: replicas: {{ .Values.replicaCount }} strategy: { type: RollingUpdate } selector: matchLabels: app.kubernetes.io/name: {{ include "app.name" . }} template: metadata: labels: app.kubernetes.io/name: {{ include "app.name" . }} spec: {{- if .Values.imagePullSecrets }} imagePullSecrets: {{- range .Values.imagePullSecrets }} - name: {{ .name }} {{- end }} {{- end }} containers: - name: app image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} ports: - containerPort: {{ .Values.service.targetPort }} readinessProbe: httpGet: { path: /healthz, port: {{ .Values.service.targetPort }} } initialDelaySeconds: 5 periodSeconds: 5 livenessProbe: httpGet: { path: /livez, port: {{ .Values.service.targetPort }} } initialDelaySeconds: 15 periodSeconds: 10 chart/templates/service.yaml apiVersion: v1 kind: Service metadata: name: {{ include "app.fullname" . }} spec: type: {{ .Values.service.type }} selector: app.kubernetes.io/name: {{ include "app.name" . }} ports: - port: {{ .Values.service.port }} targetPort: {{ .Values.service.targetPort }} より乾燥したアプローチを好む場合は、a トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > ( ) _helpers.tpl ヘルメット CI:GitHub Actions to build, tag, and push(キャッシュ付き) Dockerの公式アクションを使用します: で、 そして、 We tag the image with the あらゆる動きが一変し、一変しつつある。 のために ( ) で、 ) setup-buildx login build-push commit SHA packages: write GITHUB_TOKEN GitHub GitHubドキュメント .github/workflows/ci.yml name: ci on: push: branches: [ "main" ] permissions: contents: read packages: write # allow pushing to GHCR (least privilege) jobs: build-and-push: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 # optional: speed up local tests - uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - run: npm ci - run: npm test - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log in to GHCR uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push image uses: docker/build-push-action@v6 with: context: . push: true tags: ghcr.io/${{ github.repository }}/app:${{ github.sha }} cache-from: type=gha cache-to: type=gha,mode=max ここでいくつかのゴッホ: ワークフローの許可はパッケージの書き込みを許可する必要がありますが、GHCR は push を拒否します. You can set defaults in repo settings and still restrict per workflow/job. (GitHub Docs) org.opencontainers.image.source で画像をラベル化することで、GHCR はパッケージをリポ UI に再接続できます。 Buildx は、Docker の CI ガイドで文書化されたキャッシュおよびマルチアーキのサポートで、Actions で画像を構築するための推奨方法です。 Kubernetes は文字通り画像参照を処理します。 タグは、何が実行されているかを知るのが難しくなり、引き出しポリシーのデフォルトをトライすることもできます。 (※) ) 完璧な再生可能性のために - Kubernetes は消化剤をネイティブにサポートします。 ) Why SHA tags instead of :latest :latest digest image@sha256:... キューブレット (8)CD:ヘルメットのアップグレード、セキュアタイムアウト、および展開チェック 成功した押しのあとで、 初回と繰り返しのデプロイの両方に対応します。 (ブロックが完成するまで、 (永遠に待たないで) (自動回転失敗) その後、追加のセキュリティネットとして、 プロジェクトの進捗状況を確認する( で、 ) helm upgrade --install --wait --timeout --atomic kubectl rollout status ヘルメット キューブレット deploy: needs: build-and-push runs-on: ubuntu-latest environment: production steps: - uses: actions/checkout@v4 - name: Install kubectl (official) run: | curl -LO "https://dl.k8s.io/release/$(curl -Ls https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" chmod +x kubectl && sudo mv kubectl /usr/local/bin/ - name: Install Helm run: curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash - name: Configure kubeconfig env: { KUBECONFIG_DATA: ${{ secrets.KUBECONFIG_DATA }} } run: | mkdir -p $HOME/.kube echo "$KUBECONFIG_DATA" | base64 -d > $HOME/.kube/config - name: Helm upgrade (create or update) run: | helm upgrade --install app ./chart \ --namespace prod --create-namespace \ --set image.tag=${{ github.sha }} \ --wait --timeout=10m --atomic - name: Rollout status (extra verification) run: kubectl rollout status deploy/app -n prod --timeout=180s そして ヘルメット リリースレベルの成功/失敗をバブルアップします。 ステップごとに進捗を印刷し、何かが停止したときに迅速かつ読みやすいフィードバックを提供します。 失敗を自動回帰に変える - あなたが「半分更新された」よりも安全であることを望むときに有用です。 で、 ) Why both --wait kubectl rollout status --wait kubectl rollout status --atomic ヘルメット キューブレット 9)サプライズダウンタイムを防ぐ健康サプライズ あなたは完璧なラウンドアップデートを得ることができ、アプリが温める前にトラフィックを受け入れる場合にエラーを提供することができます。 防ぐ:彼らは、あなたのPodが「準備ができている」と言うまで、サービスエンドポイントをゲートします。 トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > トップ > ) readiness probes Liveness probes キューブレット 実践的なチューニングガイド: アプリが 20 を必要としている場合は、初期 DelaySeconds を適切に準備状態に設定します。 アプリケーションが時々ブロックする場合(例えば、デッドロック)は、無限のエンドポイントまたはポートに触れる HTTP または TCP ライバリティ ソンドを好む。 アプリが起動するのが遅い場合は、起動が完了するまで、スタートを遅らせるための探査機を追加します(Kubernetes) 10)毎週見る落とし穴(そしてそれらを避ける方法) 10.1 航海 :latest 何が間違っているか:同じタグは時間の経過とともに異なるビットを指し示す; トラックキャッシュとポリシーのクイークは、ノードが実際に新しい画像を引っ張ったかどうかを明確にしない。 修正: 画像を commit SHA でタグまたは digests (@sha256:...). Kubernetes は digest 参照をサポートし、常に正確な画像を取得します。 10.2 ロールロウを待つことなく 何が間違っているか: パイプラインは「グリーン」に終わりますが、デプロイがまだ統合されていないため、ユーザーは30〜60秒間エラーを表示します。 The fix: Add --wait --timeout (and optionally --atomic) to Helm, and run kubectl rollout status so failures appear clearly in logs. (ヘルム、クーバーネッツ) 10.3 過剰特権 CI (cluster-admin) 何が間違っているか: 漏れたトークンは完全なクラスター妥協に等しい。 修正: ServiceAccount + Role + RoleBinding をターゲット ネームスペースにスケープして作成し、グラフに必要な動詞とリソースのみを使用します。 11) CIのための最小RBAC(コピー/ペスト) # rbac/deployer.yaml apiVersion: v1 kind: ServiceAccount metadata: name: helm-deployer namespace: prod --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: helm-deployer namespace: prod rules: - apiGroups: ["apps"] resources: ["deployments","replicasets"] verbs: ["get","list","watch","create","update","patch"] - apiGroups: [""] resources: ["services","configmaps","secrets"] verbs: ["get","list","watch","create","update","patch"] - apiGroups: ["networking.k8s.io"] resources: ["ingresses"] verbs: ["get","list","watch","create","update","patch"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: helm-deployer namespace: prod subjects: - kind: ServiceAccount name: helm-deployer namespace: prod roleRef: kind: Role name: helm-deployer apiGroup: rbac.authorization.k8s.io これに続くのは、 原則:SAはあなたのグラフが管理する名前空間とリソースタイプに触れることができます. If a token leaks, the damage is limited to those verbs/resources in RBAC は Kubernetes でサポートされている認証モデルです。 ) least privilege prod キューブレット (2)個人登録& (GHCR) imagePullSecrets イラスト 秘密 公開GHCRパッケージ:誰でも匿名で引くことができます;秘密は必要ありません。 プライベート GHCR パッケージ:Docker レジストリの秘密を作成し、Pod スペックに参照してください(または ServiceAccount に付属します)。 引き出しの秘密を作成し、それを使用する : prod kubectl create secret docker-registry ghcr-pull \ --docker-server=ghcr.io \ --docker-username=YOUR_GITHUB_USERNAME \ --docker-password=YOUR_GHCR_TOKEN_OR_PAT \ --docker-email=you@example.com \ -n prod その後、In Proudについて: values.yaml imagePullSecrets: - name: ghcr-pull 公式ドキュメントは、プライベートレジストリのための同じフローを示します; GHCRは標準のDocker authを使用します。 ) キューブレット 13)ロールバック、誰が何をするか、そして速い「私は健康ですか?」 2つのレイヤーがあなたを助けることができます: ヘルムリリース・ストーリー→ヘルム・ストーリー/rollback kubectl rollout undo/status を設定します。 典型的なコマンド: # See release history managed by Helm helm history app -n prod # Roll back to the previous release helm rollback app 1 -n prod # Verify the Deployment converges kubectl rollout status deploy/app -n prod --timeout=180s ヘルメット すでにアップグレード中の失敗に自動的に戻ります。 マニュアル・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ・オブ( で、 ) --atomic kubectl rollout status ヘルメット キューブレット 14) A reusable repo layout & a secrets checklist repo-root/ app/ # your code Dockerfile chart/ Chart.yaml values.yaml values-staging.yaml values-prod.yaml templates/ deployment.yaml service.yaml _helpers.tpl rbac/ deployer.yaml .github/workflows/ci.yml Secrets (GitHub → Settings → Secrets and variables → Actions): KUBECONFIG_DATA – base64 kubeconfig for the helm-deployer ServiceAccount. ヘルム・デプロイヤー ServiceAccountのためのベース64 kubeconfig GITHUB_TOKEN – auto-injected; set workflow permissions: packages: write to push to GHCR (use repo/org defaults or YAML). (GitHub Docs) 15) オプション: the same loop with カスタマイズ カスタマイズ お寺でない方がお好きですか? に構築されている。 あなたのパイプラインは: build → push → → シングルサービスのリポーと小さなカスタマイズに最適です; ヘルムはパッケージ化が必要な場合、またはクライアントがすでにグラフを使用している場合、より便利です。 ) Kustomize kubectl kubectl apply -k overlays/prod kubectl rollout status キューブレット Quick sketch: kustomize/ base/ deployment.yaml service.yaml kustomization.yaml overlays/ prod/ kustomization.yaml # patches image tag to $GIT_SHA 16) 附属書:追加のCIステップ(テスト、同期、喫煙検査) (1件の要請に対してポート先送り): A tiny smoke check after deploy - name: Port-forward and smoke test run: | kubectl -n prod port-forward svc/app 8080:80 & PF_PID=$! sleep 3 curl -fsS http://127.0.0.1:8080/healthz | grep -q "ok" kill $PF_PID Digest pinning (even stricter than tags): # Check the pushed image's digest docker buildx imagetools inspect ghcr.io/${OWNER}/${REPO}/app:${GITHUB_SHA} # Then set in values-prod.yaml: # image: # repository: ghcr.io/${OWNER}/${REPO}/app # tag: "" # leave empty when using a digest # digest: "sha256:..." ヘルムに消化使用をテンプレートしたい場合は、画像スタンザとテンプレートを調整してください。 # values.yaml (allow either tag OR digest) image: repository: ghcr.io/your-org/your-repo/app tag: "CHANGE_ME" digest: "" # templates/deployment.yaml (image reference) image: "{{ .Values.image.repository }}{{- if .Values.image.digest -}}@{{ .Values.image.digest }}{{- else -}}:{{ .Values.image.tag }}{{- end }}" Kubernetes 理解 直接消化します. それは最も決定的な方法です。 (あなたが作ったもの) ) @sha256: 正確に キューブレット 追加 2位 ドクターのドキュメントには、両方とも含まれています。 ) Multi-arch builds (if you need arm64): platforms: linux/amd64,linux/arm64 build-push-action Docker ドキュメンタリー 17)参照 Kubernetes Deployments (rolling update behavior & concepts). (Kubernetes) Rolling updates overview (tutorial). (Kubernetes) kubectl rollout status (command reference). (Kubernetes) Probes (living, readiness, startup). (Kubernetes) Images: tags, digests, and imagePullSecrets. (Kubernetes) RBAC authorization (official). (Kubernetes) Install kubectl and version skew note. (Kubernetes) ヘルメットのアップグレードとフラッグ(--install、--wait、--atomic)。 (Helm) Installing Helm (CI script). (Helm) Chart structure & values reference and best practices. (Helm) GitHub Actions & GHCR Publishing Docker images with Actions. (GitHub Docs) Use GITHUB_TOKEN with least-privilege permissions. (GitHub Docs) Working with the Container registry (GHCR) and OCI labels. (GitHub Docs) Docker official GitHub Actions: setup-buildx, login, build-push. (GitHub) Docker's CI guide for GitHub Actions. (Docker Documentation) Docker Multi-stage builds (why/how), best practices, multi-platform. (ドッカー文書) 閉鎖思考 これが、クライアントが言うときの道です。 それは単一のサービスから多くのサービスにまで拡大し、その各部分は非プラットフォームの人々に説明できる。 「今週はプラットフォームの再構築ではなく、信頼できる展開を望んでいる」 1 つのグラフ、1 つのワークフロー、1 つのレジストリ Immutable images (SHA tags or digests), probes that reflect real app health, and rollouts that wait. 不変な画像(SHAタグまたはディジェスト)、実際のアプリの健康を反映する探査機、そして待機するロールアウト。 Cluster-admin ではなく Targeted Deploy ライセンス つながり続ける この記事を気に入り、ウェブ開発についてもっと知りたい場合は、さまざまなプラットフォームで私とつながってください。 デビュー ハッカーナイト.com ハッシュノード.com ツイッター.com インスタグラム.com 個人ポートフォリオ V1 あなたのフィードバックと質問は常に歓迎されています. 学び、コードし、素晴らしいウェブアプリケーションを作成し続ける。