Upgrade to Pro — share decks privately, control downloads, hide ads and more …

はてなサマーインターンシップ2025 コンテナ + Kubernetesハンズオン 講義資料

Avatar for Hatena Hatena
October 14, 2025

はてなサマーインターンシップ2025 コンテナ + Kubernetesハンズオン 講義資料

Avatar for Hatena

Hatena

October 14, 2025
Tweet

More Decks by Hatena

Other Decks in Technology

Transcript

  1. なぜコンテナ環境が採⽤されるのか • 開発者の⽣産性向上 • ⾼速な開発サイクル • 環境構築の簡素化 • アプリケーション運⽤の効率化 •

    コンテナオーケストレーションとしての役割 現代のアプリケーション開発でコンテナは⽋かせないものになっている IBUFOBJOUFSO !
  2. コンテナで実現したいこと • 仮想化 • 可搬性 (portability) を⾼く保つこと • ⾼速(not performance)‧低コストであること

    これらを実現するのが、プロセスの隔離とコンテナイメージによ る環境の構築 IBUFOBJOUFSO !
  3. コンテナを実現するプロダクト • 2000年: FreeBSD jails • 2008年: Linux Containers (LXC)

    • 2013年: Docker • 2019年: Podman これらのプロダクトも、概ね以降で紹介する技術 (や、相当の機 能) を組み合わせて実現されています IBUFOBJOUFSO !"
  4. Namespace • Linux Kernel の持つ機能 • Namespace ごとにリソースを隔離して、Namespace 内のプロセ スに対して独⽴した環境に⾒せる

    • それぞれのプロセスが⼲渉することがなくなる • どのリソースを隔離するかによって様々な Namespace が存在する • PID, Mount, User, Network, IPC, UTS, Time, cgroup IBUFOBJOUFSO !"
  5. PID Namespace • プロセス ID 番号空間の隔離 • 名前空間内で最初のプロセスは PID 8

    ubuntu@utm:~$ ps PID TTY TIME CMD 1889 pts/0 00:00:00 bash 2711 pts/0 00:00:00 ps # unshareίϚϯυͰ෼཭ ubuntu@utm:~$ sudo unshare "#pid "#fork "#mount-proc ps PID TTY TIME CMD 1 pts/0 00:00:00 ps IBUFOBJOUFSO !"
  6. User Namespace • UID/GID を分離する • Capability (後述) を分離する •

    異なる Namespace で同じ UID のユーザを作成できる • ホストからは⼀般ユーザ、コンテナ内では root というユーザが 作成できる • マッピング IBUFOBJOUFSO !"
  7. その他のNamespace • Mount: マウントポイントを分離する • Network: ネットワークデバイス、ルーティングテーブル、IP アドレス、ポート番号などを隔離する • Time:

    ホストとコンテナの時間を分離する • IPC: 共有メモリを分離する • UTS: ホスト名とドメイン名を分離する IBUFOBJOUFSO !"
  8. cgroup • cgroupは、プロセスグループに対してCPU、メモリ、ディスクI/Oなど のリソースの使⽤量を制限、監視、優先順位付けをするLinuxカーネル の機能 • 階層構造を持っており、各ノード(cgroupの階層)がリソースグループ を表す • cgroup

    Namespaceにより、コンテナ内のプロセスはホストOS全体の cgroup階層を⾒るのではなく、⾃⾝に割り当てられたcgroup階層のサ ブツリーをルートとして認識する IBUFOBJOUFSO !"
  9. Capability • 特権の細分化 • ネットワーク操作など、特定の操作を⾏うために特権が必要となることがある • 特定の操作のためにあらゆる特権を取得するのは過剰 • pingバイナリに CAP_SYS_BOOT(システムの再起動)を付与してしまった

    • pingコマンドの実⾏のために特権を取得すると、この特権で PC の再起動までで きるようになってしまった • もちろんping コマンドの中に再起動処理のロジックが⼊っていなければできな いけれど、権限としてはできる IBUFOBJOUFSO !"
  10. Capability • Linux Kernel では操作の種類に応じた権限として、Capability という概念があり、プロセスに対して許可 する権限を個別に選択できる • Capabillityは"鍵"のようなもので、実装という"ドア"とセットで機能する •

    pingは、ICMPパケットを直接送受信するために、rootでしか使えないRAWソケットを利⽤する • pingバイナリに、この特権処理を許可するCAP_NET_RAWというCapabilityのみを付与し、pingは⼀般 ユーザでも実⾏可能になる • pingバイナリにはシステムを再起動する権限であるCAP_SYS_BOOTのような他の強⼒な権限は付与しな い • pingコマンドに脆弱性があっても、システム全体に影響が及ぶリスクを最⼩限に抑えることができる • Capability の⼀覧は man capabilities(7) で確認できる IBUFOBJOUFSO !"
  11. Capability • 特権操作を必要とするプロセスに対しても、特権を渡すのではなく Capability を 付与する • Capability によって許可される操作は Namespace

    で隔離された範囲に閉じな いことがあるので注意する必要がある • コンテナランタイムはコンテナで実⾏するプロセスに対していくつかの Capability をデフォルトで付与する • 設定によって追加の Capability を付与することもできる • Docker の場合 !"cap-add, !"cap-drop, !"priviledged オプションがある IBUFOBJOUFSO !"
  12. seccomp • システムコールの中には、Linux Namespaceでは⼗分に分離できない、あるいはホストシステム 全体に影響を及ぼす可能性のあるリソースに⼲渉するものがある • コンテナ内のプロセスからこれらのシステムコールが呼び出されると、コンテナの分離性が損な われ、ホストシステムにセキュリティ上の影響が及ぶリスクがある • seccomp

    はプロセスの発⾏できるシステムコールを制限する仕組みで、コンテナランタイムは seccomp を利⽤してコンテナ内のプロセスがこれらのシステムコールを呼び出すことを防ぐ • Docker でデフォルトで制限されているシステムコールは公式ドキュメントに⼀覧されている • 設定でプロファイルを渡すことによって呼び出しを制限するシステムコールを制御できる • プロファイルとは、許可するシステムコールと拒否するシステムコールを定義したルールセット IBUFOBJOUFSO !!
  13. コンテナイメージ • コンテナ化された環境で利⽤するファイルシステムなどをまと めたもの • 主な内容物はコンテナ化されるプロセスから参照される Mount Namespace にマウントされるファイル群の tar

    アーカイブ • コンテナ化されるプロセスにとって、この tar アーカイブが/ (ルートディレクトリ)となるようにコンテナランタイムは pivot_rootする IBUFOBJOUFSO !"
  14. Union ファイルシステム • ベースとなる下位ディレクトリ (Lower Dir) に対し、差分を上位ディレクト リ (Upper Dir)

    として重ね合わせる • コンテナイメージに含まれるファイルシステムは Lower Dir、コンテナ上で 変更されるファイルシステムを Upper Dir とする • Lower Dir は変更されないので1つのコンテナイメージを複数のコンテナ インスタンスで共有できる • 変更を個々のコンテナインスタンス毎の Copy on Write レイヤー (Upper Dir) に適⽤する IBUFOBJOUFSO !"
  15. コンテナイメージの構造を覗く FROM ubuntu RUN echo "hoge" > hoge.txt RUN rm

    hoge.txt $ docker build . -t sample 作成したイメージを出⼒して解凍する $ docker save sample > image.tar $ mkdir /tmp/images $ tar xf image.tar -C /tmp/images $ ls -l /tmp/images total 32 drwxr-xr-x@ 3 rskmm0chang wheel 96 7 14 12:54 blobs -rw-r"#r"#@ 1 rskmm0chang wheel 362 1 1 1970 index.json -rw-r"#r"#@ 1 rskmm0chang wheel 1067 1 1 1970 manifest.json -rw-r"#r"#@ 1 rskmm0chang wheel 31 1 1 1970 oci-layout -rw-r"#r"#@ 1 rskmm0chang wheel 89 1 1 1970 repositories IBUFOBJOUFSO !"
  16. イメージレイヤー blobs以下にDockerfile の命令毎にレイヤーが分かれている $ tree /tmp/images/ /tmp/images/ ├── blobs │

    └── sha256 │ ├── 081fb1efc91eea477727e7966405f2e3038e2f283672dda79108e305e1d14e09 │ ├── 176b61970a68fab10ed0567af1cb59479f6d50436043cf533b123ad1e485e5c9 │ ├── 520724c855391393f7903c957f7a8d4c363fb6c216f53374f69f55c338e46aca │ ├── 7e06715b212add1e8fab9603a4c3954986ea7f8a5b20a83a559af215c16e8766 │ ├── 88d4446cbfd41e9e3e5225c78c6e068d3104726e320b92ec1d62d81fd3641b4e │ ├── 961ef2cb6a6eec47b257f88e92a47dcabb5df1b010acc4cd41bc153c3fe6c98a │ ├── a353043666c367fcf0ccba8b0a0dc23b4bd9625ea7ceefeb8dbc0917d9b4061e │ └── fcecd6f30cfb23f719076bb2bae17b876968f9bebcc1821d5f54cf594c9f63b5 ├── index.json ├── manifest.json ├── oci-layout └── repositories IBUFOBJOUFSO !"
  17. blobs • 下位のレイヤーに対しての差分がまとめられている • 以下のblobsの中⾝を⾒てみる # vΛ͚ͭͯల։ $ tar xvf

    blobs/sha256/081fb1efc91eea477727e7966405f2e3038e2f283672dda79108e305e1d14e09 -C /tmp/layer_content x hoge.txt IBUFOBJOUFSO !"
  18. blobs whiteout • ファイルの削除は whiteout file によって表現される • ファイルを削除したときは .wh.(ϑΝΠϧ໊)

    という空ファイルが作られる • ディレクトリを削除したときは .wh.(σΟϨΫτϦ໊) という空ファイルが作 られる • ディレクトリの内容をすべて削除した場合、そのディレクトリ全体を不透明 (opaque)にするためにopaque whiteout file(.wh!"wh!"opq)が作成される IBUFOBJOUFSO !"
  19. レイヤーキャッシュ # syntax=docker/dockerfile:1 FROM golang:1.23-bookworm AS builder WORKDIR /services/blog COPY

    go.mod go.sum ./ # ͕͜͜มߋ͞Εͨ৔߹͸ ↓ ͷ෦෼Λ࠶࣮ߦ RUN go mod download COPY . . RUN "#mount=type=cache,target=/root/.cache/go-build \ make build • コンテナイメージのビルド時に は Lower Dir に対する変更を Upper Dir として新しいレイヤー ⽤の tar アーカイブを作成する • ⼀度実⾏した命令は Lower Dir として残っているので、Upper Dir による変更だけを⾏えばよ く、レイヤーキャッシュが利⽤ できる IBUFOBJOUFSO !!
  20. ⾼レベルランタイム • containerd, CRI-O など • コンテナイメージや複数台のコンテナを管理する • ユーザインタフェースとなるツールや、コンテナオーケストレーションツールと通信 する

    • CRI (Container Runtime Interface) という規格がある • 低レベルランタイムと通信してコンテナを起動する‧低レベルランタイムにコンテ ナ環境の設定を送信する • Docker は低レベルランタイムとの通信に containerd を利⽤している IBUFOBJOUFSO !"
  21. 低レベルランタイム • runc, gVisor など • 個々のプロセスを起動し、Namespace を隔離してコンテナと して実⾏する •

    OCI Runtime Spec (Open Container Initiative Runtime Specification) によって標準的な仕様‧挙動が定義されている IBUFOBJOUFSO !"
  22. 1コンテナ 1プロセス • 単⼀の機能として分離して⽔平スケールしやすくするため • 再利⽤性、透明性を⾼める • 依存関係を減らす • PID

    1問題への対策にもなる • PID Namespaceのところで話した話題 • LinuxにおいてPID eは特殊な役割がある • 通常ではinitや、systemdなどが担っている IBUFOBJOUFSO !"
  23. ステートレスでイミュータブルにする • 状態を持たず、不変 • 実⾏しているコンテナ内でアプリケーションを変更しない • 永続データはコンテナ外部のコンポーネントに任せる • ログは stdout/stderr

    に出⼒する • ログをファイルに書き出さない • コンテナオーケストレーションはstdout/stderrをそのコンテナのログと して⾒る(docker logsなども) IBUFOBJOUFSO !"
  24. イメージは軽量にする • 実⾏に必要な依存関係のみを持つイメージを作成する • 軽量なので実⾏までのコストが⼩さくなる。依存関係が減ると攻撃され うる対象も減る。 • 軽量なベースイメージを選択する • -slim

    な flavor や distroless をベースとして、必要なランタイムとアプ リケーションだけインストールする • Seekable OCI でイメージを遅延読み込みすることも可能だが、変換が必要 IBUFOBJOUFSO !"
  25. 適切なベースイメージを選択する • イメージを作成する上で、ベースイメージを正しく選択することは重要 • 開発元の公式イメージや、コンテナレジストリで verified となっているイメージを選択する • Alpine Linux

    を避ける • glibc を採⽤していないので互換性やパフォーマンスの問題が起こることがある • Alpine Linuxだとビルドが困難なものもある IBUFOBJOUFSO !"
  26. コンテナのユーザは⼀般ユーザにする • User namespace の分離と適切なマッピングを指定しない場 合、コンテナの root はホストの root に対応する

    • コンテナ内の脆弱性で root 権限を取得された場合、影響がホス トの root にまで及んでしまうことも • Dockerfile の USER 命令でコンテナを実⾏するユーザを指定す る IBUFOBJOUFSO !"
  27. Graceful Shutdown コンテナに限らないけれど、コンテナ環境ではアプリケーションのライフサイクルが短くなりやすい • アプリケーションを適切に終了させる • データの不整合が起きないように、など、アプリケーションをきちんと⽌める • SIGTERMに対応させる •

    コンテナオーケストレーションでのオートスケールへの対応にもなる • アプリケーションの中にはSIGTERM以外のときがあるので注意 • nginxとかphp-fpmはSIGQUIT • DockerfileのSTOPSIGNALでGraceful Shutdownのシグナルを変えることも可能 • https://github.com/nginx/docker-nginx/blob/master/Dockerfile-debian.template#LÇÉÉ IBUFOBJOUFSO !"
  28. コンテナオーケストレーションの⽬的 • ⾃動化による管理コスト削減 • コンテナのライフサイクルを⾃動化し、⼿間とコストを削減する • コンテナ環境の⾼い可⽤性を維持 • コンテナやノードの障害発⽣時に、アプリケーションの継続的な稼働を可能にす る

    • コンテナ同⼠の接続 • 複数のコンテナが協調して動作するために必要なネットワークを⾃動的に設定 し、コンテナ同⼠が安全かつ効率的に通信できるようにする IBUFOBJOUFSO !"
  29. コンテナオーケストレーションツールが持つ 主な機能 • コンテナ配置のスケジューリング • コンテナをどのノードに配置するか • 負荷分散/サービスディスカバリー • クラスタ内のコンテナ間の負荷分散

    • セルフヒーリング/ヘルスチェック • コンテナのヘルスチェックと問題発⽣時への⾃動復旧 • オートスケーリング • 負荷に応じたコンテナのスケールイン‧アウト IBUFOBJOUFSO !"
  30. コンテナオーケストレーションたち • Docker Swarm • Apache Mesos • Kubernetes •

    Amazon Elastic Container Service(ECS) AWSの優位性をベースにECSも使われているが、商⽤環境(オンプ レ含む)ではKubernetesがデファクトスタンダード IBUFOBJOUFSO !"
  31. Kubernetesとは • Kubernetes, K,s • Googleの内製コンテナ管理ツールBorgをOSS化したもの • OSSになる前からGoogleの⼤規模環境で利⽤されていたので、概念が洗練されていた • パブリッククラウドでサービスが提供されている

    • Amazon Elastic Kubernetes Service(EKS) • Google Kubernetes Engine (GKE) • Azure Kubernetes Service (AKS) • ⾼い拡張性、エコシステムが充実 • コントローラ作成やAdmission Webhookなど IBUFOBJOUFSO !"
  32. Cluster • control PlaneとNodeで構成 • control Plane • kube-apiserver •

    etcd • kube-scheduler • kube-controller-manager • Node • kubeletがkube-apiserverとやり取り • コンテナを実⾏するためのコンピューティングリソースの集まり • Data Planeと⾔ったりもする • 詳細は後述 IBUFOBJOUFSO !"
  33. Node • Data Plane • 複数のPod(コンテナの集まり)を実⾏するためのコンピューティングリソー ス • 物理 or

    仮想のサーバー • ノードでkubeletが起動し、API Serverとやりとりをする • K`s⾃体にはノードをスケールさせる仕組みはない • サードパーティ(cluster-autoscaler, Karpenter)を利⽤する IBUFOBJOUFSO !"
  34. 複数のコンテナ • Podは1つ以上のコンテナ群 • 1コンテナ1プロセス • ひとつのPodに複数のコンテナ • メインのコンテナとそれを⽀えるコンテ ナ

    • (例) Proxy, ログ転送, 監視エージェント • 内部的にpauseコンテナが動いていて、 Namespaceの共有などを⾏う • PodのStatusとして⾒えないが、ノードか らは⾒える特殊なコンテナ 引⽤元: https://www.ianlewis.org/en/ almighty-pause-container IBUFOBJOUFSO !"
  35. リソースのカテゴリ あまりカテゴリを意識することはないけれど、説明しやすいので、いったん分けて話していきます • Workloads コンテナの実⾏に関するリソース • Service コンテナを外部公開するようなエンドポイントを提供するリソース • Config&Storage

    設定‧機密情報‧永続化ボリュームなどに関するリソース • Cluster セキュリティやクォータなどに関するリソース • Metadata クラスタ内の他のリソースを操作するためのリソース Namespaceという仮想的なクラスタの分離機能 IBUFOBJOUFSO !"
  36. ConfigMap/Secret アプリケーションの設定をリソースとして管理でき、アプリケーションと設定を分離できる • ConfigMap • 機密性のないデータをキーと値のペアで保存する • 環境変数の管理もできる • Secret

    • ConfigMapと機能はほぼ同じ • 機密性のあるデータをキーと値のペアで保存する • といっても実はただのBaseYZなので、丸⾒えに近い • secretは使わずに、Podにmountさせるのがベストではあるが、やや⼿間 • https://github.com/aws/secrets-store-csi-driver-provider-aws IBUFOBJOUFSO !"
  37. Service ロードバランサ • kube-proxyというコンポーネントの機能 • iptablesで実現している • 他の実装もあるが、デフォルトはiptables • 複数のPodに対するトラフィックのロードバランシング(負荷分散)を⾏う

    • ロードバランシングの⼊り⼝となるエンドポイントを提供 • エンドポイントには単⼀の仮想IPが割り当てられる • エンドポイントの種類は⽤途によって様々 • ClusterIP (内部向け) • NodePort (外部向け) • LoadBalancer(外部向け) IBUFOBJOUFSO !"
  38. Service サービスディスカバリ • 動的にPodが⼊れ替わるクラスター内で情報を登録、発 ⾒するための仕組み • クラスタ内DNSの利⽤が推奨されている • ロードバランシングの⼊り⼝となるエンドポイントがク ラスタ内DNSに⾃動的に登録される

    • [SERVICE_NAME]. [NAMESPACE].svc.cluster.localという形式で DNS Aレコードに割り当てられる • (例) account.hatena- intern.svc.cluster.local • 同じNamespace内であれば、account、違う Namespaceの場合はaccount.hatena-internで も名前解決できる IBUFOBJOUFSO !!
  39. Ingress • Ingress • L)のロードバランサ • Kubernetes⾃体にはIngressの実装がなく、インターフェイスのみ • aws-load-balancer-controller, ingress-nginx,

    etc • HTTPSの終端として証明書を指定可能 • Secretは証明書も管理でき、それを指定できる IBUFOBJOUFSO !"
  40. Manifest • リソース定義ファイル • yamlで書くことが多いがjsonでも可能 • kubectl apply -f <manifest>

    によってK=sクラスタに適⽤ • コントローラがリソースの状態を⾃律的にマニフェストの内容に 近づける • Reconciliation Loop IBUFOBJOUFSO !"
  41. Manifestのサンプル(Deployment) apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app:

    nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 IBUFOBJOUFSO !"
  42. Manifestのサンプル(Service) apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector:

    app: nginx ports: - protocol: TCP port: 80 targetPort: 80 IBUFOBJOUFSO !"
  43. リソース制限 • Podに対して割り当てるCPUやメモリの制限 を⾏うことができる • cgroup • 要求と制限 • requests(要求)とlimits(制限)を指定でき

    る • ノードにPodを配置する際に考慮される • requestsの指定がない場合は判断のしよ うがないので、どこかのノードに詰め込ま れる spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m" IBUFOBJOUFSO !"
  44. ヘルスチェック • Podが正しく動作しているか確認するための仕組み • Liveness Probe • アプリケーションが起動し、コンテナが正しく動作しているかどうか • チェックが通らなかったときはPodを再起動する

    • Readiness Probe • Podがリクエストを受け付ける準備ができているかどうか • チェックが通らなかったときにはServiceのendpointのリストから当該Podが削除される • Startup Probe • 起動時にしか実⾏されない • Podの起動に時間がかかるような場合に、Liveness Probeの前に実⾏される • Podが正常に起動したことを確認するチェック IBUFOBJOUFSO !"
  45. 負荷に対する拡張性(Scalability) • ⽔平オートスケール • Horizontal Pod Autoscaler (HPA) • CPU等のメトリクスを参照してPodのレプリカを⾃動で追加する

    • 垂直オートスケール • Vertical Pod Autoscaler (VPA) • Kubernetesの内部リソースではなく、個別に対応は必要 • CPU, メモリの使⽤量を分析してリクエスト値を提案したり⾃動的に更新したりする • Kvsの内部リソースではないので注意 IBUFOBJOUFSO !"
  46. マニフェストの構成 k8s ├── account │ ├── app.yaml │ ├── config

    │ │ └── schema.sql │ ├── db.yaml │ ├── kustomization.yaml │ ├── secret │ │ └── ecdsa-private.pem │ └── test.yaml ├── blog │ ├── app.yaml │ ├── config │ │ └── schema.sql │ ├── db.yaml │ ├── kustomization.yaml │ ├── secret │ │ └── account-ecdsa-public.pem │ └── test.yaml ├── kustomization.yaml ├── namespace.yaml ├── renderer-go │ ├── app.yaml │ └── kustomization.yaml └── system └── sa.yaml • k8s ディレクトリがマニフェスト置き場 • account/blog/renderer-goとマイクロサービスごとにディレクト リを分ける • kustomization.yaml がkustomizeの設定ファイル IBUFOBJOUFSO !"
  47. k"s/blog/kustomization.yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - app.yaml - db.yaml

    - test.yaml secretGenerator: - name: blog-app-secret files: - secret/account-ecdsa-public.pem configMapGenerator: - name: blog-app-env-vars literals: - MODE=development - DATABASE_DSN=root@(blog-db:3306)/intern_2025_blog?time_zone=UTC&parseTime=true&loc=UTC - ACCOUNT_ADDR=account:50051 - RENDERER_ADDR=renderer-go:50051 - name: blog-test-env-vars literals: - TEST_DATABASE_DSN=root@(blog-db:3306)/intern_2025_blog_test?time_zone=UTC&parseTime=true&loc=UTC - name: blog-db-schema-config files: - config/schema.sql IBUFOBJOUFSO !"
  48. 確認 % make up • 8080番ポートは⾃動でポートフォワードされるようになっていますが、ポートフォワードされてい ない場合、別のターミナルを開き、以下のコマンドでポートフォワードできます。 % kubectl port-forward

    service/blog 8080:8080 # ϩʔΧϧͷ8080ϙʔτ΁ͷ௨৴Λ blog service ͔Βෛՙ෼ࢄ͞Ε͍ͯΔpodͷ8080ϙʔτʹసૹ͢Δ もしくは再度make upしてください。 Podが起動すると、⾃動でブラウザが開くので開いてブログを作成してみましょう。 開かない場合、vscodeのterminalのPORTSタブから8080ポートを追加してあげてください。 IBUFOBJOUFSO !!
  49. デバッグ # Podͷৄࡉ৘ใͷදࣔɻpod͕ىಈ͠ͳ͍৔߹͸ಛʹ"Events:"ཝʹ஫໨ % kubectl describe pod blog # ωʔϜεϖʔε্ʹ͋ΔϦιʔεͷ৘ใΛදࣔ

    % kubectl get all # ىಈ͍ͯ͠ΔPodͰγΣϧΛىಈ͢Δ % kubectl exec -it svc/account -c account !" /bin/sh Pod(コンテナ)に⼊ったら - 起動しているプロセスは? ! ps - blogサービスにアクセス ! wget -q -O - blog:8080 - ! nslookup blog IBUFOBJOUFSO !"#
  50. ファイルの追加 % cp -R k8s/renderer-go k8s/renderer-ts % sed -i -e

    's/renderer-go/renderer-ts/g' k8s/renderer-ts/*.yaml • k8s/renderer-go ディレクトリをコピーして k8s/ renderer-ts を作成 • マニフェスト内の renderer-go を renderer-ts に置き換え IBUFOBJOUFSO !"#
  51. skaffoldの編集 skaffold.yaml apiVersion: skaffold/v4beta13 kind: Config metadata: name: hatena-intern-2025 build:

    artifacts: # (snip) - image: hatena-intern-2025-renderer-go context: services/renderer-go - image: hatena-intern-2025-renderer-ts # ! context: services/renderer-ts # ! local: # (snip) • services/renderer-ts のdockerイメージのビルドとk2sクラスタへの反映がされるようにする IBUFOBJOUFSO !"#
  52. マニフェストの編集 k"s/blog/kustomization.yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization # (snip) configMapGenerator: -

    name: blog-app-env-vars literals: - MODE=development - DATABASE_DSN=root@(blog-db:3306)/intern_2025_blog?time_zone=UTC&parseTime=true&loc=UTC - ACCOUNT_ADDR=account:50051 - RENDERER_ADDR=renderer-ts:50051 # ! - name: blog-test-env-vars # (snip) • blogサービスの記法変換サービスへの向き先をrenderer-goからrenderer-tsに変える IBUFOBJOUFSO !"#
  53. Podが正常に起動しない場合 • kubectl get pods を実⾏して各Podが正しく起動している かどうか確認する • kubectl describe

    pod renderer-ts で詳細情報を確認 • なぜ正常に起動しないか原因を探ろう IBUFOBJOUFSO !!"
  54. おまけ1 データベースを覗いてみよう アプリケーション開発に役に⽴つと思います。 % mysql -u root -h 127.0.0.1 -P

    3306 intern_2025_blog # ͔ͬͪ͜΋(localhost) % mysql -u root -h localhost -P 3306 intern_2025_blog MySQL [intern_2025_blog]> show tables; +----------------------------+ | Tables_in_intern_2025_blog | +----------------------------+ | blogs | | entries | | sessions | | users | +----------------------------+ MySQL [intern_2025_blog]> select count(*) from blogs; +----------+ | count(*) | +----------+ | 0 | +----------+ IBUFOBJOUFSO !!"