kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Killercoda : Katacoda の学習コンテンツをそのままインポートできる!

Katacoda「2022年6月末」にサービス停止になってしまった.今まで本当によく使っていたから残念だった😢

特に「ウェブ上ですぐに試せる手軽さ」「学習コンテンツの豊富さ」「独自コンテンツを作って公開できる仕組み」など,魅力的なポイントが多くあったと思う.

www.oreilly.com

今回紹介する Killercoda は Kim Wuestkamp によって公開されたサービスで,作者自身が「Katacoda Alternative(Katacoda の代替)」と言っている.Katacoda サービス停止の発表前から Katacoda の課題を解決するべく開発されていた.詳しくは以下の記事にまとまっている.なお CKS (Certified Kubernetes Security Specialist) など Kubernetes 関連の資格を最近受験した人は Killercoda にお世話になったのではないでしょうか!

itnext.io

Killercoda

Killercoda も Katacoda を同じく環境構築をせずにブラウザを使ってサクッと学べるプラットフォームで,既に Linux / Git / Vim / Kubernetes / Cassandra などを試せる.現時点ではまだ学習コンテンツは多くないけど,今後もっとサービスが普及して増えると嬉しいなと思う.

killercoda.com

Katacoda インポート機能

Killercoda の便利な機能の一つに「Katacoda インポート機能」がある.今まで Katacoda で使っていた Markdown をすぐに Killercoda にインポートできる.2022年2月に以下の記事で作った Katacoda サンプルの GitHub リポジトリをそのまま使って試してみる.

kakakakakku.hatenablog.com

と言っても作業は少なく,Killercoda の Creator 画面に3種類の設定をするだけ!簡単!

  • Step 1: Github Repo
    • 今回は kakakakakku/katacoda-kakakakakkumaster を設定した
  • Step 2: Repository Access
    • 表示される Deploy key を GitHub リポジトリに設定する(write access は付与しなくて OK!)
  • Step 3: Webhook
    • 表示される Payload Url を GitHub リポジトリに設定する(画面上部に表示される Call Webhook Manually も使える)

すると,専用の URL にすぐアクセスできるようになった!スゴイ!簡単!実際にシナリオを試すと {{execute}} 構文(クリックするとコマンドを実行できる)や {{copy}} 構文(クリックするとクリップボードにコピーできる)なども正常に動いた!

「Katacoda インポート機能」の詳細は以下にまとまっている.クイズ構文など,まだ全ての構文がサポートされているわけではないけど,今まで Katacoda でコンテンツを提供していた人が簡単に Killercoda に移行できるのは素晴らしいことだと思う.

itnext.io

以上!今回は Killercoda「Katacoda インポート機能」の紹介でしたー!

Pluto : Kubernetes apiVersion の「非推奨と削除」を検出する

Pluto を使うと Kubernetes マニフェストの apiVersion に対して deprecated(非推奨)removed(削除)を検出できる.警告自体は Deprecated API Migration Guide | Kubernetes を見れば確認できるし,kubectl apply コマンドを実行したときにも表示されるけど,Pluto は実行前に確認できて便利!パイプラインに組み込むのも良し!

github.com

セットアップ

Pluto CLI は macOS なら Homebrew を使えば簡単にセットアップできる.今回は現時点で最新となる Pluto v5.10.2 を前提とする.

$ brew install FairwindsOps/tap/pluto

$ pluto version
Version:5.10.2 Commit:0070fa703641a58ec339a9675aa214ba080ad5d3

$ pluto help
A tool to detect Kubernetes apiVersions

Usage:
  pluto [flags]
  pluto [command]

Available Commands:
  completion    Generate the autocompletion script for the specified shell
  detect        Checks a single file or stdin for deprecated apiVersions.
  detect-files  detect-files
  detect-helm   detect-helm
  help          Help about any command
  list-versions Outputs a JSON object of the versions that Pluto knows about.
  version       Prints the current version of the tool.

Flags:
  -f, --additional-versions string       Additional deprecated versions file to add to the list. Cannot contain any existing versions
      --columns strings                  A list of columns to print. Mandatory when using --output custom, optional with --output markdown
      --components strings               A list of components to run checks for. If nil, will check for all found in versions.
  -h, --help                             help for pluto
      --ignore-deprecations              Ignore the default behavior to exit 2 if deprecated apiVersions are found.
      --ignore-removals                  Ignore the default behavior to exit 3 if removed apiVersions are found.
  -r, --only-show-removed                Only display the apiVersions that have been removed in the target version.
  -o, --output string                    The output format to use. (normal|wide|custom|json|yaml|markdown|csv) (default "normal")
  -t, --target-versions stringToString   A map of targetVersions to use. This flag supersedes all defaults in version files. (default [])
  -v, --v Level                          number for the log level verbosity

Use "pluto [command] --help" for more information about a command.

pluto.docs.fairwinds.com

Pluto を実行する

さっそく Pluto CLI を試す.個人的によく使っている Kubernetes マニフェストの一部を抜粋して pluto detect-files コマンドを実行してみた.すると CronJobPodDisruptionBudgetdeprecated(非推奨)が検出された.なお,Pluto はデフォルトで「Kubernetes v1.22」を検出対象にしている.

$ pluto detect-files -d .
NAME         KIND                  VERSION          REPLACEMENT   REMOVED   DEPRECATED
my-cronjob   CronJob               batch/v1beta1    batch/v1      false     true
my-pdb       PodDisruptionBudget   policy/v1beta1   policy/v1     false     true

kubectl コマンドのように -o オプションも使える.-o wide オプションだと該当するバージョンも表示できて便利!他にも -o json-o yaml も使える.

$ pluto detect-files -d . -o wide
NAME         NAMESPACE   KIND                  VERSION          REPLACEMENT   DEPRECATED   DEPRECATED IN   REMOVED   REMOVED IN
my-cronjob   <UNKNOWN>   CronJob               batch/v1beta1    batch/v1      true         v1.21.0         false     v1.25.0
my-pdb       <UNKNOWN>   PodDisruptionBudget   policy/v1beta1   policy/v1     true         v1.21.0         false     v1.25.0

さらに --target-versions オプションを使うと検出対象にする Kubernetes バージョンを変更できる.--target-versions k8s=v1.23.0 オプションを使うと HorizontalPodAutoscaler でも deprecated(非推奨)が検出された.明示的に指定しておくのが良さそう.

$ pluto detect-files -d . -o wide --target-versions k8s=v1.23.0
NAME         NAMESPACE   KIND                      VERSION               REPLACEMENT      DEPRECATED   DEPRECATED IN   REMOVED   REMOVED IN
my-cronjob   <UNKNOWN>   CronJob                   batch/v1beta1         batch/v1         true         v1.21.0         false     v1.25.0
my-hpa       <UNKNOWN>   HorizontalPodAutoscaler   autoscaling/v2beta2   autoscaling/v2   true         v1.23.0         false     v1.26.0
my-pdb       <UNKNOWN>   PodDisruptionBudget       policy/v1beta1        policy/v1        true         v1.21.0         false     v1.25.0

Pluto を GitHub Actions に組み込む

次は Pluto を GitHub Actions に組み込む.ドキュメントに載っている YAML を使えば簡単に実行できる!

pluto.docs.fairwinds.com

name: CI

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  pluto:
    name: pluto
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Download Pluto
        uses: FairwindsOps/pluto/github-action@master
      - name: Run Pluto
        run: pluto detect-files -d . -o wide --target-versions k8s=v1.23.0

しかし Pluto は実行時に以下のリターンコードを返す.よって,deprecated(非推奨)removed(削除)が検出されると落ちてしまう.もし「検出はするけど CI は継続する」場合は --ignore-deprecations オプションと --ignore-removals オプションを併用する.そうすれば「リターンコード 0」を返せるようになる.

  • リターンコード 1 : エラー
  • リターンコード 2 : deprecated(非推奨)あり
  • リターンコード 3 : removed(削除)あり
name: CI

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  pluto:
    name: pluto
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Download Pluto
        uses: FairwindsOps/pluto/github-action@master
      - name: Run Pluto
        run: pluto detect-files -d . -o wide --target-versions k8s=v1.23.0 --ignore-deprecations --ignore-removals

まとめ

Kubernetes マニフェストの apiVersion に対して deprecated(非推奨)removed(削除)を検出できる Pluto を試した.日常的に使っているマニフェストリポジトリの GitHub Actions に Pluto を設定したので,継続的に使ってみようと思う.

Python コードでアーキテクチャ図を生成できる Diagrams がめっちゃ便利!

「Diagrams」を使うと Python コードでアーキテクチャ図を生成できる.サポートされているアイコンセットがとても多く AWS や Google Cloud や Microsoft Azure もあれば,Kubernetes やプログラミング言語なども使える.試してみたけどめちゃくちゃ便利!まさに Diagram as Code だ✌️

diagrams.mingrammer.com

セットアップ

「Diagrams」Graphviz に依存しているため,macOS だと pipbrew ですぐにセットアップできる.

$ pip install diagrams
$ brew install graphviz

試してみた

さっそく Examples を参考にアーキテクチャ図を作ってみた!

サンプル : AWS

from diagrams import Cluster, Diagram
from diagrams.aws.compute import EC2, EC2AutoScaling, Lambda
from diagrams.aws.database import Aurora
from diagrams.aws.integration import SQS
from diagrams.aws.network import ALB, Route53
from diagrams.aws.storage import S3

with Diagram('AWS Architecture'):
    route53 = Route53('Route 53')

    alb = ALB('ALB')

    with Cluster('EC2 Auto Scaling'):
        instances = [
            EC2('Instance'),
            EC2('Instance'),
            EC2('Instance')
        ]

    aurora = Aurora('Aurora')

    sqs = SQS('SQS')

    function = Lambda('Lambda')

    s3 = S3('S3')

    route53 >> alb >> instances
    instances >> aurora
    instances >> sqs >> function >> s3

サンプル : Kubernetes

from diagrams import Cluster, Diagram
from diagrams.k8s.compute import Deployment, Pod, ReplicaSet
from diagrams.k8s.network import Ingress, Service
from diagrams.k8s.podconfig import ConfigMap

with Diagram('Kubernetes Architecture'):
    ingress = Ingress('Ingress')

    service = Service('Service')

    with Cluster(''):
        pods = [
            Pod('pod'),
            Pod('pod'),
            Pod('pod')
        ]

    replicaset = ReplicaSet('ReplicaSet')

    deployment =  Deployment('Deployment')

    configmap = ConfigMap('ConfigMap')

    ingress >> service >> pods << replicaset <<  deployment << configmap

サンプル : アプリケーション

from diagrams import Cluster, Diagram
from diagrams.programming.framework import React
from diagrams.programming.language import Go, Java
from diagrams.onprem.database import MySQL, PostgreSQL

with Diagram('SPA Architecture'):
    frontend = React('Frontend')

    with Cluster('Service A'):
        frontend >>  Go('Go API') >> MySQL('MySQL')

    with Cluster('Service B'):
        frontend >> Java('Java API') >> PostgreSQL('PostgreSQL')

tree コマンド風のディレクトリ構造を簡単に生成できる「tree.nathanfriend.io」

ブログ記事に「ディレクトリ構造」を載せるときは tree コマンドを使っている.ディレクトリ構造が深すぎるときは tree -L で深さを指定できるし,不要なディレクトリがあるときは tree -I で除外もできる.今まで書いたブログ記事にも多くディレクトリ構造を載せてきた😆

tree.nathanfriend.io

tree.nathanfriend.io を使うと tree コマンド風のディレクトリ構造をウェブサイトで簡単に生成できる.そのままコピーしてすぐブログ記事に貼れるのは便利〜👏 今まで同じようなツールを実装しようと思ったこともあったし,今後は tree コマンドと併用してみようと思う.

tree.nathanfriend.io

.
└── Edit me to generate/
    ├── a/
    │   └── nice/
    │       └── tree/
    │           ├── diagram!
    │           └── :)
    └── Use indentation/
        ├── to indicate/
        │   ├── file
        │   ├── and
        │   ├── folder
        │   └── nesting.
        └── You can even/
            └── use/
                ├── markdown
                └── bullets!

tree.nathanfriend.io では以下のオプションも選べる.特に Trailing / はよく tree -F で使うので実装されてて良かった!

  • Fancy(ツリー構造のスタイルを変更するかどうか)
  • Full path(絶対パスにするかどうか)
  • Trailing /(ディレクトリの末尾に / を含めるかどうか)
  • Root .(ルートディレクトリを . として含めるかどうか)

jupyter nbconvert コマンドを使って Notebook を変換する

jupyter nbconvert コマンドを使うと Jupyter Notebook を Python コード / PDF / HTML などに変換できる.指定できるフォーマットの一覧は GitHub に載っている.また Jupyter Notebook で使える Download as メニューも同じ仕組みを使っている.

github.com

Python コード

Jupyter Notebook を「Python コード」に変換するなら --to script オプションを使う.例えば,MLOps として「データサイエンティスト」の実装した Jupyter Notebook を「機械学習エンジニア」が Python コードにリファクタリングするときに使えたりする.

$ jupyter nbconvert --to script xxx.ipynb

PDF

Jupyter Notebook を「PDF」に変換するなら --to pdf オプションを使う.TeX に依存しているため,環境によってはエラーになる可能性もある.

$ jupyter nbconvert --to pdf xxx.ipynb

その場合は --to webpdf オプションを使って,PyppeteerChromium 経由で「PDF」に変換する選択肢もある.

$ jupyter nbconvert --to webpdf xxx.ipynb

HTML

Jupyter Notebook を「HTML」に変換するなら --to html オプションを使う.画像も <img> タグになる.

$ jupyter nbconvert --to html xxx.ipynb

あわせて --template オプションを使うと HTML のデザインも変更できる.デフォルトは lab となる.また --template lab オプションを使う場合は --HTMLExporter.theme dark オプションで黒ベースのデザインにも変更できる.

$ jupyter nbconvert --to html xxx.ipynb --template lab
$ jupyter nbconvert --to html xxx.ipynb --template lab --HTMLExporter.theme light
$ jupyter nbconvert --to html xxx.ipynb --template lab --HTMLExporter.theme dark
$ jupyter nbconvert --to html xxx.ipynb --template classic
$ jupyter nbconvert --to html xxx.ipynb --template basic

関連記事

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com