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
NearMeの技術発表資料です
PRO
May 31, 2023
Programming
1.7k
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の技術発表資料です
PosthogのA/Bテスト機能の紹介
nearme_tech
PRO
1
21
AIフレンドリーなプロダクトに向けて
nearme_tech
PRO
1
50
初めてのLean言語
nearme_tech
PRO
0
76
Apache Airflow Workflow orchestration without turning cron into spaghetti
nearme_tech
PRO
1
21
実務で役立つ幾何学 ボロノイ図の基礎から グラフ・ネットワーク応用まで
nearme_tech
PRO
1
59
SQL/ID抽出タスクから考える 実践的なハルシネーション対策
nearme_tech
PRO
1
67
OpenCode & Local LLM
nearme_tech
PRO
0
200
OpenCode Introduction
nearme_tech
PRO
0
59
【Browser Automation × AI】 Stagehandを試してみよう
nearme_tech
PRO
0
160
Other Decks in Programming
See All in Programming
AIエージェントで 変わるAndroid開発環境
takahirom
2
720
数百円から始めるRuby電子工作
tarosay
0
100
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
220
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
530
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
3k
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
140
えっ!!コードを読まずに開発を!?
hananouchi
0
230
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
170
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
1
240
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
420
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
610
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
0
360
Featured
See All Featured
Believing is Seeing
oripsolob
1
170
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
620
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Chasing Engaging Ingredients in Design
codingconduct
0
240
Statistics for Hackers
jakevdp
799
230k
Building AI with AI
inesmontani
PRO
1
1.1k
Become a Pro
speakerdeck
PRO
31
6k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.7k
Rails Girls Zürich Keynote
gr2m
96
14k
The untapped power of vector embeddings
frankvandijk
2
1.8k
Un-Boring Meetings
codingconduct
0
350
The Curious Case for Waylosing
cassininazir
1
440
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