Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
初めてのKubernetes (ハンズオン)
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
NearMeの技術発表資料です
PRO
May 31, 2023
Programming
1.8k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
初めてのKubernetes (ハンズオン)
NearMeの技術発表資料です
PRO
May 31, 2023
More Decks by NearMeの技術発表資料です
See All by NearMeの技術発表資料です
Claude Code × git worktree で並列開発 — サブモジュール構成のリポジトリで成立させる —
nearme_tech
PRO
0
40
LLM + 強化学習
nearme_tech
PRO
0
24
PosthogのA/Bテスト機能の紹介
nearme_tech
PRO
1
31
AIフレンドリーなプロダクトに向けて
nearme_tech
PRO
2
60
初めてのLean言語
nearme_tech
PRO
0
95
Apache Airflow Workflow orchestration without turning cron into spaghetti
nearme_tech
PRO
2
34
実務で役立つ幾何学 ボロノイ図の基礎から グラフ・ネットワーク応用まで
nearme_tech
PRO
1
66
SQL/ID抽出タスクから考える 実践的なハルシネーション対策
nearme_tech
PRO
1
82
OpenCode & Local LLM
nearme_tech
PRO
0
290
Other Decks in Programming
See All in Programming
Built Our Own Background Agent at LayerX
layerx
PRO
10
5.9k
今さら聞けない .NET CLI
htkym
0
210
Go 1.27 における memory allocation の高速化
andpad
0
300
Dockerfile CMD for Node.js
grazie1999
0
110
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
720
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
240
Jindong: Introducing Declarative Haptics in Compose Multiplatform
l2hyunwoo
0
130
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
270
20260722_microCMSで考える、AI時代のコンテンツ運用設計
yosh1
0
450
実装をデザインガイドラインに追従させるための取り組み / 260731-dip-mosh-design-system
dachi023
0
7.4k
Loosening the Reins: Go Generics Get More Flexible
kuro_kurorrr
0
190
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
5
500
Featured
See All Featured
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
2
3.8k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
260
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.9k
Embracing the Ebb and Flow
colly
88
5.1k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Designing Experiences People Love
moore
143
24k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
870
Transcript
0 初めてのKubernetes (ハンズオン) 2023-05-26 第45回NearMe技術勉強会 Kenji Hosoda
1 Kubernetes(クバネティス)とは? “デプロイやスケーリングを自動化したり、コンテナ化されたアプリケーションを管理したり するための、オープンソースのシステム” https://kubernetes.io/ 私のイメージ インフラに関わる様々なツールが揃っていて、かつ、オープンソー スで利用できるので、これ一つ覚えればインフラで出来ることの幅 が広がる。ただし、運用は面倒なところもあるので、小規模のサー ビスだと割に合わない場合もある。
2 古き良きWebサービスのホスティング ロードバランサ ノード1 ノード2 SSHログイン Webサービス コード 設定 Webサービス
コード 設定 これはこれでいい部分もある
3 KubernetesによるWebサービスのホスティング ワーカーノード1 設定ファイル ロードバランサ Pod Pod Pod Pod Pod
Pod Pod Service ワーカーノード2 Pod Container Container コントロールプレーン ワーカーノードを管理 Container Registry イメージをダウンロード だいぶ省略して書いてます
4 Kindを利用してローカルにクラスタを作成してみよう (他のOSの場合:https://kind.sigs.k8s.io/docs/user/quick-start#installation) kind create cluster kind get clusters docker
ps Docker上で動いていることを確認 kindのインストール brew install kind # For mac クラスタの作成
5 kubectlを利用してみよう brew install kubectl # For mac kubectl version
--client kubectl 他のOS: https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/install-kubectl.html kubectlのインストール kubectl cluster-info --context kind-kind kubectl config use-context kind-kind コンテキストをkindのクラスタに設定 kubectl get node ノードの取得 → kindのデフォルトはワーカーノードとコントロールプレーンまとめて 1台で動作
6 Deploymentを利用して、Podをスケールさせよう apiVersion: apps/v1 kind: Deployment metadata: labels: app: web-nginx
name: web-nginx spec: replicas: 3 selector: matchLabels : app: web-nginx template: metadata: labels: app: web-nginx spec: containers: - image: nginx name: nginx ports: - containerPort : 80 web-nginx.yaml Podの定義 3つにスケール kubectl apply -f web-nginx.yaml web-nginx.yamlマニフェストの適用 kubectl get pod Podが3つにスケールしていることを確認
7 7 DeploymentのPodを削除してみよう kubectl get pod Podの一覧を取得 kubectl delete pod
web-nginx-694c7647c-7d9rk 一つのPodを削除 kubectl get pod Podの一覧を取得 → しばらくすると新たな Podが構築される ※Deploymentで管理されたPodなので再構築される。 Pod単体で構築した場合は再構築されない。
8 8 Podの数を変更してみよう apiVersion: apps/v1 kind: Deployment metadata: labels: app:
web-nginx name: web-nginx spec: replicas: 2 selector: matchLabels : app: web-nginx template: metadata: labels: app: web-nginx spec: containers: - image: nginx name: nginx ports: - containerPort : 80 web-nginx.yaml 2つに変更 kubectl apply -f web-nginx.yaml 変更したweb-nginx.yamlマニフェストの適用 kubectl get pod Podが2つになっていることを確認 また3つに戻してみよう
9 9 Kubernetesは宣言的 設定ファイル 状態A 設定ファイル 状態B 障害が起こっても自律的に復帰する 次の状態への変化は自動的に行う (Reconcile処理)
10 10 ノードを増やしてみよう 1/3 kind delete cluster kind create cluster
--config=my-cluster.yaml クラスタを再構築して、 Ingress用のcluster設定を適用 kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane - role: worker - role: worker kubeadmConfigPatches: - | kind: JoinConfiguration nodeRegistration: kubeletExtraArgs: node-labels: "my-label=true" my-cluster.yaml (kindのIngress用のcluster設定) kubectl get node ワーカーノードが2つ、コントロールプレーンのノードが 1つあることを確認 ラベルをつける ことができる my-label=true
11 11 ノードを増やしてみよう 2/3 kubectl apply -f web-nginx.yaml web-nginx.yamlマニフェストの適用 kubectl
get pod -o wide 2つのノードにPodが展開されていることを確認 my-label=true
12 12 特定のノードでPodを動かしてみよう apiVersion: apps/v1 kind: Deployment … spec: containers:
- image: nginx name: nginx ports: - containerPort: 80 nodeSelector: my-label: "true" web-nginx.yaml my-label=true kubectl apply -f web-nginx.yaml web-nginx.yamlマニフェストの適用 kubectl get pod -o wide 2特定のラベルがついたノードにのみ Podが配置されていることを確認 特定ラベルがついたノードを選択 (Affinityを用いてもっと細かい制御が可能 )
13 13 特定のPodのログを見てみよう kubectl get pod Podの一覧を取得 kubectl logs web-nginx-f5bb6cbf5-b299w
一つのPodのログを取得 ※1つのPod内に複数のContainerがある場合は、Container名も指定する
14 14 特定のPodにログインしてみよう kubectl get pod Podの一覧を取得 kubectl exec -it
web-nginx-694c7647c-kj7kr /bin/bash 一つのPodにログイン ※1つのPod内に複数のContainerがある場合は、Container名も指定する
15 マニフェストからリソースを削除してみよう kubectl delete -f web-nginx.yaml web-nginx.yamlマニフェストのリソースを削除 kubectl get pod
Podが削除されていることを確認
16 16 namespaceを利用してみよう kubectl get namespace namespaceの一覧を取得 kubectl create namespace
sandbox namespaceを作成 kubectl apply -f web-nginx.yaml -n sandbox web-nginx.yamlマニフェストをnamespaceを指定して適用 kubectl get pod 指定なしだとnamespaceは”default”なのでpodは表示されない kubectl get pod -n sandbox namespaceを指定するとpodが表示される kubectl delete -f web-nginx.yaml -n sandbox namespaceを指定してリソースを削除
17 Serviceを利用して”Webサービス”にアクセス # 先のDeploymentの定義に追記 --- apiVersion: v1 kind: Service metadata:
name: web-nginx spec: selector: app: web-nginx ports: - port: 8080 targetPort: 80 web-nginx.yaml kubectl apply -f web-nginx.yaml web-nginx.yamlマニフェストを適用 kubectl get svc Serviceの確認 kubectl port-forward svc/web-nginx 8888:8080 Serviceをポートフォワードして外出しする curl localhost:8888 “Webサービス”のレスポンスを確認 ※3つのPod内のどれかにアクセスしている “- - -”は区切りで必要
18 Ingressを利用して”Webサービス”をホスティング 1/2 kind delete cluster kind create cluster --config=my-cluster.yaml
クラスタを再構築して、 Ingress用のcluster設定を適用 kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane kubeadmConfigPatches : - | kind: InitConfiguration nodeRegistration: kubeletExtraArgs: node-labels: "ingress-ready=true" extraPortMappings : - containerPort: 80 hostPort: 80 protocol: TCP my-cluster.yaml (kindのIngress用のcluster設定) kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress -nginx/main/deploy/static/provider/kind/deploy.yaml nginx-ingress-controllerの構築
19 Ingressを利用して”Webサービス”をホスティング 1/2 # 先のServiceの定義に追記 --- apiVersion: networking.k8s.io/v1 kind: Ingress
metadata: name: example-ingress spec: rules: - host: a.example.com http: paths: - pathType: Prefix path: "/" backend: service: name: web-nginx port: number: 8080 web-nginx.yaml kubectl apply -f web-nginx.yaml web-nginx.yamlマニフェストを適用 # /etc/hostsに以下を追記 127.0.0.1 a.example.com /etc/hostsの編集 curl http://a.example.com/ a.example.comにアクセス
20 20 Lensを利用してクラスタ全体を見てみよう https://k8slens.dev/ からデスクトップアプリをダウンロード ・各種リソースを俯瞰して見れる ・直接Podのログが見れる ・直接Podにログインできる ・ポートフォワードを構築して内部にアクセ スできる
・(Prometheusと組み合わせてモニタリン グできる)
21 21 最後に kind delete cluster 今回、ストレージ周りや、定期実行周りは紹介しきれなかったですが、これらもよく利用される のでぜひキャッチアップしてみてください。 最後に、kindは地味にCPUやメモリを喰うので不要ならクラスタは削除しておいてください (他
のツールと比べて軽い方ではあるのですが)。
22 Thank you