今さら聞けない人のための
K8s超入門
Big Sur対応版
日本仮想化技術株式会社
代表取締役社長兼CEO
宮原 徹(@tmiyahar)
http://VirtualTech.jp
自己紹介
• 本名:宮原 徹
• 1972年1月 神奈川県生まれ
• 1994年3月 中央大学法学部法律学科卒業
• 1994年4月 日本オラクル株式会社入社
– PCサーバ向けRDBMS製品マーケティングに従事
– Linux版Oracle8の日本市場向け出荷に貢献
• 2000年3月 株式会社デジタルデザイン 東京支社長および株
式会社アクアリウムコンピューター 代表取締役社長に就任
– 2000年6月 (株)デジタルデザイン、ナスダック・ジャパン上場(4764)
• 2001年1月 株式会社びぎねっと 設立
• 2006年12月 日本仮想化技術株式会社 設立
• 2008年10月 IPA「日本OSS貢献者賞」受賞
• 2009年10月 日中韓OSSアワード 「特別貢献賞」受賞
• ガンダム勉強会主宰・好きなモビルスーツはアッガイ
2
3
『Software Desgin』で
「宮原徹のオープンソース放浪記」
5年間60回 連載してました
2021年2月号で無事終了!
日本仮想化技術株式会社 概要
• 社名:日本仮想化技術株式会社
– 英語名:VirtualTech Japan Inc.
– 略称:日本仮想化技術/VTJ
• 設立:2006年12月
• 資本金:3,000万円
• 売上高:2億1235万円(2020年7月期)
• 本社:東京都渋谷区渋谷1-8-1
• 取締役:宮原 徹(代表取締役社長兼CEO)
• 伊藤 宏通(取締役CTO)
• スタッフ:8名(うち、6名が仮想化技術専門エンジニアです)
• URL:http://VirtualTech.jp/
• 仮想化技術に関する研究および開発
– 仮想化技術に関する各種調査
– 仮想化技術を導入したシステムの構築・運用サポート
– OpenStackの導入支援・新規機能開発・運用サポート
– 自動化・DevOps支援
ベンダーニュートラルな
独立系仮想化技術の
エキスパート集団
4
主な業務内容
• 仮想化技術を活かしたコンサルティング
– オンプレからクラウドまで
– DevOps案件のOpsとして運用・IaC開発
• 新技術のコンサルティング・PoC
– 新しい仮想化技術の活用に関する調査
– PoCによる実証検証
– 5G、MEC、GPU、コンテナなど幅広く
5
本日のアジェンダ
1. Kubernetes (K8s )とは
2. K8sの導入(Minikubeを使って)
3. K8sを動かしてみる
4. K8sの仕組みを少し探ってみる
• コンテナオーケストレーションツールであるKubernetes (K8s)
の使用方法を講師なりに勉強して仕組みを理解できるように
解説します
• 各種情報を参照すれば(私でも)分かるレベルの説明は省略
しています
• 説明自体もかなりザックリです
• 8月に弊社から出した『Kubernetes雑にまとめてみた 2020年8
月版』も合わせてご参照ください
– https://www.slideshare.net/VirtualTech-JP/kubernetes-20208
6
Kubernetes (K8s)とは
7
Kubernetes(K8s)とは
• 『Kubernetes (K8s)は、デプロイやスケーリ
ングを自動化したり、コンテナ化されたアプ
リケーションを管理したりするための、オー
プンソースのシステムです。』
• デプロイ:アプリケーションを配備すること。
ここではアプリケーションが実行されるコン
テナを動作させること
• スケーリング:複数コンテナを実行すること
8
※ https://kubernetes.io/ja/
Podとは
• Podは、アプリケーションのコンテナ(いくつか
の場合においては複数のコンテナ)、ストレー
ジリソース、ユニークなネットワークIP、および
コンテナの実行方法を管理するオプションを
カプセル化します。
• Podはデプロイメントの単位、すなわち
Kubernetesのアプリケーションの単一インスタ
ンス で、単一のコンテナ または密結合なリ
ソースを共有する少数のコンテナで構成され
る場合があります。
9
※ https://kubernetes.io/ja/docs/concepts/workloads/pods/pod-overview/
なぜK8s?
• コンテナオーケストレーション
– 複数のコンテナ(その他ネットワークなど)を一元
管理したい
• 自動回復
– デプロイしたコンテナが障害などで停止した時に
コンテナを再実行する
• CI/CD
– 素早くデプロイできるコンテナ環境
• マイクロサービス化
– APIのアクセス先をコンテナで構築
10
K8sの導入(Minikubeを使って)
11
K8sを使うには
A) クラウド上のサービスを使う
– 実は一番現実的?
– 色々なサービスがある
B) 自分で構築する
– 仕組みをしっかりと理解したいならコレ
– 思ったよりも情報が少ない
C) Minukubeを使う
– コマンド練習用
– VirtualBoxに入れたり、Katacoda使ったり
• Katacoda:ブラウザで試せる学習環境
12
VirtualBoxでMinikubeを動かす
• 公式ドキュメントの手順に従って導入
– https://kubernetes.io/ja/docs/tasks/tools/install-minikube/
• 使用環境:macOS Big Sur(11.2.1)
– 標準シェルがzshなのでプロンプトは%
– MinikubeはWindows、Linuxでも導入可能ですが、手順や環境、本資料
での記述が一部異なりますのでご注意ください
1. VirtualBoxのインストール
– https://www.virtualbox.org/
2. Homebrewのインストール
– https://brew.sh/index_ja
3. Minikubeのインストール
– % brew install minikube
– Minikubeとkubectlコマンドがインストールされる
13
Minikubeの起動
1. minikubeコマンドで起動
– Podを実行するハイパーバイザーにVirtualBox
を指定
– % minikube start --driver=virtualbox
2. 起動完了までに時間がかかる
– ISOイメージやKubernetesもダウンロード
– VMが作成され、Kubernetesをインストール
3. 起動完了したら状態を確認
– % minikube status
14
※--driverオプションは以前の--vm-driverオプション
Minikubeのインストールと起動
15
K8sを動かしてみる
16
ダッシュボードを使う
• WebブラウザでKubernetesの状態確認や
操作が行えます
• コマンドを実行するとWebブラウザで自動
的にアクセス
– % minikube dashboard &
17
ダッシュボード画面
18
簡単なPodを起動
1. Podの起動
– % kubectl create deployment hello-minikube
--image=k8s.gcr.io/echoserver:1.10
2. Podをアクセス可能にする
– % kubectl expose deployment hello-minikube --
type=NodePort --port=8080
3. アクセス用のURLを取得する
– % minikube service hello-minikube --url
4. 取得したURLでPodにアクセス
– 例:http://192.168.99.100:30258
19
Podにアクセス
20
Kubernetesオブジェクト
• Deployment
– Pod(≒コンテナ)の状態を宣言したオブジェクト
– Deploymentをcreateしただけでは外部からは
アクセスできない(内部からはアクセスできる)
• Service
– Podのアプリケーションを外部にサービスとし
て公開するオブジェクト
21
Kubernetesオブジェクト
基本オブジェクト
• Pod
• Service
• Volume
• Namespace
上位オブジェクト
• Deployment
• DaemonSet
• StatefulSet
• ReplicaSet
• Job
22
上位オブジェクトの説明:コントローラーに依存して基本オブジェクトを構築し、
追加の機能と便利な機能を提供する高レベルの抽象化も含まれています
https://kubernetes.io/ja/docs/concepts/#kubernetes-objects
サービスの情報取得
• サービス一覧を取得
– % kubectl get svc
• サービス詳細を取得
– % kubectl describe svc
• サービスのエンドポイントを取得
– % kubectl get ep
23
参考
スケールさせる
• Podに含まれる実行コンテナの数を増やす
– % kubectl scale deployment hello-minikube
--replicas=2
– ダッシュボードからも実行可能
• Podの状態を確認
– % kubectl get pods -o wide
– % kubectl describe pods
• コンテナ数を減らして、確認
– % kubectl scale deployment hello-minikube
--replicas=1
– % kubectl get pods -o wide
24
スケールさせた状態
25
Pod内に
コンテナが2つ
Deplymentで
スケールできる
仕組みを少し探ってみる
26
MinikubeのVMにSSH
• minikubeコマンドでログイン可能
– % minikube ssh
• IPアドレスを調べてログインする場合
– % minikube ip
– % ssh docker@IPアドレス
– パスワードは tcuser
27
Minikubeのネットワークは?
• ホストからVMへの接続:VirtualBoxのホス
トオンリーネットワークを使用
– VM初回起動時に作成される
– ホストが192.168.99.1、VMが192.168.99.100〜
• VMからコンテナへの接続:Dockerの仮想
ブリッジ
– 仮想ブリッジdocker0は172.l7.0.1
– コンテナは172.17.0.x
28
参考
Minikubeのネットワーク構成図
29
ホスト
VM
vboxnet1
ブラウザ
docker0
Dockerコンテナ
eth0
eth1
192.168.99.1
192.168.99.100:31529
DNAT
172.17.0.1
172.17.0.5:8080
Dockerのネットワーク構成例
30
Dockerコンテナ
eth0
eth0
docker0
veth veth
Dockerコンテナ
eth0
仮想的に直結
ブリッジ接続
NAPT接続(IPマスカレードやポート転送)
外部
参考
※「今さら聞けない人のためのDocker超入門」より
NodePortのiptables設定
• NodePortで起動した場合のiptables設定
– % kubectl expose deployment hello-minikube --
type=NodePort --port=8080
– iptables-saveの前後で追加されるルールから抜粋
1. -A PREROUTING -j KUBE-SERVICES
2. -A KUBE-SERVICES --dst-type LOCAL -j KUBE-
NODEPORTS
3. -A KUBE-NODEPORTS -p tcp --dport 31529 -j KUBE-
SVC-HELLOMINIKUBE
4. -A KUBE-SVC-HELLOMINIKUBE -j KUBE-SEP-
HELLOMINIKUBE
5. -A KUBE-SEP-HELLOMINIKUBE -p tcp -j DNAT --to-
destination 172.17.0.5:8080
31
※HELLOMINIKUBEは実際にはユニークID
スケールした場合
32
ホスト
VM
vboxnet1
ブラウザ
docker0
Dockerコンテナ
eth0
Dockerコンテナ
eth0
eth1
192.168.99.1
192.168.99.100:31529
DNAT
172.17.0.1
172.17.0.6:8080
172.17.0.5:8080
アクセスを振り分け
スケール時のiptables設定
iptablesの設定が変更され、Pod内の複数コンテナに
振り分けされるようになる
1. -A KUBE-SVC-HELLOMINIKUBE --mode
random --probability 0.50000000000 -j KUBE-
SEP-HELLOMINIKUBE5
2. -A KUBE-SVC-HELLOMINIKUBE -j KUBE-
SEP-HELLOMINIKUBE6
3. -A KUBE-SEP-HELLOMINIKUBE5 -p tcp -j
DNAT --to-destination 172.17.0.5:8080
4. -A KUBE-SEP-HELLOMINIKUBE6 -p tcp -j
DNAT --to-destination 172.17.0.6:8080
33
※HELLOMINIKUBExは実際にはユニークID
Minikubeの停止と削除
• Minikubeのノード停止
– % minikube stop
• MinikubeのノードVMの削除
– % minikube delete
• K8sがバージョンアップした際
– 起動時に警告が出る
– HomeBrew側のminikubeのバージョンアップ
– Minikubeそのもののバージョンアップ
– なんか動作が微妙な感じがするので、クリーンイ
ンストールした方が良さそう
34
HomeBrewでMinikubeを削除
minikube stopとdeleteをした状態で
• インストールされているものの確認
– % brew list
• インストールされているものの削除例
– % brew uninstall kubernetes-cli minikube
• キャッシュのクリーンナップ
– % brew cleanup --prune=all
35
今後の課題
• 環境を色々と変えてみる
– minikube startのオプションで変更可能
– Kubernetesのバージョンの変更
– ネットワークの変更(CNI)
– コンテナランタイムの変更(--driver)
– リソース量(CPU・メモリ)の変更
• アプリケーションの実行
– 公式のドキュメントにもあります
• 使用していない機能の利用
– ボリューム
• 複数ノードの構成
– Minikubeではできない
– K3sとかMicroK8sとか
36
個人的な課題
• Raspberry Pi 4クラスタで動かす
37
Raspberry Pi 4クラスタ
4GB×1+8GB×3
LED冷却ファン装備
Raspberry Pi 4でやってみた
• Raspberry Pi OSをインストール
• ARM用Dockerをインストール
• Minikubeをインストール
• 一応動いた、っぽい?
• Macで動作している状況と勝手が違う
Raspberry Piで動かすには研究が必要
38
ありがとうございました
39

今さら聞けない人のための K8s超入門 Big Sur対応版