Upgrade to Pro — share decks privately, control downloads, hide ads and more …

めっちゃわかる Kubernetes! / Mix Leap Study #32

めっちゃわかる Kubernetes! / Mix Leap Study #32

大規模環境でのコンテナの利用において、Kubernetes がデファクトスタンダードになりました。
本セッションでは、Kubernetes とは何か、なぜ Kubernetes なのか、
また具体的に何ができるのかをデモを通じて紹介します。
また Yahoo! JAPAN は、2017年10月頃から本番環境で Kubernetes を利用しています。
その後1年強経過し、現在どのような状況なのか、どのように利用しているのかを紹介します。

https://yahoo-osaka.connpass.com/event/113370/

Kazuki Suda

January 31, 2019
Tweet

More Decks by Kazuki Suda

Other Decks in Technology

Transcript

  1. Kazuki Suda / @superbrothers ▶ ソフトウェアエンジニア@Z Lab & Yahoo Japan

    ▶ 第8代黒帯〜インフラストラクチャ Kubernetes〜 ▶ Kubernetes Meetup Tokyo 主催 ▶ Cloud Native Deep Dive 主催
  2. @superbrothers アジェンダ 1. Kubernetes とはなにか 2. ヤフーと Kubernetes 3. コンテナとはなにか

    4. なぜコンテナなのか 5. なぜ Kubernetes なのか 6. なぜ Kubernetes なのか(機能⾯) 7. Kubernetes のアーキテクチャとオブジェクト 8. より詳しく知るには
  3. @superbrothers Kubernetes ▶ コンテナオーケストレーションツール + 複数のマシン(ノード)で構成されるクラスタに対して
 コンテナ(アプリケーション)の配備、設定、管理を⾏う ▶ κυβερνήτης: ギリシャ語で操舵⼠

    ▶ Google の社内システムからインスパイアされた ▶ 2014年6⽉に最初のコミットがあり、2015年7⽉に1.0.0をリリース + 2019年1⽉時点の最新バージョンは 1.13.0 “Kubernetes is open source—a contrast to Borg and Omega,
 which were developed as purely Google-internal systems. “ Borg, Omega, and Kubernetes
  4. @superbrothers Kubernetes ▶ 初期は Google のソフトウェアだったが、その後
 Cloud Native Computing Foundation(CNCF)に譲渡され、


    現在は CNCF がホストするオープンソースプロジェクト + CNCF は Linux Foundation 傘下の組織 ▶ オンプレでの利⽤はもちろん、
 GCP や AWS、Azure でマネージドサービスとしても提供されている ▶ 「10年以上に渡りコンテナを本番環境で運⽤してきた Google の経験と
 多くの企業によるコミュニティの優れたアイデアと⼿法が組み込まれている」
  5. @superbrothers Kubernetes はオープンである ▶ オープンソースソフトウェア + github.com/kubernetes/kubernetes (Apache License 2.0)

    ▶ オープンデザイン + github.com/kubernetes/community ▶ オープンコミュニティ + Cloud Native Computing Foundation + Special Interest Groups (SIGs) ▶ Slack, StackOverflow, 全世界で300以上のミートアップ + Kubernetes Slack ワークスペース(slack.k8s.io) #jp-users + Kubernetes Meetup Tokyo
  6. @superbrothers Kubernetes はポータブルである ▶ cloud-controller-manager(クラウドの操作) + L4 LB, ブロックストレージなどの操作を抽象化 +

    GCP、AWS、Azure、OpenStack など ▶ CNI(Container Network Interface) + コンテナネットワークの標準化 + Calico、Flannel、Weave Net など ▶ CRI(Container Runtime Interface) + コンテナ操作の標準化 + Docker(containerd)、cri-o、rkt
  7. @superbrothers Kubernetes は成⻑している Kubernetes Docker Swarm Apache Mesos All Time

    Statistics Contributors 2,235 209 357 Commits 70,766 3,501 31,890 12 Month Statistics Contributors 871 25 117 Commits 14,477 230 6,890 https://www.openhub.net/p/_compare?project_0=Kubernetes&project_1=docker+swarm&project_2=Apache+Mesos As of 19/1/23
  8. @superbrothers なぜ Kubernetes なのか ひんぱんなデプロイに耐えられる⾮常に優れた機能を持つ ▶ これまでの開発は、アプリケーションのデプロイに数⽇、数週間かかることも ▶ 時間のかかるデプロイは、問題があったときの修正も遅くなる ▶

    逆にいうとひんぱんなデプロイは問題をすぐに修正でき、リスクを取れる + 1つひとつのデプロイが軽くなり(ボリューム、リスク) + 間違いから迅速に復旧できるようになり + より多くのリスクをとることができる ▶ 開発した成果をいかにはやく本番に届けられるかが競合に勝つための⼤きな要 因になっている
  9. @superbrothers apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas:

    3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.13.3 ports: - containerPort: 80 Kubernetes における宣⾔的設定 レプリカ数 (3つデプロイする) デプロイするコンテナイメージ (nginx のバージョン 1.13.3)
  10. @superbrothers VM中⼼ではなく「コンテナ中⼼」のインフラ Kubernetes は、複数の VM (ノード) を1つの⼤きなリソースプール (クラスタ) とし て扱うことで

    VM を抽象化する。 ▶ クラスタに対してコンテナをデプロイすると、そのコンテナの実⾏に必要なリ ソースが空いているノードにスケジュールされる ▶ 開発者は、特定のコンテナがクラスタ内のどのノードで実⾏されているかを気 になる必要がない
  11. @superbrothers クラスタはノードの集合体 クラスタ CPU: 8 RAM: 30GB ノード CPU: 80

    RAM: 300GB GPU: 3 CPU: 8 RAM: 30GB GPU: 3 異なるタイプのマシンも同居できる
  12. @superbrothers VMの抽象化に加えて、ITインフラも抽象化 VM の抽象化に加えて、サービスの構成を「アプリケーション指向」に抽象化され た Kubernetes オブジェクトで扱う。 ▶ ロードバランサや永続ストレージなどの IT

    インフラを抽象化 ▶ ステートレスからステートフルまでさまざまな種類のアプリケーションに対応 する多くのオブジェクトが⽤意されている
  13. @superbrothers ひんぱんなデプロイに耐えられる⾮常に優れた機能 ▶ ひんぱんなデプロイを可能にする「宣⾔的設定」 + デプロイした結果を「宣⾔的に」記述した設定ファイルによるデプロイ + 確実なロールバックも容易に実現 ▶ 強⼒な⾃⼰回復機能「セルフヒーリング」

    + 常に健全な数のアプリケーションが実⾏されている状態を保とうとする ▶ VM(仮想マシン)中⼼ではなく「コンテナ中⼼のインフラ」 + 個々のマシンの管理は⾏わなわず、クラスタを⼤きなマシンとして扱う + ロードバランサなどのITインフラを抽象化し、サービス構成の管理を⾃動化
  14. @superbrothers 他のプラットフォームとの⽐較 ▶ Infrastructure as a Service ▶ VM, ディスク,

    ネット ワーク Kubernetes ▶ Container as a Service ▶ コンテナの管理、実⾏ ▶ あらゆるアプリケーション Cloud Foundry ▶ Platform as a Service ▶ コードからデプロイ ▶ HTTP、API、Web OpenStack
  15. ▶ コンテナで⾃由度と抽象化を バランスよく実現する ▶ 抽象度が⾼く、⽣産性が ⾼い ▶ ⼀⽅で⾃由度が低い 物理インフラ OS

    サーバ仮想化 ミドルウェア ランタイム アプリケーション 物理インフラ OS サーバ仮想化 ミドルウェア ランタイム アプリケーション 物理インフラ OS サーバ仮想化 ミドルウェア ランタイム アプリケーション コンテナ化 IaaS Kubernetes PaaS ▶ ⾃由度は⾼いが管理す るものが多い ⾃由度 ⽣産性
  16. @superbrothers Kubernetes のアーキテクチャ controller
 Manager scheduler apiserver kubelet コンテナ
 ランタイム

    etcd API kube-proxy ノード B .. マスタコンポーネント ノード A ! kubectl
  17. @superbrothers Kubernetes オブジェクト ワークロードやITインフラを「アプリケーション指向」に抽象化したもので、開発 者はオブジェクトをマニフェストと呼ばれる YAML または JSON 形式のファイルで 記述する。

    ▶ Pod: 複数のコンテナと複数のボリューム ▶ Label: 唯⼀のグルーピング機能 ▶ ReplicaSet: N個の Pod が実⾏されている状態を保つ ▶ Deployment: ローリングアップデート、ロールバック ▶ Service: 仮想IPとポート、サービスのエントリポイント
  18. @superbrothers Pod A ボリューム コンテナ コンテナ ノード1 ノード2 IP: 10.60.0.5

    Pod B IP: 10.60.1.7 Pod C IP: 10.60.1.8 Podに含まれるコンテナは
 必ず同じノード上で実⾏される 各PodはフラットなネットワークのIPアドレスを持ち、ノードをまたいで通信できる
  19. @superbrothers Pod(ポッド) ▶ 複数のコンテナと
 複数のボリューム ▶ デプロイの最⼩単位 ▶ IP-per-Pod apiVersion:

    v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx:1.15.8 ports: - containerPort: 80
  20. @superbrothers Label(ラベル) ▶ 唯⼀のグルーピング機構 ▶ セレクタによるクエリ + app=frontend apiVersion: v1

    kind: Pod metadata: name: nginx labels: app: frontend spec: containers: - name: nginx image: nginx:1.15.8 ports: - containerPort: 80
  21. @superbrothers ReplicaSet(レプリカセット) ▶ N個のPodが実⾏されている状態を保つ ReplicaSet レプリカ数: 3
 セレクタ: app=nginx ノードA

    Podテンプレート ノードB Pod C app: nginx app: nginx Pod B app: nginx Pod A app: nginx 望ましい数: 3 現在の数: 3
  22. @superbrothers ReplicaSet(レプリカセット) ▶ N個のPodが実⾏されている状態を保つ ReplicaSet レプリカ数: 3
 セレクタ: app=nginx ノード1

    Podテンプレート ノード2 Pod C app: nginx app: nginx Pod D app: nginx Pod A app: nginx 望ましい数: 3 現在の数: 3
  23. @superbrothers ReplicaSet ▶ N個のPodが実⾏されている状態を保つ apiVersion: apps/v1 kind: ReplicaSet metadata: name:

    nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.15.8 ports: - containerPort: 80 Podテンプレート レプリカ数
  24. @superbrothers Pod A-A web:v1 Deployment(デプロイメント) ▶ ローリングアップデート ▶ ロールバック Deployment

    A containers - image: web:v1 レプリカ数: 2 ReplicaSet A containers - image: web:v1 レプリカ数: 2 Pod A-B web:v1
  25. @superbrothers Deployment(デプロイメント) ▶ ローリングアップデート ▶ ロールバック Deployment A containers -

    image: web:v2 レプリカ数: 2 ReplicaSet A containers - image: web:v1 レプリカ数: 2 ReplicaSet B containers - image: web:v2 レプリカ数: 1 Pod A-A web:v1 Pod A-B web:v1
  26. @superbrothers Deployment(デプロイメント) ▶ ローリングアップデート ▶ ロールバック Deployment A containers -

    image: web:v2 レプリカ数: 2 ReplicaSet A containers - image: web:v1 レプリカ数: 2 ReplicaSet B containers - image: web:v2 レプリカ数: 1 Pod A-A web:v1 Pod A-B web:v1 Pod B-A web:v2
  27. @superbrothers Deployment(デプロイメント) ▶ ローリングアップデート ▶ ロールバック Deployment A containers -

    image: web:v2 レプリカ数: 2 ReplicaSet A containers - image: web:v1 レプリカ数: 1 ReplicaSet B containers - image: web:v2 レプリカ数: 1 Pod A-B web:v1 Pod B-A web:v2 Deployment(デプロイメント)
  28. @superbrothers Deployment(デプロイメント) ▶ ローリングアップデート ▶ ロールバック Deployment A containers -

    image: web:v2 レプリカ数: 2 ReplicaSet A containers - image: web:v1 レプリカ数: 1 ReplicaSet B containers - image: web:v2 レプリカ数: 2 Pod A-B web:v1 Pod B-A web:v2 Pod B-B web:v2
  29. @superbrothers Deployment(デプロイメント) ▶ ローリングアップデート ▶ ロールバック Deployment A containers -

    image: web:v2 レプリカ数: 2 ReplicaSet A containers - image: web:v1 レプリカ数: 0 ReplicaSet B containers - image: web:v2 レプリカ数: 2 Pod B-A web:v2 Pod B-B web:v2
  30. @superbrothers Deployment ▶ ローリングアップデート ▶ ロールバック apiVersion: apps/v1 kind: Deployment

    metadata: name: nginx spec: replicas: 2 selector: matchLabels: app: nginx strategy: type: RollingUpdate rollingUpdate: maxSurge: 25% maxUnavailable: 25% template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.15.8 ports: - containerPort: 80 デプロイ戦略 レプリカ数 Pod テンプレート
  31. @superbrothers Service(サービス) ▶ 仮想IPとポート ▶ ラベルセレクタによる Pod のグルーピング ▶ サービスタイプ

    + ClusterIP + NodePort + LoadBalancer + Service my-svc タイプ: ClusterIP
 セレクタ: app=nginx ポート: 8080/tcp→80/tcp clusterIP: 10.0.171.239 10.0.171.239:8080 Pod A IP: 10.60.0.5 Pod B IP: 10.60.1.7 10.60.0.5:80 10.60.1.7:80 ReplicaSet app: nginx app: nginx
  32. @superbrothers Service nginx タイプ: ClusterIP
 セレクタ: app=nginx ポート: 8080/tcp→80/tcp clusterIP:

    10.0.171.239 10.0.171.239:8080 Pod A IP: 10.60.0.5 Pod B IP: 10.60.1.7 10.60.0.5:80 10.60.1.7:80 ReplicaSet app: nginx app: nginx nginx:8080 Pod α Service 名によるサービスディスカバリ
  33. @superbrothers Service(サービス) ▶ 仮想IPとポート ▶ ラベルセレクタによる Pod のグルーピング ▶ サービスタイプ

    + ClusterIP + NodePort + LoadBalancer + apiVersion: v1 kind: Service metadata: name: nginx spec: type: ClusterIP selector: app: nginx ports: - protocol: TCP port: 8080 targetPort: 80
  34. @superbrothers その他の主なオブジェクト ▶ Namespace: クラスタを論理的に分割する ▶ ConfigMap: アプリケーションと設定の分離 ▶ Secret:

    アプリケーションとシークレットの分離 ▶ PersistentVolume, PersistentVolumeClaim, StorageClass: 永続ボリューム ▶ StatefulSet: ステートフルアプリケーション ▶ Job: ワンショットジョブ ▶ CronJob: ジョブの定期実⾏ ▶ DaemonSet: 全てのノードで Pod を実⾏ ▶ Ingress: HTTP負荷分散、バーチャルホスト、TLS 終端 ▶ HolizontalPodAutoScaler (HPA): オートスケール
  35. @superbrothers より詳しく知るには ▶ すぐ始めるには + Minikube: ローカルに開発⽤クラスタを構築 + Google Kubernetes

    Engine: 信頼と実績 ▶ 公式ドキュメント: kubernetes.io ▶ ⽇本コミュニティ Kubernetes Slack チャンネル: slack.k8s.io #jp-users ▶ ミートアップ: Kubernetes Meetup Tokyo - bit.ly/k8sjp ▶ 書籍 + ⼊⾨ Kubernetes(オライリー・ジャパン) + Mastering Kubernetes(O’Reilly) + Kubernetes 完全ガイド(インプレス)
  36. @superbrothers Kubernetes ▶ コンテナオーケストレーションツール + 複数のマシン(ノード)で構成されるクラスタに対して
 コンテナ(アプリケーション)の配備、設定、管理を⾏う ▶ κυβερνήτης: ギリシャ語で操舵⼠

    ▶ Cloud Native Computing Foundation(CNCF)がホストする
 オープンソースプロジェクト ▶ オンプレでの利⽤はもちろん、
 GCP や AWS、Azure でマネージドサービスとしても提供されている ▶ 「10年以上に渡りコンテナを本番環境で運⽤してきた Google の経験と
 多くの企業によるコミュニティの優れたアイデアと⼿法が組み込まれている」