Kubernetes完全ガイド を読んだので、メモを残しておく。 普段、意識していなかったコマンドや仕組みをまとめておく。
- サイズの小さなイメージを作りたければ scratch や apline をベースにする
- ENTRYPOINT と CMD が設定されているときは、
$ENTRYPOINT $CMD
が実行されるようなイメージ - マルチステージビルド:ビルド専用のコンテナでだけ処理を行い、成果物を実行専用コンテナにコピーすることが出来る
- CNCF ではプロジェクトの成熟度を「Graduated」「Incubating」「Sandbox」の3段階に設定している
- オンプレで構築する場合はAWS や GCP でのインスタンスサイズが目安になる
- Flannel:ノード間でオーバーレイネットワークを構成する
- Docker, Inc. が提供するkubernetes のプレイグラウンドがある
- kubernetes のリソースは大きくわけて5種類
- Workloads, Discoverty &LB, Config & Storage, Cluser, Metadata
- 特に Metadata はクラスタ内で他のリソースを操作するためのリソース(HorizontalPodAutoscaler など)
- Deployment/CronJob > ReplicationController/ReplicaSet/DaemonSet/StatefulSet/Job > Pod という階層構造がある
kubectl get all
:ほぼすべてのリソースを一覧取得Stateful Set
:0番目の Pod が最初に作られ、最後に削除される
- kubeconfig
- clusters、users、contexts の3種類を設定(どれも複数登録可能)
- context や namespace の切り替えが冗長であれば、kubectx や kubens を使うと良いかも
- kube-ps1 を使うと cluster と namespace をプロンプトに出力できる
source <(kubectl completion bash)
などで zsh/bash の補完機能を使える
- コンウェイの法則:組織図と、マニフェストの管理方法やマイクロサービスのアーキテクチャが似ている
kubectl scale
:ReplicaSet, ReplicationController, Deployment, StatefulSet, Job, CronJob でスケーリングkubectl apply --prune
:実行時にマニフェストから削除されたリソースを検知して、自動で削除- CI/CDでは、単純にこのコマンドを投げ続けるだけでよい
kubectl apply --prune --all
:クラスタ内に存在するすべてのマニフェストを読み込ませないと、漏れがあったリソースが消えてしまい危険kubectl apply --prune -l system=a
:基本的にラベルを指定しておく
- デバッグ
kubectl cp
:コンテナとローカルマシンの間でファイル転送kubectl port-forward
:コンテナとローカルマシンの間でポート転送kubectl -v
:デバッグ出力
- サービスディスカバリ
spec.hostAliases
:Pod内の全コンテナの/etc/hosts
を書き換える- Pod内からは同 namespace に含まれるサービスを環境変数から確認できる
{service name}.{namespace}.svc.cluster.local
でサービスのAレコードが登録されているspec.externalTrafficPolicy=Local
とすると Node を跨ぐロードバランシングを行わない- Headless Service を使うと、VIP経由のトラフィックのロードバランシングではなく、DNSラウンドロビンによる負荷分散を行う
- 特定の Node のIPアドレス:ポート番号で受信したトラフィックを外部へ転送するために ExternalIP Service を使える
- ExternalName Service:事前に設定したCNAMEを返す
- Ingress
- Ingress:L7ロードバランサを提供する。Service とは違う位置づけなので、独立したリソース
- Ingress用Podをデプロイする場合:Ingress Pod 宛の Loadbalancer Service を作っておき、そこから先を L7 ロードバランスする
- Nginx Ingress は Inress Controller 自体が L7 相当の処理を行う Pod にもなっている(コントローラという名前だが)
- Secret が定義されたマニフェストは Git リポジトリにアップロードする際に kubesec を使って暗号化できる
- Dynamic Provisioning を使うと、PersistentVolumeChain が発行されたタイミングで動的に PersistentVolume を作成・割り当て
- スケジューリング
- Requests はリソースの下限、Limit はリソースの上限
- これら2つの差は小さくしておく
- 基本的に Requests を基準にスケジューリング
kubectl describe resourcequota
で確認できる- Beyond CPU: horizontal pod autoscaling with custom metrics in Google Kubernetes Engine が参考になる
- postStart/preStop:コンテナの起動後と停止直前に任意のコマンドを実行できる
- ただ確実に慈善処理を行うなら initContainers を使った方が良い
- None に対して Taints(汚れ) を付けておいて、Pod がそれを Tolerations(許容)するとうスケジューリング
- ログを中長期に安定保存するには Fluentd を使って外部に転送する構成を取るのがよい
- Spinnaker(Netflix)、skaffold(Google) などで CI/CD できる
- マニフェストファイルのLinter kubeval やユニットテストツール kubetest がある
- サービスメッシュ
- マイクロサービス間の通信や経路を制御する考え方
- Istio/Conduit(Linkerd v2)/Linkerd など
- etcd
- クラスタの全ての情報を保存するもの
- 単一障害店(SPoF)になってはならない
- Raft の性質上3/5/7台といった奇数台で組むのが良い
etcd snapshot
でバックアップをとれる
- Operator Framework を使って独自のリソースを作成できる
- X as a Service:Vitess(Mysql)、NATS(Queue)、Rook(Ceph)、Kubeflow(ML)