入門kubernetesを読んだ

入門kubernetesを読んだ。今更入門か?と言われそうだが、1年半ほどデープラーニングをやっていて、インフラ業から離れていたのでご容赦頂きたい。

これを読む前にk8s tutorialを読んだりしたが、圧倒的に物足りなかったので良い本はないかと探してこの本を読んだ。 正解だった。Kubernetesの作者が書いているので、単なる使い方だけではなく、設計指針なども書いてあって面白かった。

k8s は、コンテナの運用なり、Immutable Infrastructure のベストプラクティスを詰め込んで作った感がした。 k8s を使わないにしても、k8s の設計を知っておくことはアークテクチャ設計の上で役立つと感じた。

通読にかかったのは4時間ぐらいで結構サクッと読めた。ちゃんと試したりすればもっと時間がかかると思うが、概観を掴むにはそれぐらい。

目次

  • 1章 Kubernetes入門
  • 2章 コンテナの作成と起動
  • 3章 Kubernetesクラスタのデプロイ
  • 4章 よく使う kubectlコマンド
  • 5章 Pod
  • 6章 Labelと Annotation
  • 7章 サービスディスカバリ
  • 8章 ReplicaSet
  • 9章 DaemonSet
  • 10章 Job
  • 11章 ConfigMapと Secret
  • 12章 Deployment
  • 13章 ストレージソリューションとKubernetesの統合
  • 14章 実用的なアプリケーションのデプロイ

1章 Kubernetes入門

k8s は宣言的アプローチ

命令的なアプローチでは「Aを起動、Bを起動、Cを起動」です。これに対応する宣言的な設定は「レプリカ数は3に等しい」となります。

所感: terraform に比べるとコマンドが別れているので、命令的な気がするけどな〜

Kubernetesは、現在の状態が望ましい状態に一致するよう継続して動く

オペレータによる従来型の復旧作業は、手動の復旧策の実行やアラートに対する人間による介入というかたちで行われます

Kubernetesのような自己回復するシステムは、オペレータの責任を軽減すると共に、信頼性の高い復旧策をより早く実行することによって、システム全体の信頼性を改善することもできます。

コンポーネントをロードバランサで分離すると、サービスの他の層を調整したり設定し直したりせずにプログラムのサイズ(ひいてはキャパシティ)を大きくできるので、サービスを構成するプログラムをスケールするのが簡単になります

所感: LBは単に負荷分散だけではないよ、と

クラスタ自体のスケールアップが必要な場合もあるでしょう。ここでも、Kubernetesのおかげで作業が簡単になります

1.2.3 マイクロサービスによる開発チームのスケール

所感: 全部のチームが kubernetes 使うことを想定してマイクロサービスを話しているけど、チームによっては GAE 使ったりするので、全体で kubernetes 使うという前提は成り立たないと思うんだよなぁ。← 外部サービスを k8s Service として取り扱うことである程度解消できるみたい。13章

k8s の抽象化層

1.3 インフラの抽象化

パブリッククラスドサービスはインフラ指向のAPI. k8s はアプリ指向のAPI.

例えば「アプリケーション」とは言わず「仮想マシン」と言うことなど

2章 コンテナの作成と起動

Docker は知ってるのでスキップ

3章 Kubernetesクラスタのデプロイ

minikube: ローカルでk8sクラスタを簡単に試すやつ

4章 よく使う kubectlコマンド

Kubernetes上にあるものは、すべてRESTfulリソースで表せます。こういったリソースをKubernetesオブジェクトと呼びます

すべてのコマンドで -o wide をつけると詳細情報が取れる

pod で bash を起動する

kubectl exec -it <Pod名> -- bash”

pod に複数のコンテナが起動している場合は -c コンテナ名、でさらに指定する

5章 Pod

基本は1pod、1コンテナで良い。

ファイルシステムでやり取りするなど、どうしても複数コンテナを同じノードに載せないと動かない場合は、podに複数コンテナを載せる。

まとめて1コンテナにしないのは、ウェブフロントエンドコンテナと、Gitファイルシステムコンテナ、など性質や必要となるリソースが異なることが多いから。

ヘルスチェック、コンテナごとのリソース制限などの設定もできる。Volume を使った永続データコンテナを作るとかもできる。

podは鯨の群のことで、鯨に関連する語を使うDockerの慣習に従っています

同じPod内のアプリケーションは、同じIPアドレスとポート(ネットワークネームスペース)を使用し、同じホスト名(UTSネームスペース)を持ち、System V IPCやPOSIXメッセージキューを経由したネイティブなプロセス間通信チャネル(IPCネームスペース)を使って通信できます

k8s スケジューラの動き

Kubernetesスケジューラは同じアプリケーションのPodを別々のノードに分散しようとします

明示的に削除したり割り当て直したりしない限り、そのPodは同じノード上で動き続けます。

6章 Labelと Annotation

app=bandicoot,env=staging,ver=2 のような感じで pod にラベルをつけて検索できる

7章 サービスディスカバリ

Service オブジェクトが担当。

Service オブジェクトを作るとIPアドレスが割り当てられ、ラベル検索してデプロイされたpods(deployments)を検索して振り分ける(ってことであってる?)

Service オブエジェクトのIPアドレスに対しては、k8s の DNS サービスによって、「サービス名」で名前解決できるようになっている。

Service の Type を NodePort、LoadBalancer にかえると外からアクセスできるようになる。

7.5 より高度な詳細

裏側では、deployment に割り当てられている IPアドレスの一覧を管理する、Endpoints というものがある。

Endpoints は、 ラベルで deployments 検索して、それぞれの IP アドレスを一覧化することと同等。

それを kube-proxy なるものが Service のクラスタIP からルーティングされるように(クライアントが動くホストの) iptables を設定して実現している。つまり全ノード。

8章 ReplicaSet

指定した pod を何ノード動かすか管理。スケールアウト。冗長化。

9章 DaemonSet

全てのノードで1pod だけ動かしたいものがある。モニタエージントや、Fluentd コンテナとか。

10章 Job

短時間pod. kube oneshot.

10.2.3 並列実行キュー

Queue を扱う ReplicaSet を立てておいてそれを使う. それは自分で用意しないといけない。

なにかで enqueue して、Consumer ReplicaSet を立てておいてそいつが実行するアーキテクチャ。

(時間トリガーで kube oneshot なり enqueue する ReplicaSet も立てておけば、cron 的なものも作れそう)

11章 ConfigMapと Secret

環境(stag, prod) による設定違いや、機密情報を管理

12章 Deployment

所感: k8s tutorialGKE tutorial だと Pod や ReplicaSet はすっ飛ばしてまず deployment を作っていたが、この本だとその概念がやっとここで出てくる。

前に pod を作成と言っていた

kubectl run nginx --image=nginx:1.7.12

は実は deployment オブジェクトを作っていた。

Deploymentオブジェクトは、新しいバージョンのリリースを管理する仕組みです。Deploymentは、デプロイされたアプリケーションをバージョンをまたいで表現します

Deploymentを使うと、ダウンタイムやエラーを発生させずに、新しいバージョンのソフトウェアをシンプルかつ確実にロールアウトできます。

ReplicaSetがPodを管理するように、DeploymentはReplicaSetを管理します。

12.5 Deployment ロールアウト戦略

Recreate: シンプルに古いのを破棄して、新しいのを作る。Graceful shutdown にならないし、pod がない状態ができる。

RollingUpdate: ユーザトラフィックを受け付けながらダウンタイムなしで、サービスの新しいバージョンをロールアウトできる。

  • maxUnavailable: 100%から何%落としてローリングアップデートするか
  • maxSurge: 100%から何%増やしてローリングアップデートするか

13章 ストレージソリューションとKubernetesの統合

k8s の外にあるサービスを、k8s Service として取り扱うことができる

kind: Service
apiVersion: v1
metadata:
name: external-database
spec:
type: ExternalName
externalName: database.company.com”

staging では k8s で deployment を作って使う、などがしやすくなる (でも、他チームのサービス、どうやって作ってるか知らんしな)

StatefulSet

StatefulSet で MongoDB や MySQL などの状態を持つサービスをデプロイ。

また後で。

14章 実用的なアプリケーションのデプロイ

あとで暇だったら読む

    そのっつ (Naotoshi Seo)

    Written by

    CRuby, Fluentd, and Chainer committer. SRE, Specialist at ZOZO Technologies, Inc. ex-DeNA.