はじめに
Dockerが登場する前には、LXCというnamespace技術を利用してコンテナを実現する方法が存在していました。DockerはUnionファイルシステムを使用してレイヤーを生成し、動作するファイルシステムです。
Docker
Dockerはアプリケーションをコンテナ形式で開発し、配布・配信し、実行するためのオープンプラットフォームです。
Dockerアーキテクチャ
- Docker Daemon: コンテナをビルド・実行する作業を担当します。
- Docker Client: Docker Daemonと通信し、REST APIを使用します。
- Repository: コンテナイメージを共有するリポジトリです。
- Image Layer: 読み取り専用、Container: 読み書き可能
Dockerコマンド
- Commit: コンテナレイヤーを基に新しいイメージレイヤーを作成します。
- detached(-d): バックグラウンドで実行します。
- foreground(-it): プロセスの標準入出力とエラーをコンソールに接続します。
- inspect: 詳細を表示します。
- attach: -dで実行されたものに接続して表示します。
- exec: コマンドを実行します。
- cp: コンテナとホストマシンの間でファイルをコピーします。
- export: tarで圧縮します。
Dockerのファイルシステム
- volumes: 基本的に読み書き可能ですが、読み取り専用にも変更できます。コンテナ間のデータ共有、データのリモート保存、高性能I/O Overlayファイルシステムを使用する際にStorage Driverを使用します。
- bind mounts: ホストマシンのファイルシステムのどこにでもファイルを保存できます。
- tmpfs mounts: メモリをマウントし、敏感情報をコンテナのライフサイクル中に保存します。
Dockerネットワーク
- bridge: ホストマシン内にサブネットワークを構成し、これをbridgeと呼びます。コンテナ間の通信が必要な場合に使用します。
- host: 既に占有されているポートがあると起動できません。ホストのネットワークを直接使用します。
- none: 全てのネットワーキングを無効化します。
- overlay: 異なるdocker daemonにあるコンテナ間で通信が可能です。
DockerFile
- FROM: BASE Imageを積み重ねることができます。
- ARG: 変数として使用される部分です。
- LABEL: 特定の条件に基づいてコンテナ内で処理を行います。
- RUN: コンテナを実行します。
- CMD: コンテナが起動する際に実行するコマンドです。
- ENTRY POINT: 必ず実行される領域です(CMDは値によって変更されることがあります)。
- EXPOSE: ポートを公開します。
- ENV: 環境変数として、実行時に変更可能です。
- COPY: ファイルをコピーします。
- ADD: URLを指定してファイルをコピーし、TARファイルも自動的に解凍します。
コンテナは小さく軽量に作成することが重要です。
Multi Stage Build
Build StageとPRD Stageを分けてイメージを作成できます。
Kubernetes
コンテナ化されたワークロードとサービスを管理するためのポータブルで拡張可能なオープンソースプラットフォームです。ワークロードはk8sで動作するアプリケーション(=pod)です。
ノードコンポーネント
- Kubelet: 各ノードのエージェントで、podの動作を管理します。
- Kube-Proxy: クラスター レベルのネットワーキング時に必要です。
- Container Runtime: コンテナを実行する役割を果たします。
- etcd: Kubernetesのデータベースです。
- KubeScheduler: どのノードにコンテナを実行するかを決定します。
コマンドの違い
- 命令型: 必要な動作を指示します (kubectl)。
- 宣言型: 望む状態を宣言します (yaml - kubectl apply -f app.yaml)。
Namespace
単一クラスター内のリソースグループの隔離メカニズムとして使用されます。
- namespace設定: namespaceごとに設定が可能です。
- ResourceQuotas: namespaceごとの総リソース使用量を制限する制約条件です。
- LimitRange: その中で動作する個々のコンテナに対するリソースを定義する際に使用します。
ラベルとセレクター
podを見つけるために使用されます。ラベルはkey-value形式で、セレクターはクエリ文です。
Podの状態
- PodScheduled
- ContainersReady
- Initialized
- Ready
Podの初期生成からコンテナ実行までの状態を示します。
ContainerProbe
- livenessProbe: podが生存しているかを確認します。
- readinessProbe: サービス要求を処理できるかを確認します。
- startupProbe: コンテナアプリケーションが起動したかを確認します。
ReplicaSet / Deployment
- ReplicaSet: レプリカPodの集合です。
- Deployment: イメージを変更する場合、新しいreplicasetを作成します。
StatefulSet
DBのために使用され、各Podに役割があります。
DaemonSet
共通の内容に対して使用されます。
K8Sサービス(=ネットワーク)
- ClusterIP: クラスター内部でのみ使用可能なIPを提供します。
- NodePort: 外部からアクセスする場合に使用します。
- LoadBalancer: ロードバランサーです。
Ingress
サービスを外部に公開する際に使用されます。
Volume
Pod単位でVolumeを管理します。
- PersistentVolume(=PV): 実際に存在する容量です。
- PersistentVolumeClaim(=PVC): 適切なVolumeをバインドして使用します。
Config / Secret
- ConfigMap: 機密ではないデータを保存するためのAPIです。
- Secret: パスワード、トークン、証明書などを保存できるオブジェクトです。
デプロイ戦略
- Recreate: ダウンタイムが発生する可能性があります。
- Rolling Update: 無停止デプロイ戦略です。
- Blue/Green: 一時的にサービスが2倍になる可能性がありますが、ロールバックが速いです。
- Canary: 一部をテストしてから全体にデプロイします。
Horizontal Pod AutoScaler
Metrics Serverを使用してAutoScalerを実装します。
Helm
K8Sパッケージ管理ツールです。
-
chart: k8sオブジェクトの束です。
-
repository: chartのリポジトリです。
-
release: chartのインスタンスです。
-
helm upgrade: イメージタグやCPU Limitを変更します。
-
helm rollback: 以前のバージョンにロールバックします。
-
helm create: 基本的なhelmテンプレートを作成します。
-
helm Lint: chartにエラーがないか検証します。
-
helm package: chartを圧縮します。これをchartリポジトリにアップロードします。