$30 off During Our Annual Pro Sale. View Details »

WebエンジニアのためのKubernetesサクッと入門

 WebエンジニアのためのKubernetesサクッと入門

NPO法人みんなのコード様の社内勉強会にて使用した資料を、許可を得て公開させていただきます。

SAITO Kazuya

November 30, 2020
Tweet

More Decks by SAITO Kazuya

Other Decks in Programming

Transcript

  1. Webエンジニアのための
    Kubernetesサクッと入門
    株式会社スマートアルゴリズム
    代表取締役 齋藤 和也

    View Slide

  2. 自己紹介
    1988年生まれ、福岡県出身、九州工業大学情報工
    学部卒。
    フリーランスとして2年ほど、Webサービスやスマー
    トフォンアプリの受託開発を中心に活動。アジャイル
    開発を実践し、保守性・拡張性の高い設計を得意と
    する。
    独立前は研究用ソフトウェアの開発に従事してお
    り、機械学習や自然言語処理といった分野にも明る
    い。
    2015年1月、株式会社スマートアルゴリズムを設
    立、代表取締役に就任。

    View Slide

  3. ゴール
    KubernetesでWebアプリを運用する上で
    最低限必要な構成要素をおさえよう!

    View Slide

  4. Dockerについて
    言わずと知れたコンテナ仮想化ソフトウェア
    VMのようにゲストOSがない分オーバーヘッドが小さい
    Kubernetesとは何か? | Kubernetesより引用

    View Slide

  5. Dockerだけだと何がまずいの?
    Dockerの役割=コンテナを動かすだけ
    ● 複数のコンテナをまとめて扱いたい場合は?
    ● イメージを更新した際のコンテナの入れ替えは?
    ● 負荷分散はどうする?
    ● サーバが複数台あったら?
    オーケストレーションは別で考える必要がある

    View Slide

  6. そこでKubernetes!

    View Slide

  7. Kubernetes(k8s)とは
    コンテナオーケストレーションのデファクトスタンダード
    複数台のサーバをクラスタ化し、設定内容に応じてコンテナのラ
    イフサイクルを管理したり自己修復したりしてくれる

    View Slide

  8. k8sのアーキテクチャ
    Kubernetes - Wikipediaより引用
    GKE等のマネージドサービスは
    Masterの面倒を見てくれる
    kubectlコマンドで
    クラスタを制御

    View Slide

  9. CronJob (fetch-weather)
    Webアプリ on k8s の構成例 (プログル情報の場合)
    Pod (proguru-high-xxx)
    nginx
    rails
    Pod (python-xxx)
    python
    Service (proguru-high) Service (python)
    Ingress (proguru-high)
    high.proguru.jp/* high.proguru.jp/************
    Job (fetch-weather-xxx)
    Deployment (proguru-high) Deployment (python)

    View Slide

  10. Deployment
    ● ローリングアップデートやロールバックといっ
    たデプロイ管理の仕組みを提供
    ● Deployment が ReplicaSet を管理し、
    ReplicaSet が Pod を管理する
    ● Deployment を更新
    → 新しい ReplicaSet を生成
    → 古い Pod と新しい Pod を入れ替え
    → 古い ReplicaSet を削除
    ● ローリングアップデートの戦略も柔軟にカス
    タマイズできる

    View Slide

  11. Service
    ● Podをネットワークサービスとして公開するため
    の仕組みを提供
    ● セレクタとポートでどのPodが参照されるか決ま

    ● クラスタ外からアクセスできるようにするために、
    NodePortを指定するケースが多い
    クラスタ内に閉じているなら ClusterIPも可
    ● クラスタ内DNSにより、サービス名をホスト名と
    してアクセスできる

    View Slide

  12. ConfigMap / Secret
    ● 値やファイルをクラスタに登録しておき別リ
    ソースから参照できる仕組みを提供
    ● 環境変数として使ったりファイルとしてマウン
    トしたりといった使い方
    ● ConfigMapは単なる設定
    Secretは秘匿情報を扱うという使い分け
    ● Secretについては公式ドキュメントを参照

    View Slide

  13. Ingress
    ● L7ロードバランサを扱う仕組みを提供
    ● GCPのロードバランサが作成される
    (GKE Ingress コントローラが制御)
    ● アノテーションによって静的 IPを付与したり
    SSL証明書を紐付けたりできる
    (ManagedCertificateが必要)
    ● ロードバランサはクラスタ外にあるため
    NodePortのサービスじゃないとIngress側か
    らアクセスできない

    View Slide

  14. CronJob
    ● Cronと同じ仕組みを提供
    ● Cronが動いているPodがあるのではなく
    CronJobがJobを起動する
    (DeploymentとPodの関係に似ている)
    ● タイムゾーンはMasterに依存するため、マ
    ネージドサービスを使う場合はまず
    間違いなくUTCになることに留意

    View Slide

  15. DaemonSet
    ● 全ノードで常に1つだけ特定のPodを起動す
    る仕組みを提供
    ● 各ノードのメトリクスを取得したりログを収集
    したりする用途が多い
    ● GKEではクラスタ作成時にオプションをつけ
    れば自動的にリソースが作られる

    View Slide

  16. よくある課題:環境ごとに設定を分けるには?
    ● プログル全般ではKustomizeというツールを使っている
    ● ベースのYAMLを用意し、環境ごとに設定を上書き
    ● Helmというツールもあるが、頻繁に更新されバージョニングさ
    れないようなWebアプリだと使いにくい印象
    ● k8sディレクトリで
    $ kustomize build overlays/staging
    を実行してみよう

    View Slide

  17. よくある課題:デプロイはどうする?
    ● プログル全般ではSkaffoldというツールを使っている
    ● kubectlはk8sクラスタを制御するためのツール
    Dockerイメージは別途作成する必要がある
    ● ビルド〜デプロイのパイプラインを制御してくれる
    プッシュ型のツール
    ● プル型のツールとしてFluxやArgoCDがある(GitOps)

    View Slide

  18. 他にもいろいろある
    網羅性が高くオススメ
    https://amzn.to/3ppEYf5
    Elasticsearchのクラスタをk8s上に簡単に構築
    https://www.elastic.co/jp/elastic-cloud-kubernetes
    カスタムリソース定義 (CRD)という仕組みにより
    kind: Elasticsearch
    というリソースを作成するだけで色々やってくれる

    View Slide

  19. Fin.

    View Slide