Carpe Diem

備忘録

Kubernetesの初学者がlabelについて気になること

概要

ラベルという名前ゆえか若干軽視されがちですが、Kubernetesにおいてlabelはリソースを識別する上で非常に重要な要素です。
そのlabelについてKubernetesの初学者が気になる(自身も気になった)ことを挙げて行きます。

気になること

Deploymentにあるlabelが多い

公式ドキュメントに記載されているDeploymentの例を見てみます。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:  # ①
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:  # ②
      app: nginx
  template:
    metadata:
      labels:  # ③
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

この様にlabelに関連するところがなんと3つもあります。

続きを読む

KubernetesのPodを安全に終了する

概要

KubernetesのPodを安全に終了する際に気をつけるべき事前知識と設定方法について説明します。

あらかじめまとめると

  1. 新規リクエストのルーティングがなくなるまでpreStopでPodのアプリケーションコンテナの終了開始を待たせる
  2. 既存リクエストが全て処理されるまでアプリケーション側でGraceful Shutdownをする
  3. SIGKILLで強制終了されないように1, 2が完了するまでterminationGracePeriodSecondsを長くする

の3つを実施することになります。

環境

前提知識

Podが終了すると何がトリガーされるか

Podが終了するとまずdeletionTimestampがPodリソースに設定され、Terminating状態になります。

そしてその次に以下の3つの処理がそれぞれ独立(並行)して実施されます。

  • Podの終了処理
  • ServiceからPodへのルーティングの削除
  • ReplicaSetやDeployment管理下からの除外

これらはそれぞれ独立しているため順序に保証はなく「いずれかの処理の完了を待って次の処理をする」のような依存関係を持った制御もできません

続きを読む

Envoyで重み付き負荷分散を試してみる

概要

christina04.hatenablog.com

の中でconfig.route.v3.RouteActionに重み付き負荷分散(weighted load balancing)の設定がありました。

これを利用することで

  • カナリアリリース
  • リクエストのサンプリング
    • 一部だけ詳細なログやstatsを出す
    • Mountebankのようなリクエストをレコードしてリプレイできるモックサーバに流す

といったことが容易に実現できます。

今回はこの機能を試してみます。

環境

  • v1.24.0
続きを読む

EnvoyのVirtual hostを読み解く

概要

EnvoyのルーティングはListener > Network filter chain > HCM(HTTP connection manager)のVirtual Hostで適用されます。

設定の一部は配列で複数設定することができますが、ものによっては

  • 一致率が高いものから順に適用する(完全一致→部分一致→ワイルドカードなど)
  • 先に設定した順で走査し、マッチしたものを適用する

といった違いがあったりなど、きちんと理解していないとハマることがあるので1つ1つ読み解いていきます。

環境

  • Envoy v1.24.0
続きを読む

RedisのLua Scriptを使う

概要

前回PipelineやMultiでは読み出したデータを意思決定に使えないという課題があり、代わりにWatchで楽観ロックを用いるという旨を説明しました。

christina04.hatenablog.com

Lua Scriptを使えば楽観ロックを用いずとも上記の課題を解決することができます。

環境

  • Redis 6.2.7
  • Go 1.19.2

Lua Script

Lua Script機能は元々Redisに存在しない機能を使いたい場合にRedis自体のCソースを改修せずともLua言語を用いて拡張できるようにした仕組みです。

メリットとして以下があります。

続きを読む

RedisのPipeline, Multi, Watchの区別

概要

RedisのPipeline, Multi, Watchの区別をする上であまりシーケンス図を用いた説明がなかったので図示してみました。

解説

Pipeline

課題

通常複数の処理を実行しようとすると以下のような流れになります。
シンプルではありますが都度サーバ通信が入るところに無駄があります。

続きを読む

スクリーンショットをYoinkに直接送る

背景

以前以下の対応を行いましたが、

christina04.hatenablog.com

最後に書いてあるようにある程度ファイルは小さくなったもののクリップボード経由だとまだまだ大きく、結局スクリーンショットを保存したディレクトリから貼り付ける習慣になってしまいました。

しかしその場合以下の課題がありました。

  • 保存ディレクトリから貼り付けるのが手間
    • Dockに保存ディレクトリを常駐させているが、ファイルが増えると見えなくなる
  • 複数ファイルになるとDockから直接D&Dできない

そこで

を使って上記の課題を解決しました。

続きを読む