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
metrics-serverをセキュアなTLSでデプロイしてみた
Search
世良泰明
July 30, 2024
Technology
0
350
metrics-serverをセキュアなTLSでデプロイしてみた
2024/7/30 Kubernetes Novice Tokyo #33 発表資料
世良泰明
July 30, 2024
Tweet
Share
More Decks by 世良泰明
See All by 世良泰明
ラズパイ奮闘記 その1
y_sera15
0
39
EKS勉強会
y_sera15
1
110
自宅k8s構築日記 冬休み編
y_sera15
0
200
自宅k8sクラスター構築日記
y_sera15
0
160
EKSを動かしてみた話
y_sera15
0
88
ちょっと大きめのOSSにコントリビュートしかけた話
y_sera15
0
220
小江戸らぐ kubernetesクラスターを再構築した話
y_sera15
0
180
小江戸らぐ 自宅にkubernetesクラスターを構築した話
y_sera15
0
29
Other Decks in Technology
See All in Technology
偶然 × 行動で人生の可能性を広げよう / Serendipity × Action: Discover Your Possibilities
ar_tama
1
1.1k
室長と気ままに学ぶマイクロソフトのビジネスアプリケーションとビジネスプロセス
ryoheig0405
0
370
OpenID BizDay#17 KYC WG活動報告(法人) / 20250219-BizDay17-KYC-legalidentity
oidfj
0
250
運用しているアプリケーションのDBのリプレイスをやってみた
miura55
1
720
明日からできる!技術的負債の返済を加速するための実践ガイド~『ホットペッパービューティー』の事例をもとに~
recruitengineers
PRO
3
400
ホワイトボードチャレンジ 説明&実行資料
ichimichi
0
130
飲食店予約台帳を支えるインタラクティブ UI 設計と実装
siropaca
7
1.8k
滅・サービスクラス🔥 / Destruction Service Class
sinsoku
6
1.6k
OpenID Connect for Identity Assurance の概要と翻訳版のご紹介 / 20250219-BizDay17-OIDC4IDA-Intro
oidfj
0
280
分解して理解する Aspire
nenonaninu
1
140
2/18/25: Java meets AI: Build LLM-Powered Apps with LangChain4j
edeandrea
PRO
0
120
開発スピードは上がっている…品質はどうする? スピードと品質を両立させるためのプロダクト開発の進め方とは #DevSumi #DevSumiB / Agile And Quality
nihonbuson
2
3k
Featured
See All Featured
Embracing the Ebb and Flow
colly
84
4.6k
Fashionably flexible responsive web design (full day workshop)
malarkey
406
66k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Documentation Writing (for coders)
carmenintech
67
4.6k
What's in a price? How to price your products and services
michaelherold
244
12k
Building a Scalable Design System with Sketch
lauravandoore
461
33k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.6k
Done Done
chrislema
182
16k
Build The Right Thing And Hit Your Dates
maggiecrowley
34
2.5k
Side Projects
sachag
452
42k
A Modern Web Designer's Workflow
chriscoyier
693
190k
The Pragmatic Product Professional
lauravandoore
32
6.4k
Transcript
metrics-serverをセキュアなTLSで デプロイしてみた 2024/7/30 Kubernetes Novice Tokyo #33 y_sera15
自己紹介 名前: 世良 泰明 (せら やすあき) twitter(X): @y_sera15 職業: 某製造業
インフラエンジニア 住み: - ~9月 名古屋 - 10月~ 横浜 k8s暦: - 自宅クラスター 2年(現在再構築中) - 業務利用 2ヶ月 other: - 今回は個人として参加 - etcd + CoreDNS + ExternalDNSで2週間悩んでいます... 自宅K8sクラスター: - intel NUC x3 - NAS(Synology) コンセプト: production likeな基盤
今日の話 目次 - metrics-serverとは - インストール時の問題点 - 解決方法 - 仕組み
metrics-serverとは 何をするもの? - Metrics APIを提供するコンポーネント. コンテナ/NodeのCPU, メモリ使用率が分かる. 使いどころ - HPA用コントローラのスケーリング判断
- kubectl topコマンド 導入方法 - manifest - helm https://github.com/kubernetes-sigs/metrics-server kubectl top node実行結果
インストール時の問題点 kubeadmやminikubeなどで普通に構築したクラスターでは, そのまま入れるとクラッシュしてしまう ざっと調べてみると, --kubelet-insecure-tls オプションを追加する というブログがちらほら 公式(README)の記載 kubelet によって提示される証明書の
CA を検証しない。 テスト目的に限る。 このオプションを使用しない場合の具体的なガイドは 公式にはない & (少なくとも日本語の)ブログでもなかなか見当たらない ⇒なんか気持ち悪い. 本番相当で使うにはどうすればいいの...? kubelet 証明書は、クラスターCAよって署名される必要がある (または、metrics-serverに --kubelet-insecure-tls を渡して証明書の検証を無効にする)
解決方法 issueの中にドンピシャな方法を発見. (kubeadmにて構築したクラスターの場合) https://github.com/kubernetes-sigs/metrics-server/issues/576#issuecomment-1820504816 1. kubelet-configのconfigmapにて, serverTLSBootstrap: true を追加. kubectl
edit cm -n kube-system kubelet-config 2. 各ノードにてkubeletの設定を反映 sudo kubeadm upgrade node phase kubelet-config 3. kubeletのデーモンを再起動 sudo systemctl restart kubelet.service 4. 証明書署名要求(csr)の確認 kubectl get csr -n kube-system 5. 証明書署名要求(csr)の承認 kubectl certificate approve <csr名> ⇒ これを行ってからインストールしたら実際に稼働した ただ, 何をやっているのか分からないので深掘ってみる
仕組み アーキテクチャ - kubeletのエンドポイントからメトリクスを取得 - api-server経由でMetrics APIを提供 Kubernetes monitoring architecture
https://github.com/kubernetes/design-proposals- archive/blob/main/instrumentation/monitoring_architecture.md Resource Metrics API https://github.com/kubernetes/design-proposals- archive/blob/main/instrumentation/resource-metrics-api.md kubectl top - node - pod client kubelet api-server metrics-server /metrics/resource /apis/metrics/v1beta1/ - /nodes - /nodes/{node} - /namespaces/{namespace}/pods - /namespaces/{namespace}/pods/{pods} --kubelet-insecure-tls で 設定する通信はここ TLS通信を有効化するためには, ①metrics-serveが所有しているCA証明書で ②kubeletのサーバ証明書が署名されている必要がある. https https or http
仕組み ①. metrics-serverが所有しているCA証明書 - クラスターのCA証明書が, configmapを通じて自動的にmountされる. (クラスターのCA証明書は, 各ノードの/etc/kubernetes/pki に格納されている.) ②.
kubeletのサーバ証明書 - apiserverとの通信用に自己署名の証明書を使用する(kubeadmのデフォルト設定). - kubeletの設定(serverTLSBootStrap)により, クラスターCAの署名を付与することができる. 自己署名 kubelet metrics-server https CA.crt kubelet.crt mount CA.crt CA.key つまり, こうなればよい before 署名 kubelet metrics-server https kubelet.crt mount CA.crt after CA.crt CA.key k8sクラスター k8sクラスター
仕組み serverTLSBootStrap - kubeletのconfigパラメータ - クラスターのCAに対して, kubeletのサーバ証明書のcsrを作成.(kubenetesのapiを使用) - セキュリティ上の理由により, csrは手動承認が必要.
自動承認するために、kubelet-csr-approverというコントローラーが存在している。 https://github.com/postfinance/kubelet-csr-approver https://kubernetes.io/docs/reference/access-authn-authz/kubelet-tls-bootstrapping/
まとめ metrics-serverを, '--kubelet-insecure-tls' オプションを使わずインストールする方法と, その仕組みを解説した 方法 - kubeletのオプションでserverTLSBootstrap: trueとする -
kubeletの再起動 - csrを承認(kubectl certificate approve) 仕組み - metrics-serverはkubeletのエンドポイントから情報を取得し, Metrics APIを提供している - kubeletのサーバ証明書をクラスターのCAで署名してやればよい - serverTLSBootStrapオプション1つで証明書要求まで良しなにやってくれる 気が向いたらQiitaかZenにも投稿します.
以下、補足スライド
TLS通信の仕組み TLS通信の例 https://www.google.com サーバー証明書 ルート証明書 ルート認証局 ルート証明書の 秘密鍵 サーバー ルート認証局の証明書
ルート認証局に 署名されている ブラウザがルート認証局の 証明書を持っている ⇒ 通信先の正当性を確認
TLS通信の仕組み TLS通信の例 https://www.google.com サーバー証明書 ルート証明書 ルート認証局 ルート証明書の 秘密鍵 サーバー サーバー秘密鍵
証明書要求 (CSR) ルート認証局の証明書 署名された 証明書 kubernetesではクラスター内で ルート認証局(CA証明書/秘密鍵)を 作成
TLS通信の仕組み 自己署名だとどうなるのか https://www.google.com サーバー 証明書 サーバー 秘密鍵 自分で署名しちゃう (オレオレ証明書) サーバ証明書が正当な
ものなのか 確かめられない httpsで通信できず. (サーバの正当性の確認をスキップすればtlsできるっぽいが...) ブラウザだと怒られる
Q&A Q. metrics-serverのTLSを有効化したことによって, 何か他のコンポーネントに影響があったみ たいなことはなかったでしょうか? A. 特にないです. サーバーの証明書が"(クラスタ内で)由緒正しい"ものに差し変わっただけです.