1. Serviceタイプ
Podは一時的なIPを持ち、再起動時に変わります。Serviceはラベルセレクターを通じてPodグループへの安定した仮想IP(ClusterIP)とロードバランシングを提供します。
| タイプ | 到達可能範囲 | ユースケース | 実例 |
|---|---|---|---|
| ClusterIP | クラスター内部のみ | バックエンドマイクロサービス | 決済サービス → DB |
| NodePort | 外部からNodeIP:Port経由(30000-32767) | 開発/テスト用アクセス | ベアメタル上のデモアプリ |
| LoadBalancer | クラウドLB経由で外部 | クラウド上の本番アプリ | AWS/GCPインターネットトラフィック |
| ExternalName | 外部サービスへのCNAMEエイリアス | 外部DNSの統合 | legacy-db.company.com |
External Traffic
│
▼
[LoadBalancer] ← cloud provider LB (AWS ELB, GCP)
│
[NodePort :30080] ← all nodes expose port 30080
│
[ClusterIP 10.96.5.3] ← virtual IP, iptables/IPVS routing
│
┌────┴────┐
[Pod A] [Pod B] ← matched by label selector
試験のポイント: NodePortは自動的にClusterIPを作成します。LoadBalancerは自動的にNodePort + ClusterIPを作成します。各タイプは下位タイプを継承します。
2. CoreDNSとサービスディスカバリー
CoreDNSはKubernetesクラスターのデフォルトDNSサーバーです。各Serviceに自動的にDNSレコードが登録されます。
DNS format: {service}.{namespace}.svc.cluster.local
例:
namespace "production" 内のService "api":
→ api.production.svc.cluster.local
→ api.production.svc
→ api.production
→ api (同じnamespace内のみ)
| DNSクエリ | 解決先 | 利用可能な場所 |
|---|---|---|
api | Service ClusterIP | 同一namespace内のみ |
api.production | Service ClusterIP | 任意のnamespace |
api.production.svc.cluster.local | Service ClusterIP | 任意のnamespace(FQDN) |
3. ストレージ:PV、PVC、StorageClass
Storage lifecycle:
STATIC DYNAMIC
───── ───────
Admin creates → PersistentVolume StorageClass (provision template)
App requests → PersistentVolumeClaim → SC auto-provisions PV
Pod mounts → PVC as volume
| 概念 | 役割 | 作成者 |
|---|---|---|
| PersistentVolume (PV) | 実際のストレージリソース(NFS、EBS、GCE Disk) | 管理者またはダイナミックプロビジョナー |
| PersistentVolumeClaim (PVC) | サイズとアクセスモードを指定したストレージ要求 | 開発者/アプリ |
| StorageClass | PVCがあるときにPVを自動作成するテンプレート | 管理者 |
アクセスモード
| モード | 略称 | 意味 | 例 |
|---|---|---|---|
| ReadWriteOnce | RWO | 1ノードが読み書き | EBSボリューム、ローカルディスク |
| ReadOnlyMany | ROX | 複数ノードが読み取り | NFS上の静的ファイル |
| ReadWriteMany | RWX | 複数ノードが読み書き | NFS、EFS、GlusterFS |
| ReadWriteOncePod | RWOP | 1つのPodのみ(v1.22+) | 排他アクセスが必要な場合 |
試験のポイント: AWS EBSはRWOのみサポートします。問題で複数Podの同時書き込みが要求される場合、NFS(RWX)が必要です。StatefulSetは通常、各Podに独自のPVCを持つRWOを使用します。
4. ConfigMapとSecret
| リソース | 用途 | エンコーディング | Podへの注入方法 |
|---|---|---|---|
| ConfigMap | 機密でない設定(URL、フラグ、環境ファイル) | プレーンテキスト | 環境変数、ボリュームファイル、CLIの引数 |
| Secret | 機密データ(パスワード、APIキー、TLS証明書) | Base64(デフォルトでは暗号化されない) | 環境変数(非推奨)、ボリュームマウント |
試験のポイント: Secretはbase64エンコードされただけで、暗号化されていません。etcdでSecretを暗号化するには、APIサーバーでEncryption Configurationを有効にする必要があります。試験では「encrypted」が誤りの選択肢としてよく使われます。
5. チートシート
| 試験の質問 | 回答 |
|---|---|
| クラウドでアプリを外部公開するには? | LoadBalancer(またはIngress) |
| namespace "backend"のService "db"のDNS名は? | db.backend.svc.cluster.local |
| 複数Pod間で共有ストレージが必要な場合は? | アクセスモードRWXのPV |
| デプロイ時にストレージを自動プロビジョニングするには? | StorageClass + PVC |
| Secretはデフォルトで暗号化されている? | いいえ、base64のみ |
6. 練習問題
Q1: 開発者が「frontend」という別のnamespaceからバックエンドデータベースService「orders-db」にアクセスしたいと考えています。どのDNS名を使用すべきですか?
- A) orders-db
- B) orders-db.default.svc.cluster.local
- C) orders-db.backend.svc.cluster.local ✓
- D) backend.orders-db.cluster.local
解説:namespace間のDNSには完全な形式が必要です:{service}.{namespace}.svc.cluster.local。短縮名「orders-db」は同一namespace内でのみ機能します。
Q2: ClusterIPとNodePortの両方を自動的に作成するServiceタイプはどれですか?
- A) ClusterIP
- B) NodePort
- C) LoadBalancer ✓
- D) ExternalName
解説:LoadBalancerはスーパーセットです。ClusterIP + NodePort + クラウドロードバランサーを作成します。NodePortはClusterIPを含みますが、ClusterIPは外部アクセスなしの単独です。
Q3: Secretにデータベースパスワードが含まれています。開発者がパスワードは「暗号化されている」と主張しています。この主張は正しいですか?
- A) はい、Kubernetes SecretはAESで暗号化されている
- B) いいえ、SecretはEncryption Configurationが有効でない限りbase64エンコードのみ ✓
- C) はい、Secretはetcdの組み込み暗号化で暗号化されている
- D) いいえ、Secretはプレーンテキストで保存される
解説:デフォルトでは、Secretはetcdにbase64エンコードされた文字列として保存されます。これは暗号化ではありません。管理者はAPIサーバーでEncryptionConfigurationを構成して保存時の暗号化を有効にする必要があります。