サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
掃除・片付け
ymmt.hatenablog.com
この記事は私が過去 3 年ほど Kubernetes に携わる中で学んだ、ちょっと見つけにくい知識をまとめたものです。 特にカスタムコントローラーを開発するような人に必要となる知識群です。 感想とか指摘とかあれば Twitter までお寄せください。 更新履歴 2021-03-05: "コンテナの resources.limits と resources.requests の違いについて" の項を補足しました (thanks to @superbrothers) API コントローラー実装 プログラムと連携動作 資源管理 ネットワーク モニタリング アクセスコントロール API kube-apiserver が備える拡張機構を列挙しなさい 回答例 Custom resources: OpenAPI スキーマで独自のリソース型を追加できる Aggregation layer: kube-ap
(2013-12-28 タイトルをエンジニア→プログラマに変えました) cybozu.com の中の人、山本泰宇です。2013年も今日で仕事納めです。 さて、先ほどプレスリリースが出たのですが、来年から私は運用本部長として、自社クラウドサービスおよび社内情報システムの運用を統括する仕事をすることにしました。この2年ほどはプログラマとしての仕事を多くしていたのですが、今後は自らプログラミングする機会は大幅に減ることになると思います。 ご存知の方もいるかもしれませんが、実は私が本部長になるのは2度目です。2005年に開発部長になり、そのまま規模を拡大して2006年に開発本部長となり、2007年に退きました。本部は違いますが、7年ぶりの再登板ということになります。略歴としては以下のようになります。 2001年12月 サイボウズに入社 プログラマとしてガルーンを開発 2005年 開発部長
ソフトウェアエンジニアとして働き始めて 20 年以上になります。 元々ソフトウェアでいろいろ作りたくて就いた職業なので、結構な数のプロダクトを開発してきました。 私がメインで開発したもので OSS として出ているものでは、 yrmcds: memcached クローンで、レプリケーション機能などを持つ usocksd: SOCKS4/5 サーバー & ライブラリ transocks: アプリのネットワーク通信を透過的に SOCKS サーバーにプロキシする透過プロキシ coil v2: Kubernetes の CNI ネットワークドライバ moco: MySQL を自動運用する Kubernetes オペレーター accurate: Kubernetes 上で namespace ベースのソフトマルチテナンシーを実現するためのソフトウェア などがあります。これらのソフトウェアの多くは、現役
新型コロナウィルスの影響も長引いてますが、皆さま無事お過ごしでしょうか。私は幸い無事です。 日ごろチームでソフトウェア開発をしているのですが、近年社内ではペアプログラミングやモブプログラミングが流行しています。 私のいるチームでもここ二年ほどモブプログラミング(ないし類似のプラクティス)に取り組んできました。 モブプログラミングについて正確にどのようなものかは以下の記事などをご参照いただければと思います。 簡単にまとめると、要求分析やコーディング等幅広い開発作業を、同じ場所に集まったチームの共同作業でこなしていくというものです。 このご時世ですので、最近はオンラインのミーティングルームに集合する形式でしたけど。 www.agilealliance.org ここから先は、非常にパーソナルな、私に限定された体験になります。 どの人・チームにも適用できる話ではありません。ではありますが、どの人・
あけましておめでとうございます。年賀状代わりに開発環境の構築記事を差し上げます。 いやわりと真剣に、開発環境にはその開発者の近況が表れていると思うのですよ。 いっちょあなたもどうですか 😀 閑話休題。 以下今日やった Ubuntu 20.04 LTS のインストール作業記録です。語調変わるのはご勘弁。 Hyper-V VM の用意 Ubuntu のインストール インストール後の作業 systemd-networkd の設定 不要なツールを purge build-essential をインストール dotfiles で初期設定 Go をインストール Docker をインストール 以上 Hyper-V VM の用意 特に難しいことはない。 ブリッジ仮想スイッチを作り、第2世代タイプにしてセキュアブートを無効化するくらい。 あとチェックポイント(自動スナップショット)はうざいので無効化してい
子供のころからできるだけ手抜きして成果を挙げることだけは長けている山本です。 今回は、C/C++ で作ったプログラムが運用中にクラッシュするときのデバッグ方法のお話しです。 開発中のデバッグは gdb などでソース追いながらデバッグできますが、運用中ですと strip していたり最適化していたりしてデバッグが難しくなります。 そもそも、いきなりクラッシュすると情報が残らずに困ってしまいます。そんなときどうするか。 Step1. スタックトレースを出力する こんな関数を用意しましょう。Linux 以外の人はそれなりに実装してください。 #include <execinfo.h> #include <unistd.h> void dump_stack() { void* bt[100]; int n = backtrace(bt, 100); backtrace_symbols_fd(bt,
業務で Linux 向けの Go プログラムを多数開発しています。 しかしながら、開発している機材の OS は好きこのんで Windows です。 在宅から勤務するときに、Windows のリモートデスクトップが最強すぎるので手放せないのが大きな理由です。 そんなわけで、Windows の Hyper-V という機能で Ubuntu を仮想マシンとして動作させ、Emacs で長年開発していました。 しかし近年、モニタも 4K 32 インチと大きくなりましたしメモリも 32 GB 搭載されていますし、なにより Visual Studio Code のような高機能 IDE が手軽に利用できる状況でありながら、ろくにカスタマイズをしない Emacs で開発を続けるのも怠慢かなと考え、「WSL で快適な Go 開発環境を作る」という記事に書いたように Windows + WSL + Visual
人類は大袈裟ですが、私には厳しかったという話。 IPv6 対応のプログラムとは? いたるところに書かれているので省略。以下の記事などを参考にどうぞ。 IPv6ソケットプログラミング Programming using C-API 手短にまとめると gethostbyname(3) ではなく getaddrinfo(3) を使って名前解決する accept(2) や getpeername(2) で返るアドレス情報は struct sockaddr_storage に格納する listen するソケットは AF_INET6 指定で作ると IPv4/v6 両対応になる シンプルですよね。ここまでは。 落とし穴1:リンクローカルアドレス IPv6 のアドレス体系は IPv4 とかなり異なります。最たるものがリンクローカルアドレスです。 リンクローカルアドレスはルーティングされないので、リンク(≒
@songmu 氏からご恵贈いただいた「みんなの Go 言語」(みんGo)、早速拝読しました。 書評としてはタイトル通り、なのですがそれではあんまりなのでもう少し。 本書でも述べられている通り、Go 言語は早ければ一日で大体学べてしまう学習効率の良さが魅力です。最大の魅力と言っていいかもしれません。コンパクトな言語仕様に実務で必要な周辺ツールが揃っているため、初学者から歴戦のプログラマまで活用範囲が非常に広いのです。 さて、その Go 言語をさらに活用するための本書。お手に取ってみればわかりますが 150 ページ弱で薄い本です。読むのに半日あれば十分でした。本の内容も余計なことは書かれておらず、「こんな便利な機能があるよ」くらいなあっさり風味で淡々と役に立つ情報が並べられています。 ああ、わかっているなと。 Go 言語の最大の魅力と思う学習効率の高さを、文字通り形にした本、それが「みんなの
最初に断っておきますと、OpenTelemetry を良く知っていたり真面目に調査しようという人が読むべき内容はここにはありません。 公式ドキュメントなりをご参照ください。これは最近 OpenTelemetry を使いだした一般人の感想記事です。 さて、いけてる Web 開発者、特にバックエンド開発者の方はオブザーバビリティという言葉は聞き及んでいるかと思います。 なかでもオブザーバビリティ三種の神器と言われている(?)ログ、メトリクス、分散トレーシングをどう実装するか頭を悩ませているかもしれません。 頭を悩ませてきた、あるいは頭を悩ませている理由の一つは、これらを実装するときに特定の実装向けになりがちであったためです。 メトリクスであれば最近は Prometheus 向けに /metrics エンドポイントとして提供する実装が多いといった話です。しかしながら、 あらゆる人が Promet
@tamagawa_ryuji 氏からこの度和訳して発売された「SRE サイトリライアビリティエンジニアリング」をご恵贈いただきました。 英語の原本は昨年発売されており、Google のサービス運用について実践的な知見が得られる貴重な書籍ということで、去年のうちに英語版を社内で購入し、輪講しています。今回和訳本を頂きましたので、二度目となりますが早速拝読しました。 SRE (Site Reliability Engineering) という言葉を聞きなれない方のために簡単に解説しておくと、Google において古典的なシステム管理者の概念に代えて導入された、システムとその上のサービスの信頼性に責任を持つエンジニアとその仕事のやり方の体系的な概念です。 初めて読んだ際は、SRE とそれにまつわる Toil や Postmortem といった概念や SLO の定義の仕方について Google
仕事で、データセンターのアーキテクチャを刷新するプロジェクトを進めてます。 Kubernetes を中心としているので、必然的に Kubernetes 上で動作するアプリケーションを開発する機会があります。 Kubernetes は API サーバー (kube-apiserver) にリソースを登録して、他のプログラムは API サーバー上のリソースを監視して動く Hub & Spoke アーキテクチャを特徴としています。 出展:https://kubernetes.io/docs/concepts/architecture/cloud-controller/ Kubernetes の動作をカスタマイズするには、API サーバーの動作に手を入れる必要があります。kube-apiserver はそのための仕組みとして、通常の API に加えて以下を提供しています。 Custom Resou
TL;DR HDD 同様、NVMe ストレージも nobarrier するなら内部キャッシュを無効化したほうがいいケースがあります。 分かる人向けに端的に書くと、NVMe 仕様には volatile write cache の有無と、有効化/無効化切り替え、および有効な場合にデータが消失するケースが明記されています。手持ちの NVMe デバイスの情報を確認して、ファイルシステムに nobarrier つけたいなら、確実に無効化しておきましょう。 以下は詳細。 NVMe というのは PCIe バスに直接つないでデータを保存できるストレージの共通規格で、nvmexpress.org で仕様が公開されています。最新の仕様は rev. 1.3です。 HDD や SSD のようなものではあるんですが、hdparm コマンドで設定することはできず、ベンダが提供するツールか、NVMe 仕様に基づいてコン
@ymmt2005 こと山本泰宇です。 公式発表とは別に、こちらでは yrmcds のもう一つの使い方を紹介します。それと、私の気持ちなどを。 yrmcds は実際のところ、作ることをかなりためらいました。工数という観点でみれば Apache が Redis を扱えるようにするとか、レプリケーションの仕組みを頑張るといったほうが小さい気がしたからです。C++11 の実践課題という動機は個人に寄っているので、会社に十分なメリットがないことには・・・と。 そこで会社へのメリットとして、以下の価値を加えることにしました。 後進の開発者が設計やプログラミング技法を学ぶ教材として使える 英語圏では無名のサイボウズの知名度の足しになるようにオープンソース化して宣伝を頑張る 教材として yrmcds が提供しているものは以下です。 簡潔なコード 以下の cloc レポートが示すように、ほとんどのファイル
個人的な備忘録です。 仕事上 Ubuntu をターゲットに Go のプログラム開発をする必要があるのですが、従前 Windows デスクトップに Hyper-V の Ubuntu で Emacs で開発していたところをVisual Studio Code(vscode) に開発環境を変えたいと考えました。理由は省略。 最初は Ubuntu 上に vscode を入れて X 越し(VcXsrv)で試してみたのですが大画面だと描画速度が遅すぎてストレスたまってダメでした。 仕方がないので Windows 上の vscode で WSL の Ubuntu を併用しつつネイティブ Windows 開発環境を構築することにしました。大分手順が多くなってきたのでメモとして残します。 WSL のセットアップ 公式手順に従えば難しいことはない。 WSL を有効にしたら Microsoft Store で
yrmcdsという memcached のクローンを開発・メンテナンスしています。yrmcds は memcached を機能拡張しているので、クライアントライブラリも独自に開発する必要があり、libyrmcds という C/C++ 用クライアントライブラリとそれを基にした php-yrmcds という PHP の拡張モジュールも開発・メンテナンスしています。 この時点でもう関心ない人が大半だと思いますが、ここから書くのは世界中でたぶん私くらいしか苦労してないし、することもない話です。苦労したので書き残しておくか、くらいな駄文です。 You've been warned! memcached には当初から実装されているテキストプロトコルと、後から追加されたバイナリプロトコルがあります。後から追加されたバイナリプロトコルは後発なだけあって、テキストプロトコルにはない、以下の特徴があります。
昔、サイボウズ社内のブログで公開して人気があったのをいくつか公開します。 まずは、英語が書けない人のための 書き方講座。 ---- 「英語なんて読むのも大変だし、書くのはもっと大変」という方、たくさんいるんじゃないでしょうか。 私もなかなか英語は苦手で、苦労してきました。今でも苦手は苦手ですが、読まなきゃいけなければ読めるし、書かなきゃいけなければ書ける、くらいにはなりました。 というわけで、英文をなんとか書けるメソッドをご紹介します。自己流ですし、これで「ばりばり」書けるメソッドというわけではないですが、やんなきゃいけない時には役に立つかなと。 ■読めなくても書ける 正確に言うと、「(難しい英文を)読めなくても(簡単な英文なら)書ける」。英語を読むのが苦手でも、書けます。大丈夫。書ける文章を書けばいいのです。 と、当たり前のようですが、実は書ける文章を書くというのが最初の難関だったりしま
これまた誰かの役に立てばということで。 keepalived (VRRP)はその仕組み上、ネットワーク分断時にマスターが二つ以上できます。俗にいう、スプリットブレインというやつです。 ネットワーク分断が解消したのち、マスターは一つに収束します。ネットワークスイッチの類であれば大概の場合これで問題はありません。ええ、問題はないはずでした。 ところが先日、ネットワーク分断解消後にある Linux サーバーからスイッチの仮想IP(VIP)への通信ができなくなる現象が発生しました。原因を調べたところ、VIP を現在持っているスイッチの MAC アドレスではなく、バックアップスイッチ側の MAC アドレスが ARP キャッシュに載っていたためでした。 以下のような経緯で障害になったものと思われます。 スプリットブレイン中、複数のマスターから VIP の ARP キャッシュを更新するためGratuit
/usr/local/bin にある #!/usr/bin/python3 をみつけたい、場面です。 こんな感じ。 find /usr/local/bin -type file | xargs awk '/python3/ {print FILENAME} {nextfile}' 1行目だけ検査したらさっさと nextfile で次に移るので OK というわけ。 nextfile Stop processing the current input file. The next input record read comes from the next input file. FILENAME and ARGIND are updated, FNR is reset to 1, and processing starts over with the first pattern in the
さて、テストコードなんて書きたくなかった私ですが、世の流れには逆らえず今はせっせとテストコードを量産しています。 開発完了=試験完了=出荷可能が求められる忙しない世の中でありますから。 目下開発しているのは Kubernetes 向けのネットワークソフトウェア Coil のバージョン 2 なんですが、この開発では main 文以外はすべて自動テストする徹底ぶりです。他にも近年様々にテストコードを書いてきた過程で、以下の知見を得るに至りました。 外部依存はなるべく実物を使う etcd を使うなら etcd を用意、ネットワークをいじるなら network namespace を用意、... 内部依存はなるべくインタフェースで依存注入する 多分この結論に似たことはあちこちで言われている気はするのですが、結論に至った理由が大事と思うため、以下少し書きます。 あ、以下モックと言ってる用語は専門的に
エンジニアなら詳細が気になるもの。というわけで、個人ブログのほうで yrmcds 1.0.0 リリース記事の技術的な補足をしておきます。 keepalived 使うの、split brain になるんじゃないの? さてはプロの方ですね。困りますな、そういう突っ込みは! 気になる人は split brain 起こさない heartbeat をご利用ください。 用途次第でまあどうでもいっかなーという人は keepalived の方が手軽かと思います。 サーバーサイドロックとレプリケーション ロック状態はレプリケーションされません。非同期レプリケーションなのでしても無駄というか。 するとロックした後、フェイルオーバーするとオブジェクトがロックされない状態になるわけです。危険です。 対策として導入したのが、バイナリプロトコルの RaU (Replace and Unlock) です。 このコマンド
最近 CKE というベアメタル向けの Kubernetes 管理ツールを作っています。 ブートストラップツールではなく自律的・継続的にクラスタの構成を修正していくツールで、以下が特徴です。 ネットワークプラグイン非依存 HA 対応 CKE 自体の高可用性 今日は CKE の紹介が目的ではないのでこのあたりにします。 本題は、CKE が内部で使っている golang.org/x/crypto/ssh というライブラリが無期限に ブロックしてしまう問題があったので、どう対応したかです。 問題 以下のようなスタックトレースで動作が停止するケースが試験中に何度か発生しました。 goroutine 2153 [chan receive, 4 minutes]: golang.org/x/crypto/ssh.(*mux).openChannel(0xc000105730, 0x13a0ec2, 0x
このエントリーは社内勉強会用の解説記事です。 普通の人は便利な libev や libuv を使っておきましょう。 epoll はいわゆる C10K 問題に対応するための Linux カーネルが提供する仕組みです。といってもこの問題、32bit 時代のメモリが潤沢ではなかった時代のものなので、いまどき並大抵のプログラムであれば、普通に1コネクション1スレッドで問題ないでしょう。@kazuho 先生がそうおっしゃっていました。 まあ御託はさておいて、epoll のマニュアル読んでもちょいわからないところを補足しておきます。 レベルトリガーとエッジトリガー マニュアルに書いてありますが、簡単に言うとレベルトリガーは指定した状態が満たされるかチェックする方式です。つまりソケットの受信バッファにデータがあれば、epoll_wait を何度呼び出しても必ず read ready が返ってきます。 エ
builderscon tokyo 2018に参加してきましたので、メモ。 仕事で Kubernetes を扱っているので、その周辺技術の話を聞いてきました。 初日はサービスメッシュ関係がたくさん。 Envoy internals deep dive Envoy 開発者の Matt Klein 氏による、開発の背景と内部アーキテクチャの解説。 Kubecon EU 2018 の拡大版(同じ?)のようで、そちらの資料は公開されていました。 speakerdeck.com マイクロサービスが多様な言語で開発されると、サービス間通信の標準的な振る舞いをライブラリアプローチで実装するのが困難 そこで L7/L4 プロキシとしてサービス間通信を調整する Envoy を開発 Envoy 自体は通信処理に専念するデータプレーンで、Envoy のクラスタを管理するコントロールプレーンを別に用意する アーキ
毎日暑いですね。私はようやく明日から夏休みです。 さて。今日は Jekyll で Web サイトやブログを作る話です。 俺もう知っているって人は、特に得られる情報ないと思います。ずぼら入門なんで。 Jekyll は Ruby でできたツールで、CSS や HTML のテンプレートから静的にページを生成してくれます。 GitHub Pages のエンジンとして使われており、以下のようなサイトが Jekyll で動作しています。 Cybozu Open Source Onion Inc.'s Tech Blob @banyan's blog いまどきブログサイト作るだけなら、たとえばこのはてなブログでもいいし、Blogger でもいいし選択肢はたくさんあります。 なぜ手間をかけて Jekyll というツールを使いたいかと言えば、以下の利点があるからです。 任意のコンテンツを置ける スタティック
Go 1.7 から本体に入った context パッケージは便利、というより今や必須の道具です。以下のように書くことで、一定時間で処理をキャンセルできたりします。 func slowOperationWithTimeout(ctx context.Context) (Result, error) { ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) defer cancel() // releases resources if slowOperation completes before timeout elapses return slowOperation(ctx) } defer cancel() とありますが、このようにしないとリソースリークするので context 使うときはこう書くのがパターンです。 さて
ログ出力をどうするかっていうのは、Go 書くときに常にちょっとした悩みの種でした。 標準の log パッケージはあるものの、実用には機能が不足していると見なす人が多いためです。 かくいう私もその一人で、近年は Kubernetes 界隈でよく使われている以下を組み合わせていました。 go-logr/logr uber-go/zap + go-logr/zapr logr は所謂 structured logging のための共通インタフェースを提供するパッケージで、uber-go/zap のような著名なログライブラリ向けにアダプタも提供してくれます。 debug, info, warn, error といったいわゆるログレベルも備えていますし、context 経由で logger を渡すこともできるので、便利に活用していました。 ただ、logr は結構使われているとはいえ標準パッケージでは
先日 GitHub に「開発中のためまだマージするべきでない」プルリクエストを作ることができる Draft Pull Request 機能が追加されました。 今の業務では複数人でモブプロしたりする関係で、開発途中のブランチを GitHub に push してひとまずプルリクエストを作ることが良くあります。従来は、そういったプルリクエストを作る都度 "wip" ラベルをつけたり [WIP] とタイトルを変えたりとひと手間かかっていました。その手間を無くせるので、draft pull request は待望の機能です。 もうひとつ、業務ではプルリクエストは working tree から git neco review という拡張コマンドで自動作成するようにしています。いちいち画面を触る必要がなくとても便利です。自然な考えとして、git neco draft というコマンドを打てば draft
はじめに言っておきますと、テストは重要ですよ。テストしないなんてありえない。 でも、テストコードを書いて当たり前という昨今の論調には、同意できないのです。テスト熱中症になんて到底なれません。そう思うのは私だけではないようで、Rails の作者も書きまくればいいってものではないと言っています。 なぜ同意できないのか、理由を書き連ねて鬱憤を晴らすことにします。 コスト対効果が悪いから もうこれに尽きる。尽きすぎる。テスト書いてもほとんど不具合なんて見つからないです。 なぜって? なぜでしょうね。知りませんが、ほとんど不具合ないんですもの。 typo の類はコンパイル時に修正されてますし。 コンパイル型言語じゃない? コンパイル型言語使えばいいんじゃないですか :-p 難しいバグは見つけられないから テストコードでさらっとみつかる不具合はそもそも簡単・単純なものが多いです。 再現しやすければ、改
次のページ
このページを最初にブックマークしてみませんか?
『誰かの役に立てばいいブログ』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く