OSS のコンテナオーケストレーションツール
Kubernetes のご紹介
オープンソースカンファレンス 2020 Osaka
2020/01/24
SRA OSS, Inc. 日本支社
赤松 俊弘

whoami自己紹介 赤松 俊弘（Toshihiro Akamatsu）
 SRA OSS, Inc. 日本支社
OSS 事業本部 基盤技術グループ
職務 PostgreSQL 以外の OSS 全般の技術サポート、構築 主にインフラ構築・監視システム構築を担当© 2020 SRA OSS, Inc. Japan

2

はじめに

© 2020 SRA OSS, Inc. Japan3

コンテナとは ホスト OS 上に論理的な区画 (コンテナ) を作ってアプリケーションを動作させるために必要なプログラムなどをまとめたもの
コンテナ
コンテナ
バイナリ
バイナリ
 ホスト OS 上のリソースをライブラリライブラリコンテナで共有して利用 サーバ仮想化に対してコンテナランタイム
オーバヘッドが少ない 複数のコンテナを組み合わせてOS一つのアプリケーションを作る
マイクロサービスとの相性がよい
ハードウェア© 2020 SRA OSS, Inc. Japan4

アプリ開発の問題点
 開発環境・テスト環境・ステージング環境・本番環境など、複数の環境でインフラ・ミドルウェアの違いに依存する問題が発生しやすい開発

テスト

ステージング

本番

アプリ

アプリ

アプリ

アプリ

ミドルウェアミドルウェアミドルウェアミドルウェア

OS

OS

OS

OS

H/W

H/W

H/W

H/W

同じ環境??
© 2020 SRA OSS, Inc. Japan5

アプリ開発の問題点
 サービスが増えると開発環境・テスト環境・ステージング環境・本番環境も増える・・
ＡＢＣサービス向けシステム

新サービス向け
システム
インフラの準備時間とテスト実施のための時間がかかってしまって迅速な開発・サービス提供ができなくなってしまう© 2020 SRA OSS, Inc. Japan6

コンテナを利用したアプリ開発
 コンテナランタイム上で同じイメージを動かすことで環境の違いのリスクを減らすことができる コンテナ間は独立しているので、同じホスト上でも動作させることができる
 サーバ仮想化に対してオーバヘッドが少ないため、サーバの利用効率が上昇する© 2020 SRA OSS, Inc. Japan7

コンテナを利用したアプリ開発 コンテナの構成ファイルをGitリポジトリで管理・共有できる
 コンテナのイメージをリポジトリで管理・共有できる
 継続的インティグレーション／継続的デリバリー（CI・CD）を実施しやすく、アプリケーション開発が効率的にできる
CI/CD
アプリケーションソースコードの変更がされたら即座にコンテナを作成して、テスト環境でテストして本番環境にリリース可能な状況にしておく

生産性の向上や環境管理の負荷軽減が期待できる© 2020 SRA OSS, Inc. Japan8

2025 年の崖 (経済産業省より)https://www.meti.go.jp/shingikai/mono_info_service/digital_transformation/20180907_report.html

2025年の崖(経済産業省より)© 2020 SRA OSS, Inc. Japan9

コンテナオーケストレーション
 コンテナを動かす際には、可用性・性能を考慮して複数のホストマシンから構成されるクラスタが必要コンテナを自律制御・管理するためのクラスタプラットフォーム© 2020 SRA OSS, Inc. Japan10

Kubernetes とは© 2020 SRA OSS, Inc. Japan11

Kubernetes とはKubernetes is a portable, extensible, open-source platform
for managing containerized workloads and services,that facilitates both declarative configuration and automation.
What is Kubernetes.
Production-Grade Container Orchestration – Kubernetes.
https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/

Kubernetes は、宣言的な構成管理と自動化を促進し、コンテナ化されたワークロードやサービスを管理するための、ポータブルで拡張性のあるオープンソースプラットホーム
Kubernetesとは何か？.
Production-Grade Container Orchestration – Kubernetes.
https://kubernetes.io/ja/docs/concepts/overview/what-is-kubernetes/© 2020 SRA OSS, Inc. Japan

12

Kubernetes とは
 Google での 10 年以上の運用経験をもとに設計されたシステムをオープンソース化 (2014~)
 Cloud Native Computing Foundation (CNCF)
により開発・メンテナンス
 ベンダーフリー・認定システム間で互換性が高い
 Kubernetes を中心としたエコシステムの整備- Prometheus – fluentd

 大規模クラスタをサポート

https://www.cncf.io/certification/software-conformance/

https://kubernetes.io/docs/setup/best-practices/cluster-large/

項目

サポート対象

ノード数

5000台以下

Pod数

150,000以下

コンテナ数

300,000以下

１ノードあたりのpod数100以下© 2020 SRA OSS, Inc. Japan

13

リリースサイクル
 Kubernetes X.Y.Z
 X メジャーバージョン
 Y マイナーバージョン
 Z パッチバージョン
 最新 1.17.2 (2020/01/24 時点)

 マイナーバージョンのリリースサイクル 約３カ月
 ３つのマイナーバージョンをメンテナンス
一つのマイナーバージョンは約９か月間のみメンテナンスされる
https://kubernetes.io/docs/setup/release/version-skew-policy/© 2020 SRA OSS, Inc. Japan

14

Kubernetes の大きな特徴
 ユーザが宣言的に「あるべき状態」を定義
 Kubernetes は「あるべき状態」になるように「自律的」に働く
CHECK あるべき状態 = 実際の状態

Reconciliation
Loop
あるべき状態

実際の状態

状態が異なれば「あるべき状態」に直す© 2020 SRA OSS, Inc. Japan

15

あるべき状態 宣言１： Nginx を 3 つ動かす
１つの Nginx に障害が発生して、合計 2 つしか動いていない
場合には新規で 1 つ起動⇒ 障害の自動修復

 宣言2: Nginx の平均 CPU 利用率が 50% になるように Nginx を自動的に増やす⇒ 水平オートスケール

 宣言3: ノードのリソースが不足したらノードを追加⇒ ノードの水平オートスケール© 2020 SRA OSS, Inc. Japan

16

YAML による構成管理
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-masterlabels:app: redis
spec:
selector:
matchLabels:
app: redis
role: master
tier: backend

replicas: 1
template:
metadata:labels:app: redis
role: master
tier: backend
spec:
containers:- name: master

YAMLによる構成管理

構成をファイルで定義できる
Github などで管理しやすい

複製数の指定image: redis:5.0.4
resources:
requests:

コンテナイメージの指定

cpu: 100m
memory: 100Mi

H/Wリソースの設定

ports:- containerPort: 6379

© 2020 SRA OSS, Inc. Japan17

Kubernetes アーキテクチャ© 2020 SRA OSS, Inc. Japan18

Kubernetes アーキテクチャ
Kubernetes クラスタ
Master
クラスタの管理

Node
アプリケーションのホスト© 2020 SRA OSS, Inc. Japan19

Kubernetes アーキテクチャ
Master
kubecontrollermanager

kubescheduler

クライアントkubectl

etcd

kube-apiserver

kubeproxy

kubeletNode

kubeproxy

Container
RuntimekubeletNode

kubeproxy

NodeContainer
RuntimekubeletContainer
Runtime© 2020 SRA OSS, Inc. Japan20

kube-apiserver
Masterクライアントkubectl

クラスタの中心かつ全体のフロントエンド

kubecontrollermanager

kubescheduler

etcd

kube-apiserver

全てのコンポーネントがKube-apiserver を通して動作
Kubernetes API を外部に提供kubeproxy

Nodekubelet

Container
Runtime© 2020 SRA OSS, Inc. Japan

etcd へは kube-apiserver
からのみ通信可能
21

etcd
Masterクライアントkubectl

kubecontrollermanager

kubescheduler

etcd

kube-apiserver

kubeproxy

Nodekubelet

Container
Runtime© 2020 SRA OSS, Inc. Japan

一貫性、高可用性をもつ
キーバリューストア

Kuberbetes の全ての情報の保存先

22

kube-scheduler
Masterクライアントkubectl

kubecontrollermanager

kubescheduler

etcd

kube-apiserver

kubeproxy

Nodekubelet

Container
Runtime© 2020 SRA OSS, Inc. Japan

Pod を配置する Node を決定
配置に関する制約や条件を確認

23

kube-controller-manager
Masterクライアントkubectl

現在の状態が「あるべき状態」に合致するよう動作

kubecontrollermanager

kubescheduler

etcd

kube-apiserver

ノードコントローラ
ノードダウンの場合の通知と対応
レプリケーションコントローラ
Pod の起動数を正常に保つ

kubeproxy

Nodekubelet

Container
Runtime© 2020 SRA OSS, Inc. Japan

エンドポイントコントローラ
エンドポイントの注入
24

kubeletMasterクライアントkubectl

各 Node で実行されるエージェント
kubecontrollermanager

kubescheduler

etcd

kube-apiserver

kubeproxy

Nodekubelet

Container
Runtime© 2020 SRA OSS, Inc. Japan

Pod の定義を取得し、コンテナが正常に実行されていることを保証
コンテナエンジンにリクエストを受け渡す
クラスタに Pod と Node の状態を報告
25

kube-proxy
Masterクライアントkubectl

各 Node で動作する
ネットワークプロキシ

kubecontrollermanager

kubescheduler

etcd

kube-apiserver

Node のネットワークルールをメンテナンス
クラスタ内外から Pod への通信を可能に

kubeproxy

Nodekubelet

Container
Runtime© 2020 SRA OSS, Inc. Japan

ネットワークルールはiptables などを利用
26

耐障害性
Masterクライアントkubectl

部分的な障害がサービス停止にならないようなアーキテクチャ

kubecontrollermanager

kubescheduler

etcd

kube-apiserver

kubeproxy

Nodekubelet

Container
Runtime© 2020 SRA OSS, Inc. Japan

他のコンポーネントに接続ができなくても、各コンポーネントは直近の内容をもとに動作を続ける

27

Kubernetes リソース

© 2020 SRA OSS, Inc. Japan

28

Pod
 Kubernetes にデプロイする「論理ホスト」
 デプロイ可能な最小単位のオブジェクト
 １つ以上のコンテナ
 共有ネットワーク・ボリューム 同じ Pod 内のコンテナは同一 Node にデプロイされる
 Pod はいずれかの Namespace に属するNIC

Podノードコンテナ
ボリューム
https://kubernetes.io/docs/tutorials/kubernetes-basics/explore/explore-intro/© 2020 SRA OSS, Inc. Japan29

ReplicaSet Pod の上位リソース 同じ Pod を指定数だけ起動して管理するリソース(コントローラが指定数動いているか確認する)
ReplicaSet
Nginx-rs

Pod
Nginx

PodNginx© 2020 SRA OSS, Inc. Japan

Pod
Nginx

30

Deployment
 ReplicaSet の上位リソース
 バージョン管理

Deployment
ReplicaSet
ReplicaSet
Updatev.1
v.2
Podv.1

Podv.1

Podv.2

Podv.2rollback© 2020 SRA OSS, Inc. Japan

特定のバージョンにアップデート/ロールバック アップデート戦略
 Recreate
Pod をすべて停止、新しいバージョンで一斉に起動 RollingUpdate
少数の Pod を順次アップデート
31

Service Pod の IP アドレスは不定
 Service は Pod へのエンドポイントを提供
 クラスタ内部向け
 外向け
 クラスタ内外の負荷分散

Ｓｅｒｖｉｃｅ
RedisEndpoint

 Kubernetes 内部でもっている
DNS を利用して名前解決

Pod
Redis
1

 アプリからはサービス名でアクセス© 2020 SRA OSS, Inc. Japan

PodRedis
2

Pod
Redis
3

Deployment Redis32

その他のリソース
 DaemonSet 各 Node で必ず一つだけ動く Pod

 Statefulset
 状態を保持するアプリケーション
 ネットワーク識別子、永続的なストレージを利用できる

 Job/CronJob 処理が終わったら終了する Pod

 PersistentVolume/PesistentVolumeClaim 永続的なボリューム ConfigMap/Secret 設定・パスワード© 2020 SRA OSS, Inc. Japan33

構成図とリソースの対応
リソースを組み合わせてYAMLファイルで構成定義

Service

構成図

LOADBALANCER

ConfigMap
WEBparameter

Deployment

LBWEB

WEB

Replicas=3
WEB
WEB

Service
DBACCESSDB

SecretDBuserDBpassword

StatefulSet
Replicas=1
DB

ConfigMap
DBparameter

PVC
10G© 2020 SRA OSS, Inc. Japan

34

Namespace (名前空間)
 一つの kubernetes クラスタ上で複数の仮想クラスタの動作をサポート

テナントX

ユーザ1
ユーザ2

ステージング

テナントY

サービスＡ

サービスB

単体テスト

開発・テスト環境クラスタ

本番環境クラスタ© 2020 SRA OSS, Inc. Japan

35

カスタムリソース
 リソースを自分で作ることもできる⇒ 独自の Reconciliation Loopの開発
 オペレータの運用ノウハウをコードで表現できる https://operatorhub.io/で公開されている
例: Zalando社：Postgres-OperatorPostgreSQL SR構成を管理してくれるリソース
Primary-Standby(マスタ-スレーブ)の状態管理© 2020 SRA OSS, Inc. Japan

36

まとめ

© 2020 SRA OSS, Inc. Japan37

長所と短所 コンテナ開発による生産性の向上
 コンテナによる環境管理の負荷軽減
 コンテナによる効率的なサーバ運用
 自動スケーリング
 障害の自動修復
 ファイルベースによる構成、バージョン管理 特定のベンダに支配されない標準技術• 学習コストが高い• Kubernetesのリリースが早くて追従が大変• エコシステム(関連ソフトウェア)も進歩が速く追従が大変© 2020 SRA OSS, Inc. Japan38

システム管理者と開発者の役割
VMによる運用 システム管理者


コンテナによる運用
 システム管理VM の払い出し
ネットワークの定義
ホストの監視・管理
ミドルウェアの冗長化対策

 Kubernetes クラスタの監視・管理

 開発者


 開発者

ssh などで VM にアクセスして環境の構築

 ファイルベースで構成を定義
 Git などでアプリケーションと構成を管理© 2020 SRA OSS, Inc. Japan

39

Appendix© 2020 SRA OSS, Inc. Japan40

Kubernetes の学習 オンラインコースの活用 ブラウザでkubernetesクラスタを操作できる© 2020 SRA OSS, Inc. Japan

41

認定資格制度 Certified Kubernetes Administrator (CKA) 試験 Kubernetesの管理者に必要なスキル、知識、および能力が問われる試験 ハンズオン形式の試験 試験時間3時間

 Certified Kubernetes Application Developer（CKAD）試験 Kubernetes上でアプリケーションを設計・構築・設定・展開できることを証明する
資格試験
 ハンズオン形式の試験 試験時間 2時間© 2020 SRA OSS, Inc. Japan

42

情報収集
 kubernetes slack https://slack.k8s.io/#jp-users #jp-events チャンネル Kubernetes Meetup Tokyo
https://k8sjp.connpass.com/
毎月開催 19:00~
200~300人規模のイベント
youtube配信あり© 2020 SRA OSS, Inc. Japan43

CNCF trail map

https://github.com/cncf/landscape/blob/master/README.md#trail-map© 2020 SRA OSS, Inc. Japan44

CNCF landscape© 2020 SRA OSS, Inc. Japan45

ご清聴ありがとうございました。

© 2020 SRA OSS, Inc. Japan

46