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クラスタ内のリソースに 柔軟なフィルタリングをかける方法 3-shake...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Masaya Aoyama (@amsy810)
August 04, 2022
Programming
490
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Kubernetesクラスタ内のリソースに 柔軟なフィルタリングをかける方法 3-shake SRE Tech Talk #4 LT / SRETT4-LT-amsy810
Masaya Aoyama (@amsy810)
August 04, 2022
More Decks by Masaya Aoyama (@amsy810)
See All by Masaya Aoyama (@amsy810)
Keynote: Cloud Native Darwinism: Continuous Evolution of Platforms for Competitive Edge - KubeCon + CloudNativeCon Japan 2025 / kubecon-japan-2025-amsy810-keynote
masayaaoyama
0
77
KubeCon + CloudNativeCon EU 2025 Overview / k8sjp-70-kubecon-cncon-eu-2025-overview
masayaaoyama
0
190
KubeCon + CloudNativeCon NA 2024 Overviewat Kubernetes Meetup Tokyo #68 / amsy810_k8sjp68
masayaaoyama
0
550
Cloud Nativeを支える要素技術・プロダクト・プラクティスの歩み / infrastudy-returns-01-amsy810
masayaaoyama
4
870
KubeCon + CloudNativeCon EU 2024 Overview / k8sjp64-kubecon-overview
masayaaoyama
0
430
KubeCon + CloudNativeCon NA 2023 Sessions for Site Reliability Engineers / amsy810-srett08
masayaaoyama
2
930
KubeCon + CloudNativeCon NA 2023 Overview+Recap for Gateway API Cloud Native Community Japan Kickoff meetup / amsy810_cncj1
masayaaoyama
0
2.2k
Kubernetes as a Service の利用者を支える機能 - Platform Engineering Meetup #1 / pfem01-amsy810-k8s
masayaaoyama
1
3k
Kubernetes基盤を自律的に支えるController化の実装Tips / forkwell-202303-amsy810-k8s
masayaaoyama
7
4k
Other Decks in Programming
See All in Programming
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
350
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
270
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
200
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
17
9.3k
Built Our Own Background Agent at LayerX #aidevex_findy
layerx
PRO
8
3.1k
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
120
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
230
地域 SRE コミュニティ最前線 - ホンマでっかSRE勉強会
tk3fftk
0
270
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
1.9k
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
220
自作OSでスライド発表する
uyuki234
1
3.9k
What's New in Android 2026
veronikapj
0
150
Featured
See All Featured
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
57k
Raft: Consensus for Rubyists
vanstee
141
7.6k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Deep Space Network (abreviated)
tonyrice
0
230
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
370
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.9k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
410
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
880
Thoughts on Productivity
jonyablonski
76
5.3k
Bash Introduction
62gerente
615
220k
Ruling the World: When Life Gets Gamed
codingconduct
0
290
Paper Plane (Part 1)
katiecoart
PRO
1
9.8k
Transcript
Masaya Aoyama 3-shake Kubernetesクラスタ内のリソースに 柔軟なフィルタリングをかける方法 3-shake SRE Tech Talk #4
LT amsy810 @amsy810
- Co-chair ⻘⼭真也 + CREATIONLINE - 技術アドバイザ + SAKURA Internet
Research Center – 客員研究員 + 3-shake 技術顧問 + PLAID - Organizer - KaaS Product Owner - Publications Twitter: @amsy810
kubectl get pods --filter Service ʹඥ͍͍ͯͳ͍Pod
kubectl get ServiceMonitors --filter Serviceʹඥ͍͍ͯͳ͍ServiceMonitor
Ͳ͏ͬͯΓ·͔͢ʁ
• ServiceMonitor は Prometheus Operator で実装されている API • 指定された条件の Service
(Endpoint)に対して Scrape を⾏う ServiceMonitor と Service リソース Kind: ServiceMonitor spec: endpoints: - path: /metrics port: service namespaceSelector: matchNames: - default selector: matchLabels: app: my-app Kind: Service metadata: namespace: default labels: app: my-app spec: {} Service Endpoint 10.0.0.1 Endpoint 10.0.0.2 app: my-app app: my-app app: my-app Scrape
• ラベルの整理を⾏ったところ ServiceMonitor にマッチしない状態に • Argo CD が app.kubernetes.io/instance ラベルを付与する兼ね合いで
Git リポジトリ上では判別できないケースもあり ServiceMonitor と Service リソース Kind: ServiceMonitor spec: endpoints: - path: /metrics port: service namespaceSelector: matchNames: - default selector: matchLabels: app: my-app Kind: Service metadata: namespace: default labels: app: dummy spec: {} Service Endpoint 10.0.0.1 Endpoint 10.0.0.2 app: dummy app: dummy app: dummy Scrape
無意味な ServiceMonitor の⼀覧を表⽰したい = ServiceMonitor で指定されている Service が存在するか否か • e.g.
Deployment に PDB / HPA / etc が存在しているか • e.g. 使われていない ConfigMap / ServiceAccount / etc が存在するか 実現したいこと Service Endpoint 10.0.0.1 Endpoint 10.0.0.2 app: dummy app: dummy app: dummy Scrape
• kubectl get servicemonitors -o jsonpath=ʻ.items[?(@...)]ʼ • 複数のリソースにまたがる条件⼀致は指定できない • jq
や go-template でも同様 • 軽量なプログラムを Go などで実装する • client-goで実装し、ポリシーロジックを実装するのは少々⼿間がかかる • Gatekeeper で ServiceMonitor / Service の 作成/更新時 にチェックを⾏う • audit 機能があるものの新たな要件発⽣時には対応しづらい 考えられる⽅法
ղܾࡦͷ࣮ํ๏ࣗମΑ͋͘ΔͰ͢
• kubectl get した結果を元に Conftest を実⾏する Conftest を⽤いて柔軟なフィルターを実装する deny[msg] {
sm = input.items[_] sm.kind == "ServiceMonitor" not has_valid_svc(sm, input.items) msg = sprintf("ServiceMonitor=%s", [sm.metadata.name]) } $ kubectl get service,servicemonitor –A –o yaml apiVersion: v1 items: - kind: Service metadata: {name: svc-1} - kind: Service metadata: {name: svc-2} - kind: ServiceMonitor metadata: {name: sm-1} ... • 取得した複数の Object は items[] 配列に格納 • YAML ストリームではなく単⼀のドキュメントと して返されるため、”conftest test” 実⾏時の --combine オプションは不要
kubectl get と conftest test --combine を両⽴する • kubectl get
で取得した list を元にテストする場合 deny[msg] { sm = input[_] sm.kind == "ServiceMonitor" not has_valid_svc(sm, input) msg = sprintf("ServiceMonitor=%s", [sm.metadata.name]) } deny[msg] { sm = input.items[_] sm.kind == "ServiceMonitor" not has_valid_svc(sm, input.items) msg = sprintf("ServiceMonitor=%s", [sm.metadata.name]) } • conftest test --combine でマニフェストを元にテストする場合(CI での利⽤を想定) 後々 CI にも Conftest を組み込んで再利⽤できる形で関数を実装する 特定のリソース or リソースの配列に対する関数を意識して実装する
あとは Rego でポリシーを実装するだけ • ServiceMonitor の Selector に⼀致する Service の存在確認(実際には
Namespace を考慮すること) # ServiceMonitor にマッチする Service が1つ以上存在することの確認 has_valid_svc(sm, items){ svc = items[i] svc.kind == "Service" match_svc(sm, svc) } # 「1つのServiceMonitorのSelector」と「1つのServiceのラベル」がマッチするか否かの確認 match_svc(sm, svc) { s := {sprintf("%s=%s", [i, sm.spec.selector.matchLabels[i]]) | sm.spec.selector.matchLabels[i]} l := {sprintf("%s=%s", [i, svc.metadata.labels[i]]) | svc.metadata.labels[i]} sub := s - l count(sub) = 0 } ポリシーは下記の通り数⾏で表現可能
まとめ クラスタから取得した情報をもとに、柔軟にフィルタリングを掛ける場合にも Conftest は有⽤ • yq などでの表現⼒ < Rego の表現⼒
• 複数のリソースにまたがるポリシー 実装したフィルタリングポリシーは、場合によっては CI に組み込むことも有⽤ • ServiceMonitor に適切な Service が存在するか(不適切な Selector の防⽌) Kind: ServiceMonitor spec: endpoints: - path: /metrics port: service selector: matchLabels: app: my-app Kind: Service metadata: namespace: default labels: app: dummy spec: {} ?
None
Thank you for your attention Twitter: @amsy810