Kubernetes入門向けの資料です。 @さくらの夕べ Docker/Kubernetesナイト
お受けした質問の一部はこちらのツイートに紐づく形で回答しています → https://twitter.com/amaya382/status/1140559260234833920
補足) わかりやすさのため、説明を簡略化している・少々乱暴な表現をしている部分があります。また、一部機能の紹介では、k8s本体のみでなく周辺ツールを前提としたものも含まれます。
Kubernetesって何ができるの?どうなってるの?@さくらの⼣べ Docker/Kubernetesナイト技術本部2019/6/17 伊藤⻯⼀ (@amaya382)
View Slide
⾃⼰紹介伊藤⻯⼀しごと• 所属: 技術本部 アプリケーショングループ• 新規プロジェクト×2でKubernetesを導⼊中• 1つはAPIサーバのデプロイ先、バッチ処理実⾏環境として• 1つはスケーラブルなデータ処理基盤としてこじん• Twitter: @amaya382• Kubernetesに関する同⼈誌を書いたり• 技術書典7もKubernetes関係で模索中2
対象者とゴール前提• コンテナ型仮想化をなんとなく知っている• Dockerを触ったことがある対象者• Kubernetesという得体の知れないものの概要を知りたい• Docker化したアプリのいい感じのデプロイ先を探しているゴール• 概要を把握する• メリット・デメリットを把握する• 実運⽤する場合に何が必要になるかを知る3
始める前に…Kubernetes使ったことありますか?• ナニソレオイシイノ?名前しか知らない…• Nginxとかデプロイしてみたことあるよ• 本格利⽤すべく、いろいろな機能を試しているよ• がっつり本格利⽤しているよ4
Kubernetesって何?そもそも読み⽅がよく分からん• Kubernetes: クーバーネィティス (諸説あり)• k8s: ケーエイツ (ケーハチエス)• kube*: キューブ*コンテナオーケストレーションシステム• コンテナ間のネットワークの管理• 計算機リソースの分配• ⾃動的なデプロイ・スケール・障害時復旧• etc.※Docker以外にも対応しているが、殆どの場合Dockerと利⽤される5コンテナベースのアプリを本番運⽤するに必要な機能群
Kubernetesって何?そもそも読み⽅がよく分からん• Kubernetes: クーバーネィティス (諸説あり)• k8s: ケーエイツ (ケーハチエス)• kube*: キューブ*コンテナオーケストレーションシステム• コンテナ間のネットワークの管理• 計算機リソースの分配• ⾃動的なデプロイ・スケール・障害時復旧• etc.※Docker以外にも対応しているが、殆どの場合Dockerと利⽤される6コンテナベースのアプリを本番運⽤するに必要な機能群
Kubernetesって何?そもそも読み⽅がよく分からん• Kubernetes: クーバーネィティス (諸説あり)• k8s: ケーエイツ (ケーハチエス)• kube*: キューブ*コンテナオーケストレーションシステム• コンテナ間のネットワークの管理• 計算機リソースの分配• ⾃動的なデプロイ・スケール・障害時復旧• etc.※Docker以外にも対応しているが、殆どの場合Dockerと利⽤される7コンテナベースのアプリを本番運⽤するに必要な機能群どこで動かそう?
Kubernetesって何?そもそも読み⽅がよく分からん• Kubernetes: クーバーネィティス (諸説あり)• k8s: ケーエイツ (ケーハチエス)• kube*: キューブ*コンテナオーケストレーションシステム• コンテナ間のネットワークの管理• 計算機リソースの分配• ⾃動的なデプロイ・スケール・障害時復旧• etc.※Docker以外にも対応しているが、殆どの場合Dockerと利⽤される8コンテナベースのアプリを本番運⽤するに必要な機能群いっぱいだ増やそう
なぜk8s?「Dockerだけじゃだめなの?」• DockerはあくまでContainerを動かすところまで• 複数ノードになるとカバーしきれない部分が出てくる「似たようなプロダクトに、Mesos、DockerSwarm、Consulとかあるらしいけど?」• 正直⼀⻑⼀短。だが、将来性がありデファクトになりつつある9ECSを提供していたAmazonでさえEKSに⼒を⼊れているほど他のプロダクトと⽐較して複雑だが⾼機能・⾼性能
k8sで何ができるようになるの?スケールが容易• 各サービスごとのリソースプールのスケール• 全体のリソースプールのスケール対障害性• k8sを構成するコンポーネントそれぞれで冗⻑化可能• 部分的に障害が起きても、⾃動的に修復• ほとんどがステートレス• 最悪の場合でも環境ごと作り直しやすい10バースト対応も設定1つ⼊れるだけ
k8sで何ができるようになるの?⾼度な制御が可能• アクセス制御• アカウント権限管理• Role-Based Access Control(RBAC)どこでも動くしなんでも動く• ベンダー⾮依存• GPUready、機械学習基盤にも11クラウド+オンプレのハイブリッドなんてことも可能「あーるばっく」と発⾳するらしいデータベースAはアプリXからしかアクセスできません!
k8sで何ができるようになるの?ミドルウェアレベルまで全て織り込み済み• ロードバランサはデフォルトで⾃動作成• L7ReverseProxyもアプリの延⻑で設定可能• 個別にNginx/Apache等を建てて管理する必要なし12
k8sで何ができるようになるの?⼿厚いデプロイのサポート• 無停⽌アップデート• ローリングアップデート• Blue-Green• 特定の状態にロールバック• 宣⾔的・冪等性• テキストベースのマニフェスト• 「アプリコンテナを4個、nginxコンテナを2個、DBコンテナを2個。あ、でも負荷が⾼い時はnginxコンテナを5個まで⾃動で増やして!DBコンテナにアクセスできるのはアプリコンテナだけでよろ!」• 環境の再現が容易13実運⽤で超重要!
k8sで何ができるようになるの?⼀⾔で⾔うと、『ベンダ⾮依存・コンテナベース・全てコードで管理可能なフルスタックIaaS+PaaS』• とにかく運⽤で楽ができる!アプリの⾮機能要件にも強い!最⾼!!!• が、痛みも伴う…• 学習コストは特⼤• 構築コストも特⼤14構成を誤ると運⽤コストも下げられない→詳細はこの後のGitOpsにて!
ユースケース15
ユースケースマイクロサービス• 相性◎な機能が豊富• オートスケール• サーキットブレイク• ロールアウト• アクセス制御16特定サービスの負荷が上がったら、そのサービスだけを⾃動的にスケールアウト!特定サービスに障害が発⽣したら、そのサービスだけを切り離し!
ユースケースマイクロサービス• 相性◎な機能が豊富• オートスケール• サーキットブレイク• ロールアウト• アクセス制御17無停⽌でサービスをアップデート!特定のサービス間のみに制限してセキュリティリスクを抑制
ユースケースJupyterHub• JupyterNotebook環境をユーザごとに作るためのシステム• k8sを計算リソースプールとして利⽤• リクエストが来ると、バックエンドに配備されたk8sにJupyterNotebookのインスタンスが作成される• 様々な機械学習向けツールを内包したKubeflowも流⾏り始めている18
仕組み19
k8sの持つ2つの側⾯• DevOpsを強く意識• 複数レイヤのエンジニアが歩み寄った先「k8sを使うぞ!やっていくぞ!」となったとき、協調しつつも⼤きく2つに役割が分かれる• Admin• インフラエンジニア+運⽤エンジニアクラスタの作成・権限管理・運⽤・監視• ApplicationDeveloper• ミドルウェアエンジニア+ソフトウェアエンジニアクラスタ上で動かすサービスの構築・開発・運⽤20
Application Developerからみたk8s21有効v1v2無効NodeDeploymentReplicaSetPodContainerInternetユーザService※簡略化済物理マシンやVM1台と対応
Application Developerからみたk8s22有効v1v2無効NodeDeploymentReplicaSetPodContainerInternetユーザService※簡略化済主にReplicaSetを世代別管理ロールバック等を実現
Application Developerからみたk8s23有効v1v2無効NodeDeploymentReplicaSetPodContainerInternetユーザService※簡略化済Podを管理
Application Developerからみたk8s24有効v1v2無効NodeDeploymentReplicaSetPodContainerInternetユーザService※簡略化済Containerの集まり必ずNode上に収まる
Application Developerからみたk8s25有効v1v2無効NodeDeploymentReplicaSetPodContainerInternetユーザService※簡略化済Docker等のコンテナそのもの(つまりNodeのプロセス)
Application Developerからみたk8s26有効v1v2無効NodeDeploymentReplicaSetPodContainerInternetユーザService※簡略化済アプリへの疎通を管理
Application Developerからみたk8s27有効v1v2無効NodeDeploymentReplicaSetPodContainerInternetユーザService内部IP: XXX.XXX.XXX.1内部IP: XXX.XXX.XXX.2Local IP: YYY.YYY.YYY.1Local IP: YYY.YYY.YYY.2Global IP: ZZZ.ZZZ.ZZZ.1https://ZZZ.ZZZ.ZZZ.1※簡略化済
k8sAdminからみたk8s28MasteretcdAdminkube-apiserverkube-schedulercontroller-managerkube-proxykubeletNodeDockerPodContainerユーザLoadBalancerkube-proxykubelet※簡略化済設定を更新⾃Nodeのあるべき状態をPull
k8sAdminからみたk8s29MasteretcdAdminkube-apiserverkube-schedulercontroller-managerkube-proxykubeletNodeDockerPodContainerユーザLoadBalancerkube-proxykubelet※簡略化済全てのアクセスをプロキシ※k8s管理下だがk8s外のリソース
動かすには30
環境⾃前• kubeadm (≒⼿動)• Rancher• kubespray開発向けローカル環境• Linux: microk8s• Win/Mac: minikubeKubernetes as a Service(KaaS)• Google Kubernetes Engine(GKE)• AmazonElasticContainerServiceforKubernetes(EKS)• AzureKubernetesService(AKS)31本番環境にも利⽤でき、Adminが不要やはり⼿元で動かせるのは便利
• スタートアップスクリプトのRancherを使う• Rancher経由でk8sクラスタ作成• https://qiita.com/zembutsu/items/41837d953a518c0b7f9e• ⼿作り• ルーター+スイッチ配下にk8sクラスタを作る(ちょっとだけオプションが追加で必要)• sakura-cloud-controller-managerをインストール• LoadBalancerが使えるようになる• Service作成の際にロードバランサ関係のメタデータを付与32
ツールkubectl: CLIツール• kubectl create deployment --image=nginx mynginx• 「mynginx」という名前のnginxのDeploymentを作成• Deploymentに紐づく形で、ReplicaSet・Pod・Containerも作成される• kubectl expose deployment mynginx \--type=LoadBalancer --port=80• 「mynginx」という名前のDeploymentの80番ポートをLoadBalancer経由でアクセス可能にするServiceを作成• 外部のLoadBalancerが⾃動的に払い出される• kubectl get deployment mynginx -o=yaml• 「mynginx」という名前のDeploymentの情報をYAML形式で取得• kubectl apply -f nginx-deploy.yaml• 「nginx-deploy.yaml」というファイルの設定を適⽤• このYAML形式ファイルを「Manifest」と呼ぶ33
Manifestとは k8s設定のコード化を実現しているもの• YAMLやJSONで表現される• APIに直接対応• 独⾃の定義で拡張可能34apiVersion: apps/v1kind: Deploymentmetadata:labels:app: debugkitname: debugkitspec:replicas: 1selector:matchLabels:app: debugkittemplate:metadata:labels:app: debugkitspec:containers:- image: amaya382/k8s-debugkitname: k8s-debugkit例えば、k8s上でWorkflowを実現
まとめ ベンダー⾮依存・コンテナベース・⼀貫したコードで管理可能なIaaS+PaaS• その分学習コストは⾼い • k8s⾃体の構築・運⽤もやや難しい • とはいえカバー範囲を考えれば⼗分すぎるリターン導⼊が検討できる環境• アプリがコンテナ化されている• インフラ管理で疲弊している• アプリの更新頻度が⾼い• アプリの構成要素が多い• スパイクアクセスが発⽣する35KaaSであれば、構築・運⽤をスキップ可能。IaaS+Terraform+Ansible等で頑張ってきたことが⼀⼿に!例えば、「WordPressを1つ2つ動かしたい」程度には全く不適