Kubernetes Introduction
目次
- [[#この発表を通して得られる効果|この発表を通して得られる効果]]
- [[#動機|動機]]
- [[#コンテナことはじめ|コンテナことはじめ]]
- [[#コンテナことはじめ#What is container?|What is container?]]
- [[#コンテナことはじめ#build, ship and run|build, ship and run]]
- [[#コンテナことはじめ#料理で例えると…|料理で例えると…]]
- [[#コンテナことはじめ#docker command samples|docker command samples]]
- [[#About Kubernetes|About Kubernetes]]
- [[#周辺技術|周辺技術]]
- [[#How-to|How-to]]
- [[#How-to#リソースの定義(sample)|リソースの定義(sample)]]
- [[#How-to#リソースの追加・削除・確認|リソースの追加・削除・確認]]
- [[#How-to#Kubernetes Cluster 構築方法|Kubernetes Cluster 構築方法]]
- [[#注意点|注意点]]
- [[#まとめ|まとめ]]
- [[#Appendix|Appendix]]
- [[#Appendix#よく使われるサービス|よく使われるサービス]]
この発表を通して得られる効果
- Kubernetes(クバネティス)の概要がわかる
- Kubernetesに関係する技術分野がわかる
- Kubernetesに対しての心理的障壁が下がる(仲良くなれるかも?)
動機
- なぜKubernetesを選んだのか
- 今年触れて面白かった技術で、業務でも使用しています。
- また個人でも細々と盆栽サーバーを育てています。
- 生き物みたいで可愛いですね🦆
- 学習コストが高いと感じるかもしれません
- 私もそうでした
- このスライドが少しでも学習のきっかけになればと思います。
コンテナことはじめ
What is container?
- virtualization(仮想化)技術の一種
- ミドルウェア以上の階層を仮想化
- これによりVM(仮想マシン)と比較すると軽量コンパクト
- アプリケーションとライブラリ、ミドルウェアをまとめたひとつのユニットを「コンテナ」と呼ぶ
- 物流コンテナのように、一つの箱に色々詰め込むイメージ
- 物流コンテナのように、一つの箱に色々詰め込むイメージ
- 実態としてはLinuxのプロセスの一つとして稼働
- namespaceによるリソース分離
- ミドルウェア以上の階層を仮想化
build, ship and run
- build
- 実行環境を”image”と呼ばれる形式で配布可能とする
- コンテナの設計図
- ship
- imageを保管場所に上げる
- Docker Hub
- プライベートレジストリ
- imageを保管場所に上げる
- run
- imageからcontainerを起動する
料理で例えると…
- build
- 料理人が料理のレシピを考える。一から食材を取り揃えるもよし、「カレーの具材セット」のような有り合わせの食材をベースとして作るもよし。考えたレシピはルールに従って記載する。
- ship
- c○○kpadをはじめとするレシピ共有サイトにレシピを投稿
- run
- 利用者側で「全自動料理製造機」を持っていると仮定し、それにレシピを食わせてやると料理人が考えた料理と(ほぼ)同じ料理が出来上がる

- 利用者側で「全自動料理製造機」を持っていると仮定し、それにレシピを食わせてやると料理人が考えた料理と(ほぼ)同じ料理が出来上がる
docker command samples
- [build]
Dockerfileを作成
FROM ubuntu:24.04
WORKDIR /work
COPY entrypoint.sh /work/entrypoint.sh
CMD ["/bin/bash", "/work/entrypiont.sh"]
- [build]
docker imageを生成
docker image build -t testimage:latest -f Dockerfile .
- [ship]
docker imageをpush
docker image tag testimage:latest xxxxxxx/testimage:latest
docker image push xxxxxxx/testimage:latest
- [run]
docker imageからコンテナの実行
docker container run -it xxxxxx/testimage:latest
What is Kubernetes
- コンテナオーケストレーションサービスとも呼ばれ、コンテナ管理を容易にするツールです。
- 「オーケストラ」における演者がコンテナ群、Kubernetesが指揮者に相当します
- 複数のコンテナを調整し、効率的に動作させることが目的です。
Tips
名前
- ギリシャ語で「操縦桿」を意味する
K + ubernete(8文字) + sであることから”k8s”と呼ばれることも
アイコンの由来
Google内でのKubernetesのもともとのコードネームはProject Sevenであり、スター・トレックのキャラクターで、優しいBorgである、セブン・オブ・ナインの名前に由来する。Kubernetesのロゴの輪にある7つのスポークは、このコードネームに由来している。
Key points
- 宣言的リソース管理
- 期待する状態を定義し、自動でその状態を維持します。
- Reconcile Loop(突き合わせループ): 現実と期待する状態が異なる場合に差異を補う仕組みです。
- namespaceによる分離
- Kubernetesではリソースを論理的にグループ分けできます。これにより、異なるプロジェクト間での分離を実現します。
Why we need Kubernetes
- コンテナ管理のコスト削減
- 歴史的にはGoogleの内部サービスから生まれました。
- スケーラビリティ
- 要望に応じ、必要なタイミングで必要なリソースを調達できる
- リソース集約率向上
- 一つのサーバーの中に、複数のアプリケーションを並行して実行させることができる
- 空きスペースに極限まで詰め込む
周辺技術
Docker
- コンテナ化ツールで、Kubernetesに必要な基本的な部分となります。
Linux
- コンテナが動作するベースとなるOSです。
- ネットワーク
- Kubernetesは高度なネットワーキング機能を備えています。
- したがって、それらを下支えする基礎的な技術の習得は必要です。
Kubernetes Official Architecture Image
Components
Node
- Controller Node
- クラスタ全体の管理を行います。
- Worker Node
- アプリケーションの実行に使用されます。
Cluster
- 複数のNodeから構成されるユニット
Pod
- (複数の) Containerから構成される、Kubernetes実行の最小単位
- Main
- SideCar
- Liveness Probe, Readiness Probe
Deployment
- Pod(およびコンテナ群)をまとめて管理する主体
Service
[!reason] スケーリングや障害発生のタイミングでPodが削除・起動されるたびに、新たに作成されるPodには毎回異なるIPアドレスが払い出されます。したがって、あるPodにアクセスしようとしたときに「アクセスしたいPodに今割り当てられているIPアドレスが何かわからない」という問題があります。そこでServiceはPod集合に対して1つの共通IPアドレスを付与し、具体的なPodへの接続やロードバランシングを可能にします。 [改訂新版]イラストでわかるDockerとKubernetes
サービスの外部公開方法としては以下の選択肢が存在する。
- ClusterIP
- NodePort
- LoadBalancer
- Ingress
Volume
- PersistentVolume
- PersistentVolumeClaim
- Storage Provider
- 例:local, NFS, S3
Variables
- ConfigMap
- Secret
How-to
リソースの定義(sample)
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: sandbox
labels:
run: nginx
spec:
type: LoadBalancer
ports:
- port: 80
protocol: TCP
selector:
run: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: sandbox
spec:
selector:
matchLabels:
run: nginx
replicas: 6
template:
metadata:
labels:
run: nginx
namespace: sandbox
spec:
containers:
- name: nginx
image: nginx:latest
resources:
limits:
memory: "32Mi"
cpu: "500m"
requests:
memory: "16Mi"
cpu: "25m"
ports:
- containerPort: 80
リソースの追加・削除・確認
kubectlコマンドを使用する
- apply
- manifestファイルの内容に従い、clusterにdeployを行う
kubectl apply -f <manifest_file_name>
- get
- clusterで実行中のリソースを取得する
kubectl get -n <namespace> <resouce_type>
- describe
- リソースの詳細情報を表示する
kubectl describe -n <namespace> <resouce_type>/<resource_name>
- delete
- リソースを削除する
kubectl delete -n <namespace> <resouce_type>/<resouce_name>
- logs
- 実行中のコンテナログを取得する
kubectl logs -n <namespace> <resouce_type>/<resouce_name>
Kubernetes Cluster 構築方法
- ローカルマシン
- オンプレミスサーバー
- クラウド
注意点
- リソース制限
- request, limit
- cpu
- memory
- …
- request, limit
- 実行可能Nodeの制限
- Podで処理が可能なリソースの量や種別が異なる
- ARM専用ノード、GPU専用ノードなど
- taint(染み)
まとめ
- Kubernetesとは「コンテナオーケストレーションサービス」と呼ばれ、コンテナ管理面における煩雑さを減らしてくれます。
- 期待する状態を定義することで、Kubernetesが自動的にリソースの調整を行ってくれます。
- 種々のリソース種別があり、それらを組み合わせて”マニフェスト”と呼ばれるドキュメントに記載します
Appendix
よく使われるサービス
- ネットワーク
- calico
- flannel
- TLS証明書
- cert-manager
- trust-manager
- ストレージ
- nfs-provisioner
- ロギング
- prometheus
- grafana
