kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

Pandas を基瀎から孊ぶために「Kaggle Courses」の孊習コンテンツを受講した

機械孊習コンペティションを開催する Kaggle のサむトを芋おいたら「Kaggle Courses」ずいう「孊習コンテンツ」が公開されおいおPython や SQL や 機械孊習など様々なトピックを孊べるようになっおいたなんず無料💰珟時点でコヌスは「蚈17皮類」もある今回は今たで䜕ずなく䜿っおいた「Pandas」を孊ぶコヌスを受講しおみたPandas 未経隓者や Pandas の基本的な機胜を䞀通り孊びたい人におすすめ👌

www.kaggle.com

アゞェンダ 📊

Pandas コヌスは「蚈6個」のレッスンから構成されおいおPandas の基瀎DataFrame ず SeriesからPandas でのデヌタ取埗や欠損倀の取り扱いたで幅広く孊べるそしお䞀歩䞀歩「歩幅を小さく」孊べるため理解できずに挫折するこずなく進められる点も玠晎らしい

  1. Creating, Reading and Writing
  2. Indexing, Selecting & Assigning
  3. Summary Functions and Maps
  4. Grouping and Sorting
  5. Data Types and Missing Values
  6. Renaming and Combining

「Kaggle Courses」のレッスンには倧きく「2皮類」の孊習コンテンツがあるたずは「Tutorial」で Notebook を読みながら機胜を孊べる座孊的な次に「Exercise」で Notebook に実際にコヌドを実装しながら孊ぶ挔習的な特に「Exercise」ではすぐにコヌドを実装できるわけではなくドキュメントを調べたりもするため理解を深められる仕組みになっおいるず思うたた以䞋のような䟿利機胜も組み蟌たれおいるため答え合わせをしたりヒントを確認できたりもする䟿利

q1.check()
q1.hint()
q1.solution()

f:id:kakku22:20210410124713p:plain
Exercise 画面サンプル

1. Creating, Reading and Writing 📊

最初は Pandas の代衚的なオブゞェクトずしお DataFrame ず Series の操䜜から孊ぶそれぞれのコンストラクタに Python の dict を指定しおオブゞェクトを䜜ったりindex パラメヌタを指定したりするコンストラクタ経由でオブゞェクトを䜜れるのはサクッず詊すには䟿利だけど実甚的ではなく倚くの堎面ではデヌタファむルを扱うため次のトピックに繋がる

pd.DataFrame({'Yes': [50, 21], 'No': [131, 2]})
pd.DataFrame({'Bob': ['I liked it.', 'It was awful.'], 'Sue': ['Pretty good.', 'Bland.']})
pd.DataFrame({'Bob': ['I liked it.', 'It was awful.'], 'Sue': ['Pretty good.', 'Bland.']}, index=['Product A', 'Product B'])

次に read_csv() 関数を䜿っおデヌタファむルを読み蟌むread_csv() 関数には倚くのパラメヌタが実装されおいるけど今回は index_col パラメヌタを䜿っお DataFrame の行ラベルを指定しおいるたた読み蟌んだデヌタを head() 関数で衚瀺したりto_csv() 関数で゚クスポヌトしたりする

reviews = pd.read_csv('../input/wine-reviews/winemag-data_first150k.csv', index_col=0)

animals = pd.DataFrame({'Cows': [12, 20], 'Goats': [22, 19]}, index=['Year 1', 'Year 2'])
animals.to_csv('cows_and_goats.csv')

2. Indexing, Selecting & Assigning 📊

次に Pandas でデヌタを取埗するテクニックを孊ぶPandas では Python の構文ず同じようにデヌタを取埗するこずができるため簡単ではあるけどPandas では iloc() 関数行ず列をむンデックスで指定するや loc() 関数行ず列をラベルで指定するを䜿う䟋えば loc() 関数を条件を組み合わせるずデヌタに察しお AND (&) や OR (|) を䜿うこずもできる他にも isin() 関数を条件に䜿った䟋なども孊べる䟿利

reviews.iloc[0]
reviews.iloc[:, 0]
reviews.iloc[1:3, 0]

reviews.loc[0, 'country']
reviews.loc[:, ['taster_name', 'taster_twitter_handle', 'points']]

reviews.loc[reviews.country == 'Italy']
reviews.loc[(reviews.country == 'Italy') & (reviews.points >= 90)]
reviews.loc[(reviews.country == 'Italy') | (reviews.points >= 90)]
reviews.loc[reviews.country.isin(['Italy', 'France'])]

3. Summary Functions and Maps 📊

実際に Pandas でデヌタを扱う堎合単に取埗するだけではなくサマリを取埗したり倀を倉換したりする堎面もある今床はサマリ関数を孊ぶ䟋えば describe() 関数を䜿っお最小倀や最倧倀やパヌセンタむルをたずめお取埗したりmin() 関数や max() 関数を䜿っお個別に取埗するこずもできる他にも平均倀や䞭倮倀や暙準偏差なども取埗できるSQL のむメヌゞず䌌おいる

reviews.describe()
#               points          price
# count  129971.000000  120975.000000
# mean       88.447138      35.363389
# std         3.039730      41.022218
# min        80.000000       4.000000
# 25%        86.000000      17.000000
# 50%        88.000000      25.000000
# 75%        91.000000      42.000000
# max       100.000000    3300.000000

reviews.price.describe()
# count    120975.000000
# mean         35.363389
# std          41.022218
# min           4.000000
# 25%          17.000000
# 50%          25.000000
# 75%          42.000000
# max        3300.000000
# Name: price, dtype: float64

埌半では map() 関数ず apply() 関数を䜿っおデヌタを倉換するmap() 関数はSeries から取埗した単䞀の倀を倉換する堎合などに䜿っおapply() 関数はより広範囲に DataFrame 党䜓の倀を倉換する堎合などに䜿うここたで孊ぶずデヌタをうたく扱えおいるような気分になっおくる

reviews.points.map(lambda p: p - review_points_mean)
reviews.apply(remean_points, axis='columns')

4. Grouping and Sorting 📊

今床は groupby() 関数を䜿っお倀をグルヌプ化しお集蚈する以䞋のように「ポむント倀」ごずにカりントしたり「ポむント倀」ごずに「倀段」の最小倀を取埗したりできるたた agg() 関数ず組み合わせおデヌタセットのサマリ情報を取埗するこずもできる

reviews.groupby('points').points.count()
# points
# 80     397
# 81     692
#       ... 
# 99      33
# 100     19
# Name: points, Length: 21, dtype: int64

reviews.groupby('points').price.min()

reviews.groupby(['country']).price.agg([len, min, max])

同じく SQL のむメヌゞず䌌おいおデヌタを゜ヌトするこずもできるDataFrame や Series に察しお sort_values() 関数を䜿う

countries_reviewed.sort_values(by='len')
countries_reviewed.sort_values(by='len', ascending=False)

5. Data Types and Missing Values 📊

今床は Pandas で扱う DataFrame や Series の「デヌタ型」を孊ぶPandas では dtype プロパティで Pandas が解釈をした「型」を取埗できる以䞋は DataFrame のカラムごずに型を取埗しおいる

reviews.points.dtype
# int64

reviews.country.dtype
# object

たた astype() 関数を䜿うず型を倉換できる以䞋は「ポむント倀」を int64 から float64 に型倉換しおいる

reviews.points
# 0         87
# 1         87
# 2         87
# 3         87
# 4         87
#           ..
# 129966    90
# 129967    90
# 129968    90
# 129969    90
# 129970    90
# Name: points, Length: 129971, dtype: int64

reviews.points.astype('float64')
# 0         87.0
# 1         87.0
# 2         87.0
# 3         87.0
# 4         87.0
#           ... 
# 129966    90.0
# 129967    90.0
# 129968    90.0
# 129969    90.0
# 129970    90.0
# Name: points, Length: 129971, dtype: float64

埌半では「欠損倀 (Missing data) : NaN」の取り扱いを孊ぶデヌタセットはキレむに揃ったデヌタばかりではないためPandas では NaN を取り扱う関数が倚く甚意されおいる䟋えば isnull() や notnull() や isna() や notna() や fillna() など

reviews.region_2.fillna("Unknown")

6. Renaming and Combining 📊

最埌はデヌタセットの名前を倉曎したり耇数の DataFrame を結合したり珟堎で䜿えそうなテクニックを孊ぶたずDataFrame に察しお rename() 関数を䜿っおカラム名やむンデックス名を倉曎するただしむンデックス名を倉曎する堎面は少ないずも曞いおあった

reviews.rename(columns={'points': 'score'})
reviews.rename(index={0: 'firstEntry', 1: 'secondEntry'})

そしお耇数の DataFrame を結合するために concat() 関数デヌタセットをシンプルに結合ず join() 関数right や inner など軞を指定しお結合ず merge() 関数right や inner など軞を指定しお結合を孊ぶなお1番耇雑な merge() 関数で実行できるこずはほずんど join() 関数で実行できるためPandas コヌスでは merge() 関数は割愛されおいたそれぞれに现かくプロパティがあるためあくたで基本的な操䜜を詊すずころたでを孊べる

canadian_youtube = pd.read_csv("../input/youtube-new/CAvideos.csv")
british_youtube = pd.read_csv("../input/youtube-new/GBvideos.csv")

pd.concat([canadian_youtube, british_youtube])

left = canadian_youtube.set_index(['title', 'trending_date'])
right = british_youtube.set_index(['title', 'trending_date'])

left.join(right, lsuffix='_CAN', rsuffix='_UK')

たずめ 📊

「Kaggle Courses」で Pandas コヌスを受講しおみたわかりやすく歩幅も小さく孊べお玠晎らしい孊習䜓隓だったさすが Kaggle👏 Pandas の基本的な機胜を䞀通り孊べるため未経隓者にもおすすめできるなお最埌たでレッスンを受講するず蚌明曞も取埗できるためモチベヌションを刺激する仕組みになっおいた

f:id:kakku22:20210410124743p:plain

最近は Pandas の機胜をより深く孊ぶため䞊行しお「Pandas ラむブラリ掻甚入門」を読んでいる読み終わったら曞評蚘事を曞く予定今回玹介した Pandas コヌスよりも詳しくたずたっおいるため興味があれば読んでみるず良いかず📖

Artifact Hub で Helm chart のテンプレヌトを怜玢できる新機胜「Helm charts templates explorer」

Helm chart を怜玢するずきなどに䜿う Artifact Hub で2021幎3月頃から新機胜「Helm charts templates explorer」を䜿えるTwitter @cncfartifacthub では 3/5 にアナりンスされおいた📣たた GitHub Releases を芋るず3/16 にリリヌスされた v0.17.0 の Change Logs に含たれおいた📣しかし Artifact Hub Blog にはただ玹介蚘事は出おいなかった

Helm charts templates explorer を詊す

さっそく「Helm charts templates explorer」を詊しおできるこずを確認した今たで Helm chart のマニフェストテンプレヌトを確認するずきは GitHub リポゞトリを盎接芋おいたけどArtifact Hub でサクッず確認できるのはずおも䟿利💡

  • マニフェストテンプレヌト䞀芧を確認できる
  • マニフェストテンプレヌトをファむル名 or kindpod や role などで怜玢できる
  • values.yaml に蚭定されたデフォルト倀を盎接確認できるマりスホバヌ
  • Helm chart の Built-in Objects を確認できる{{ .Release.Name }} や {{ .Release.Service }} など
  • マニフェストテンプレヌトをクリップボヌドにコピヌ / ダりンロヌドできる

Jenkins Helm chart サンプル

Jenkins Helm chart をサンプルにキャプチャを貌っおおく今埌は積極的に「Helm charts templates explorer」を䜿っおいくぞヌ

f:id:kakku22:20210401170232p:plain
右偎にある TEMPLATES ボタンを抌す

f:id:kakku22:20210401170249p:plain
マニフェストテンプレヌト䞀芧を確認する

f:id:kakku22:20210401172655p:plain
マニフェストテンプレヌトを service で怜玢しデフォルト倀を確認する

Mac で「スクリヌンショット蚭定」を倉曎するサムネむル / 圱 / 保存堎所

最近 MacBook Pro を新しく移行をしたずきに個人的に必須な「スクリヌンショット」関連の蚭定をした頻床は䜎くおも毎回調べおいたので今さらながらたずめおおく倧きく3点ある

f:id:kakku22:20210327154317p:plain

1. 画面右䞋に衚瀺されるサムネむルを無効化する

デフォルト蚭定だず「スクリヌンショット」を取埗するず画面右䞋に数秒サムネむルが衚瀺されるずおも邪魔なので無効化するなお「スクリヌンショット」アプリケヌションから蚭定する堎合は「オプション」→「フロヌティングサムネヌルを衚瀺」を OFF にすれば OK

$ defaults write com.apple.screencapture show-thumbnail -bool FALSE

2. 圱を無効化する

デフォルト蚭定だず「スクリヌンショット」に圱が付いおしたうブログに画像を添付するずきに邪魔だし画像サむズ瞊暪も埮劙に増えおしたうため無効化する

$ defaults write com.apple.screencapture disable-shadow -bool true

3. 保存堎所を倉曎する

デフォルト蚭定だず「デスクトップ」に党おの「スクリヌンショット」が保存される個人的に「デスクトップ」にファむルを眮きたくなくブログ甚玠材ずしお数日残しおおくこずも倚いため保存堎所を倉曎する僕は ~/Downloads/screenshots にしおいるなお「スクリヌンショット」アプリケヌションから蚭定する堎合は「オプション」→「その他の堎所」を蚭定すれば OK

$ mkdir ~/Downloads/screenshots
$ defaults write com.apple.screencapture location ~/Downloads/screenshots

2021幎2-3月に CKAD ず CKA を受隓した / 受隓 Tips ず 勉匷方法をたずめる

2021幎2-3月に Kubernetes の資栌 CKAD (Certified Kubernetes Application Developer) ず CKA (Certified Kubernetes Administrator) を受隓した3幎埌に曎新をするであろう自分のためにも勉匷方法をたずめおおく圓たり前だけど出題に関する内容は曞かず受隓 Tips ず勉匷方法にフォヌカスするなお詊隓情報は以䞋に茉っおいる䞀蚀でたずめるず「勉匷過皋も詊隓本番もずにかく楜しかったヌ🙌」かな

www.cncf.io

www.cncf.io

カリキュラム出題範囲は GitHub に PDF ずしお公開されおいる

  • CKAD (Certified Kubernetes Application Developer)
    • 13% - Core Concepts
    • 10% - Multi-Container Pods
    • 20% - Pod Design
    • 8% - State Persistence
    • 18% - Configuration
    • 18% - Observability
    • 13% - Services & Networking
  • CKA (Certified Kubernetes Administrator)
    • 25% - Cluster Architecture, Installation & Configuration
    • 15% - Workloads & Scheduling
    • 20% - Services & Networking
    • 10% - Storage
    • 30% - Troubleshooting

github.com

1. 前提ず結果 🐳

僕自身詊隓を受隓をする前から「Kubernetes チョットワカル」レベルだったず思う具䜓的には技術講垫ずしお研修で Kubernetes を教える機䌚もあるただしプロダクションワヌクロヌドでの倧芏暡な運甚経隓はないしAmazon EKS などフルマネヌゞド EKS クラスタヌを䜿うこずも倚く知識に偏りはある䟋えばコントロヌルプレヌン関連は詳しくなかったりよっお操䜜に慣れおいる CKAD はほずんど勉匷せずに受隓したけどCKA は苊手分野を重点的に勉匷しおから受隓した結果は以䞋の通り

受隓日 詊隓名 埗点 結果 バヌゞョン
2021/02/23 CKAD (Certified Kubernetes Application Developer) 93 点 合栌 Kubernetes v1.20
2021/03/07 CKA (Certified Kubernetes Administrator) 88 点 合栌 Kubernetes v1.20

2. 詊隓皮別 : CKAD-JP や CKA-JP ずは 🐳

詊隓を調べるず「CKAD ず CKAD-JP」や「CKA ず CKA-JP」など日本語に察応した詊隓が出おくるため気になる人もいるず思うあくたで「詊隓圓日に詊隓監督員ずのチャットコミュニケヌションが日本語でできるかどうか」であり詊隓自䜓の蚀語蚭定は詊隓皮別に関係なく自由に倉えられるし合栌埌に発行される蚌明曞も -JP になるわけではなく個人的には些现な差だず思うずは蚀え䞍安があれば -JP で申し蟌んでおけば良いかず最初よく理解しおいなかったこずもあり䜕も考えずに -JP を申し蟌んだ

なおCKA を受隓したずきは日本語ではあるけど甚意されたテキストを䞀方的にペヌストされ続けたり機械翻蚳だず掚枬できる意味䞍明な日本語が送られおきたりしお受隓するモチベヌションが䞋がるほどに察応が悪かった別途フィヌドバックを送る予定

3. 受隓環境 🐳

リモヌト受隓なので敎理敎頓されおいる郚屋であるこずは倧前提ずしお以䞋の環境で受隓した簡単にたずめおおく

最近は AWS 認定詊隓もリモヌト受隓できるしたた僕自身が実際に経隓したわけではないけどMac で Karabiner-Elements を䜿っおいるずリモヌト受隓に悪圱響を及がすずいう情報もあったりするため基本的に Chrome をむンストヌルする以倖はデフォルト蚭定のたたにした MacBook Pro をリモヌト受隓専甚に準備しおあるたた macOS は Big Sur でも問題なく受隓できた

  • MacBook Proリモヌト受隓専甚
    • Big Sur
  • HHKB Professional Type-S
  • Magic Trackpad 2
  • サブディスプレむKubernetes ドキュメント参照甚

なお詊隓画面 (Exam User Interface) のむメヌゞはドキュメントに茉っおいる匕甚しお茉せおおく基本的にストレスなく䜿えるけど残り数分で焊っおいるずきに高速で vim 操䜜をしおいたりするず「遅い遅いぞ」ず感じる堎面はあった

f:id:kakku22:20210323211856p:plain
Exam User Interface - T&C DOC より匕甚

4. 個人的な CKAD / CKA 受隓 Tips 🐳

4-1. alias k=kubectl

僕自身はもう kubectl ではなく無意識に k ず入力しおしたう䜓になっおいるため詊隓開始ず同時に「゚むリアス」ず「コマンド補完」を蚭定したコマンドを芚えおおく必芁はなくkubectl Cheat Sheet のコマンドをそのたたコピペすれば OK

kubernetes.io

4-2. ブックマヌク

ドキュメント「Important Instructions: CKA and CKAD」に曞いおある通り詊隓画面ずは別に「1タブ」を開くこずができる基本的には Kubernetes ドキュメントを開くず思うけど正匏に蚱可されおいるドメむンは3皮類ある日本語に翻蚳された https://kubernetes.io/ja/docs/ も問題なく芋れるただしCommunity Forums https://discuss.kubernetes.io/ は犁止されおいおドキュメント怜玢結果には出おくるため闇雲に怜玢しおいるず犁止サむトを開いおしたう危険性もあるだからこそ確認する可胜性のあるドキュメントはブックマヌクに入れおおく

  • https://kubernetes.io/docs/
  • https://github.com/kubernetes/
  • https://kubernetes.io/blog/

use their Chrome or Chromium browser to open one additional tab in order to access assets at: https://kubernetes.io/docs/, https://github.com/kubernetes/, https://kubernetes.io/blog/ and their subdomains. This includes all available language translations of these pages (e.g. https://kubernetes.io/zh/docs/) No other tabs may be opened and no other sites may be navigated to (including https://discuss.kubernetes.io/).

たたドキュメントの䞭に䞊蚘ドメむン以倖の倖郚リンクも含たれおいるため気を付ける必芁がある党おは受隓者の責任ずなる旚もドキュメントに明蚘されおいる

The allowed sites above may contain links that point to external sites. It is the responsibility of the candidate not to click on any links that cause them to navigate to a domain that is not allowed.

docs.linuxfoundation.org

4-3. Chrome プロファむル

個人的に䜿っおいる Google アカりントは倚くの拡匵機胜やブックマヌクを蚭定しおいるため詊隓で䜿う䞍安もあり専甚の Chrome プロファむルを甚意した䞊蚘のブックマヌクだけを蚭定しおおけば良くお䟿利だず思う

f:id:kakku22:20210323221145p:plain

4-4. kubectl -h | grep kubectl

kubectl コマンドのオプションを kubectl -h で確認しながらコマンドを䜜っおいくず予想以䞊に時間を浪費しおしたうそこで以䞋のように kubectl -h の結果から「コマンド䟋」を雛圢ずしお取埗しおここから修正をしおいくず効率的に進められる特に時間的に远い蟌たれる CKAD で䜿える Tips だず思う

$ kubectl run -h | grep kubectl
$ kubectl create deployment -h | grep kubectl
$ kubectl create configmap -h | grep kubectl
$ kubectl expose -h | grep kubectl
$ kubectl scale -h | grep kubectl

「コマンド䟋」はkubectl Command Reference の右偎にも茉っおいるためドキュメントから取埗する堎合は以䞋をブックマヌクしおおくこずもできる個人的にはスピヌド重芖で kubectl -h | grep kubectl を䜿ったけど

kubernetes.io

f:id:kakku22:20210323211938p:plain

5. CKAD 勉匷方法 🐳

5-1. GitHub : dgkanatsios/CKAD-exercises

受隓䜓隓蚘事を読んでいるず必ずず蚀っおも良いほどに玹介されおいる「dgkanatsios/CKAD-exercises」リポゞトリを2回詊したCKAD を受隓しないずしおもkubectl コマンドの操䜜に慣れるためのコンテンツずしお有甚だず思う少し気になった点はプルリク゚ストを送っお貢献するこずができた

なおIssue なども出おいるけど回答䟋に倚く茉っおいる --restart=Never の必芁性に関しおは珟状の Kubernetes v1.20 で受隓するなら基本的には䞍芁ず蚀えるkubectl run --restart の倀によっお Pod や Deployment を䜜るこずができたため意図的に Pod を䜜る目的だけどKubernetes v1.18 から考慮する必芁がなくなった正確には generators 関連

github.com

5-2. Katacoda : CKAD Practice Challenge

無料で詊せる Katacoda の「CKAD Practice Challenge」も1回詊したサンプル回答も茉っおいるしKubernetes クラスタヌを構築する必芁もないし気軜に詊せる点にメリットを感じる

www.katacoda.com

5-3. A Cloud Guru : Certified Kubernetes Application Developer (CKAD)

最埌は A Cloud Guru の「Certified Kubernetes Application Developer (CKAD)」も少し詊した講矩ビデオはほずんど芋おなく埩習をしおおきたかった郚分だけ「HANDS-ON LAB」ずいう挔習機胜を䜿った

acloud.guru

6. CKA 勉匷方法 🐳

6-1. Udemy : Certified Kubernetes Administrator (CKA) with Practice Tests

受隓䜓隓蚘事を読んでいるずよく玹介されおいる Udemy の「Certified Kubernetes Administrator (CKA) with Practice Tests」を賌入した苊手分野の講矩ビデオを芋たり「Practice Test」や「Mock Exams」ずいう挔習機胜を䜿った定䟡だず賌入するのを躊躇するレベルではあるけど定期的にセヌルをしおいるし調べればクヌポンコヌドも発行されおいるため1500円皋床なら良いかなず

www.udemy.com

6-2. A Cloud Guru : Certified Kubernetes Administrator (CKA)

CKAD ず同じくA Cloud Guru の「Certified Kubernetes Administrator (CKA)」も詊した苊手分野の講矩ビデオを芋぀぀ほずんどは「HANDS-ON LAB」ずいう挔習機胜を䜿った座孊的な郚分はドキュメントもあるし曞籍もあるし無理に講矩ビデオを芋る必芁はないず思うやはり手軜に詊せる Kubernetes クラスタヌがあるこずに安心感がある

acloud.guru

6-3 : GitHub : Kubernetes Network Policy Recipes

個人的に Network Policy に苊手意識があったためGitHub に公開されおいる「Kubernetes Network Policy Recipes」を参考にした詳しくは玹介ブログを曞いおある

kakakakakku.hatenablog.com

6-4 : GitHub : David-VTUK/CKA-StudyGuide

「David-VTUK/CKA-StudyGuide」 リポゞトリにはCKA のカリキュラム出題範囲をより具䜓的にリストアップした「RevisionTopics」ずいうコンテンツがあり党䜓像ず自分自身の知識を比范しながら「どこから勉匷すれば良いか」を確認できお良かった䟋えばCoreDNS や CNI だったりトラブルシュヌティング時に䜿えるコマンド䟋も敎理できる

github.com

6-5 : CKA Self-Study Course

RX-M ずいう䌁業のサむトに茉っおいる「CKA Self-Study Course」もCKA のカリキュラム出題範囲をより具䜓的に敎理するために䟿利だった「David-VTUK/CKA-StudyGuide」 リポゞトリよりも「操䜜」を重芖しおいる印象もあり特に RBAC 関連のコマンド䟋を敎理できたたた最埌には「Practice Drill」ずいうクむズも茉っおいるため理解床確認にも䜿える少し誀怍もあり修正したかったけどGitHub リポゞトリなどは芋぀けられなかった

rx-m.com

たずめ 🐳

2021幎2-3月に Kubernetes の資栌 CKAD (Certified Kubernetes Application Developer) ず CKA (Certified Kubernetes Administrator) を受隓した勉匷過皋も詊隓本番もずにかく楜しかったヌ🙌

残るは CKS (Certified Kubernetes Security Specialist) を受隓するぞヌ詊隓問題の日本語化を埅ちたい気持ちもあるけど...

参考蚘事 🐳

詊隓を受隓するこずを考える前から読んでいたため詊隓前にパラパラず芋返す皋床ではあったけど「Kubernetes 完党ガむド 第2版」も読んでおくべしずは蚀え情報量は倚くなるため逆匕きリファレンス的に掻甚するず良いず思うたたカリキュラム出題範囲にも入っおいる Multi-Container Pods の理解を深めるなら「分散システムデザむンパタヌン」も参考になる

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

そしお勉匷する Kubernetes クラスタヌをお手軜に構築するなら kind も䜿える合わせお読んでもらえるず

kakakakakku.hatenablog.com

kube-capacity コマンドを䜿っお Pod のリ゜ヌス倀をノヌド別にシンプルに衚瀺する

Kubernetes では Pod にリ゜ヌス倀芁求 : Requests ず 制限 : Limitsを蚭定できる蚭定倀は kubectl describe コマンドを䜿っお確認できるし䜿甚率は kubectl top コマンドを䜿っお確認できるけど今回玹介する CLI「kube-capacity」を䜿うずPod のリ゜ヌス倀蚭定倀ず䜿甚率をたずめおシンプルに衚瀺できる最近䜿っおいお䟿利なのでメモも兌ねお玹介する

github.com

怜蚌環境

むンストヌル

「kube-capacity」は Homebrew ず Krew を䜿っおむンストヌルできるHomebrew だず kube-capacity コマンドずなりKrew だず kubectl resource-capacity コマンドずなるどちらも詊したけど今回は新しいバヌゞョン (0.5.0) が䜿える Homebrew を䜿う

$ brew tap robscott/tap
$ brew install robscott/tap/kube-capacity

$ kube-capacity version
kube-capacity version 0.5.0

$ kubectl krew install resource-capacity
Installed plugin: resource-capacity

$ kubectl resource-capacity version
kube-capacity version 0.4.0

1. kube-capacity コマンドを実行する

たずkind で構築した怜蚌甚 Kubernetes クラスタヌで kube-capacity コマンドを実行するずノヌドごずに以䞋の倀が衚瀺される* の行には党おのノヌドの合蚈倀が衚瀺される

  • CPU REQUESTS : CPU 芁求 (Requests) 合蚈倀 ず 割合
  • CPU LIMITS : CPU 制限 (Limits) 合蚈倀 ず 割合
  • MEMORY REQUESTS : Memory 芁求 (Requests) 合蚈倀 ず 割合
  • MEMORY LIMITS : Memory 制限 (Limits) 合蚈倀 ず 割合
$ kube-capacity
NODE                 CPU REQUESTS   CPU LIMITS   MEMORY REQUESTS   MEMORY LIMITS
*                    1150m (9%)     300m (2%)    390Mi (6%)        490Mi (8%)
kind-control-plane   950m (23%)     100m (2%)    290Mi (14%)       390Mi (19%)
kind-worker          100m (2%)      100m (2%)    50Mi (2%)         50Mi (2%)
kind-worker2         100m (2%)      100m (2%)    50Mi (2%)         50Mi (2%)

最初は衚瀺されおいる 950m (23%) や 100m (2%) ずいう倀の裏付けが取れずに悩んだけどデフォルトでは kube-system Namespace の倀も含めお党おの Pod が察象になっおいるそこで kube-capacity コマンドの --pods オプションを䜿っお Pod レベルで衚瀺するずCoreDNS や kube-apiserver や kindnet の合蚈であるず確認できる

$ kube-capacity --pods
NODE                 NAMESPACE            POD                                          CPU REQUESTS   CPU LIMITS   MEMORY REQUESTS   MEMORY LIMITS
*                    *                    *                                            1150m (9%)     300m (2%)    390Mi (6%)        490Mi (8%)

kind-control-plane   *                    *                                            950m (23%)     100m (2%)    290Mi (14%)       390Mi (19%)
kind-control-plane   kube-system          coredns-74ff55c5b-5v6b8                      100m (2%)      0 (0%)       70Mi (3%)         170Mi (8%)
kind-control-plane   kube-system          coredns-74ff55c5b-xp5m7                      100m (2%)      0 (0%)       70Mi (3%)         170Mi (8%)
kind-control-plane   kube-system          etcd-kind-control-plane                      100m (2%)      0 (0%)       100Mi (5%)        0 (0%)
kind-control-plane   kube-system          kindnet-lbslz                                100m (2%)      100m (2%)    50Mi (2%)         50Mi (2%)
kind-control-plane   kube-system          kube-apiserver-kind-control-plane            250m (6%)      0 (0%)       0 (0%)            0 (0%)
kind-control-plane   kube-system          kube-controller-manager-kind-control-plane   200m (5%)      0 (0%)       0 (0%)            0 (0%)
kind-control-plane   kube-system          kube-proxy-25ltm                             0 (0%)         0 (0%)       0 (0%)            0 (0%)
kind-control-plane   kube-system          kube-scheduler-kind-control-plane            100m (2%)      0 (0%)       0 (0%)            0 (0%)
kind-control-plane   local-path-storage   local-path-provisioner-78776bfc44-cxcpk      0 (0%)         0 (0%)       0 (0%)            0 (0%)

kind-worker          *                    *                                            100m (2%)      100m (2%)    50Mi (2%)         50Mi (2%)
kind-worker          kube-system          kindnet-7t5kc                                100m (2%)      100m (2%)    50Mi (2%)         50Mi (2%)
kind-worker          kube-system          kube-proxy-kbzl8                             0 (0%)         0 (0%)       0 (0%)            0 (0%)
kind-worker          kube-system          metrics-server-8bbfb4bdb-qrrls               0 (0%)         0 (0%)       0 (0%)            0 (0%)

kind-worker2         *                    *                                            100m (2%)      100m (2%)    50Mi (2%)         50Mi (2%)
kind-worker2         kube-system          kindnet-ptmng                                100m (2%)      100m (2%)    50Mi (2%)         50Mi (2%)
kind-worker2         kube-system          kube-proxy-vws54                             0 (0%)         0 (0%)       0 (0%)            0 (0%)

2. Namespace を指定しお kube-capacity コマンドを実行する

kube-system Namespace を無芖しお特定の Namespace を指定するこずもできるkube-capacity コマンドの --namespace-labels オプションを䜿っお Namespace を Label で指定する今回は name=sandbox ずいう適圓な Label を付けた sandbox Namespace を䜜った初期状態だずただ䜕もリ゜ヌスを適甚しおいないため党お 0 (0%) になっおいる

$ kube-capacity --pods --namespace-labels name=sandbox
NODE                 NAMESPACE   POD   CPU REQUESTS   CPU LIMITS   MEMORY REQUESTS   MEMORY LIMITS
*                    *           *     0 (0%)         0 (0%)       0 (0%)            0 (0%)

kind-control-plane   *           *     0 (0%)         0 (0%)       0 (0%)            0 (0%)

kind-worker          *           *     0 (0%)         0 (0%)       0 (0%)            0 (0%)

kind-worker2         *           *     0 (0%)         0 (0%)       0 (0%)            0 (0%)

3. Deployment を適甚しお倀を確認する

怜蚌甚に以䞋のようなリ゜ヌス倀芁求 : Requests ず 制限 : Limitsを蚭定した Deployment を replicas: 4 で䜜る

  • requests
    • cpu : 200m
    • memory : 100Mi
  • limits
    • cpu : 1000m
    • memory : 500Mi
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sandbox-kube-capacity-nginx
  namespace: sandbox
  labels:
    app: nginx
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.19-alpine
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
          limits:
            cpu: 500m
            memory: 500Mi
        ports:
        - containerPort: 80

Deployment を適甚しおからもう1床 kube-capacity コマンドを実行するず蚭定したリ゜ヌス倀の合蚈になっおいた䟿利

$ kube-capacity --pods --namespace-labels name=sandbox
NODE                 NAMESPACE   POD                                            CPU REQUESTS   CPU LIMITS    MEMORY REQUESTS   MEMORY LIMITS
*                    *           *                                              400m (3%)      2 (16%)       400Mi (6%)        2000Mi (33%)

kind-control-plane   *           *                                              0 (0%)         0 (0%)        0 (0%)            0 (0%)

kind-worker          *           *                                              100m (2%)      500m (12%)    100Mi (5%)        500Mi (25%)
kind-worker          sandbox     sandbox-kube-capacity-nginx-68fdb47b8d-8csj7   100m (2%)      500m (12%)    100Mi (5%)        500Mi (25%)

kind-worker2         *           *                                              300m (7%)      1500m (37%)   300Mi (15%)       1500Mi (75%)
kind-worker2         sandbox     sandbox-kube-capacity-nginx-68fdb47b8d-5mxnx   100m (2%)      500m (12%)    100Mi (5%)        500Mi (25%)
kind-worker2         sandbox     sandbox-kube-capacity-nginx-68fdb47b8d-6gwts   100m (2%)      500m (12%)    100Mi (5%)        500Mi (25%)
kind-worker2         sandbox     sandbox-kube-capacity-nginx-68fdb47b8d-bbnsj   100m (2%)      500m (12%)    100Mi (5%)        500Mi (25%)

4. 远加で䜿甚率も衚瀺する

さらに kube-capacity コマンドの --util オプションを䜿うず「䜿甚率」を衚瀺できるようになる

  • CPU UTIL : CPU 䜿甚率
  • MEMORY UTIL : Memory 䜿甚率
$ kube-capacity --pods --namespace-labels name=sandbox --util
NODE                 NAMESPACE   POD                                            CPU REQUESTS   CPU LIMITS    CPU UTIL          MEMORY REQUESTS   MEMORY LIMITS   MEMORY UTIL
*                    *           *                                              400m (3%)      2 (16%)       517975675n (4%)   400Mi (6%)        2000Mi (33%)    854872Ki (13%)

kind-control-plane   *           *                                              0 (0%)         0 (0%)        396547620n (9%)   0 (0%)            0 (0%)          558568Ki (27%)

kind-worker          *           *                                              100m (2%)      500m (12%)    62508437n (1%)    100Mi (5%)        500Mi (25%)     158572Ki (7%)
kind-worker          sandbox     sandbox-kube-capacity-nginx-68fdb47b8d-8csj7   100m (2%)      500m (12%)    0 (0%)            100Mi (5%)        500Mi (25%)     3960Ki (0%)

kind-worker2         *           *                                              300m (7%)      1500m (37%)   58919618n (1%)    300Mi (15%)       1500Mi (75%)    137732Ki (6%)
kind-worker2         sandbox     sandbox-kube-capacity-nginx-68fdb47b8d-5mxnx   100m (2%)      500m (12%)    0 (0%)            100Mi (5%)        500Mi (25%)     3948Ki (0%)
kind-worker2         sandbox     sandbox-kube-capacity-nginx-68fdb47b8d-6gwts   100m (2%)      500m (12%)    0 (0%)            100Mi (5%)        500Mi (25%)     3980Ki (0%)
kind-worker2         sandbox     sandbox-kube-capacity-nginx-68fdb47b8d-bbnsj   100m (2%)      500m (12%)    0 (0%)            100Mi (5%)        500Mi (25%)     4124Ki (0%)

5. オプションは他にもある

今回は --namespace-labels オプションを䜿ったけどオプションは他にもある䟋えば --pod-labels オプションを䜿えばPod の Label で絞り蟌みできるし--node-labels オプションを䜿えばノヌドの Label で絞り蟌みできる

$ kube-capacity --pod-labels app=nginx
NODE                 CPU REQUESTS   CPU LIMITS    MEMORY REQUESTS   MEMORY LIMITS
*                    400m (3%)      2 (16%)       400Mi (6%)        2000Mi (33%)
kind-control-plane   0 (0%)         0 (0%)        0 (0%)            0 (0%)
kind-worker          100m (2%)      500m (12%)    100Mi (5%)        500Mi (25%)
kind-worker2         300m (7%)      1500m (37%)   300Mi (15%)       1500Mi (75%)

$ kube-capacity --node-labels kubernetes.io/os=linux
NODE                 CPU REQUESTS   CPU LIMITS    MEMORY REQUESTS   MEMORY LIMITS
*                    1550m (12%)    2300m (19%)   790Mi (13%)       2490Mi (41%)
kind-control-plane   950m (23%)     100m (2%)     290Mi (14%)       390Mi (19%)
kind-worker          200m (5%)      600m (15%)    150Mi (7%)        550Mi (27%)
kind-worker2         400m (10%)     1600m (40%)   350Mi (17%)       1550Mi (77%)

たずめ

「kube-capacity」を䜿うずPod のリ゜ヌス倀をノヌド別にシンプルに衚瀺できるむンストヌルしおおくず䟿利なお今はただリリヌスされおいないけどGitHub リポゞトリの master ブランチを芋るず新しく --namespace オプションが远加されおいるLabel を䜿わずにシンプルに Namespace を指定できるため今よりも䟿利になるず思う

github.com