kakakakakku blog

Weekly Tech Blog: Keep on Learning!

n8n.io 入門 : IFTTT のようなワークフローを構築しよう

「n8n.io」を使うと GitHub / Slack / Google Sheets など多くのサービス(ドキュメントを見ると 240 以上もインテグレーションできる!)を組み合わせて自由に「ワークフロー」を構築できる.関連サービスで言えば IFTTT のような感じ!例えば IFTTT Pro に課金せずにセルフホスティングできたりする.今回は「n8n.io 入門」を目的として Mac で Docker を使って「n8n.io」を試す.現状だと Docker と npm (npx) で試せる.なお,SaaS として使える「n8n.cloud」もある(最近まで coming soon になっていた).

n8n.io

n8n.io 入門 : 完成形

今回は「GitHub リポジトリに対する Star⭐/ Unstar⭐をトリガーに Slack 通知とコマンド実行に条件分岐をするワークフロー」を構築して「n8n.io」に入門する.完成形を以下に載せておく.実際に Star⭐の通知を受けられる仕組みを構築できると便利そう.

f:id:kakku22:20210101191321p:plain

1. 起動する

Quickstart に載っている通り,Docker を使ってローカル環境を起動する.1点ポイントがあり n8n start--tunnel オプションを付ける.GitHub などの Webhook でトリガーするためにインターネット側からローカル環境に接続できるようにする必要がある.ドキュメントにも書いてある通り,--tunnel オプションは「ローカル環境」として気を付けて使う.

$ docker run -it --rm \
    --name n8n \
    -p 5678:5678 \
    -v ~/.n8n:/root/.n8n \
    n8nio/n8n \
    n8n start --tunnel

docs.n8n.io

docker run コマンドで「n8n.io」を起動してから http://localhost:5678/ にアクセスをすると,以下のようにワークフロー画面を表示できるようになる.簡単!そして UI も見やすく実装されている.

f:id:kakku22:20210101191131p:plain

2. トリガー設定をする

さっそくトリガーを設定していく.画面右上にある + アイコンを押して,Triggergithub と検索すると GitHub Trigger を選択できるようになる.分類としては以下の通り.本当にインテグレーションが多くある.

  • Regular : アクション
  • Trigger : トリガー
  • All : 全て

f:id:kakku22:20210101191146p:plain

別途準備しておいた GitHub の Personal access tokens を使って Webhook の設定をする.Events には star 以外に issuepull_requestpush などを選べる.

  • Authentication : Access Token
  • Repository Owner : kakakakakku
  • Repository Name : redash-hands-on
  • Events : star

f:id:kakku22:20210101191202p:plain

トリガー設定を完了すると,ワークフロー画面に表示される.

f:id:kakku22:20210101191217p:plain

3. トリガー設定を確認する

この時点で動作確認をする.今回はワークフロー名を playground として保存して,画面下にある Execute Workflow ボタンを押すと待機状態になる.実際に kakakakakku/redash-hands-on リポジトリに Star⭐をすると,GitHub Trigger 上に と表示される.GitHub Trigger をクリックすると「レスポンスボディ」など詳細に確認できる.

f:id:kakku22:20210101191232p:plain

4. 条件分岐を設定する

次に IF を使って条件分岐を設定する.「n8n.io」の便利な点は「レスポンスボディ」の値を使って柔軟に条件を設定できるところで,今回は GitHub Trigger のレスポンスから body.action の結果を取得して created であれば Star⭐と判断する.Unstar⭐の場合は deleted という値になる.

f:id:kakku22:20210101191248p:plain

最終的に body.action (Equal) created という条件にする.

f:id:kakku22:20210101191304p:plain

5. Slack 通知とコマンド実行を設定する

最後は Star⭐の場合に「Slack 通知 (Slack)」を設定する.Unstar⭐の場合に「コマンド実行 (Execute Command)」を設定する.特に意味はなく「n8n.io」を試すために設定した.詳細は割愛する.同じように画面下にある Execute Workflow ボタンを押せば動作確認できる.

f:id:kakku22:20210101191321p:plain

まとめ

今回は簡単なワークフローを構築して「n8n.io」に入門した.便利!もっと便利に使うために以下のアクションは気になる!

「n8n.io」の実装は GitHub リポジトリに公開されているし,デフォルト設定では SQLite にデータを格納しているし(実際に ~/.n8n/database.sqlite を確認できる),コードを読むネタとしても使えそう.引き続き「n8n.io」を試していくぞー!

github.com

2020年の振り返りと2021年の抱負

2020年の振り返り 🎉

幅広く技術を語れるように学び続けた

2019年から継続して,2020年も「幅広く技術を語れるように学び続ける」を目標に掲げていた.目標としては定量的に評価できないし,無限にある技術領域の全てを学ぶことはできないけど,1年前に理解できていなかった(技術講師として教えられなかった)いくつかの技術に対して自信を持てるようになった.長期目標をブレイクダウンするために四半期ごと(3ヶ月ごと)に以下の中期目標を掲げていた.あくまで選んだ技術領域に対するインプットとアウトプットの比重を高くするという意味で,当然ながら他の技術も並行して学んでいた.

  • 1-3月 : マイクロサービス関連(特に Envoy
  • 4-6月 : フロントエンド関連(特に Next.js
  • 7-9月 : コンテナ関連(特に Kubernetes
  • 10-12月 : コンテナ関連(特に Kubernetes

優先順位の関係で学べなかった(諦める意思決定をした)技術領域も多くあったし,2018年から技術講師という仕事を続けていることから,プロダクションコードを書く機会は全くないし,衰えてきた(もしくは忘れてしまった)技術領域もある.全ては限られた時間の中でのトレードオフになる.だからこそ,学んだことをブログに残しておけば,外部記憶装置として,未来の自分に貢献できると思う.

リモート適性に気付けた

今まで本格的に「リモートワーク」をしたことはなく,2020年における大きな変化だった.世界的に困難な状態が続いていることは理解した上で「リモート」にフォーカスすると,個人的には「良いことばかり」だった.まず「リモートワーク」により,家族と過ごす時間を圧倒的に増やせた.もともと,ワーカホリックで夜遅くまで会社にいることが多く,娘たちに会えない日も多かった.24時間を柔軟に使えるようになったし,無駄な移動時間もなくなり,結果的に仕事での成果も過去1番と言えるほどに大きく得られた.精神面で言うと,もともとあまり人とのコミュニケーションが得意ではなく「リモートワーク」になって必要なコミュニケーションに限定されることで,ストレスを感じなくなった.

また技術講師として「リモート研修」にシフトせざるを得なくなった.経験もなく不安も多かったけど,今ではもう「リモート研修」に慣れているし,ベストプラクティスも多く習得しているし,自信を持って得意と言える.「クラスルーム型」「リモート型」のどちらも経験できたのは良かった.リモート研修用の「配信環境」としては,徒歩20分程度の実家で空いている1部屋を配信専用で使わせてもらっている.自宅だとリモート研修中に娘たちが乱入してくる可能性もあるし,1日ずっと騒がないように気を付けてもらうことも難しく,不可能と判断した.実家(一軒家 / 3階建て)では,基本的に両親が生活をしない階で配信できるため,迷惑も掛からず,快適に過ごせている.物欲は抑えて,配信沼には入らないようにしているけど,Blue Microphones Yeticaster は本当に良いぞ!

今年もブログメンタリングを継続できた

2020年も「ブログメンタリング」を継続できた.2020年は「計18名(2019年からの継続を含む)」のメンティを担当して,卒業生の累計は「計58名」になった.単純に考えて,個人的な趣味で提供している活動としてはスゴイ人数規模になったと思う.なお,2017年12月から3年間続けてきた「ブログメンタリング」は,2021年からは少しスタイルを変えて続けていく.詳しくはまた後日!

インプット/アウトプット 💡

ブログ

2020年は「週1記事」のノルマと,ストレッチゴールの「70記事 ➔ 90記事(上方修正)」を達成して「計90記事」を書いた.1年間を通して,ノルマを達成できなかった週はなく,余裕があれば「週3記事」に挑戦した週もあった.日常的に忙しく,インプットとアウトプットのバランスを強く意識している中,ここ数年で「90記事を書く自分」を想像できていなかった.2020年の結果としては,自分自身とても驚いているし,モチベーションを高く維持し続けることができたと思う.累計ブクマ数は2020年で「14771 ➔ 16958 (+ 2187)」という結果だった.

f:id:kakku22:20201231012819p:plain

なお,200 ブクマを超えた記事は3記事だった.

勉強会

2019年は「時間捻出」「ノドのケア」という理由で勉強会にほとんど参加しなかったけど,2020年はリモート勉強会中心になり,「レコーディングを倍速で見れば十分そう」という別の理由からほとんど参加しなかった.リアルタイムに参加したのは海外で開催された「Mob Programming Gathering 2020」だけだった.とは言え,リアルタイムにリアクションをしたり,コメントで盛り上げることも重要だし,2021年はもう少し積極的に参加したいと思う.

kakakakakku.hatenablog.com

プルリクエスト

2020年は「計4件」のプルリクエストを OSS に送った.過去と比較すると大きく減ってしまった.

kakakakakku.hatenablog.com

読んだ本

2020年は「計11冊」を読んで書評を書いた.読んだけど書評を書いていない本もあり,もう少し書きたかった.「みんなでアジャイル」「CircleCI 実践入門」は献本をしていただき,書籍の普及に少しでも貢献できていればと思う.

Mackerel アンバサダー

2019年3月から活動している「Mackerel アンバサダー」としては,2月と3月に集中してブログを書いた.「サービスメトリック」「アノテーション」を組み合わせた Hatena Blog 関連 KPI の可視化は今でも使っている.ただし「3ヶ月に1記事」という個人的なノルマは達成できなかった.あまり試しておくべき機能に出会えてなく,2021年のためにもう1度ネタ出しをしようと思う.

f:id:kakku22:20201231005724p:plain

2021年の抱負 ✨

幅広く技術を語れるように学び続ける

3年連続で「幅広く技術を語れるように学び続ける」を目標として掲げる.目標を考えるのが面倒になったわけではなく,本当に自分自身に最適な目標だと確信している.特に技術講師として「教える」ことを前提にすると,深く理解する必要があり「語れる = 教えられる」という部分に価値がある.さらに,2020年に学べなかった領域として「データアナリティクス関連」があり,2021年は専門性を高めていく.

定量的な目標は継続して,以下とする.2020年のように,ストレッチゴールを上方修正する可能性もあるけど,仕事などに忙殺される週もあるため,無理せず慣れたペースを維持していくことを意識する.

  • ブログ「週1記事」ノルマ
  • ストレッチゴールとして1年間で「70記事」

健康とヒゲ脱毛

「リモート」前提になり,運動不足にならないようにある程度は鍛えている.特に10月頃からは1ヶ月に 50-80km ほどは走っていて,体は引き締まり,既に 5kg ほど落ちた.今まで以上に疲れも感じず,便利な体になった.これは2021年も継続する.

そしてもう1個ある目標は「ヒゲ脱毛」を成功させることで,プロダクティビティを追求するために,現状1番無駄だと感じる時間はヒゲを剃る時間だと思う.この時間をもっとブログの執筆時間に当てられたらどんなに素晴らしいことだろう.さらにもともと肌も弱くすぐ荒れてしまうため,コンプレックスだった.実は10年前から同じことは考えていて,ヒゲ脱毛に挑戦していたけど,2011年に契約したところは無免許施術で逮捕され,翌年2012年に契約したところは倒産になり,ただお金を捨てた形になっている.そこから今まで8年間も諦めていた.2021年こそは!もしオススメのクリニックなどがあれば教えてもらえると!

買って良かった 🎁

AirPods ProBlue Microphones YeticasterLG : 4K Display など,買って良かったものは多くあるけど,二番煎じな気もするため,あまり紹介されてなくマニアックなもので「買って良かったもの」を2点紹介する.

まず「リモート前提」になり下半身は見えなくなるため,楽に過ごせるパンツを探していて「NEWHEY のチノパン」を買った.圧倒的に安く(2500円ほど!),個人的に好きなスキニーで,ストレッチ素材で過ごしやすく,仕事中はほとんど履いている.Amazon の購入履歴を見たら4本も買っていた!なお,レビューにも書いてある通り,後ろにある金具は指をバッサリ切るため(実際に深く切った)買ったらすぐに捨てる.

もう1点は収納関連で,自宅とトランクルームの整理をするときに,収納しやすく,簡単に捨てられるものを探していた.「コクヨの収納ボックス」は簡単に組み立てられて,軽く,デザインもシンプルでとても重宝している.Amazon の購入履歴を見たら12箱も買っていた!

観たアニメ 📺

2020年は Amazon Prime Video で多くアニメを観た.今まであまり観る習慣はなくて,最初は気分転換だったけど,どんどんとハマってしまった.特に「Re:ゼロ」「呪術廻戦」「炎炎ノ消防隊」は何度も繰り返し観た.無意識に観たくなってしまう!2021年1月から続編もあったりするため,引き続き観ていく!

  • 鬼滅の刃(シーズン1)
  • ハイキュー!!(シーズン1,2,3,4)
  • ソードアート・オンライン アリシゼーション War of Underworld
  • Re:ゼロから始める異世界生活(シーズン1,2)
  • デカダンス
  • 呪術廻戦(シーズン1)
  • 約束のネバーランド(シーズン1)
  • 炎炎ノ消防隊(シーズン1,2)
  • 体操ザムライ

まとめ

2021年もガンガン攻めていくぞ 🔥

過去の振り返り

iTerm2 上でコマンドを組み立てられる新機能「Composer」を試した

2020年11月にリリースされた「iTerm2 v3.4」に追加された新機能「Composer」を使うと「iTerm2 上でコマンドを組み立ててから」実行できるようになる.例えば,ワークショップを試すときに <ここを修正><REPLACE>{id} など,実行するコマンドの中に含まれているプレースホルダを組み立てる場合や,本番環境などでコマンドを実行するときに下書きをしたり見直しをする場合で,今までテキストエディタを使っていたところを「Composer」で代替できるようになる.確かに今まではテキストエディタを使っていた!

iterm2.com

Composer 有効化

iTerm2 で Command + Shift + . と入力すると,以下のように右上に「Composer」で使う領域が表示される.シンプルなコマンドならテキストフィールド上で直接組み立てることもできるし,複数行コマンドならダイアログを使う.個人的に数週間使った感想としては,操作を統一するためにも基本的にダイアログを使えば良いと思う.

f:id:kakku22:20201228164520p:plain

Composer を試す 1

サンプルとして,以下のような GitHub API に curl コマンドを実行する手順を考える.コマンドをペーストしてから {username}kakakakakku に置き換える.

$ curl -s https://api.github.com/users/{username} | jq '.login, .blog, .bio'

以下のように「Composer」でコマンドを組み立てて Shift + Enter と入力すると,そのまま実行できる.

f:id:kakku22:20201228164533p:plain

Composer を試す 2

次に複数行コマンドのサンプルとして,以下のような AWS CLI で Amazon S3 Bucket のオブジェクト一覧を取得するコマンドを実行する手順を考える.コマンドをペーストしてから <REGION><BUCKET>ap-northeast-1kakakakakku-playground に置き換える.

$ aws s3api list-objects-v2 \
    --region <REGION> \
    --bucket <BUCKET>

以下のように「Composer」でコマンドを組み立てて Shift + Enter と入力すると,そのまま実行できる.特に複数行コマンドだと「Composer」を使うメリットがある.可読性も高くて普通に便利!

f:id:kakku22:20201228164550p:plain

まとめ

2020年11月にリリースされた「iTerm2 v3.4」に追加された新機能「Composer」を試した.今までコマンドを組み立てるときにテキストエディタを使っていたけど,今後は iTerm2 の「Composer」を使っていく.欲を言えば,コマンド実行履歴も管理できるともっと便利になりそう!

関連記事

kakakakakku.hatenablog.com

Pod に「優先度」を設定できる PriorityClass と Non-preempting 機能を試した

Kubernetes の「PriorityClass」を使うと Pod に優先度(プライオリティ)を設定できる.例えば,通常 Pod を起動するために必要なリソースを確保できない場合は Pending になるけど,そういう場合でも優先的に起動できるようになる.逆に「優先度を低くした待機用 Pod」を使ってノードを多めに起動しておく「オーバープロビジョニング」という活用法にも繋がる.今回は「PriorityClass」を試していく.

kubernetes.io

検証環境

今回は Docker Desktop for MacKubernetes 1.19.3 を使う.検証をシンプルにするために「1 ノード」そして「メモリ 2 GB」にした.

$ kubectl describe nodes | egrep 'Capacity:|Allocatable:|memory:'
Capacity:
  memory:             2035604Ki
Allocatable:
  memory:             1933204Ki

「PriorityClass」設定なし

まず,以下のようなマニフェスト deployment-row.yaml を作る.「メモリ 500 MB」を要求する Pod を3個起動する Deployment とした.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sandbox-priority-class-row-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.19-alpine
          resources:
            requests:
              memory: "500Mi"
          ports:
            - containerPort: 80

マニフェストを適用すると,期待通りに Pod を起動できた.

$ kubectl apply -f deployment-row.yaml
deployment.apps/sandbox-priority-class-row-nginx created

$ kubectl get pods
NAME                                               READY   STATUS    RESTARTS   AGE
sandbox-priority-class-row-nginx-99fd6b465-9vhsv   1/1     Running   0          10s
sandbox-priority-class-row-nginx-99fd6b465-hg9ch   1/1     Running   0          10s
sandbox-priority-class-row-nginx-99fd6b465-zhv7b   1/1     Running   0          10s

ほぼ同じマニフェスト deployment-high.yaml をもう1個作る.今回は replicas: 1 にした.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sandbox-priority-class-high-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.19-alpine
          resources:
            requests:
              memory: "500Mi"
          ports:
            - containerPort: 80

同じくマニフェストを適用すると,メモリを確保することができず Pending になった.「PriorityClass」設定なしだと,期待通りの挙動になる.2種類の Deployment を削除しておく.

$ kubectl apply -f deployment-high.yaml
deployment.apps/sandbox-priority-class-high-nginx created

$ kubectl get pods
NAME                                                READY   STATUS    RESTARTS   AGE
sandbox-priority-class-high-nginx-99fd6b465-5rcpm   0/1     Pending   0          10s
sandbox-priority-class-row-nginx-99fd6b465-9vhsv    1/1     Running   0          2m
sandbox-priority-class-row-nginx-99fd6b465-hg9ch    1/1     Running   0          2m
sandbox-priority-class-row-nginx-99fd6b465-zhv7b    1/1     Running   0          2m

$ kubectl delete -f deployment-high.yaml
deployment.apps "sandbox-priority-class-high-nginx" deleted

$ kubectl delete -f deployment-row.yaml
deployment.apps "sandbox-priority-class-row-nginx" deleted

「PriorityClass」設定あり

次に「PriorityClass」を作る.まずは「優先度:高」として使う high-priority.yaml を作る.値は 1000000 にした.値は「10億以下の整数値」を指定できて,大きいほど優先度が高くなる.今回はドキュメントにも載っている数値をそのまま使った.

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 1000000
globalDefault: false

もう1個「優先度 : 低」として使う row-priority.yaml を作る.値は -1 にした.

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: row-priority
value: -1
globalDefault: false

マニフェストを適用しておく.

$ kubectl apply -f high-priority.yaml
priorityclass.scheduling.k8s.io/high-priority created

$ kubectl apply -f row-priority.yaml
priorityclass.scheduling.k8s.io/row-priority created

次に Deployment に priorityClassName の指定を追加する.deployment-row.yaml「優先度 : 低」の Pod にする.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sandbox-priority-class-row-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.19-alpine
          resources:
            requests:
              memory: "500Mi"
          ports:
            - containerPort: 80
      priorityClassName: row-priority

deployment-high.yaml「優先度:高」の Pod にする.検証をする準備は整った.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sandbox-priority-class-high-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.19-alpine
          resources:
            requests:
              memory: "500Mi"
          ports:
            - containerPort: 80
      priorityClassName: high-priority

さっそくマニフェストを適用する.順番はさっきと同じく deployment-row.yamldeployment-high.yaml にする.ポイントは deployment-high.yaml を適用したときに既に起動していた sandbox-priority-class-row-nginx-65dbdbc8f4-bcxk5 が自動的に止まり,代わりに「優先度:高」sandbox-priority-class-high-nginx-868895ff4d-tz7cr が起動した.期待通りに動かせた!

$ kubectl apply -f deployment-row.yaml
deployment.apps/sandbox-priority-class-row-nginx created

$ kubectl get pods
NAME                                                READY   STATUS    RESTARTS   AGE
sandbox-priority-class-row-nginx-65dbdbc8f4-5gzkb   1/1     Running   0          30s
sandbox-priority-class-row-nginx-65dbdbc8f4-bcxk5   1/1     Running   0          30s
sandbox-priority-class-row-nginx-65dbdbc8f4-jnxj9   1/1     Running   0          30s

$ kubectl apply -f deployment-high.yaml
deployment.apps/sandbox-priority-class-high-nginx created

$ kubectl get pods
NAME                                                 READY   STATUS    RESTARTS   AGE
sandbox-priority-class-high-nginx-868895ff4d-tz7cr   1/1     Running   0          20s
sandbox-priority-class-row-nginx-65dbdbc8f4-5gzkb    1/1     Running   0          2m
sandbox-priority-class-row-nginx-65dbdbc8f4-87q8r    0/1     Pending   0          20s
sandbox-priority-class-row-nginx-65dbdbc8f4-jnxj9    1/1     Running   0          2m

また2種類の Deployment を削除しておく.

$ kubectl delete -f deployment-high.yaml
deployment.apps "sandbox-priority-class-high-nginx" deleted

$ kubectl delete -f deployment-row.yaml
deployment.apps "sandbox-priority-class-row-nginx" deleted

Non-preempting 機能 : プリエンプトしない(削除しない)

Feature Gates を確認すると NonPreemptingPriority という機能が Kubernetes 1.19 に Beta としてデフォルトで使えるようになっている.「プリエンプト」とは「Pod を削除すること」を意味していて,簡単に言えば「PriorityClass」を使っても「実行中の Pod は削除せず」スケジューリング待ちの中で優先度を高くする.さっそく試していく.

kubernetes.io

high-priority.yaml をベースに新しく high-priority-nonpreempting.yaml を作る.1箇所 preemptionPolicy: Never を追加した.これで「プリエンプトしない」ことを宣言できる.

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority-nonpreempting
value: 1000000
preemptionPolicy: Never
globalDefault: false

次に deployment-high.yamlpriorityClassNamehigh-priority-nonpreempting に変えて,同じように deployment-row.yamldeployment-high.yaml の順番でマニフェストを適用する.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sandbox-priority-class-high-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.19-alpine
          resources:
            requests:
              memory: "500Mi"
          ports:
            - containerPort: 80
      priorityClassName: high-priority

結果としては「PriorityClass」設定なしと同じになる.他にもスケジューリング待ちの Pod があれば,効果が出てくる.

$ kubectl apply -f deployment-row.yaml
deployment.apps/sandbox-priority-class-row-nginx created

$ kubectl get pods
NAME                                                READY   STATUS    RESTARTS   AGE
sandbox-priority-class-row-nginx-65dbdbc8f4-8vh5d   1/1     Running   0          10s
sandbox-priority-class-row-nginx-65dbdbc8f4-dbgxr   1/1     Running   0          10s
sandbox-priority-class-row-nginx-65dbdbc8f4-srd7c   1/1     Running   0          10s

$ kubectl apply -f deployment-high.yaml
deployment.apps/sandbox-priority-class-high-nginx created

$ kubectl get pods
NAME                                                READY   STATUS    RESTARTS   AGE
sandbox-priority-class-high-nginx-5dbccfd9f-s8trp   0/1     Pending   0          10s
sandbox-priority-class-row-nginx-65dbdbc8f4-8vh5d   1/1     Running   0          40s
sandbox-priority-class-row-nginx-65dbdbc8f4-dbgxr   1/1     Running   0          40s
sandbox-priority-class-row-nginx-65dbdbc8f4-srd7c   1/1     Running   0          40s

ドキュメントを読むと「Non-preempting 機能」のユースケースとして「データサイエンス」の例が載っていた.処理中の計算は無駄にせず継続しながら,その後は優先度を適用していく.良さそう!

An example use case is for data science workloads. A user may submit a job that they want to be prioritized above other workloads, but do not wish to discard existing work by preempting running pods.

まとめ

Kubernetes の「PriorityClass」を使って Pod に優先度(プライオリティ)を設定できることを確認した.また preemptionPolicy を指定して「プリエンプトしない」PriorityClass を宣言できることも確認した.覚えておこう!

2020年のプルリクエストを振り返る

2016年から毎年 OSS に送ったプルリクエストを振り返る記事を書いている.2019年と比較すると,2020年は大きく減って「計4件」だった.GitHub は毎日のように使っているし,多くあるプライベートリポジトリに定期的にコミットもしているけど,OSS への貢献にはあまり繋げられなかった.過去の振り返りは以下にある.

プルリクエストを振り返るための検索

プルリクエストを振り返るために GitHub の検索条件を使う.今回は「2020年」に限定するため created:2020 とする.

is:pr is:public author:kakakakakku -user:kakakakakku created:2020

2020/01

envoyproxy/katacoda-scenarios

2019年11月から Envoy を試していて,2020年1月も継続していた.学習コンテンツとして使っていた「Try Envoy(内部的には Katacoda)」で気付いた誤りを修正した.現在 envoyproxy/katacoda-scenarios リポジトリの Contributors「4番目」に入っている!

github.com

github.com

2020/07

remotemobprogramming/mob

リモートモブプログラミングでドライバーを交代する(Git Handover と言う)ときに便利な mob コマンドの README.md「リリースされているバージョン番号をバッジとして表示したい」という Issue があり,Shields.io を使って対応した.

github.com

cyber-dojo/exercises-start-points

「テスト駆動開発」「モブプログラミング」を教えるときによく使う Cyber-Dojo のエクササイズ(実装ネタ)にあった typo を修正した.

github.com

まとめ

2020年は「計4件」のプルリクエストを送った.ドキュメント修正など機会はもっとあったはず.2021年は積極性を取り戻していく!