Unyablog.

のにれんのブログ

検索システムのフロントを SSR・Remix で作り直した

かなり昔に Elasticsearch ベースの検索システム(Heineken)を作っていた。 Elasticsearch で部内 Wiki 検索高速化 - Speaker Deck 特に更新せず数年動かしていたのだけど、サーバーの置き換えに伴って Kubernetes に置きたいよねという話になり、ついでに …

ISUCON 13 に参加した

去年11月、Smiling Face with Halo というチームで ISUCON 13 に参加した。チームメンバーはいつもの id:utgwkk と id:wass80 。 スコアは 0! よって最下位!! 直前には 73k くらい出てはいた。 ちょっと遅くなってしまったけど、個人的に楽しい問題だったし…

サポート外のリソースを含んだ Helm release を無理やり削除した

久々に helmfile sync を行った結果、PodSecurityPolicy リソースなんか知らないという理由で Upgrade に失敗した。 $ helmfile dep && helmfile sync ... Error: UPGRADE FAILED: resource mapping not found for name: "descheduler" namespace: "" from "…

curl の trace / trace-ascii が便利だった

curl で通信の内容を見ながら詳細なデバッグをしたいとき、 tcpdump や Wireshark でパケットキャプチャを行うのが定番だと思う。ただ、通信が多い環境だと実際にデバッグしたい通信を絞り込むのが面倒だし、TLS だと暗号化されていてさらに面倒。 curl のオ…

eBPF の tc を使ってパケットを触ってみる開発入門資料

eBPF の tc (classifier) を使ってパケットを触ってみる話をしたので、資料を貼ります。 docs.google.com eBPF は一度慣れるとかなり便利な仕組みで、見るべき場所が分かっていればそれなりに気軽に使うことができる。ただ、ドキュメントがだいぶ整備されて…

Renovate で Flux 配下の Helm Chart をアップデートする

この記事は KMC アドベントカレンダー 14 日目の記事です。 adventar.org 前回の記事は id:crashrt さんでした。自分も百舌谷さん好きです! crashrt.hatenablog.com 背景 現在、Kubernetes クラスタに入れる Manifest を Flux (Fluxcd) を使って管理してい…

dex と oauth2-proxy と ingress-nginx で OIDC ID token を取得して kubernetes-dashboad にログインする

Kubernetes では kubernetes-dashboard という各種リソースを見るためのダッシュボードが提供されている。 ブラウザ上で色々確認できるので便利なのだが、ログイン時は下のように自身の token か kubeconfig ファイルをアップロードする必要がある。 Kuberne…

Filebeat の Nginx module でアクセス先パスを正規化する

今回の ISUCON では Filebeat を使って Nginx のログを Elasticsearch に放り込み、 Kibana ダッシュボードで表示していた。 nonylene.hatenablog.jp なかなか役に立ってよかったものの、 /user/:userID/home のようなパスだと userID に様々な値が入ってし…

ISUCON12 本選に出場した (:old_noto_innocent: Team)

ISUCON 12 本選に出場した。結果は 167492 点で 7 位(結果修正後)。そこそこかな? isucon.net アプリケーション周りは utgw の記事を見ると分かりやすいです blog.utgw.net 予選の記事は↓。ブログ賞受賞とのことで、個人スポンサーグッズをもらえるらしい…

pt-query-digest の出力結果を Filebeat を使って Elasticsearch に集約し Kibana で出す

今年の ISUCON では Elastic Stack を使って MySQL のスローログを Kibana で可視化したが、いくつか課題があった。 パラメーターによってクエリが分散し、ボトルネックが分かりづらい MySQL スローログは生のクエリが記載されていて、Filebeat の MySQL モ…

ISUCON 予選突破のために Elastic Stack と GCP で分析環境を整えた (:old_noto_innocent: Team)

ISUCON 12 予選にいつもの id:utgwkk, id:wass80 と :old_noto_innocent: チームで参戦した*1。 結果は 50696 点で本選出場! ここ数回と同様、自分はインフラと分析・観測を担当していた。ただ、毎年似たようなことをやっていてあまり貢献できていないなあ…

Elasticsearch の Docker container でパスワードを指定する

環境: Docker の elasticsaerch image 8.3.2 久々に Elasticsearch を Docker で立ち上げると、初期状態でセキュリティ機能が有効になっていて、そのまま curl しても認証が通らず API が打てなかった。 $ curl -k https://localhost:9200/ {"error":{"root_…

pip install --user を config でデフォルトにする

最近(2年以上前)、pip がデフォルトで --user でインストールするようになった。 github.com ただ、この機能が有効になるにはいくつかの条件がある。 The user has not explicitly specified otherwise in the command line, environment variable, or a c…

GKE の Preemptible VM を Spot VM にした

プライベートで GKE を Preemptible VM ベースで運用していた。だいぶ昔に Preemptible VM が Spot VM に変わるよという通知が GCP から来ていて 値段変わらないし 放置していたのだが、GKE のバージョンを上げるついでに Spot VM に変更した。 cloud.google…

TypeScript 型わくわく日記

TypeScript でオブジェクトのバリデータを作っている。それぞれの値ごとのバリデータは値の特性ごとに様々な関数がある((value: string) => Error[] のような形)。 時折 Optional な値があるものの、バリデータ自体は non-null な値のバリデーションに専念…

AlertManager: Slack の Incoming webhook URL が Kubernetes の Secret で扱いやすくなっていた

Prometheus の AlertManager は Slack などに通知を送る重要なコンポーネントである。 当然 Slack の Webhook URL といった Credential を設定ファイルに書く必要があるのだけど、AlertManager は強い意志で環境変数や複数設定ファイルに対応していないので…

Git でブランチがリモートリポジトリの HEAD から派生しているかどうかを確認する

Git

Git でトピックブランチを切るときに、元ブランチで git pull し忘れて古いコミットから生やしてしまうときがある。 最新の変更を認識できなかったり、後々コンフリクトが起きたりと不便なことがままあるので、 Commit 前に HEAD がリモートリポジトリの HEA…

Python の subprocess.run は KeyboardInterrupt で強制的に kill される

Python から Terraform をインタラクティブな(stdin をそのまま渡す)形で呼ぶために、subprocess.run を使って subprocess で走らせようとしている。 ここで、 Ctrl-C (KeyboardInterrupt) のハンドリングがネックになる。 Terraform は Ctrl-C を打つと G…

Elasticsearch: さようなら、query_string のスペース区切り

この記事は KMC advent calendar 2021 9日目の記事です。 昨日の記事は Elasticsearch: N-gram tokenizer と N-gram token filter の挙動の違い - Unyablog. でした。今日*1も Elasticsearch の話をします。 本題 サークル内で開発しているドキュメント検索…

Elasticsearch: N-gram tokenizer と N-gram token filter の挙動の違い

この記事は KMC advent calendar 8日目の記事ということにしています。 adventar.org KMC では部内ドキュメント検索システムで Elasticsearch を使用している。最近 Elasticsearch のバージョンを上げる準備をしていて、設定の見直しの中で N-gram token fil…

Docker で jq が使いたくなったら gojq の Image を使えば良さそう

タイトル通りのメモ。 jq を Docker で使いたかったけど、公式で提供されている image が明示されておらず、それっぽいものも Updated 6 years ago となっている。 github.com 野良 Image はあまり使いたくないので、どうしたものか。 gojq を使おう ここで…

GitHub Actions で Docker push をするときに、特定のブランチについて latest タグをつける

DockerHub の autobuild が無料では出来なくなったので GitHub Actions で Docker build / push を行う作業をしていた。 基本的にはスムーズに移行できたが、 latest tag を自動で生成する部分だけちょっと詰まったのでメモ。 問題 Docker Hub の autobuild …

docker-compose を Docker で動かす

docker-compose を Docker 内で実行するメモ。 背景 docker-compose は便利なツールだが、Linux サーバー上で動かすときは入れ方に悩む。 Docker engine は Docker 公式 apt リポジトリから入れることができるけど、docker-compose はレポジトリには存在しな…

replicaCount: 1 と Drain とダウンタイム

Kubernetes で Node を Drain するとき、replicaCount: 1 な ReplicaSet (Service) はある程度のダウンダイムを許容せざるを得ない。 関連 issue は以下。 github.com 問題 ReplicaSet X があり、その replicaCount は 1 にしている また、同じ Selector で …

k8s: 手元で削除したリソースをクラスタからも消したい

k8s の yaml を kustomize で管理している。ここからリソースを消しても kustomize はそれを感知しないためクラスタからは削除されない。 どうするか kpt を使う。これを見つけたのは deprecated になった inventory からリンクが貼られていたため。 kpt は…

Vertical Pod Autoscaler の limits 周りの挙動について

Kubernetes で memory の requests を管理するのに Vertical Pod Autoscaler (VPA) を使っている。 github.com VPA はリソースの使用量の実績に基づいて良い感じに limits と requests を調整してくれるものだが、 limits の設定に関してちょっと困ったので…

Kubernetes ヒヤリハット ― デフォルトに戻すときはちゃんと書く

Kubernetes で Service Account を特定のものから default に戻そうとして、Pod の Template から serviceAccountName を消して apply した。 spec: - serviceAccountName: old-service-account restartPolicy: Never containers: - ... しかし、適用しても…

SQLAlchemy で MySQL の JSON_CONTAINS をやる

SQLAlchemy で MySQL の JSON_CONTAINS をやるには func.json_contains を用いれば良いのだけど、 JSON_CONTAINS のドキュメント にあるように candidate は JSON ドキュメントである必要がある。 以下のようにすると hoge は JSON ドキュメントではないため…

ISUCON 10 本戦に出場した(16位)

チーム として ISUCON 10 本戦に参加した。 isucon.net 結果は 14206 点で 16位。くやしい! レポジトリは以下。よく分からない Author になってるコミットは大体自分によるもの。 github.com 以下はチームメイトのブログ。コードの改善などは基本的にそち…

ISUCON 10 で予選突破した(24位)

ISUCON に今年も出場して、めでたく予選突破できた。チーム名は で、チームメイトはいつもと同様 utgwkk と wass80。 isucon.net チームメイトのエントリは以下。 wass80.hateblo.jp blog.utgw.net レポジトリは以下。 github.com やったこと いつも通り自…